Linux的SELinux安全性控制除作用於文件系統外還作用於端口,這使得那些作為服務啟動的進程只能在規定的幾個端口上監聽。為敘述方便我們稱之為受控端口。
nginx監聽端口
要查看當前有哪些受控端口可執行:
# semanage port -l | grep '^http_port_t' http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
這里顯示了八個端口號,其中包括80端口。由於nginx默認在80端口監聽因此啟動正常。
# service nginx start
我們接下來可做個試驗,看看nginx能否在其它端口上監聽,比如8888端口。為此新加/etc/nginx/conf.d/test.conf文件:
# /etc/nginx/conf.d/test.conf server { listen 8888; server_name localhost; }
你也可以不新加本文件,而是直接修改/etc/nginx/conf.d/default.conf文件。
完成后讓nginx重新加載配置:
# nginx -s reload
雖然該命令執行成功,但實際上8888端口並未處於監聽狀態:
# netstat -anp | grep 8888
上面的netstat命令無輸出,這表明8888端口不在監聽狀態。進一步我們查看一下審計日志:
vi /var/log/audit/audit.log
在文件尾部發現如下兩行:
1 type=AVC msg=audit(1452146884.454:2430): avc: denied { name_bind } for pid=1268 comm="nginx" src=8888 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:port_t:s0 tclass=tcp_socket 2 type=SYSCALL msg=audit(1452146884.454:2430): arch=c000003e syscall=49 success=no exit=-13 a0=b a1=1b5cc60 a2=10 a3=7ffdaf0be83c items=0 ppid=1 pid=1268 auid=4294967295 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=4294967295 comm="nginx" exe="/usr/sbin/nginx" subj=system_u:system_r:httpd_t:s0 key=(null)
這里的詳細含義我也不清楚,但肯定的是nginx無權限在8888端口上監聽。如果你確實希望nginx在8888端口上監聽,則可把8888端口號注冊為受控端口。注冊前請先檢查一下8888端口是否已被登記:
semanage port -l | grep 8888
如果有輸出則表示8888端口已被注冊,此時請換用其它端口。
要注冊http 8888端口號請執行:
semanage port -a -t http_port_t -p tcp 8888
作為一種好習慣我們應再次檢查一下受控端口列表,看看有沒有剛注冊的端口號:
semanage port -l | grep '^http_port_t'
最后再讓nginx重新加載配置:
# nginx -s reload
此時8888端口應處於監聽狀態:
# netstat -anp | grep 8888
nginx反向代理端口
如果你想讓你的應用被nginx反向代理,則被反向代理的端口號也必須為已受控端口。
其它說明
不知何故,只當你把nginx啟動為服務時端口才受Linux安全性控制,如果你直接運行nginx則不受此控制。