0060 Linux SELinux 管理命令
Posted guangfengli
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于0060 Linux SELinux 管理命令的主要内容,如果未能解决你的问题,请参考以下文章