我正在设置 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
在无法记录任何错误后,我禁用了“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 问题的步骤:
检查 SELinux 审计日志:
查看 SELinux 审计日志,深入了解
nginx -t
被阻止的原因。您可以使用以下ausearch
命令:sudo ausearch -c 'nginx' --raw | audit2allow -M my-nginx-policy sudo semodule -i my-nginx-policy.pp
这会根据审计日志生成自定义 SELinux 策略模块并安装它。
检查Nginx配置文件:
使用以下命令确保 Nginx 配置文件具有正确的 SELinux 安全上下文标签
ls -Z
。如果标签不正确,请使用chcon
设置正确的标签:sudo chcon -t httpd_config_t /etc/nginx/nginx.conf
替换
/etc/nginx/nginx.conf
为您的 Nginx 配置文件的实际路径。测试Nginx配置:
解决任何 SELinux 策略问题并验证安全标签后,尝试运行
nginx -t
以检查配置语法:sudo nginx -t
如果问题已解决,SELinux 应该不再阻止此操作。
重新标记整个 Nginx 配置目录(如有必要):
如果您有多个具有不正确的安全标签的 Nginx 配置文件,则可以递归地重新标记整个目录:
sudo restorecon -Rv /etc/nginx/
此命令将重置 下的所有文件和目录的 SELinux 安全上下文标签
/etc/nginx/
。SELinux 政策修改(如有必要):
如果尽管采取了上述步骤,SELinux 仍继续阻止该操作,则可能需要专门为您的 Nginx 配置创建自定义 SELinux 策略模块。修改 SELinux 策略时要小心,因为它会影响系统安全。
请记住遵循 SELinux 最佳实践,并且仅在您完全了解后果时才修改政策。此外,定期更新系统并保持 SELinux 政策最新有助于避免将来出现此类问题。