安全增强式 Linux,即SELinux
(Security-Enhanced Linux)是一个?Linux
?内核的安全模块,其提供了访问控制安全策略机制,包括了强制访问控制(Mandatory Access Control,MAC)。SELinux
?是一组内核修改和用户空间工具,已经被添加到各种?Linux
?发行版中。其软件架构力图将安全决策的执行与安全策略分离,并简化涉及执行安全策略的软件的数量。
?
Linux安全之SELinux理解
?
1. SELinux 介绍
安全增强式 Linux(SELinux
)是一种强制访问控制的实现。它的作法是以最小权限原则为基础,在 Linux 核心中使用 Linux 安全模块。它并非一个 Linux 发行版,而是一组可以应用在类 Unix 操作系统(如 Linux、BSD 等)的修改。
SELinux
?更能遵从最小权限的理念SELinux
是一个在内核中实践的强制访问控制安全性机制
?
Linux安全之SELinux理解
两种访问控制
DAC
:自主访问控制MAC
:强制访问控制SELinux
有两种工作级别
strict
: 每个进程都受到 selinux 的控制targeted
: 仅有限个进程受到 selinux 控制,只监控容易被入侵的进程1.1 为什么需要 SELinux
在未启用 SELinux 的情况下,要控制用户的文件访问权,唯有通过酌情访问控制(DAC)方法如文件权限或访问控制清单(ACL)。不论用户或程序都可以将不安全的文件权限赋予其它人,或反过来访问系统在正常运作下无须访问的部份。举个例说:
ssh
?金钥及惯常用来放置这些金钥的目录,~/.ssh/
。Firefox
?被木马程序所占用,它可能会阅读用户的私人?ssh
?金钥,尽管它没有理由如此做。基本上在传统 DAC 模式只在两个权限级别,root?及用户,而当中不能简易地实施最小权限的理念。很多由 root 引导 1 的进程在后期会撇除它们的权限并以受限制的用户身份来运行,有些则会在 chroot 的情况下执行,但这些安全措施都是酌情的。
1.2 解决方案SELinux
?更能遵从最小权限的理念。在缺省的 enforcing 情况下,一切均被拒绝,接着有一系列例外的政策来允许系统的每个元素(服务、程序、用户)运作时所需的访问权。当一项服务、程序或用户尝试访问或修改一个它不须用的文件或资源时,它的请求会遭拒绝,而这个行动会被记录下来。
由于?SELinux
?是在内核中实践的,应用程序无须被特别编写或重写便可以采用 SELinux。当然,如果一个程序特别留意稍后所提及的 SELinux 错误码,它的运作可能会更畅顺。
理论上,下列样例方案可提供更高安全度:
~/.ssh/
?目录2. SELinux 的操作
2.1 SELinux 的三种模式
SELinux 拥有三个基本的操作模式,当中?Enforcing
?是缺省的模式。
Enforcing
Permissive
Disabled
SELinux 的模式可以通过 Adminstration 选单里的 SELinux 图像管理界面、或者在命令行执行?system-config-selinux
?来查看及更改(SELinux 图像管理界面是?policycoreutils-gui
?组件的一部份,缺省是不会被安装的)。
2.2 获取当前 SELinux 运行状态
sestatus 命令
# sestatus SELinux status: enabled SELinuxfs mount: /selinux Current mode: enforcing Mode from config file: enforcing Policy version: 21 Policy from config file: targeted
getenforce 命令
Enforcing
、Permissive
?和?Disabled
Disabled
?代表 SELinux 被禁用Permissive
?代表仅记录安全警告但不阻止可疑行为Enforcing
?代表记录警告且阻止可疑行为。
# getenforce Disabled
2.3 改变 SELinux 运行状态
临时修改
setenforce
命令
setenforce [ Enforcing | Permissive | 1 | 0 ]
Enforcing
?和?Permissive
?之间切换,结果保持至关机。setenforce 0
?之后服务或者程序依然无法运行,那么就可以肯定不是?SELinux
?导致的。
# 强制访问控制 setenforce 1 # 自主访问控制 setenforce 0
永久修改
/etc/sysconfig/selinux
或者/etc/selinux/config
SELINUX=disabled
为主开关,只有它打开了,设定访问控制才有意义
# cat /etc/sysconfig/selinux # 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 - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted
2.4 布尔型规则
因为在SELinux
中有些类型没有被启动或者你需要关闭某些类型,这个时候你就需要使用下列命令来修改SELinux
的类型了
获取类型状态
getsebool
命令:getsebool [-a] [boolean]
# 获取所以类型及其运行状态 getsebool -a # 获取某个类型及其运行状态 getsebool httpd_t
修改类型状态
setsebool
命令:setsebool [ -P] boolean value | bool1=val1 bool2=val2 ...
# 临时修改 setsebool httpd_t 1 # 永久修改 setsebool -P httpd_t 1
3. SELinux 政策
配置文件?/etc/sysconfig/selinux
?还包含了?SELinux
?运行策略的信息,通过改变变量?SELINUXTYPE
?的值实现。
两种策略
targeted
?代表仅针对预制的几种网络服务和访问请求使用 SELinux 保护strict
?代表所有网络服务和访问请求都要经过 SELinux注意事项
/etc/sysconfig/selinux
中对其进行修改targeted
,包含了对几乎所有常见网络服务的 SELinux 策略配置,已经默认安装并且可以无需修改直接使用。
# cat /etc/sysconfig/selinux # 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 - No SELinux policy is loaded. SELINUX=disabled # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=strict
4. SELinux 访问控制
4.1 三种访问控制方法
TE
)
TE
?是针对型政策所采用的主要访问控制机制RBAC
)
SELinux
?用户(未必等同 Linux 用户)为基础,但缺省的针对型政策并未采用它MLS
)
4.2 访问控制规则解析
所有进程及文件都拥有一个?SELinux
?的安全性脉络,我们这里查看?Apache
?的主页,来看看?SELinux
?安全性脉络来看看它们如何运作的。
# 查看 Apache 的主页 # -Z 这个标旗在多数工具内都可用来显示 SELinux 安全性脉络(例如:ls -Z、 ps axZ 等) # ls -Z /var/www/html/index.html -rw-r--r-- username username system_u:object_r:httpd_sys_content_t /var/www/html/index.htmlSELinux
?脉络栏
system_u:object_r:httpd_sys_content_t
httpd_sys_content_t
httpd
进程的 SELinux 安全性脉络
Apache
?在?httpd_t
?这个类型本地内运行
# ps axZ | grep httpd system_u:system_r:httpd_t 3234 ? Ss 0:00 /usr/sbin/httpdSELinux
?安全机制
httpd_t
?运行的?Apache
?可以读入拥有?httpd_sys_content_t
?类型的?/var/www/html/index.html
Apache
?在?httpd_t
?这个本地内运行但不属?username
?这个用户,纵使?/home/username/myfile.txt
?可供任何人读入,Apache
?却不能访问该文件,因为它的?SELinux
?安全性脉络并不是?httpd_t
?类型Apache
?被人占用,又假设它仍未取得更改?SELinux
?标签至另一个脉络的?root
?权限,它将会不能引导?httpd_t
?本地外的进程(藉此防止权限升级),或访问与?httpd_t
?本地不相关的文件5. 排除 SELinux 疑难
5.1 SELinux 拒接访问原因
SELinux 拒绝某个文件、进程或资源被访问的基要原因
SELinux
?安全性脉络下运行日志分析
SELinux
?缺省会通过 Linux 审计系统?auditd
?将日志写在?/var/log/audit/audit.log
?内,而该务服缺省为启用的auditd
?长驻程序并未运行,信息将会被写进?/var/log/messages
SELinux
?的日志都以?AVC
?这个关键字作标签,让?grep
?等程序可轻易地把它们从其它信息中过滤出来。日志分析工具
SELinux
排除疑难工具协助你分析日志档,将它们转换为供人阅读的格式SELinux
?排除疑难工具是由?setroubleshoot
?组件所提供的setroubleshootd
,它负责查阅新的?SELinux AVC
?警告并传送至通报图示
# 这个工具可以从 X 窗口图像管理员的「系统」选单或从命令行引导 sealert -b # 不运行 X 服务器的人可以通过命令行产生供人阅读的报告 sealert -a /var/log/audit/audit.log > /path/to/mylogfile.txt
5.2 重新标签文件
chcon:?这个指令可以用来更改一个或多个文件与目录的?SELinux
?安全性脉络,正如?chown
?或?chmod
?可以用来更改一个文件的拥有者或标准权限。
语法
chcon [OPTION]... CONTEXT FILE...
chcon [OPTION]... [-u USER] [-r ROLE] [-t TYPE] FILE...
chcon [OPTION]... --reference=RFILE FILE...
选项
-R
:递归打标举例
chcon -t httpd_sys_content_t index.html
实战演示
# 就以Apache为例,假设你想修改DocumentRoot以另一个位置来伺服网页,替换缺省的/var/www/html #目录。譬如说我们在 /html 创建了一个目录(又或者挂载点),然后在那里创建一个 index.html文档: mkdir /html touch /html/index.html # 查看selinux属性信息 # 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.3 撤消缺省的安全性脉络
restorecon:?这个指令可以用来撤消为文件缺省的安全性脉络
语法
restorecon [-R] /path/to/somewhere
选项
-R
:递归撤标实战演示
# 让我们再次以 Apache 作为样例。设假有位用户在他的主目录内编辑了一个index.html档并将该文件 # 迁移(mv)至 DocumentRoot 的 /var/www/html 内。纵使复制(cp)这个指令普遍会沿用目标目 # 录或文件的安全性脉络,迁移(mv)指令则会保留源文件的安全性脉络。我们可以利用 chcon 这个指令 # 来更改问题文件的安全性脉络,但由于这些文件已经位于 Apache 缺省的 DocumentRoot内,我们只 # 须撤消这个目录或文件的安全性脉络便成了。要单单撤消 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
?