SELinux는 보안 강화 리눅스(Security-Enhanced Linux)의 약자로, 리눅스 시스템의 보안을 향상시키기 위한 커널 모듈입니다. SELinux는 시스템의 프로세스와 파일에 대해 접근 제어 정책을 적용하여, 잠재적인 공격으로부터 시스템을 보호합니다.
리눅스 SELinux 설정
SELinux에는 강제(Enforcing), 허용(Permissive), 비활성화(Disabled)의 세 가지 상태가 있습니다. 강제 상태는 SELinux가 정책을 적용하고 위반 사항을 기록하는 상태이고, 허용 상태는 SELinux가 정책을 적용하지 않고 위반 사항만 기록하는 상태입니다. 비활성화 상태는 SELinux가 완전히 작동하지 않는 상태입니다.
이번 포스트에서는 SELinux를 강제 상태로 설정하고, 포트포워딩을 통해 특정 네트워크에서 웹 서비스에 접근할 수 있도록 하는 방법을 소개하겠습니다. 포트포워딩은 라우터나 방화벽 등의 장비가 외부의 특정 포트로 들어오는 요청을 내부의 다른 포트로 전달하는 기능입니다. 예를 들어, 80번 포트로 웹 서비스를 제공하는 서버에 5423번 포트로 접근하면, 라우터가 80번 포트로 요청을 전달해주는 것입니다.
SELinux 강제 상태로 설정하기
SELinux의 상태와 모드는 /etc/selinux/config 파일에서 설정할 수 있습니다. 이 파일을 편집하기 위해서는 root 권한이 필요합니다. 다음과 같은 명령어로 파일을 열어보겠습니다.
# vi /etc/selinux/config
파일을 열면 다음과 같은 내용이 나타납니다.
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
여기서 SELINUX= 값이 SELinux의 상태를 결정합니다. 강제 상태로 설정하려면 SELINUX=enforcing 으로 설정하면 됩니다. 만약 허용 상태로 설정하려면 SELINUX=permissive 로 설정하면 됩니다. 비활성화 상태로 설정하려면 SELINUX=disabled 로 설정하면 됩니다.
SELINUXTYPE= 값은 SELinux의 정책 유형을 결정합니다. 일반적으로 targeted 유형을 사용하면 됩니다. 이 유형은 특정 프로세스에만 SELinux 정책을 적용하고, 나머지 프로세스는 허용합니다. minimum 유형은 targeted 유형의 변형으로, 선택된 프로세스에만 SELinux 정책을 적용합니다. mls 유형은 다중 보안 레벨(Multi Level Security)을 적용하는 유형으로, 보안 등급이 다른 프로세스와 파일의 접근을 제어합니다.
파일을 편집하고 저장한 후, 시스템을 재부팅하면 SELinux의 상태와 모드가 변경됩니다. 다음과 같은 명령어로 재부팅할 수 있습니다.
# reboot
재부팅 후에는 getenforce 또는 sestatus 명령어로 SELinux의 상태와 모드를 확인할 수 있습니다. 다음과 같은 명령어로 확인해보겠습니다.
# getenforce
Enforcing
# 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: 31
리눅스 포트포워딩 설정
포트포워딩을 설정하기 위해서는 firewall-cmd 명령어를 사용할 수 있습니다. 이 명령어는 firewalld 서비스를 제어하는 명령어로, root 권한이 필요합니다. 다음과 같은 명령어로 포트포워딩을 설정해보겠습니다.
# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.122.0/24 forward-port port=5423 protocol=tcp to-port=80'
success
이 명령어는 192.168.122.0/24 네트워크에서 오는 5423번 포트의 TCP 요청을 80번 포트로 전달하는 규칙을 추가하는 명령어입니다. –permanent 옵션은 이 규칙을 영구적으로 적용하겠다는 의미입니다. –add-rich-rule 옵션은 복잡한 규칙을 추가할 수 있는 옵션입니다. rule family=ipv4 는 이 규칙이 IPv4 프로토콜에 적용되는 것을 의미합니다. source address=192.168.122.0/24 는 이 규칙이 적용되는 소스 주소를 의미합니다. forward-port port=5423 protocol=tcp to-port=80 는 5423번 포트의 TCP 요청을 80번 포트로 전달하겠다는 의미입니다.
규칙을 추가한 후에는 firewalld 서비스를 재시작해야 적용됩니다. 다음과 같은 명령어로 재시작할 수 있습니다.
# firewall-cmd --reload
success
서비스를 재시작한 후에는 firewall-cmd –list-all 명령어로 설정된 규칙을 확인할 수 있습니다. 다음과 같은 명령어로 확인해보겠습니다.
# firewall-cmd --list-all
public (default, active)
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="192.168.122.0/24" forward-port port="5423" protocol="tcp" to-port="80"
이제 포트포워딩이 설정되었습니다. 이제 192.168.122.0/24 네트워크에 있는 시스템들은 system1의 5423번 포트로 웹 서비스에 접근할 수 있습니다.
포트포워딩 테스트하기
포트포워딩이 제대로 작동하는지 테스트해보겠습니다. system1에서는 80번 포트로 웹 서비스를 제공하는 서버에서 다음과 같은 명령어로 웹 페이지를 만들어보겠습니다.
# cat > /var/www/html/index.html
hello
# systemctl start httpd
이 명령어는 /var/www/html/index.html 파일에 hello 라는 내용을 작성하고, httpd 서비스를 시작하는 명령어입니다. httpd 서비스는 Apache 웹 서버를 의미하며, 80번 포트로 웹 서비스를 제공합니다.
system2에서는 system1의 5423번 포트로 웹 서비스에 요청을 보내보겠습니다. 다음과 같은 명령어로 요청을 보낼 수 있습니다.
# curl system1.example.com
응답없음. <Ctrl><c>
# curl system1.example.com:5423
hello
이 명령어는 curl 명령어를 사용하여 system1.example.com의 80번 포트와 5423번 포트로 웹 요청을 보내는 명령어입니다. curl 명령어는 웹 서버와 통신할 수 있는 명령어로, 웹 페이지의 내용을 출력하거나 다운로드할 수 있습니다.
80번 포트로 요청을 보내면 응답이 없습니다. 이는 80번 포트가 방화벽에 의해 차단되어 있기 때문입니다. 5423번 포트로 요청을 보내면 hello 라는 응답이 옵니다. 이는 포트포워딩에 의해 5423번 포트의 요청이 80번 포트로 전달되어 웹 페이지의 내용이 출력되기 때문입니다.
이렇게 포트포워딩을 통해 특정 네트워크에서만 웹 서비스에 접근할 수 있도록 설정할 수 있습니다. 포트포워딩은 다른 포트나 프로토콜로도 설정할 수 있으며, 다양한 용도로 사용할 수 있습니다. 예를 들어, 내부 네트워크의 서버를 외부에서 접근할 수 있도록 하거나, 특정 서비스를 보안을 강화하기 위해 다른 포트로 변경하거나, 여러 서버에 부하 분산을 하거나, 특정 서비스를 차단하거나, 등등의 기능을 수행할 수 있습니다.
마무리
SELinux와 포트포워딩에 관한 포스트를 마치겠습니다. SELinux와 포트포워딩은 리눅스 시스템의 보안과 네트워크를 관리하는 데 유용한 기능입니다.