Categories: 활용하기

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

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 파일에서 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를 끄지 않고 포트 변경을 할 수 있습니다.

JooTC

안녕하세요. 테크놀로지에 관심이 많은 블로거입니다.

View Comments

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

    • 방화벽 규칙 허용에 관한 내용을 언급하는걸 잊었었나봅니다..ㅠㅠ
      말씀하신대로 포스트 내용을 보충했습니다. 감사합니다!

Recent Posts

[iOS] Xcode ‘You do not have required contracts to perform an operation’ 해결

Xcode에서 iOS 애플리케이션을 빌드(Archive)하고 App Store Connect에 앱을 업로드하는 도중, 아래와 같은 에러가 발생하면서 더…

2주 ago

[안드로이드] INSTALL_FAILED_INSUFFICIENT_STORAGE 해결

INSTALL_FAILED_INSUFFICIENT_STORAGE 문제 안드로이드 스튜디오에서 에뮬레이터를 실행하고 개발중인 애플리케이션을 실행하려 하면 로그 창에 아래와 같이 표시되면서…

6개월 ago

Zalgo 텍스트와 이를 방지하는 방법

인터넷 커뮤니티 사이트에서 게시글이나 댓글에 간혹 장난을 목적으로 작성된 특이한 글자를 볼 수 있습니다. 위…

8개월 ago

리눅스 kill, killall 명령어 – 특정 프로세스 종료하기

리눅스 명령어 - kill, killall 리눅스 kill 명령어는 특정 프로세스를 종료해주는 명령어입니다. 백그라운드에서 실행되고 있는…

8개월 ago

JavaScript typeof null이 ‘object’인 이유

JavaScript는 역사가 긴 스크립트 프로그래밍 언어입니다. 세월이 흐르면서 많은 자바스크립트 표준이 만들어졌고, 현재는 많은 문법적…

8개월 ago

Mocha Error: Resolution method is overspecified. 해결 방법

NodeJS 테스트 프레임워크인 Mocha는 비동기 테스트를 지원합니다. 간혹 특정 테스트 스크립트를 작성하고 실행하면 아래와 같이…

8개월 ago