“事物并不总是像它们看起来那样,这是一个重要且流行的事实……”
—道格拉斯·亚当斯,《银河系漫游指南》
安全。加固。合规性。策略。系统管理员启示录的四骑士。除了我们的日常任务——监控、备份、实施、调整、更新等等——我们还负责保护我们的系统安全。即使是那些第三方提供商告诉我们禁用增强安全性的系统。这似乎是《碟中谍》伊森·亨特的工作。
面对这种困境,一些系统管理员决定服用蓝色药丸,因为他们认为他们永远不会知道关于生命、宇宙和一切其他重大问题的答案。而且,正如我们都知道的,那个答案是42。
本着《银河系漫游指南》的精神,这里有关于管理和使用 SELinux 系统的 42 个常见问题解答。
- SELinux 是一个标签系统,这意味着每个进程都有一个标签。每个文件、目录和系统对象都有一个标签。策略规则控制标记进程和标记对象之间的访问。内核强制执行这些规则。
- 两个最重要的概念是:标签(文件、进程、端口等)和类型强制(根据类型将进程彼此隔离)。
- 正确的标签格式是
user:role:type:level
(可选)。
- 多级安全 (MLS) 强制执行的目的是根据进程将要使用的数据的安全级别来控制进程(域)。例如,秘密进程不能读取绝密数据。
- 多类别安全 (MCS) 强制执行保护相似的进程彼此隔离(如虚拟机、OpenShift gears、SELinux 沙箱、容器等)。
- 用于在启动时更改 SELinux 模式的内核参数
autorelabel=1
→ 强制系统重新标记selinux=0
→ 内核不加载 SELinux 基础设施的任何部分enforcing=0
→ 以 permissive 模式启动
- 如果您需要重新标记整个系统
# touch /.autorelabel # reboot
如果系统标签包含大量错误,您可能需要在 permissive 模式下启动,以便 autorelabel 成功。
-
检查 SELinux 是否已启用
# getenforce
-
临时启用/禁用 SELinux
# setenforce [1|0]
-
SELinux 状态工具
# sestatus
-
配置文件
/etc/selinux/config
- SELinux 是如何工作的?这是一个 Apache Web 服务器的标签示例
- 二进制文件:
/usr/sbin/httpd
→httpd_exec_t
- 配置目录:
/etc/httpd
→httpd_config_t
- 日志文件目录:
/var/log/httpd
→httpd_log_t
- 内容目录:
/var/www/html
→httpd_sys_content_t
- 启动脚本:
/usr/lib/systemd/system/httpd.service
→httpd_unit_file_d
- 进程:
/usr/sbin/httpd -DFOREGROUND
→httpd_t
- 端口:
80/tcp, 443/tcp
→httpd_t, http_port_t
- 二进制文件:
在 httpd_t
上下文中运行的进程可以与带有 httpd_something_t
标签的对象交互。
- 许多命令接受参数
-Z
来查看、创建和修改上下文ls -Z
id -Z
ps -Z
netstat -Z
cp -Z
mkdir -Z
上下文在创建文件时根据其父目录的上下文设置(有一些例外)。RPM 可以将上下文设置为安装的一部分。
- SELinux 错误有四个主要原因,在下面的第 15-21 项中进一步解释
- 标签问题
- SELinux 需要知道的东西
- SELinux 策略/应用程序中的错误
- 您的信息可能已泄露
- 标签问题:如果您的
/srv/myweb
中的文件未正确标记,则访问可能会被拒绝。以下是一些修复方法- 如果您知道标签
# semanage fcontext -a -t httpd_sys_content_t '/srv/myweb(/.*)?'
- 如果您知道带有等效标签的文件
# semanage fcontext -a -e /srv/myweb /var/www
- 恢复上下文(对于两种情况)
# restorecon -vR /srv/myweb
- 如果您知道标签
- 标签问题:如果您移动文件而不是复制它,则该文件会保留其原始上下文。要修复这些问题
-
使用标签更改上下文命令
$ sudo chcon -t httpd_system_content_t /var/www/html/index.html
-
使用参考标签更改上下文命令
$ sudo chcon --reference /var/www/html/ /var/www/html/index.html
-
恢复上下文(对于两种情况)
$ sudo restorecon -vR /var/www/html/
-
-
如果 SELinux 需要知道 HTTPD 监听端口 8585,请告诉 SELinux
$ sudo semanage port -a -t http_port_t -p tcp 8585
-
SELinux 需要知道布尔值允许在运行时更改 SELinux 策略的部分,而无需任何 SELinux 策略编写知识。例如,如果您希望 httpd 发送电子邮件,请输入
$ sudo setsebool -P httpd_can_sendmail 1
- SELinux 需要知道布尔值只是 SELinux 的开关设置
- 查看所有布尔值:
# getsebool -a
- 查看每个布尔值的描述:
# semanage boolean -l
- 设置布尔值执行:
# setsebool [_boolean_] [1|0]
- 要永久配置它,请添加
-P
。例如
# setsebool httpd_enable_ftp_server 1 -P
- 查看所有布尔值:
- SELinux 策略/应用程序可能存在错误,包括
- 不寻常的代码路径
- 配置
stdout
重定向- 泄露的文件描述符
- 可执行内存
- 构建不良的库
- 如果您有受限域尝试执行以下操作,则您的信息可能已泄露
- 加载内核模块
- 关闭 SELinux 的强制模式
- 写入
etc_t/shadow_t
- 修改 iptables 规则
- 用于开发策略模块的 SELinux 工具
$ yum -y install setroubleshoot setroubleshoot-server
安装后重新启动或重启
auditd
。
- 使用
journalctl
列出与setroubleshoot
相关的所有日志
$ sudo journalctl -t setroubleshoot --since=14:20
- 使用
journalctl
列出与特定 SELinux 标签相关的所有日志。例如
$ sudo journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0
-
当发生 SELinux 错误时,使用
setroubleshoot
日志并提出一些可能的解决方案。例如,来自journalctl
Jun 14 19:41:07 web1 setroubleshoot: SELinux is preventing httpd from getattr access on the file /var/www/html/index.html. For complete message run: sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e # sealert -l 12fd8b04-0119-4077-a710-2d0e0ee5755e SELinux is preventing httpd from getattr access on the file /var/www/html/index.html. ***** Plugin restorecon (99.5 confidence) suggests ************************ If you want to fix the label, /var/www/html/index.html default label should be httpd_syscontent_t. Then you can restorecon. Do # /sbin/restorecon -v /var/www/html/index.html
- 日志记录:SELinux 在各处记录信息
/var/log/messages
/var/log/audit/audit.log
/var/lib/setroubleshoot/setroubleshoot_database.xml
-
日志记录:在审计日志中查找 SELinux 错误
$ sudo ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today
-
搜索特定服务的 SELinux 访问向量缓存 (AVC) 消息
$ sudo ausearch -m avc -c httpd
audit2allow
实用程序从被拒绝操作的日志中收集信息,然后生成 SELinux 策略允许规则。例如- 生成关于访问被拒绝原因的人类可读描述:
# audit2allow -w -a
- 查看允许被拒绝访问的类型强制规则:
# audit2allow -a
- 创建自定义模块:
# audit2allow -a -M mypolicy
-M
选项创建一个带有指定名称的类型强制文件 (.te),并将规则编译成策略包 (.pp):mypolicy.pp mypolicy.te
- 安装自定义模块:
# semodule -i mypolicy.pp
- 生成关于访问被拒绝原因的人类可读描述:
- 将单个进程(域)配置为以 permissive 模式运行:
# semanage permissive -a httpd_t
- 如果您不再希望域处于 permissive 模式:
# semanage permissive -d httpd_t
-
禁用所有 permissive 域
$ sudo semodule -d permissivedomains
-
启用 SELinux MLS 策略
$ sudo yum install selinux-policy-mls
在
/etc/selinux/config:
中:SELINUX=permissive SELINUXTYPE=mls
确保 SELinux 以 permissive 模式运行
$ sudo setenforce 0
使用
fixfiles
脚本以确保在下次重启时重新标记文件$ sudo fixfiles -F onboot $ sudo reboot
-
创建具有特定 MLS 范围的用户
$ sudo useradd -Z staff_u tux
使用
useradd
命令,将新用户映射到现有的 SELinux 用户(在本例中为staff_u
)。
-
查看 SELinux 用户和 Linux 用户之间的映射
$ sudo semanage login -l
-
为用户定义特定范围
$ sudo semanage login --modify --range s2:c100 tux
-
更正用户主目录上的标签(如果需要)
$ sudo chcon -R -l s2:c100 /home/tux
-
列出当前类别
$ sudo chcat -L
-
要修改类别或开始创建自己的类别,请按如下方式修改文件
/etc/selinux/_<selinuxtype>_/setrans.conf
-
在特定文件、角色和用户上下文中运行命令或脚本
$ sudo runcon -t initrc_t -r system_r -u user_u yourcommandhere
- -t 是文件上下文
- -r 是角色上下文
- -u 是用户上下文
- 禁用 SELinux 的容器运行
- 使用 Podman:
# podman run --security-opt label=disable …
- 使用 Docker:
# docker run --security-opt label=disable …
- 使用 Podman:
- 如果您需要为容器提供对系统的完全访问权限
- 使用 Podman:
# podman run --privileged …
- 使用 Docker:
# docker run --privileged …
- 使用 Podman:
有了这些,您已经知道答案了。所以请:不要惊慌,并开启 SELinux。
5 条评论