文章的翻译是专门为课程的学生准备的
在这里,您将获得有关生命、宇宙和 Linux 中一切的重要问题的答案,并且安全性更高。
“一个重要的事实是,事情并不总是像看上去那样,这是常识……”
-道格拉斯·亚当斯, 银河旅行者指南
安全。 可靠性提高。 一致。 政策。 天启四骑士系统管理员。 除了我们的日常任务 - 监控、备份、实施、配置、更新等 - 我们还负责我们系统的安全。 即使是第三方提供商建议我们禁用增强安全性的系统。 感觉就像工作一样
面对这种困境,一些系统管理员决定采取
本着《银河系漫游指南》的精神,这里有 42 个有关控制和使用的重要问题的答案。
1. SELinux 是一个强制访问控制系统,这意味着每个进程都有一个标签。 每个文件、目录和系统对象也有标签。 策略规则控制标记的进程和对象之间的访问。 内核强制执行这些规则。
2. 最重要的两个概念是: 贴/换标 — 标记(文件、进程、端口等)和 类型强制执行 (根据类型将进程彼此隔离)。
3. 正确的标签格式 user:role:type:level
(选修的)。
4. 提供多级安全的目的(多级安全 - MLS)是根据进程(域)将使用的数据的安全级别来管理进程(域)。 例如,秘密进程无法读取绝密数据。
5. 确保多类别安全(多类别安全 - MCS) 保护类似进程免受彼此影响(例如,虚拟机、OpenShift 引擎、SELinux 沙箱、容器等)。
6. 用于在启动时更改 SELinux 模式的内核选项:
autorelabel=1
→ 导致系统运行重新标记selinux=0
→ 内核不加载 SELinux 基础设施enforcing=0
→ 以宽容模式加载
7. 如果您需要重新标记整个系统:
# touch /.autorelabel
#reboot
如果系统标记包含大量错误,您可能需要以宽容模式启动才能成功重新标记。
8. 检查 SELinux 是否已启用: # getenforce
9. 暂时启用/禁用 SELinux: # setenforce [1|0]
10. 检查 SELinux 状态: # sestatus
11. 配置文件: /etc/selinux/config
12. 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
.
13. 许多命令接受参数 -Z
查看、创建和更改上下文:
ls -Z
id -Z
ps -Z
netstat -Z
cp -Z
mkdir -Z
当基于其父目录的上下文创建文件时,会建立上下文(有一些例外)。 RPM 可以在安装过程中建立上下文。
14. SELinux 错误有四个主要原因,在下面的第 15-21 点中有更详细的描述:
- 标签问题
- 因为 SELinux 需要知道一些事情
- SELinux 策略/应用程序错误
- 您的信息可能会被泄露
15. 标签问题:如果您的文件位于 /srv/myweb
标记不正确,访问可能会被拒绝。 以下是解决此问题的一些方法:
- 如果您知道标签:
# semanage fcontext -a -t httpd_sys_content_t '/srv/myweb(/.*)?'
- 如果您知道具有等效标记的文件:
# semanage fcontext -a -e /srv/myweb /var/www
- 恢复上下文(对于两种情况):
# restorecon -vR /srv/myweb
16. 标签问题: 如果您移动文件而不是复制它,该文件将保留其原始上下文。 要解决此问题:
- 使用标签更改上下文命令:
# chcon -t httpd_system_content_t /var/www/html/index.html
- 使用链接标签更改上下文命令:
# chcon --reference /var/www/html/ /var/www/html/index.html
- 恢复上下文(对于两种情况):
# restorecon -vR /var/www/html/
17. 如果 你需要知道的 SELinuxHTTPD 正在侦听端口 8585,告诉 SELinux:
# semanage port -a -t http_port_t -p tcp 8585
18. 你需要知道的 SELinux 布尔值,允许在运行时更改部分 SELinux 策略,而无需知道 SELinux 策略被覆盖。 例如,如果您希望 httpd 发送电子邮件,请输入: # setsebool -P httpd_can_sendmail 1
19. 你需要知道的 SELinux 启用/禁用 SELinux 设置的逻辑值:
- 要查看所有布尔值:
# getsebool -a
- 要查看每个的描述:
# semanage boolean -l
- 设置布尔值:
# setsebool [_boolean_] [1|0]
- 对于永久安装,添加
-P
。 例如:# setsebool httpd_enable_ftp_server 1 -P
20. SELinux 策略/应用程序可能包含错误,包括:
- 不寻常的代码路径
- 配置
- 重定向标准输出
- 文件描述符泄漏
- 可执行内存
- 图书馆建得不好
开放票证(不要向 Bugzilla 提交报告;Bugzilla 没有 SLA)。
21. 您的信息可能会被泄露如果您有受限域尝试:
- 加载内核模块
- 禁用强制 SELinux 模式
- 写给
etc_t/shadow_t
- 更改 iptables 规则
22. 用于开发策略模块的 SELinux 工具:
# yum -y install setroubleshoot setroubleshoot-server
重新启动或重新启动 auditd
安装后。
23. 使用
journalctl
显示与相关的所有日志的列表 setroubleshoot
:
# journalctl -t setroubleshoot --since=14:20
24. 使用 journalctl
列出与特定 SELinux 标签关联的所有日志。 例如:
# journalctl _SELINUX_CONTEXT=system_u:system_r:policykit_t:s0
25. 如果发生 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
26. 日志记录:SELinux 在很多地方记录信息:
- / var / log /消息
- /var/log/audit/audit.log
- /var/lib/setroubleshoot/setroubleshoot_database.xml
27. 日志记录:在审核日志中搜索 SELinux 错误:
# ausearch -m AVC,USER_AVC,SELINUX_ERR -ts today
28. 要查找特定服务的 SELinux 访问向量缓存 (AVC) 消息:
# ausearch -m avc -c httpd
29. 效用 audit2allow
从禁止操作的日志中收集信息,然后生成SELinux权限策略规则。 例如:
- 创建一个人类可读的描述来说明访问被拒绝的原因:
# audit2allow -w -a
- 要查看允许拒绝访问的类型强制规则:
# audit2allow -a
- 要创建自定义模块:
# audit2allow -a -M mypolicy
- 选项
-M
创建具有指定名称的类型强制文件 (.te) 并将规则编译到策略包 (.pp) 中:mypolicy.pp mypolicy.te
- 要安装自定义模块:
# semodule -i mypolicy.pp
30. 要将单独的进程(域)配置为在宽容模式下工作: # semanage permissive -a httpd_t
31. 如果您不再希望该域处于宽松状态: # semanage permissive -d httpd_t
32. 要禁用所有许可域: # semodule -d permissivedomains
33. 启用 MLS SELinux 策略: # yum install selinux-policy-mls
в /etc/selinux/config:
SELINUX=permissive
SELINUXTYPE=mls
确保 SELinux 在宽容模式下运行: # setenforce 0
使用脚本 fixfiles
确保在下次重新启动时重新标记文件:
# fixfiles -F onboot # reboot
34. 创建具有特定 MLS 范围的用户: # useradd -Z staff_u john
使用命令 useradd
,将新用户映射到现有 SELinux 用户(在本例中, staff_u
).
35. 查看SELinux和Linux用户的映射关系: # semanage login -l
36. 为用户定义特定范围: # semanage login --modify --range s2:c100 john
37. 要更正用户的主目录标签(如果需要): # chcon -R -l s2:c100 /home/john
38. 查看当前类别: # chcat -L
39. 要更改类别或开始创建您自己的类别,请按如下方式编辑文件:
/etc/selinux/_<
selinuxtype>
_/setrans.conf
40. 要在特定文件、角色和用户上下文中运行命令或脚本:
# runcon -t initrc_t -r system_r -u user_u yourcommandhere
-t
文件上下文-r
角色背景-u
用户上下文
41. 禁用 SELinux 运行的容器:
- 波德曼:
# podman run --security-opt label=disable …
- 泊坞窗:
# docker run --security-opt label=disable …
42. 如果您需要授予容器对系统的完全访问权限:
- 波德曼:
# podman run --privileged …
- 泊坞窗:
# docker run --privileged …
现在你已经知道答案了。 所以请:不要惊慌并启用 SELinux。
参考文献:
SELinux的 by丹沃尔什 您还可以看到有关 SELinux 策略执行的可视化操作指南 作者:丹·沃尔什为普通人打造的安全增强型 Linux by托马斯·卡梅伦 SELinux 着色书 byMáirínDuffy SELinux 用户和管理员指南 — 红帽企业 Linux 7
来源: habr.com