JooTC
SElinux status enabled

SELinux를 사용하는 서버에서 특정 서비스 포트 변경하기

SELinux를 사용하는 서버에서 특정 서비스 포트 변경하기


SELinux (Secure Enhanced Linux/보안 강화 리눅스)는 최신 리눅스 운영체제에 적용된 향상된 보안 정책 모듈입니다.

이 모듈을 사용하여 세부적으로 접근 권한을 설정할 수 있다는 것은 장점이지만, 간혹 이유 모를 원인으로 발생하는 에러들의 일부가 SELinux가 켜져있어서 발생하기 때문에 리눅스 관리에 있어 다소 불편할 수 있습니다.

SElinux status enabled

▲ 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 파일에서 Port7777 로 변경했는지 확인한 후, 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를 끄지 않고 포트 변경을 할 수 있습니다.

구독
알림
guest

2 Comments
Inline Feedbacks
모든 댓글 보기
test
test
4 년 전에

방화벽을 해제하는부분이 없어서 해멨어요;;;;
firewall-cmd –permanent –zone=public –add-port=해당포트/tcp
firewall-cmd –reload
해주셔야 해요

2
0
이 포스트에 대한 의견을 남겨주세요!x