系统管理员 SELinux 备忘单:42 个重要问题的答案

文章的翻译是专门为课程的学生准备的 《Linux 管理员》.

系统管理员 SELinux 备忘单:42 个重要问题的答案

在这里,您将获得有关生命、宇宙和 Linux 中一切的重要问题的答案,并且安全性更高。

“一个重要的事实是,事情并不总是像看上去那样,这是常识……”

-道格拉斯·亚当斯, 银河旅行者指南

安全。 可靠性提高。 一致。 政策。 天启四骑士系统管理员。 除了我们的日常任务 - 监控、备份、实施、配置、更新等 - 我们还负责我们系统的安全。 即使是第三方提供商建议我们禁用增强安全性的系统。 感觉就像工作一样 伊森·亨特 摘自《碟中谍》。

面对这种困境,一些系统管理员决定采取 蓝色药丸,因为他们认为他们永远不会知道生命、宇宙等大问题的答案。 众所周知,答案是 42。

本着《银河系漫游指南》的精神,这里有 42 个有关控制和使用的重要问题的答案。 SELinux的 在您的系统上。

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。

参考文献:

来源: habr.com

添加评论