您的位置:首页 > 运维架构 > Linux

Linux基础篇之SELinux

2014-03-20 19:35 447 查看
SELinux:Security Enhanced Linux,安全强化的Linux,Linux内核中的一个模块。基于MAC(Mandatory Access Control)强制访问控制机制,以政策规则来订定特定程序读取特定档案资源。强制访问控制系统的用途在于增强系统抵御0-Day攻击(利用尚未公开的漏洞实现的攻击行为)的能力。所以它不是网络防火墙或ACL的替代品,在用途上也不重复。SELinux是一个内核级别的安全机制,从Linux2.6内核之后就将SELinux集成在了内核当中,因为SELinux是内核级别的,所以我们对于其配置文件的修改都是需要重新启动操作系统才能生效的。CentOS/RHEL都会默认开启SELinux机制。SELinux目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)。1 SELinux的优势相比其他强制性访问控制系统,SELinux有如下优势:
控制策略是可查询而非程序不可见的。
可以热更改策略而无需重启或者停止服务。
可以从进程初始化、继承和程序执行三个方面通过策略进行控制。
控制范围覆盖文件系统、目录、文件、文件启动描述符、端口、消息接口和网络接口。

2 SELinux的模式SELinux拥有三个基本的操作模式,当中Enforcing是缺省的模式。Enforcing:这个缺省模式会在系统上启用并实施 SELinux的安全性政策,拒绝访问及记录行动Permissive:在 Permissive模式下,SELinux会被启用但不会实施安全性政策,而只会发出警告及记录行动。Permissive模式在排除SELinux的问题时很有用Disabled:SELinux 已被停用
使用sestatus 这个指令来查看现时的SELinux 状况:# sestatusSELinux status: enabledSELinuxfs mount: /selinuxCurrent mode: enforcingMode from config file: enforcingPolicy version: 21Policy from config file: targeted
setenforce 这个指令可以即时切换Enforcing及Permissive这两个模式,但请注意这些改动在系统重新开机时不会被保留。
要令改动过渡系统开机,请在/etc/selinux/config内修改SELINUX= 这一行为enforcing、permissive或disabled。例如:SELINUX=permissive。

getenforce查看当前SELinux的工作状态:getenforce
3 SELinux的政策:policy在SELinux中,我们是通过定义策略来控制哪些域可以访问哪些上下文。两个主要的政策,分别是:targeted:针对网络服务限制较多,针对本机限制较少,是预设的政策;strict:完整的SELinux限制,限制方面较为严格。在CentOS/RHEL中,其默认使用的是目标(target)策略,那么何为目标策略呢?目标策略定义了只有目标进程受到SELinux限制,非目标进程就不会受到SELinux限制,通常我们的网络应用程序都是目标进程,比如httpd、mysqld,dhcpd等等这些网络应用程序。目标型策略在设计时尽量保护最多的主要进程而不会对用户的体验产生不利影响,所以多数用户甚至乎不应察觉SELinux 正在运行中。
4 SELinux的访问控制:域(domin)和上下文(context)域:对哪些程序进行限制,上下文:对哪些系统资源进行限制。ps -Z:查看当前进程的域的信息,也就是进程的SELinux信息:ps -ZLABEL PID TTY TIME CMDunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c10232503 pts/0 00:00:00 suunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c10232511 pts/0 00:00:00 bashunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c10233503 pts/0 00:00:00 psls -Z命令我们可以查看文件上下文信息,也就是文件的SELinux信息:ls -Z-rw-------.root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfgdrwxr-xr-x.root root unconfined_u:object_r:admin_home_t:s0 Desktop-rw-r--r--+ root rootsystem_u:object_r:admin_home_t:s0 install.log-rw-r--r--. root rootsystem_u:object_r:admin_home_t:s0 install.log.syslog
SELinux安全性本文:system_u:object_r:admin_home_t,分别为[用户:角色:类型]用户:相当于账号方面的身份识别,SELinux用户。三种常见类型: root:表示root账户身份 user_u:表示普通用户无特权用户 system_u:表示系统进程,通过用户可以确认身份类型,一般搭配角色使用
角色:明确该资源是属于程序、档案资源还是代表使用者,常见: object_r:代表的是档案或目录等档案资源 system_r:代表的就是程序在targeted策略环境中用户的角色一般为system_r。用户的角色类似用户组的概念,不同的角色具有不同的身份权限,一个用户可以具备多个角色,但是同一时间只能使用一个角色。在targeted策略环境下角色没有实质作用,在targeted策略环境中所有的进程文件的角色都是system_r角色
类型:文件和进程都有一个类型,SElinux依据类型的相关组合来限制存取权限。
三者搭配使用的实例:ll -Zd /usr/sbin/httpd /var/www/html-rwxr-xr-x root root system_u:object_r:httpd_exec_t /usr/sbin/httpd drwxr-xr-x root root system_u:object_r:httpd_sys_content_t /var/www/html 两者的角色字段都是object_r,代表都是档案!而httpd 属于httpd_exec_t类型,/var/www/html 则属于httpd_sys_content_t这个类型。httpd属于httpd_exec_t这个可以执行的类型,而/var/www/html则属于httpd_sys_content_t这个可以被 httpd领域(domain)读取的类型。主体程序取得domain与目标档案资源的type的流程:1.首先,触发一个可执行的目标档案,那就是具有httpd_exec_t这个类型的/usr/sbin/httpd档案;2.该档案的类型会让这个档案所造成的主体程序(Subject)具有httpd 这个领域(domain),我们的政策针对这个领域已经制定了讲多规则,其中包括这个领域可以读取的目标资源类型;3.由于httpd domain 被设定为可以读取httpd_sys_content_t这个类型的目标档案(Object),因此你的网页放置到/var/www/html/目录下,就能够被httpd那支程序所读取了;4.但最终能不能读到正确的资料,还得要看rwx 是否符合Linux权限的规范。
5 SELinux的启动、关闭和观察启动SELinux:vim /etc/sysconfig/selinuxSELINUX=enforcingSELINUXTYPE=targetedvim/boot/grub/menu.lst:不能出现selinux=0重启机器:init 6关闭SELinux类似。
6 SELinux问题排除SELinux拒绝某个文件、进程或资源被访问的主要原因有数个:一个被错误标签的文件。
一个进程在错误的SELinux 安全性上下文下运行。
政策出错。某个进程要访问一个在编写政策时意料不到的文件,并产生错误信息。
一个入侵的企图。

