☞SELinux
概述
SELinux(Secure Enhanced Linux)是美国国家安全局(NSA)和SCC开发的Linux的一个强制访问控制的安全模块。2000年以GNU GPL发布,Linux内核2.6版本后集成在内核中。它能够限制权限,进程只能访问那些在他的任务中所需要文件。
Selinux是根据最小权限模型去限制进程在对象
(如文件,目录,端口,网络接口等)上的访问或执行其他的操作的权限,这些限制可以在之后根据需要进行修改。简单来说,系统只给主体的基本功能所需要的权限。
举例来说:如果系统上的Apache被发现存在一个漏洞,使得攻击者可以访问系统上的敏感文件(比如 /etc/passwd 来获得系统已存在用户) ,而修复该安全漏洞的 Apache 更新补丁尚未出现。此时 SELinux 可以起到安全效果,因为 /etc/passwd 文件不具有 Apache 的访问标签,所以 Apache 对于 /etc/passwd 的访问会被 SELinux 阻止。因此Selinux能有效的防范0day类的攻击。
Tips:0day漏洞,是已经被发现(有可能未被公开),而官方还没有相关补丁的漏洞。
【注意】:SELinux是在标准Linux基础上增加了类型强制(TE: Type Enforcement),这就意味着标准Linux和SELinux访问控制都必须满足才能能访问一个对象,例如:如果我们对某个文件有SELinux写入权限,但没有该文件的w许可,那么也不能写该文件
标准Linux | SELinux | |
---|---|---|
进程 | 真实有效的用户和组ID | 安全上下文 |
文件 | 访问列表、文件用户和组ID | 安全上下文 |
访问控制基础 | 进程用户/组ID和文件的访问模式,此访问模式基于文件的用户/组ID | 在进程类型和文件类型之间允许的许可 |
了解SELinux
DAC、MAC
Linux 上传统的访问控制标准是自主访问控制(DAC),如果一个用户被授权允许访问,意味着程序也被授权访问,那么恶意程序也将有同样的访问权。 DAC最根本的弱点是主体容易受到多种多样的恶意软件的攻击,使得恶意程序控制系统。
强制访问控制(MAC)是基于策略规则决定控制的严格程度,策略被用来定义被限制的进程能够使用哪些资源,默认情况下,没有被明确允许的行为将被拒绝。
只有同时满足了【标准Linux访问控制】和【SELinux访问控制】时,主体才能访问对象
安全上下文
存放在Inode的扩展属性域的安全元素控制
对象
的访问所有文件和端口资源和进程都具备安全标签即安全上下文(security context)
USER:ROLE:TYPE[LEVEL[:CATEGORY]]
USER:类似Linux系统中的UID,提供身份识别,用来记录身份
• user_u :普通用户登录系统后的预设,在targeted policy中users不是很重要
• system_u :开机过程中系统进程的预设
• root :root 登录后的预设
ROLE:对象的角色
• 文件、目录和设备的role:通常是 object_r;
• 程序的role:通常是 system_r;
• 用户的role:targeted policy为system_r
• • 用户role类似系统中的GID,不同角色具备不同的的权限
• • 用户可以具备多个role,但是同一时间内只能使用一个role
TYPE:给subject和object划分为不同的组,给每个主体和系统中的客体定义一个类型;为进程运行提供最低的权限环境;
• type是SElinux security context 中最重要的信息,是 SELinux Type Enforcement的核心,预设值以 _t 结尾
• 当一个TYPE与执行中的进程
相关联时,其type也称为domain,Domain标签能够执行的操作由安全策略里定义。
• 当一个文件为多服务共用时,其type为public_content_t
LEVEL:定义层次和分类,只用于mls策略中
• LEVEL:代表安全等级,默认为s0目前已经定义的安全等级为s0-s15,等级越来越高
• CATEGORY:代表分类,如FBI Secret,NSA secret,目前已经定义的分类为c0-c1023实际上下文
存放在文件系统中
ls -Z #检查文件、目录的安全上下文
ps -Z #检查进程的安全上下文,如 ps -eo user,label,pid,comm 或 ps axo …
id -Z #显示了你的shell的安全上下文期望上下文(默认):存放在二进制的SELinux策略库中
semanage fcontext -l文件的Security Contex规则
• rpm包安装的:会根据rpm包内记录来生成安全上下文;
• 手动创建的文件:会根据policy中规定的来设置安全上下文,如default_t;
• cp:会重新生成安全上下文;
• mv:安全上下文则不变;SELinux工作流程
当一个subject(进程)试图访问一个object(文件),Kernel中的策略执行服务器将检查AVC (访问矢量缓存Access Vector Cache), 在AVC中,subject和object的权限被缓存(cached),如果基于AVC中的数据不能做出决定,则请求安全服务器,安全服务器查找“应用+文件”的安全环境。然后根据查询结果允许或拒绝访问,拒绝日志在/var/log/messages
中SElinux 的状态
Enforcing(强制模式):越权行为会被记录并且会被强制拒绝。
Permissive(宽容模式):越权行为只会被记录,不会被拒绝。
Disabled(关闭):禁用Selinux,访问不受控制;
工作模式
strict: centos5,每个进程都受到selinux的控制
targeted: 用来保护常见的网络服务,仅有限进程受到selinux控制,只监控容易被入侵的进程,rhel4只保护13个服务,rhel5保护88个服务
minimum:centos7,修改过的targeted,只对选择的网络服务
mls:提供MLS(多级安全)机制的安全性
minimum和mls稳定性不足,未加以应用
配置SELinux
Selinux伪文件系统
/selinux目录,这是一个伪文件系统,存放策略文件,类似于/proc 目录,我们不需要操作它
Selinux的配置文件
/boot/grub/grub.conf
使用参数selinux=0禁用SELinux/etc/sysconfig/selinux = /etc/selinux/config
SELINUX={enforcing|permissive|disabled}
SELINUXTYPE={targeted|mls}如果需要修改文件和目录的 SELinux 类型属性时可以使用三个命令:chcon、semanage fcontext 和 restorecon 命令 。说明:使用 chcon 对文件的类型进行重新标识,重启系统时将不保留标识。对于文件类型的永久性改变,需要采用 semanage 命令。
查看当前SELinux信息
getenforce #查看Current mode
setenforce 0|1 #0: 设置为permissive,1: 设置为enforcing
sestatus -v #查看status、Current mode、file mode、关键进程Process context(Init,mingetty,sshd)、关键文件File contexts(passwd,shadow,login,bash,agetty)
chcon – change file SELinux security context
chcon [OPTION]… [-u USER] [-r ROLE] [-t TYPE] FILE…
chcon [OPTION]… –reference=RFILE FILE…
-R:递归
CentOS系统自带的chcon工具只能修改文件、目录的安全标签,不能修改端口进行修改
restorecon – restore file(s) default SELinux security contexts.
restorecon[-R] /path/file #根据现有的策略库进行还原,通过chcon修改的type将被还原
semanage – SELinux Policy Management tool
yum -y install policycoreutils-python
管理文件的安全上下文(主要是Type)
【查看】semanage fcontext -l
• semanage fcontext -l | grep ‘/var/www’ 查看 /var/www 目录的上下文
【增加】semanage fcontext -a -t httpd_sys_content_t ‘/website(/.*)?’
【删除】semanage fcontext -d -t Type ‘target’
• semanage fcontext -d -t httpd_sys_content_t ‘/website(/.*)?’管理端口的安全上下文
【查看】semanage port -l
• semanage port -l | grep -w ‘22’
• semanage port -l | grep ‘http’
【增加】semanage port -a -t port_label-p tcp|udp PORT
• semanage port -a -t http_port_t -p tcp 8520
【删除】semanageport -d -t port_label-p tcp|udp PORT
• semanage port -d -t http_port_t -p tcp 8520
【修改】semanageport -m -t port_label-p tcp|udp PORT
• semanageport -m -t http_port_t-p tcp 8520 #把已经存在的端口给http管理boolean值
【查看】getsebool [-a] [boolean] #off还是on
• semanage boolean -l #(current , default),有一句简单的描述
• semanage boolean -l | grep httpd_enable_homedirs
• semanage boollean -l -C #修改过的布尔值
• getsebool -a | grep httpd_enable_homedirs
• getsebool httpd_enable_homedirs【设置】setsebool[-P] BOOLEAN [on|off]
• setsebool httpd_enable_homedirs on #重启丢失
• setsebool -P httpd_enable_homedirs on #永久生效,修改default日志管理
通过分析日志找到问题,并根据提示修改SELinux的设置
安全审计日志 /var/log/audit/audit.log #包含了SELinux的错误信息
系统整体日志 /var/log/messages
日志分析工具安装
yum install setroublesshoot*(重启生效)图形化的分析工具
命令行分析工具
• grep ‘setroubleshoot’ /var/log/messages
• sealert-l UUID #复制messages中的run 后面的sealert -l xxxx到shell执行
• sealert-a /var/log/audit/audit.log #扫描分析审计日志中的SELinux信息,列出问题和解决办法SELinux的常见警告类型和解决办法
标签错误
SELinux 的核心概念就是label
,无论是文件系统、目录、文件、文件描述符、端口、消息接口还是网络接口,一切对象都被贴上了标签,主体只能访问功能所需的对象。如 apache 进程被黑客入侵且取得了 uid=0 的管理员权限,但是SELinux策略限制了apache 所能访问的对象。
SELinux 弹出标签类型的警告可以使用图形化的 sealert 工具查看,根据提示解决问题。也可以在系统日志中过滤 setroubleshoot 找到问题,根据执行 sealert -l UUID获得解决办法,或者sealert -a 扫描 audit.log 审计日志,也可以找到解决办法。
布尔值错误
SELinux 策略中记录了许多程序的默认运行范围,并且只赋予了基本功能所需的权限。当我们开启了程序的其他功能时,如打开 apache 访问私人网站的功能,SELinux会限制 boolen 为 off 的越权行为。
Apache 能够进入用户的网站目录,但是无法访问文件内容,SELinux 会在系统日志中记录相应的问题,并给出解决办法。
SELinux 策略或引用程序配置有问题
如果你没有修改过程序的配置却 SELinux 的警告,原因可能是 SELinux 策略有问题,这时可以查看系统日志或审计日志,使用 sealert 工具进行分析。
万般无奈之下可以 setenforce 0 停止 SELinux
也可以只对某个进程不启用 SELinux ,执行 semanage permissive -a httpd_t 则对httpd进程不启用 SELinux
程序被入侵
SELinux 并非入侵检测系统,所以目前 SELinux 除错工具无法主动的甄别出入侵企图,不过当您发现警告内容包含有如下特征时,很有可能对应进程已被黑客攻破了:
尝试关闭 SELinux (/etc/selinux) 或者设定某个 SELinux 布尔值;
尝试载入内核模块、写入内核目录或者引导器镜像;
尝试读取 shadow_t 标签的文件,如 /etc/passwd 那里通常包含了用户信息;
尝试覆盖写入日志文件;
尝试连接不需要的随机端口或者邮件端口;
SELinux下配置Apache服务
SELiniux给httpd定义的文件Type
httpd_sys_content_t 定义http主体可以访问/var/www(/.*)? 目录及其文件,创建的文件或复制到的 /var/www/html的文件都有httpd_sys_content_t 类型的标记
httpd_sys_script_exec_t 主要用于设置 /var/www/cgi-bin/ 目录下的 cgi 脚本
httpd_sys_content_rw_t 使用 httpd_sys_content_rw_t 的类型标签读取和写脚本标记文件 httpd_sys_script_exec_t 的类型
httpd_sys_content_ra_t 使用 httpd_sys_content_ra_t 的类型标签将读取和附加标记的脚本文件 httpd_sys_script_exec_t 类型
修改 DocumentRoot 到 /website
查看默认的上下文
semanage fcontext -l | grep '/var/www'
显示/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0修改配置文件 /website 作为DocumentRoot
vi /etc/httpd/conf/httpd.conf
编辑DocumentRoot “/website”
【测试】:访问显示错误页面给 /website 目录增加httpd进程可访问的安全标签
chcon -Rv -t httpd_sys_content_t '/website'
#一次性生效,立即生效chcon -Rv --reference /var/www/html /website
#参考原来的设置,一次性生效,在这种情况下,执行restorecon
-R 命令将恢复为default_t 的标签semanage fcontext -a -t httpd_sys_content_t '/website(/.*)?'
再restorecon -Rv /website/
#此时 http 的标签已经是默认标签了,无需重启就生效了,访问也能正常显示小结:SELinux限制了httpd进程可以访问的静态页面路径必须包含 httpd_sys_content_t 标签,否则修改了DocumentRoot设置将导致httpd不可访问
让 Apache 侦听非标准端口
查看允许的端口
semanage prot -l | grep http
显示http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000修改conf文件默认侦听的端口
vim /etc/httpd/conf/httpd.conf
修改Listen 8520
【测试】httpd服务启动失败,错误提示没有权限使用该端口,如果是图形界面也会有相应的SELinux警报显示SELinux策略添加httpd可访问的端口
semanage port -a -t http_port_t -p tcp 8520
#增加httpd的端口
查看semanage prot -l | grep http
显示http_port_t tcp 8520, 80, 81, 443, 488, 8008, 8009, 8443, 9000再次启动httpd服务并测试能否访问:
允许 Apache 访问创建私人网站
若是希望用户可以通过在 ~user/public_html/ 放置文件的方式创建自己的个人网站的话,那么需要在 Apache 策略中允许该操作执行
用户自己创建 ~/public_html 目录
alice] echo “alice’s test page” > ~/public_html/index.html修改conf文件,打开UserDir的访问
vi /etc/httpd/conf/httpd.conf
注释掉UserDir disabled
打开#UserDir public_html
【测试1】不给 apache 账户public_html 目录的访问权限,即不满足 DAC的条件增加 ~alice 访问控制权限,或 other 的 x 权限
setfacl -m u:apache:x ~alice
【测试2】给apache用户 ~alice 目录的访问权限,根据umask值public_html是可以被访问的。此时的结果表明httpd进程已经能够进入 ~alice/public_html/ 目录,但是访问不了网页文件,SELinux也有相应的报警,此时只满足DAC的条件修改SELinux的httpd_enable_homedirs布尔值
查看当前开关getsebool -a | grep httpd_enable_h
打开开关setsebool httpd_enable_homedirs on
【测试3】此时同时满足DAC和MAC条件,即apache用户可以访问 public_html 目录且SELinux允许httpd访问pbulic_html小结:httpd只有同时满足【标准Linux访问控制】【SELinux访问控制】的条件才能访问一个对象。
Apache 的其他SELinux布尔量
• allow_httpd_anon_write 禁用时这个布尔变量允许的 httpd 到只有标记文件 public_content_rw_t 类型的读取访问。启用此布尔变量将允许的 httpd 写入到文件标记与一个公共文件目录包 含一个公共文件传输服务,如 public_content_rw_t 类型。
• allow_httpd_mod_auth_pam 启用此布尔变量允许 mod_auth_pam 模块访问 httpd。
• allow_httpd_sys_script_anon_write 这个布尔变量定义 HTTP 脚本是否允许写访问到文件标记在一个公共文件传输服务 public_content_rw_t 类型。
• httpd_builtin_scripting 这个布尔变量定义 httpd 的脚本的访问。在这个布尔变量启用,往往需要为 PHP 内容。
• httpd_can_network_connect 禁用时这个布尔变量防止从网络或远程端口发起连接的 HTTP 脚本和模块。打开这个布尔变量允许这种访问。
• httpd_can_network_connect_db 禁用时这个布尔变量防止发起一个连接到数据库服务器的 HTTP 脚本和模块。打开这个布尔变量允许这种访问。
• httpd_can_network_relay 打开这个当布尔变量的 httpd 正在使用正向或反向代理。
• httpd_can_sendmail 禁用时这个布尔变量防止发送邮件的 HTTP 模块。这可以防止垃圾邮件的攻击漏洞中发现的 httpd。打开这个布尔变量允许 HTTP 模块发送邮件。
• httpd_dbus_avahi 关闭时这个布尔变量拒绝服务的 avahi 通过 D-BUS 的 httpd 访问。打开这个布尔变量允许这种访问。
• httpd_enable_cgi 禁用时这个布尔变量防止 httpd 的执行 CGI 脚本。打开这个布尔变量让 httpd 的执行 CGI 脚本。
• httpd_enable_ftp_server 开放这个布尔变量会容许的 httpd 作为 FTP 服务器的 FTP 端口和行为。
• httpd_enable_homedirs 禁用时这个布尔变量阻止访问用户主目录的 httpd。打开这个布尔变量允许 httpd 访问用户主目录。
• httpd_execmem 启用时这个布尔变量允许 httpd 的执行程序需要的内存地址。建议不要启用这个布尔变量从安全角度来看,因为它减少了对缓冲区溢出,但是某些模块和应用程序(如 Java 和 Mono 应用)的保护需要这种特权。
• httpd_ssi_exec 这个布尔变量定义服务器端包含(SSI)的网页中的元素是否可以执行。
• httpd_tty_comm 这个布尔变量定义的 httpd 是否被允许访问的控制终端。这种访问通常是不需要的,但是,如配置 SSL 证书文件的情况下,终端访问所需的显示和处理一个密码提示。
• httpd_use_cifs 打开这个布尔变量允许 httpd 访问 CIFS 文件系统上标记的文件,如通过 Samba 挂载的文件系统,cifs_t 类型。
• httpd_use_nfs 打开这个布尔变量允许 httpd 访问 NFS 文件系统上的标记文件 nfs_t 类型,如文件系统,通过 NFS 挂载。
获取帮助
[root@cent6]~>yum install selinux-policy-doc [root@cent6]~>makewhatis [root@cent7]~>yum install selinux-policy-devel [root@cent7]~>mandb [root@cent7]~>man -k _selinux httpd_php_selinux (8) - Security Enhanced Linux Policy for the httpd_ph... httpd_rotatelogs_selinux (8) - Security Enhanced Linux Policy for the h... httpd_selinux (8) - Security Enhanced Linux Policy for the httpd pro... httpd_suexec_selinux (8) - Security Enhanced Linux Policy for the httpd... httpd_sys_script_selinux (8) - Security Enhanced Linux Policy for the h... [root@cent7]~>man 8 httpd_selinux
以上是对 SELinux 功能和基本配置的介绍,对于 Linux 系统的网络服务,如 Apache 、Smaba、NFS、vsftp、MySQL、Bind DNS 服务等都受到SELinux 策略的严格限制,SELinux 仅开放了最基本的运行需求,当这些服务进程需要访问更多的对象时需要配置 SELinux 策略。至于连接外部网络、运行脚本、访问用户目录、共享文件等,必须经过一定的 SELinux 策略调整才能充分发挥网络服务器的作用。
很多用户一直觉得 SELinux 的安全级别设置十分麻烦,因此有人装完系统就禁用 SELinux 但这是不安全的行为。因此系统管理员要权衡易用性和安全性的关系,在不同应用场景达到二者的平衡。
原创文章,作者:helloc,如若转载,请注明出处:http://www.178linux.com/47463
评论列表(1条)
写的不错,赞一个。