ls -Zd /# system_u:object_r:root_t:s0 /
ls -Z /# system_u:object_r:bin_t:s0 bin# system_u:object_r:boot_t:s0 boot# system_u:object_r:default_t:s0 data
ps -Zaux | grep systemd-udevd# system_u:system_r:udev_t:s0-s0:c0.c1023 root 565 0.0 0.1 36964 15172 ? Ss Mar17 0:01 /usr/lib/systemd/systemd-udevd
:)进行字段分隔,各字段含义如下:字段 | 含义 |
system_u | SELinux 用户 |
object_r | 角色 |
root_t | 类型 |
s0 | 灵敏度等级 |
object_r(代表文件或目录),system_r(代表进程)。lowlevel-highlevel,如果级别相同,则写为 s0(同 sensitivity)。每个级别都是一个灵敏度类别对,类别是可选的。如果有类别,则级别写为 sensitivity:category-set。如果没有类别,则写为 sensitivity。# 安装某个包sudo dnf install <package># 查看已安装的包rpm -q <package>
ls),都会报错。sestatus 指令查看 SELinux 策略类型,示例如下:sestatus# SELinux status: enabled# SELinuxfs mount: /sys/fs/selinux# SELinux root directory: /etc/selinux# Loaded policy name: targeted # 当前策略类型# Current mode: enforcing # 当前运行模式是 enforcing 模式
/etc/selinux/config 文件进行修改,它控制 SELinux 工作模式和策略类型。selinux=0。getenforce 指令进行简明查看,如果想要获取更多信息,可以使用 sestatus 指令查看。getenforce# Enforcing
setenforce 指令可以便捷地实现 permissive、enforcing 模式间的切换,但不能实现 disabled 模式的切换。# 切换成宽容模式setenforce 0# 切换成强制模式setenforce 1
/etc/selinux/config 配置文件,可以实现 disabled、permissive、enforcing 三种模式自由切换。fixfiles -F onbootreboot
seinfo 指令可以查询具体包含哪些规则。seinfo -b# Conditional Booleans: 247# allow_domain_fd_use# allow_ftpd_full_access# ...
getsebool/setsebool 指令分别查看、设置该规则的开启状态。# 查看所有布尔值getsebool -a# 查看指定布尔值getsebool httpd_can_network_connect# 设置布尔值(临时生效)setsebool httpd_can_network_connect on# 设置布尔值(永久生效,写入策略)setsebool -P httpd_can_network_connect on
seinfo 命令,可以查询相关策略规则的名称,但如果想要知道规则的具体内容,就需要使用 sesearch 命令了。# 查看所有允许的规则sesearch --allow# allow NetworkManager_dispatcher_ddclient_t init_t:service status;# allow NetworkManager_dispatcher_ddclient_t init_t:system status;# allow NetworkManager_dispatcher_ddclient_t init_t:unix_stream_socket sendto;
semanage 是一个功能强大的指令,包括但不限于 SELinux 用户查询、用户管理、映射关系查询、规则查询、上下文查询等等。# 查看登录账户和 SELinux 用户映射关系sudo semanage login -l# 查看 SELinux 用户和角色映射关系sudo semanage user -l# 查询规则(布尔值)sudo semanage boolean -l# 安全上下文查询sudo semanage fcontext -l
getsebool 命令查看当前布尔值状态:# 查看所有布尔值及其状态getsebool -a# 查看指定布尔值getsebool httpd_can_network_connect# httpd_can_network_connect --> off
semanage boolean -l 可以查看布尔值的详细说明(包括默认值和当前值):sudo semanage boolean -l | grep httpd# httpd_can_network_connect (off , off) Allow httpd to network connect# httpd_can_network_connect_db (off , off) Allow httpd to network connect db# httpd_enable_cgi (on , on) Allow httpd to enable cgi
setsebool 命令设置布尔值:# 临时设置(重启后失效)setsebool httpd_can_network_connect on# 永久设置(写入策略文件,重启后仍生效)setsebool -P httpd_can_network_connect on
-P 选项会将修改写入策略文件,可能需要几秒钟时间。不加 -P 则仅对当前运行时生效,重启后恢复默认。布尔值 | 说明 |
httpd_can_network_connect | 允许 httpd 发起网络连接 |
httpd_can_network_connect_db | 允许 httpd 连接数据库端口 |
httpd_enable_cgi | 允许 httpd 执行 CGI 脚本 |
httpd_read_user_content | 允许 httpd 读取用户家目录内容 |
httpd_unified | 允许 httpd 统一访问所有 httpd 类型的文件 |
ftp_home_dir | 允许 vsftpd 访问用户家目录 |
nfs_export_all_rw | 允许 NFS 共享读写访问 |
samba_enable_home_dirs | 允许 Samba 共享用户家目录 |
ssh_sysadm_login | 允许 sshd 直接登录为 sysadm_t |
use_nfs_home_dirs | 允许使用 NFS 挂载的家目录 |
chcon 命令用于临时修改文件或目录的安全上下文,该修改在文件系统重新标签(relabel)或执行 restorecon 后会恢复为默认值。# 修改文件的类型chcon -t httpd_sys_content_t /var/www/html/index.html# 递归修改目录及其子文件的类型chcon -R -t httpd_sys_content_t /var/www/html/# 修改文件的完整上下文(用户:角色:类型)chcon system_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html# 查看修改结果ls -Z /var/www/html/index.html# system_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
restorecon 命令用于将文件或目录的安全上下文恢复为策略中定义的默认值。# 恢复单个文件的默认上下文restorecon -v /var/www/html/index.html# 递归恢复目录下所有文件的默认上下文restorecon -Rv /var/www/html/# 强制重新标签(忽略现有标签)restorecon -R -F /var/www/html/
semanage fcontext 命令用于永久修改文件或目录的默认安全上下文。修改后需要执行 restorecon 使其生效。# 添加新的文件上下文规则sudo semanage fcontext -a -t httpd_sys_content_t "/custom/web(/.*)?"# 修改已存在的文件上下文规则sudo semanage fcontext -m -t httpd_sys_content_t "/custom/web(/.*)?"# 使规则生效restorecon -Rv /custom/web/# 查看自定义的文件上下文规则sudo semanage fcontext -l | grep /custom/web# 删除文件上下文规则sudo semanage fcontext -d "/custom/web(/.*)?"
semanage fcontext 添加的规则存储在 /etc/selinux/targeted/contexts/files/ 目录下的策略文件中,重启后依然有效。路径匹配使用正则表达式,(/.*)? 表示匹配该目录及其所有子内容。semodule 命令可以管理这些策略模块。# 列出所有已安装的模块semodule -l# 查看模块数量semodule -l | wc -l
# 安装一个策略模块sudo semodule -i mymodule.pp
# 移除一个策略模块sudo semodule -r mymodule
# 升级策略模块sudo semodule -u mymodule.pp# 重新加载所有模块sudo semodule -R# 构建并安装模块(结合 semodule_compile)# 通常先使用 checkmodule 和 semodule_package 编译 .te 文件checkmodule -M -m -o mymodule.mod mymodule.tesemodule_package -o mymodule.pp -m mymodule.modsudo semodule -i mymodule.pp
.te(Type Enforcement)文件开始,经过 checkmodule 编译为 .mod 文件,再通过 semodule_package 打包为 .pp 文件,最后通过 semodule -i 安装。# 查看审计日志中的 AVC 拒绝消息sudo ausearch -m AVC -ts recent# 实时监控 AVC 拒绝消息sudo tail -f /var/log/audit/audit.log | grep AVC# 使用 ausearch 查看最近的 SELinux 拒绝sudo ausearch -m AVC,USER_AVC -ts today
sealert 命令(由 setroubleshoot-server 包提供)将 AVC 拒绝消息转换为人类可读的详细描述,并给出修复建议:# 分析审计日志并生成详细报告sudo sealert -a /var/log/audit/audit.log# 分析单条 AVC 消息sudo sealert -l <message_id>
sealert 输出示例:SELinux is preventing /usr/sbin/httpd from name_connect access on the tcp_socket.***** Plugin catchall_boolean (89.3 confidence) suggests ********************If you want to allow httpd to network connectThen you must tell SELinux about this by enabling the 'httpd_can_network_connect' boolean.Dosetsebool -P httpd_can_network_connect 1
setroubleshoot 服务会持续监控审计日志,将 SELinux 拒绝消息转换为详细描述,并发送到系统日志和 DBus:# 查看 setroubleshoot 服务状态sudo systemctl status setroubleshoot# 启动并设置开机自启sudo systemctl enable --now setroubleshoot# 查看通过 setroubleshoot 生成的消息sudo journalctl -t setroubleshoot
# 1. 查看 SELinux 当前状态getenforcesestatus# 2. 查看最近的 AVC 拒绝消息sudo ausearch -m AVC -ts recent# 3. 使用 sealert 分析并获取修复建议sudo sealert -a /var/log/audit/audit.log# 4. 如果确定需要放行某访问,根据 sealert 建议执行# 如设置布尔值setsebool -P <boolean_name> on# 或修改文件上下文sudo semanage fcontext -a -t <type> "<path>(/.*)?"restorecon -Rv <path>
Port 22 改为 Port 2222:sudo vi /etc/ssh/sshd_config
sudo semanage port -l | grep ssh
ssh_port_t tcp 22
sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo semanage port -l | grep ssh
ssh_port_t tcp 2222, 22
sudo systemctl restart sshd
sudo ss -tlnp | grep sshd
-m(modify)而非 -a(add)。/custom/web)作为网站根目录时,SELinux 会阻止 Web 服务访问该目录,需要为其设置正确的安全上下文。sudo mkdir -p /custom/web
ls -Zd /custom/web
unconfined_u:object_r:default_t:s0 /custom/web
sudo semanage fcontext -a -t httpd_sys_content_t "/custom/web(/.*)?"
sudo restorecon -Rv /custom/web/
ls -Zd /custom/web
system_u:object_r:httpd_sys_content_t:s0 /custom/web
DocumentRoot "/var/www/html" 改为 DocumentRoot "/custom/web":sudo vi /etc/httpd/conf/httpd.conf
sudo systemctl restart httpd
curl http://localhost/
getsebool -a | grep httpd_can_network
-P 参数使其永久生效):setsebool -P httpd_can_network_connect on
setsebool -P httpd_can_network_connect_db on
getsebool httpd_can_network_connect
httpd_can_network_connect --> on
sudo systemctl restart httpd
getsebool -a | grep nfs
-P 参数使其永久生效):setsebool -P use_nfs_home_dirs on
getsebool use_nfs_home_dirs
use_nfs_home_dirs --> on
sudo mount -t nfs nfs-server:/home /home
ls -Z /home/user/
getenforce
Enforcing
setenforce 0
sudo ausearch -m AVC -ts recent
sudo sealert -a /var/log/audit/audit.log
setsebool -P <boolean_name> on
<type>、<path> 替换为实际的类型和路径):sudo semanage fcontext -a -t <type> "<path>(/.*)?"sudo restorecon -Rv <path>
setenforce 1
<service> 替换为实际的服务名):sudo systemctl restart <service>
文档反馈