日志档是排除任何疑难的关键,而SELinux亦不例外。SELinux缺省会通过Linux审计系统auditd将日志写在/var/log/audit/audit.log内,而该服务缺省为启用的。假若auditd长驻程序并未运行,信息将会被写进/var/log/messages。SELinux的日志都以AVC这个关键字作标签,让grep等程序可轻易地把它们从其它信息中过滤出来。SELinux排除疑难工具是由setroubleshoot组件所提供的:sealert -b
解决前三个问题:1)重新标签文件chcon这个指令可以用来更改一个或多个文件与目录的SELinux安全上下文,正如'chown' 或'chmod'可以用来更改一个文件的拥有者或标准权限。chcon [OPTIONS] CONTEXT FILES ......chcon [OPTIONS] --reference=PEF_FILES FILES ......CONTEXT为要设置的安全上下文FILES 对象(文件)--reference 参照的对象PEF_FILES 参照文件上下文FILES 应用参照文件上下文为我的上下文。
OPTIONS如下:
-f强迫执行
-R,--recursive递归地修改对象的安全上下文
-r,--role=ROLE修改安全上下文角色的配置-t,--type=TYPE修改安全上下文类型的配置
-u,--user=USER修改安全上下文用户的配置-v,--verbose 显示冗长的信息
-l,--range=RANGE修改安全上下文中的安全级别例如:
1.在开启SELinux的ftp服务器中,如果想让你设置的FTP目录可以上传文件的话,SELinux需要设置:chcon -t public_content_rw_t /var/ftp/jay
2.允许用户HTTP访问其家目录,该设定仅限于用户的家目录主页:setsebool -P httpd_enable_homedirs 1chcon -R -t httpd_sys_content_t ~user/public_html
3.ls -Z /html/index.html-rw-r—r--root root user_u:object_r:default_t /html/index/htmlls -Z | grep htmldrwxr-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
chcon -v --type=httpd_sys_content_t /html/index.html
或者:chcon -Rv -t httpd_sys_content_t /html制定自定义规则:semanage fcontext -a -t httpd_sys_content_t “/html(/.*)?”该规则作出永久性、能过渡文件系统重新标签的安全性上下文改动,会将/html以下的一切加入httpd_sys_content_t这个文件上下文类型。
2)撤销缺省的安全性上下文restorecon这个指令可以用来撤消为文件缺省的安全性上下文。设定有位用户在他的主目录内编辑了一个index.html档并将该文件迁移(mv)至DocumentRoot的/var/www/html内。纵使复制(cp)这个指令普遍会沿用目标目录或文件的安全性上下文,迁移(mv)指令则会保留源文件的安全性上下文。我们可以利用chcon这个指令来更改问题文件的安全性上下文,但由于这些文件已经位于Apache缺省的DocumentRoot(/var/www/html)内,我们只须撤消这个目录或文件的安全性上下文即可:restorecon -v /var/www/html/index.html采用restorecon时可以应用-n这个标旗来防止重新标签的行动:restorecon -Rv -n /var/www/html
3)重新标签整个文件系统在启用已停用的SELinux时,或在SELinux政策由缺省的目标型改为严格型时,需要重新标签整个文件系统。要在重新开机后自动将整个文件系统重新标签,请执行:touch /.autorelabelreboot
4)允许访问某个端口SELinux的缺省政策只允许每个服务访问被公认与该服务有关的端口,例如apache对应80端口。要想让apache连接到某个非标准的端口并监听对内的连接:利用semanage这个指令来新增一条规则semanage port -a -t http_port_t -p tcp 81令SELinux完整地列出每个服务可访问的端口:semanage port -l
7 SELinux所需的服务SELinux是整合到内核的一个核心功能,开机完成后,SELinux就启动了,无需其他的服务来帮助其启动。SELinux日志系统所需要的辅助服务:
setroubleshoot:将错误信息写入日志档/var/log/messagesauditd:详细信息写入/var/log/audit/audit.log使用audit2why指令来查看日志内容:audit2why < /var/log/audit/audit.log ——Rango Chen
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息