0060 Linux SELinux 管理命令

  

1. SELinux 的起源
  SELinux 是一个面向政府和行业的产品,由 NSA、Network Associates、Tresys 以及其他组织设计和开发。尽管 NSA 将其作为一个补丁集引入,但从 2.6 版开始,它就被加入到 Linux 内核中。

2. 访问控制方法
  大多数操作系统使用访问控制来判断一个实体(用户或程序)是否能够访问给定资源。基于 UNIX® 的系统使用一种自主访问控制(discretionary access control,DAC)的形式。此方法通常根据对象所属的分组来限制对对象的访问。例如,GNU/Linux 中的文件有一个所有者、一个分组和一个权限集。权限定义谁可以访问给定文件、谁可以读取它、谁可以向其写入,以及谁可以执行它。这些权限被划分到三个用户集中,分别表示用户(文件所有者)、分组(一个用户组的所有成员)和其他(既不是文件所有者,又不是该分组的成员的所有用户)。
  很多这样的访问控制都会带来一个问题,因为所利用的程序能够继承用户的访问控制。这样,该程序就可以在用户的访问层进行操作。与通过这种方式定义约束相比,使用最小特权原则 更安全:程序只能执行完成任务所需的操作。例如,如果一个程序用于响应 socket 请求,但不需要访问文件系统,那么该程序应该能够监听给定的 socket,但是不能访问文件系统。通过这种方式,如果该程序被攻击者利用,其访问权限显然是最小的。这种控制类型称为强制访问控制(MAC)。
另一种控制访问的方法是基于角色的访问控制(RBAC)。在 RBAC 中,权限是根据安全系统所授予的角色来提供的。角色的概念与传统的分组概念不同,因为一个分组代表一个或多个用户。一个角色可以代表多个用户,但它也代表一个用户集可以执行的权限。
  SELinux 将 MAC 和 RBAC 都添加到了 GNU/Linux 操作系统中。

 

3. 关闭SELinux的方法

    临时关闭: 

    

# setenforce 0   

  

    永久关闭:

    修改/etc/selinux/config文件中的SELINUX="" 为 disabled ,然后重启。

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing - SELinux security policy is enforced.
#       permissive - SELinux prints warnings instead of enforcing.
#       disabled - SELinux is fully disabled
 若不想重启系统,使用命令setenforce 0

4. 查看SELinux状态

   

# sestatus   

# getenforce

  

5. SELinux 设定

5.1. 重新标签文件

 

 

chcon 这个指令可以用来更改一个或多个文件与目录的 SELinux 安全性脉络,正如 'chown' 或 'chmod' 可以用来更改一个文件的拥有者或标准权限。

让我们看一些例子。

就以 Apache 为例,假设你想修改 DocumentRoot 以另一个位置来伺服网页,替换缺省的 /var/www/html 目录。譬如说我们在 /html 创建了一个目录(又或者挂载点),然后在那里创建一个 index.html 档:

 

# mkdir /html
# touch /html/index.html
# ls -Z /html/index.html
-rw-r--r--  root root user_u:object_r:default_t        /html/index.html
# ls -Z | grep html
drwxr-xr-x  root root user_u:object_r:default_t        html 

  我们可以见到 /html 这个目录以及 /html/index.html 这个文件都拥有缺省的 default_t 安全性脉络类型。如果我们打开浏览器并尝试查看该页,SELinux 将会正确地拒绝它们被访问并记录错误,因为该目录与文件拥有不正确的安全性脉络。我们须要设置供 Apache 使用的 httpd_sys_content_t 正确安全性脉络。

 

# chcon -v --type=httpd_sys_content_t /html
context of /html changed to user_u:object_r:httpd_sys_content_t
# chcon -v --type=httpd_sys_content_t /html/index.html
context of /html/index.html changed to user_u:object_r:httpd_sys_content_t
# ls -Z /html/index.html
-rw-r--r--  root root user_u:object_r:httpd_sys_content_t    /html/index.html
# ls -Z | grep html
drwxr-xr-x  root root user_u:object_r:httpd_sys_content_t    html 

  

