没有selinux的linux使用自主访问控制,即自己给自己权限,如果某个具有root权限的程序被攻破,那么攻击者就可以为所欲为
有selinux的linux引入了强制访问控制,即使一个程序以root权限运行,它的行为也必须也必须遵守selinux策略规则,他只能访问策略明确允许他访问的文件、端口和资源
selinux是一个极其强大的安全层,虽然在初期可能因为其复杂性给管理员带来调整,但理解其概念和工作原理后,能极大提升系统的整体安全性,生产环境推荐在充分测试后,使其保持在enforcing模式
selinux介绍 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 1.查看文件的安全上下文 ls -Z /etc/passwdsystem_u:object_r:passwd_file_t:s0 /etc/passwd 2.查看进程安全上下文 ps -Z -C sshd LABEL PID TTY TIME CMD system_u:system_r:sshd_t:s0-s0:c0.c1023 924 ? 00:00:00 sshd system_u:system_r:sshd_t:s0-s0:c0.c1023 3897703 ? 00:00:00 sshd unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 3897707 ? 00:00:00 sshd user:role:type [:sensitivity[:category]] user: selinux用户,如system_u,表示系统用户 role: 角色,如object_r代表文件角色,system_r表示进程角色 type : 类型,最常用最重要的部分,selinux的访问控制主要基于进程的type 和文件的type 是否匹配策略规则sensitivity: 可选,敏感度,控制信息机密级别,s0最低,s1-s15逐渐升高 category: 可选,类别,用于细粒度访问控制 大部分情况下只需要关注type 字段 1.Enforcing 强制模式,默认的安全模式,会强制执行,拒绝并记录到日志中 2.Permissive 宽容模式,不会强制执行,但会记录到日志中,主要用于故障排除和策略调试 3.disabled 禁用模式,selinux完全关闭 策略指的是一套预定义的规则,告诉selinux哪个进程的type 可以访问哪个文件夹的type 等。主流Linux发行版都读自带了一套非常完善且严格的预定义策略 1.targeted 目标策略(默认策略) 为与选定的系统服务如httpd ftpd等提供保护,实现安全性和可用性的平衡 2.MLS 多级安全策略 非常复杂和严格,常用于政府、军事等保密性要求高的环境
如何处理selinux引起的问题思路 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 1.检查日志 查看/var/log/audit/audit/log或使用sealert工具 sealert -a /var/log/audit/audit.log 2.临时解决(使用宽容模式分析) 如果问题紧急,可以临时将模式改为permissive,重现问题然后分析日志,找到原因后再改回enforcing 3.永久解决方案 (1)修复文件安全上下文 如果文件被放错了地方或上下文不正确,使用chcon 命令临时修改 或使用restorecon命令恢复为默认上下文 (2)恢复默认上下文 restorecon -Rv file (3)修改布尔值 selinux有很多0 1的开关,可以动态调整,比如允许apache允许家目录 (4)查看布尔值状态 getsebool -a | grep httpd httpd_anon_write --> off httpd_builtin_scripting --> on httpd_can_check_spam --> off httpd_can_connect_ftp --> off httpd_can_connect_ldap --> off httpd_can_connect_mythtv --> off httpd_can_connect_zabbix --> off (5)修改布尔值 setsebool -P httpd_enable_homedirs on (6)自定义策略模块,一般开发搞
selinux工作模式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Memory protection checking: actual (secure) Max kernel policy version: 33 setenforce 0/1 /etc/selinux/config SELINUX=enforcing/permissive/disabled sed -i 's/^SELINUX=.*/SELINUX=permissive' /etc/selinux/config 当从disabled切换为enforcing或permissive时,所有文件都会在第一次重启后重新打标签,但可能会花费很长时间 如果配置文件.autorelabel不存在,系统可能无法正常启动 (所以在进行root密码破解的时候,在修改完密码之后,需要在根目录创建 .autorelabel文件
selinux安全上下文设置 文件/进程安全上下文 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 ls -Z /var/www/html/unconfined_u:object_r:httpd_sys_content_t:s0 index.html ls -Z /var/www/html/ -dsystem_u:object_r:httpd_sys_content_t:s0 /var/www/html/ ps -ef -Z | grep nginx system_u:system_r:spc_t:s0 1001 669148 669121 0 Jan08 ? 00:00:34 /usr/bin/nginx-prometheus-exporter --web.listen-address=:9102 --nginx.scrape-uri=http://192.168.10.100/nginx-status semanage fcontext -l | grep /var/www /var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0 /var/www(/.*)?/logs(/.*)? all files system_u:object_r:httpd_log_t:s0 /var/www/[^/]*/cgi-bin(/.*)? all files system_u:object_r:httpd_sys_script_exec_t:s0 /var/www(/.*)? 所有文件及子目录 /var/www(/.*)?/logs(/.*)? 将log 目录特别拿出来定义另外的安全上下文 1.chcon 临时修改 chcon 用于临时修改上下文,适合测试场景chcon [选项] 目标上下文 文件/目录-t 仅修改type 字段(最常用 -u 修改user字段 -r 修改role字段 -R 递归修改目录及子文件 chcon -t httpd_log_t /var/www/test/access.log2.semanage fcontext + restorecon 永久修改安全上下文 semanage fcontext会将文件、目录的上下文规则写入selinux配置文件 /etc/selinux/targeted/context/files/file_contexts.local restorecon根据文件中的规则,刷新配置 semanage fcontext -a -t httpd_sys_content_t "/var/www/html/test.html restorecon -Rv /var/www/html/test.html
端口的安全上下文 如果进程使用了非默认的端口,比如nginx使用了8080,mysql使用了3307端口,需要手动将端口类型改为进程可以访问的类型http_port_t,否则selinux会阻断进程绑定端口
1 2 3 4 5 6 7 8 9 查看端口安全上下文 semanage port -l | grep mysql mysqld_port_t tcp 1186, 3306, 63132-63164 mysqlmanagerd_port_t tcp 2273 配置端口安全上下文 semanage port -a -t <端口类型> -p 协议 端口号-端口范围 semanage port -m -t <端口类型> -p 协议 端口号-端口范围 semanage port -d -t <端口类型> -p 协议 端口号-端口范围
selinux的布尔值 selinux的布尔值是动态调整selinux策略的开关,无需修改核心配置文件,通过开启和关闭就可以临时或永久调整进程访问权限
在不关闭selinux不修改安全上下文的前提下,快速设备特殊业务场景,避免因策略过严,导致服务异常
selinux布尔值操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 getsebool -a semanage boolean -l setsebool httpd_can_connect_ftp=on setsebool -P httpd_can_connect_ftp=on setsebool -P httpd_can_connect_ftp=on httpd_use_nfs=on 注意点: - 最小权限原则 - 重启服务生效 - 拒绝禁用selinux,遇到问题优先调整布尔值、上下文 - 避免频繁修改,-P会写入配置文件,频繁修改可能导致配置冗余
selinux日志查看工具ausearch 1 2 3 4 5 6 7 8 9 10 11 12 13 14 grep 'type=AVC' /var/log/audit/audit.log ausearch -m avc ausearch -m avc -ts recent ausearch -m avc -ts 14:00 ausearch -m avc -ts "09:00:00" ausearch -m avc -ts 09:00 -te 17:00 ausearch -m avc -c httpd