3.5 SELinux 的工作模式
SELinux 有三种工作模式,分别是:
1. enforcing:强制模式。违反 SELinux 规则的行为将被阻止并记录到日志中。
2. permissive:宽容模式。违反 SELinux 规则的行为只会记录到日志中。一般为调试用。
3. disabled:关闭 SELinux。
SELinux 工作模式可以在 /etc/selinux/config 中设定。
如果想从 disabled 切换到 enforcing 或者 permissive 的话,需要重启系统。反过来也一样。
enforcing 和 permissive 模式可以通过 setenforce 1|0 命令快速切换。
需要注意的是,如果系统已经在关闭 SELinux 的状态下运行了一段时间,在打开 SELinux 之后的第一次重启速度可能会比较慢。因为系统必须为磁盘中的文件创建安全上下文(我表示我重启了大约 10 分钟,还以为是死机了……)。
SELinux 日志的记录需要借助 auditd.service 这个服务,请不要禁用它。
3.6 SELinux 工作流程
这里引用一张图片,不必过多解释。
注:上面的安全文本指的就是安全上下文。
四、SELinux 基本操作
4.1 查询文件或目录的安全上下文
命令基本用法
ls -Z
用法举例
查询 /etc/hosts 的安全上下文。
ls -Z /etc/hosts
执行结果
-rw-r--r--. root root system_u:object_r:net_conf_t:s0 /etc/hosts
4.2 查询进程的安全上下文
命令基本用法
ps auxZ | grep -v grep | grep
用法举例
查询 Nginx 相关进程的安全上下文。
ps auxZ | grep -v grep | grep nginx
执行结果
system_u:system_r:httpd_t:s0 root 7997 0.0 0.0 122784 2156 ? Ss 14:31 0:00 nginx: master process /usr/sbin/nginx
system_u:system_r:httpd_t:s0 nginx 7998 0.0 0.0 125332 7560 ? S 14:31 0:00 nginx: worker process
4.3 手动修改文件或目录的安全上下文
命令基本用法
chcon [...]
选项功能-u 修改安全上下文的用户字段-r 修改安全上下文的角色字段-t 修改安全上下文的类型字段-l 修改安全上下文的级别字段--reference 修改与指定文件或目录相一致的安全上下文-R递归操作-h修改软链接的安全上下文(不加此选项则修改软链接对应文件)
用法举例
修改 test 的安全上下文为 aaa_u:bbb_r:ccc_t:s0。
chcon -u aaa_u -r bbb_r -t ccc_t test
4.4 把文件或目录的安全上下文恢复到默认值
命令基本用法
restorecon [选项] [...]
选项功能-v打印操作过程-R递归操作
用法举例
添加一些网页文件到 Nginx 服务器的目录之后,为这些新文件设置正确的安全上下文。
restorecon -R /usr/share/nginx/html/
4.5 查询系统中的布尔型规则及其状态
命令基本用法
getsebool -a
由于该命令要么查询所有规则,要么只查询一个规则,所以一般都是先查询所有规则然后用 grep 筛选。
用法举例
查询与 httpd 有关的布尔型规则。
getsebool -a | grep httpd
执行结果
httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
#以下省略
4.6 开关一个布尔型规则
命令基本用法
setsebool [选项]
选项功能-P重启依然生效
用法举例
开启 httpd_anon_write 规则。
setsebool -P httpd_anon_write on
4.7 添加目录的默认安全上下文
命令基本用法
semanage fcontext -a -t "(/.*)?"
注:目录或文件的默认安全上下文可以通过 semanage fcontext -l 命令配合 grep过滤查看。
用法举例
为 Nginx 新增一个网站目录 /usr/share/nginx/html2 之后,需要为其设置与原目录相同的默认安全上下文。
semanage fcontext -a -t httpd_sys_content_t "/usr/share/nginx/html2(/.*)?"
4.8 添加某类进程允许访问的端口
命令基本用法
semanage port -a -t -p
注:各种服务类型所允许的端口号可以通过 semanage port -l 命令配合 grep 过滤查看。
用法举例
为 Nginx 需要使用 10080 的端口用于 HTTP 服务。
semanage port -a -t http_port_t -p tcp 10080
五、SELinux 错误分析和解决
5.1 认识 SELinux 日志
当开启了 SELinux 之后,很多服务的一些正常行为都会被视为违规行为(标题及下文中的错误均指违规行为)。
这时候我们就需要借助 SELinux 违规日志来分析解决。
SELinux 违规日志保存在 /var/log/audit/audit.log 中。
/var/log/audit/audit.log 的内容大概是这样的。
type=LOGIN msg=audit(1507898701.391:515): pid=8523 uid=0 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=25 res=1
type=USER_START msg=audit(1507898701.421:516): pid=8523 uid=0 auid=0 ses=25 subj=system_u:system_r:crond_t:s0-s0:c0.c1023 msg='op=PAM:session_open grantors=pam_loginuid,pam_keyinit,pam_limits,pam_systemd acct="root" exe="/usr/sbin/crond" hostname=? addr=? terminal=cron res=success'
...
该文件的内容很多,而且混有很多与 SELinux 错误无关的系统审计日志。我们要借助 sealert 这个实用工具来帮忙分析(如果提示找不到命令的话请安装 setroubleshoot 软件包)。
5.2 使用sealert分析错误
命令基本用法
sealert -a /var/log/audit/audit.log
执行完命令之后,系统需要花一段时间去分析日志中的违规行为并给出分析报告。分析报告的结构讲解请看下图:
浙公网安备 33010602011771号