SELinux를 사용하는 서버에서 특정 서비스 포트 변경하기
SELinux (Secure Enhanced Linux/보안 강화 리눅스)는 최신 리눅스 운영체제에 적용된 향상된 보안 정책 모듈입니다.
이 모듈을 사용하여 세부적으로 접근 권한을 설정할 수 있다는 것은 장점이지만, 간혹 이유 모를 원인으로 발생하는 에러들의 일부가 SELinux가 켜져있어서 발생하기 때문에 리눅스 관리에 있어 다소 불편할 수 있습니다.
▲ SElinux가 켜져 있을 때 모습
이 때문에 SELinux를 사용할 때 시스템 보안 정책에 의해 특정 서비스 포트를 변경하려고 하면 아래 메세지가 출력되며 거부될 수 있습니다.
Redirecting to /bin/systemctl restart sshd.service Job for sshd.service failed because the control process exited with error code. See "systemctl status sshd.service" and "journalctl -xe" for details. (위 메세지는 SSH 데몬 설정에서 22번 기본 포트를 변경하려고 할 시에 발생하는 메세지 입니다.)
Journalctl 관련된 에러 메세지는 주로 설정 파일의 문법 오류로도 나타나지만 SELinux로 인해 서비스 포트 변경이 차단 되어서 나타나기도 합니다.
SSH 포트를 변경할 경우 /etc/ssh/sshd_config 파일을 살펴보면 아래와 같이 SELinux가 켜져있을 때의 조치를 안내하고 있습니다.
# If you want to change the port on a SELinux system, you have to tell # SELinux about this change. # semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
보통 이와 같은 문제를 해결하기 위해 주로 SELinux 자체를 끄고는 하지만, 이 글에서는 SELinux를 끄지 않고 포트 변경을 수행하는 방법을 알려드리고자 합니다.
먼저, semanage 명령어를 사용하기 위해 아래 패키지를 설치합니다. 이미 해당 명령어를 사용할 수 있다면 건너뛰셔도 됩니다.
# yum install policycoreutils-python
다음으로, semanage 명령어를 Root 권한으로 실행합니다. 예로 22번을 사용하는 SSH 서비스 포트를 7777 포트로 변경하고자 하면 아래 명령어로 포트 변경을 요청할 수 있습니다.
# semanage port -a -t ssh_port_t -p tcp 7777
usage: semanage port [-h] [-n] [-N] [-S STORE] [ –add -t TYPE -p PROTOCOL -r RANGE ( port_name | port_range ) | –delete -p PROTOCOL ( port_name | port_range ) | –deleteall | –extract | –list -C | –modify -t TYPE -p PROTOCOL -r RANGE ( port_name | port_range ) ] -a, –add Add a record of the port object type
-t TYPE, –type TYPE SELinux Type for the object
-p PROTO, –proto PROTO
Protocol for the specified port (tcp|udp) or internet protocol version for the specified node (ipv4|ipv6).
적용이 완료되었다면 이제 포트 변경을 수행할 수 있습니다.
위 예시에서는 /etc/ssh/sshd_config 파일에서 Port를 7777 로 변경했는지 확인한 후, systemctl restart sshd 또는 service sshd restart 를 실행하여 포트 변경 후 적용이 되는지 확인할 수 있습니다. (Journalctl 관련 메세지가 출력되지 않으면 됩니다.)
만약 변경한 포트가 방화벽에 의해 차단되어 있다면 이를 해제해주어야 합니다.
단, 서버마다 사용 중인 방화벽 프로그램이 다를 수 있기 때문에 서버에서 사용되는 방화벽 소프트웨어를 먼저 확인해보아야 합니다. 각 방화벽 프로그램별로 7777번 포트를 허용해보겠습니다.
아래는 iptables의 방화벽 규칙 추가 예시입니다.
[root@localhost ~]# iptables -A INPUT -p tcp -m tcp --dport 7777 -j ACCEPT
아래는 firewalld의 방화벽 규칙 추가 예시입니다.
[root@localhost ~]# firewall-cmd --zone=public --add-port=7777/tcp --permanent
아래는 ufw의 방화벽 규칙 추가 예시입니다.
[root@localhost ~]# ufw allow 7777/tcp
이런 방식으로 SELinux를 끄지 않고 포트 변경을 할 수 있습니다.
방화벽을 해제하는부분이 없어서 해멨어요;;;;
firewall-cmd –permanent –zone=public –add-port=해당포트/tcp
firewall-cmd –reload
해주셔야 해요
방화벽 규칙 허용에 관한 내용을 언급하는걸 잊었었나봅니다..ㅠㅠ
말씀하신대로 포스트 내용을 보충했습니다. 감사합니다!