共计 1246 个字符,预计需要花费 4 分钟才能阅读完成。
首先声明:如果不使用 SELinux 则可以跳过本文章。
在 ContOS 7 上安装了 Nginx 服务,为了项目需要必须修改 Nginx 的默认 80 端口为 8088, 修改配置文件后重启 Nginx 服务,查看日志报以下错误:
[emerg] 9011#0: bind() to 0.0.0.0:8088 failed (13: Permission denied)
权限被拒绝,开始以为是端口被别的程序占用了,查看活动端口然而没有程序使用此端口,网上搜索说是需要 root 权限,可我执行的是 root 用户啊,这就挺郁闷的, 后来还是给力的 google 给了答案,是因为 selinux 默认只允许 80,81,443,8008,8009,8443,9000 用作 HTTP 端口使用
要查看 selinux 允许的 http 端口必须使用 semanage 命令,下面首先安装 semanage 命令工具
在安装 semanage 工具之前,我们先安装一个 tab 键补齐二级命令功能工具 bash-completion:
yum -y install bash-completion
直接通过 yum 安装发现 semanage 发现没有此包:
# yum install semange
…
NO package semanage available.
那先查找 semanage 命令是哪个软件包提供此命令
# yum provides semanage
或者使用下面的命令:
# yum whatprovides /usr/sbin/semanage
我们发现需要安装包 policycoreutils-Python 才能使用 semanage 命令
现在我们通过 yum 安装此软件包,可以使用 tab 补齐:
# yum install policycoreutils-python.x86_64
现在终于可以使用 semanage 了,我们先查看下 http 允许访问的端口:
# semanage port -l | grep http_port_t
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
然后我们将需要使用的端口 8088 加入到端口列表中:
# semanage port -a -t http_port_t -p tcp 8088
# semanage port -l | grep http_port_t
http_port_t tcp 8088, 80, 81, 443, 488, 8008, 8009, 8443, 9000
好了现在 nginx 可以使用 8088 端口了
selinux 的日志在 /var/log/audit/audit.log
但此文件记录的信息不够明显,很难看出来,我们可以借助 audit2why 和 audit2allow 工具查看,这两个工具也是 policycoreutils-python 软件包提供的。
# audit2why < /var/log/audit/audit.log
收集 selinux 工具的日志,还有另外一个工具 setroubleshoot,对应的软件包为 setroubleshoot-server
: