SELinux http 포트 허용하기

nginx로 3100번 포트에 서비스를 열려고 했더니 bind에 실패했다.

$ sudo service nginx start
Redirecting to /bin/systemctl start nginx.service
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.

$ systemctl status nginx.service
...
nginx[1172997]: nginx: [emerg] bind() to 0.0.0.0:3100 failed (13: Permission denied)

왜 그런가 찾아봤더니, SELinux(Security-Enhanced Linux)가 기본적으로 http에서 사용되는 포트를 제한하고 있었다. 또한 httpd(데몬)의 연결 여부도 설정해줘야 한다.

SELinux 확인

(1) http_port_t

# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      33

sestatus를 이용해 SELinux 상태를 확인할 수 있다. Current mode가 enforcing으로 나오면 SELinux가 적용중인 것이다

$ sudo semanage port -l | grep http_port_t
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t            tcp      5988

http가 허용되는 포트는 위 명령어로 확인 가능하다

(2) httpd_can_network_connect

$ sudo getsebool httpd_can_network_connect
httpd_can_network_connect --> off

getsebool을 사용해 http 데몬의 네트워크 연결 허용 여부를 확인할 수 있다

SELinux 설정값 변경

(1) http 포트 허용

보통 쓰이는 포트가 아닌 비표준 포트로 http를 허용하려면 아래 명령어를 사용한다

$ sudo semanage port -a -t http_port_t -p tcp {허용할_포트}

제거는 아래처럼 하면 된다

$ sudo semanage port -d -t http_port_t -p tcp {제거할_포트}

(2) httpd 연결 허용

$ sudo setsebool -P httpd_can_network_connect on

연결을 다시 막으려면 on 대신 off(또는 0, false)를 입력하면 된다