我们同样也可以利用 -R 这个回递标旗同时将它们的脉络设置:

 

# chcon -Rv --type=httpd_sys_content_t /html 

  

以这个方式更改安全性脉络在系统重新开机后仍会获保留,直至该部份文件系统被重新标签。这个动作也算颇常,因此正确的解决方法,就是于测试后编写一条自定的规则(所谓的政策模块),并把它与本地的规则进行合并。它将会是原有的 200 多条规则外的一条规则。要作出永久性、能过渡文件系统重新标签的安全性脉络改动,我们可以采用 SELinux 管理工具,或者在命令行执行 semanage 这个指令:

 

# semanage fcontext -a -t httpd_sys_content_t "/html(/.*)?" 

 

 

 

如此便会将 /html 以下的一切加入 httpd_sys_content_t 这个文件脉络类型。

 

5.2. 撤消缺省的安全性脉络

 

 

restorecon 这个指令可以用来撤消为文件缺省的安全性脉络。

让我们再次以 Apache 作为样例。设假有位用户在他的主目录内编辑了一个 index.html 档并将该文件迁移(mv)至 DocumentRoot 的 /var/www/html 内。纵使复制(cp)这个指令普遍会沿用目标目录或文件的安全性脉络,迁移(mv)指令则会保留源文件的安全性脉络。我们可以利用 chcon 这个指令来更改问题文件的安全性脉络,但由于这些文件已经位于 Apache 缺省的 DocumentRoot(/var/www/html)内,我们只须撤消这个目录或文件的安全性脉络便成了。要单单撤消 index.html 档的脉络,我们可以利用:

 

# restorecon -v /var/www/html/index.html 

  

 

 

如果要以回递的方式撤消整个目录的缺省安全性脉络:

 

# restorecon -Rv /var/www/html 

 

 

 

除此之外,如果我们只想检查 /var/www/html 目录内有哪些文件的安全性脉络需要被撤消,我们在采用 restorecon 时可以应用 -n 这个标旗来防止重新标签的行动:

 

# restorecon -Rv -n /var/www/html 

  

 

 

5.3. 重新标签整个文件系统

 

有时我们也许会需要将整个文件系统重新标签,虽然这是在启用已停用的 SELinux 时,或在 SELinux 政策由缺省的针对型改为严格型时才有真正需要。要在重新开机后自动将整个文件系统重新标签,请执行:

 

# touch /.autorelabel
# reboot 

  

假若一个系统在升级至 CentOS-5.2 时停用了 SELinux,然后 SELinux 被启用,重新标签整个文件系统时或许会失败。如果以上的步骤不能正确地将整个文件系统重新标签,请尝试先执行 genhomedircon 这个指令:

 

# genhomedircon
# touch /.autorelabel
# reboot 

 

5.4. 允许访问某个端口

我们或许会想容让 Apache 连结至某个非标准的端口并聆听对内的连接。SELinux 的政策缺省只允许每个服务访问被公认与该服务有关的端口。如果我们想容让 Apache 在 tcp 端口 81 上聆听,我们可以利用 semanage 这个指令来新增一条规则批准此事:

     centos 需要安装: yum -y install policycoreutils-python

 # semanage port -a -t http_port_t -p tcp 81

  

 

你可以这样令 SELinux 完整地列出每个服务可访问的端口:

# semanage port -l

6. 设定不正确的错误

  在linux上安装有些东西时会出现 Permission denied 的情况:nginx,apache 访问文件夹,反向代理访问网络等。

      例子:

nginx反向代理提示13 permission denied while connecting to upstream

 

后来发现是selinux的问题,于是先关掉selinux:setenforce 0;然后再访问果然好使。

于是启用selinux,再执行下面的命令,修改selinux的值:

 

setsebool -P httpd_can_network_connect 1  

  

 7.为什么要关闭SELinux?

 

  http://www.zhihu.com/question/20559538

 

 

  

 

posted @ 2016-06-10 07:57  guangfengli  阅读(288)  评论(0编辑  收藏  举报