SELinux 阻止 nginx -t

SELinux 阻止 nginx -t

我正在设置 Rocky Linux,但遇到了这个错误:

sudo nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)
nginx: configuration file /etc/nginx/nginx.conf test failed

我的用户的 SELinux 信息是:

id -Z

staff_u:staff_r:staff_t:s0-s0:c0.c1023
sudo -s
id -Z

staff_u:sysadm_r:sysadm_t:s0-s0:c0.c1023

我的 sudoer 规则:

USERNAME ALL=(ALL) ROLE=sysadm_r TYPE=sysadm_t NOPASSWD: ALL

我已经关注https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/using_selinux/managing-confined-and-unconfined-users_using-selinux#confining-an-administrator-using-sudo-and-the-sysadm_r-role_managing-confined-and-unconfined-users

在无法记录任何错误后,我禁用了“dontaudit”规则并得到:

ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts recent

time->Fri Oct  6 17:02:35 2023
type=PROCTITLE msg=audit(1696611755.583:1149): proctitle=7375646F006E67696E78002D74
type=PATH msg=audit(1696611755.583:1149): item=0 name="/lib64/ld-linux-x86-64.so.2" inode=8668 dev=fd:02 mode=0100755 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:ld_so_t:s0 nametype=NORMAL cap_fp=0 cap_fi=0 cap_fe=0 cap_fver=0 cap_frootid=0
type=CWD msg=audit(1696611755.583:1149): cwd="/home/USERNAME"
type=EXECVE msg=audit(1696611755.583:1149): argc=3 a0="sudo" a1="nginx" a2="-t"
type=SYSCALL msg=audit(1696611755.583:1149): arch=c000003e syscall=59 success=yes exit=0 a0=56233d0695a0 a1=56233d1800a0 a2=56233cffae40 a3=8 items=1 ppid=6128 pid=11286 auid=1000 uid=1000 gid=1000 euid=0 suid=0 fsuid=0 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=3 comm="sudo" exe="/usr/bin/sudo" subj=staff_u:staff_r:staff_sudo_t:s0-s0:c0.c1023 key=(null)
type=AVC msg=audit(1696611755.583:1149): avc:  denied  { siginh } for  pid=11286 comm="sudo" scontext=staff_u:staff_r:staff_t:s0-s0:c0.c1023 tcontext=staff_u:staff_r:staff_sudo_t:s0-s0:c0.c1023 tclass=process permissive=0
type=AVC msg=audit(1696611755.583:1149): avc:  denied  { rlimitinh } for  pid=11286 comm="sudo" scontext=staff_u:staff_r:staff_t:s0-s0:c0.c1023 tcontext=staff_u:staff_r:staff_sudo_t:s0-s0:c0.c1023 tclass=process permissive=0
type=AVC msg=audit(1696611755.583:1149): avc:  denied  { noatsecure } for  pid=11286 comm="bash" scontext=staff_u:staff_r:staff_t:s0-s0:c0.c1023 tcontext=staff_u:staff_r:staff_sudo_t:s0-s0:c0.c1023 tclass=process permissive=0

它似乎正在运行

staff_u:staff_r:staff_t:s0-s0:c0.c1023

并不是

staff_u:sysadm_r:sysadm_t:s0-s0:c0.c1023

在这方面我远不是专家,所以非常感谢任何帮助!


按照要求:

audit2allow -a

#============= chkpwd_t ==============
allow chkpwd_t user_devpts_t:chr_file { read write };

#============= init_t ==============
allow init_t unconfined_service_t:process siginh;

#============= staff_sudo_t ==============
allow staff_sudo_t chkpwd_t:process { noatsecure rlimitinh siginh };
allow staff_sudo_t self:capability net_admin;
allow staff_sudo_t shadow_t:file read;
allow staff_sudo_t sysadm_t:process { noatsecure rlimitinh siginh };

#============= staff_t ==============
allow staff_t staff_sudo_t:process { noatsecure rlimitinh siginh };

#============= sysadm_t ==============
allow sysadm_t http_port_t:tcp_socket name_bind;
sudo ls -Z /etc/nginx

system_u:object_r:httpd_config_t:s0 conf.d
system_u:object_r:httpd_config_t:s0 fastcgi_params
system_u:object_r:httpd_config_t:s0 mime.types
system_u:object_r:httpd_config_t:s0 modules
system_u:object_r:httpd_config_t:s0 nginx.conf
system_u:object_r:httpd_config_t:s0 scgi_params
system_u:object_r:httpd_config_t:s0 uwsgi_params
sudo ls -Z /etc/nginx/conf.d

system_u:object_r:httpd_config_t:s0 default.conf

答案1

看起来您的设置工作正常,并且staff_u运行以 为前缀的命令的用户确实正在以角色sudo运行。sysadm_r

这里,您的错误nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)和审计日志allow sysadm_t http_port_t:tcp_socket name_bind;确实显示您有一个拒绝,因为类型sysadm_t无法name_bind端口http_port_t:tcp_socket,这里是端口 tcp/80。

为了允许这种行为,您可以创建一个策略:

cat > sysadm_bind_http.te << EOF
module sysadm_bind_http 1.0;

require {
type sysadm_t;
type http_port_t;
class tcp_socket { name_bind };
}

#============= sysadm_t ==============
allow sysadm_t http_port_t:tcp_socket name_bind;
EOF
checkmodule -M -m -o sysadm_bind_http.mod sysadm_bind_http.te
semodule_package -o sysadm_bind_http.pp -m sysadm_bind_http.mod
semodule -i sysadm_bind_http.pp

答案2

在基于 Red Hat 的系统(例如 Red Hat Enterprise Linux (RHEL) 或 CentOS)上,SELinux(安全增强型 Linux)有时也会nginx -t因违反策略或安全标签不正确而阻塞。要在 Red Hat 系统上排除故障并解决此问题。

nginx -t以下是在基于 Red Hat 的系统上排除故障并解决 SELinux 问题的步骤:

  1. 检查 SELinux 审计日志:

    查看 SELinux 审计日志,深入了解nginx -t被阻止的原因。您可以使用以下ausearch命令:

    sudo ausearch -c 'nginx' --raw | audit2allow -M my-nginx-policy
    sudo semodule -i my-nginx-policy.pp
    

    这会根据审计日志生成自定义 SELinux 策略模块并安装它。

  2. 检查Nginx配置文件:

    使用以下命令确保 Nginx 配置文件具有正确的 SELinux 安全上下文标签ls -Z。如果标签不正确,请使用chcon设置正确的标签:

    sudo chcon -t httpd_config_t /etc/nginx/nginx.conf
    

    替换/etc/nginx/nginx.conf为您的 Nginx 配置文件的实际路径。

  3. 测试Nginx配置:

    解决任何 SELinux 策略问题并验证安全标签后,尝试运行nginx -t以检查配置语法:

    sudo nginx -t
    

    如果问题已解决,SELinux 应该不再阻止此操作。

  4. 重新标记整个 Nginx 配置目录(如有必要):

    如果您有多个具有不正确的安全标签的 Nginx 配置文件,则可以递归地重新标记整个目录:

    sudo restorecon -Rv /etc/nginx/
    

    此命令将重置 下的所有文件和目录的 SELinux 安全上下文标签/etc/nginx/

  5. SELinux 政策修改(如有必要):

    如果尽管采取了上述步骤,SELinux 仍继续阻止该操作,则可能需要专门为您的 Nginx 配置创建自定义 SELinux 策略模块。修改 SELinux 策略时要小心,因为它会影响系统安全。

请记住遵循 SELinux 最佳实践,并且仅在您完全了解后果时才修改政策。此外,定期更新系统并保持 SELinux 政策最新有助于避免将来出现此类问题。

相关内容