자체 관리 배포서버를 위한 Linux 방화벽 구성 iptables
최신 Linux 시스템에서 iptables
프로그램은 Linux 커널의 netfilter
또는 네트워크 패킷 필터링 기능을 관리하기 위한 메서드를 제공합니다. 이러한 방화벽 규칙을 통해 관리자는 시스템에 연결할 수 있는 호스트를 제어하고 시스템에 연결할 수 있는 호스트를 제한하여 위험 노출을 제한할 수 있습니다.
이 문서 에서는 Linux 의 iptables
방화벽에 대한 기본 방화벽 구성을 간략하게 설명합니다. 이러한 접근 방식을 더 큰 규모의 네트워킹 조직 을 위한 점 으로 활용하세요. MongoDB 의 보안 관행 및 위험 관리 에 대한 자세한 개요는 보안을 참조하세요.
개요
iptables
구성의 규칙은 특정 트래픽 스트림을 필터링하고 처리하는 프로세스를 설명하는 체인으로 나뉩니다. 체인에는 순서가 있으며, 패킷은 이후 규칙에 도달하기 위해 체인의 이전 규칙을 통과해야 합니다. 이 문서에서는 다음 두 가지 체인만 다룹니다.
INPUT
- 모든 수신 트래픽을 제어합니다.
OUTPUT
- 모든 발신 트래픽을 제어합니다.
모든 MongoDB 프로세스의 기본 포트를 고려할 때, 애플리케이션과 적합한 mongod
및 mongos
인스턴스 간에 필요한 통신만 허용하는 네트워킹 규칙을 구성해야 합니다.
기본적으로 iptables
의 기본 정책은 명시적으로 비활성화하지 않는 한 모든 연결과 트래픽을 허용한다는 점에 유의하세요. 이 문서에 설명된 구성 변경 사항은 명시적으로 허용되지 않는 모든 트래픽을 삭제하는 기본 정책을 사용하여 특정 주소 및 특정 포트의 트래픽을 명시적으로 허용하는 규칙을 생성합니다. 허용하려는 트래픽만 허용하도록 iptables
규칙을 올바르게 구성한 경우 기본 정책을 DROP
으)로 변경할 수 있습니다.
패턴
이 섹션에는 MongoDB deployment에 사용할 수 있도록 iptables
을 구성하기 위한 여러 가지 패턴과 예시가 포함되어 있습니다. port
구성 설정을 사용하여 다른 포트를 구성한 경우 이에 따라 규칙을 수정해야 합니다.
인스턴스와 mongod
주고받는 트래픽
이 패턴은 독립형 인스턴스 또는 복제본 세트의 일부로 실행되는 모든 mongod
인스턴스에 적용할 수 있습니다.
이 패턴의 목표는 애플리케이션 서버에서 mongod
인스턴스로의 트래픽을 명시적으로 허용하는 것입니다. 다음 예시에서는 <ip-address>
를 애플리케이션 서버의 IP 주소로 대체합니다.
iptables -A INPUT -s <ip-address> -p tcp --destination-port 27017 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27017 -m state --state ESTABLISHED -j ACCEPT
첫 번째 규칙은 애플리케이션 서버가 mongod
인스턴스에 연결할 수 있도록 하는 포트 27017
에서 <ip-address>
에서 들어오는 모든 트래픽을 허용합니다. 두 번째 규칙은 mongod
의의 발신 트래픽이 애플리케이션 서버에 도달하도록 허용합니다.
참고
옵션
애플리케이션 서버가 하나만 있는 경우 <ip-address>
를 IP 주소 자체로 바꿀 수 있습니다(예: 198.51.100.55
). 또한, CIDR 표기법을 사용하여 198.51.100.55/32
로 표현할 수도 있습니다. 가능한 더 큰 IP 주소 차단을 허용하려면 다음과 같이 <ip-address>
에 대해 다음 사양 중 하나를 사용하여 /24
의 트래픽을 허용할 수 있습니다.
10.10.10.10/24 10.10.10.10/255.255.255.0
인스턴스와 mongos
주고받는 트래픽
mongos
인스턴스는 샤딩된 클러스터에 대한 쿼리 라우팅을 제공합니다. 클라이언트는 mongos
인스턴스에 연결하며, 이 인스턴스는 클라이언트 관점에서 mongod
인스턴스로 작동합니다. 차례로 mongos
은 샤딩된 클러스터의 구성 요소인 전체 mongod
인스턴스에 연결합니다.
복제본 세트의 멤버인 mongod
인스턴스에서처럼 동일한 iptables
명령을 사용하여 이러한 인스턴스와 주고받는 트래픽을 허용할 수 있습니다. mongod
인스턴스로 들어오고 나가는 트래픽 섹션에 설명된 구성을 예로 들어 보겠습니다.
MongoDB 구성 서버와의 트래픽
구성 서버는 샤딩된 클러스터의 메타데이터를 저장하는 config 데이터베이스를 호스팅합니다. config 서버가 포트 27019
에서 연결을 수신 대기합니다. 결과적으로 다른 config 서버에 연결하기 위해 포트 27019
에서 수신 및 발신 연결을 허용하도록 config 서버에 다음 iptables
규칙을 추가합니다.
iptables -A INPUT -s <ip-address> -p tcp --destination-port 27019 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27019 -m state --state ESTABLISHED -j ACCEPT
<ip-address>
를 config 서버를 제공하는 모든 mongod
의 주소 또는 주소 공간으로 대체합니다.
또한, config 서버는 클러스터의 모든 mongos
인스턴스 및 클러스터의 모든 mongod
인스턴스에서 들어오는 연결을 허용해야 합니다. 다음과 유사한 규칙을 추가합니다:
iptables -A INPUT -s <ip-address> -p tcp --destination-port 27019 -m state --state NEW,ESTABLISHED -j ACCEPT
MongoDB 샤드 서버 간 트래픽
샤드 서버의 기본값은 포트 번호 27018
입니다. 각 샤드에 대한 트래픽을 허용하려면 다음 iptables
규칙을 구성해야 합니다.
iptables -A INPUT -s <ip-address> -p tcp --destination-port 27018 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27018 -m state --state ESTABLISHED -j ACCEPT
<ip-address>
사양을 모든 mongod
의 IP 주소로 대체합니다. 이를 통해 구성 복제본 세트를 포함한 모든 샤드 간에 들어오고 나가는 트래픽을 허용하여 다음을 수행할 수 있습니다.
또한, 샤드는 다음 대상으로 나가는 연결을 만들 수 있어야 합니다.
구성 서버의 모든
mongod
인스턴스.
다음과 유사한 규칙을 만들고 <ip-address>
을 config 서버 및 mongos
인스턴스의 주소로 바꿉니다.
iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27018 -m state --state ESTABLISHED -j ACCEPT
[1] | cluster의 모든 샤드는 청크 및 밸런싱 연산을 원활하게 수행하기 위해 다른 모든 샤드와 통신할 수 있어야 합니다. |
모니터링 시스템에 대한 액세스 권한 제공
mongostat
진단 도구는 --discover
와 함께 실행될 때 config 서버, 샤드 서버, mongos
인스턴스를 포함하여 클러스터의 모든 구성 요소에 도달할 수 있어야 합니다.
Default Policy(기본 정책)를 다음으로 변경합니다. DROP
iptables
체인의 기본 정책은 모든 트래픽을 허용하는 것입니다. 모든 iptables
구성 변경을 완료한 후에는 위와 같이 명시적으로 허용되지 않은 모든 트래픽이 MongoDB deployment의 구성 요소에 도달할 수 없도록 기본 정책을 DROP
으로 변경해야 합니다 . 다음 명령을 실행하여 이 정책을 변경합니다.
iptables -P INPUT DROP iptables -P OUTPUT DROP
구성 관리 및 iptables
유지
이 섹션에는 iptables
을 관리하고 사용하기 위한 여러 가지 기본 연산이 포함되어 있습니다. iptables
구성의 일부 측면을 자동화하는 다양한 프런트 엔드 도구가 있지만 핵심적으로 모든 iptables
프런트 엔드는 동일한 기본 기능을 제공합니다.
모든 iptables
규칙을 영구화
기본적으로 모든 iptables
규칙은 메모리에만 저장됩니다. 시스템이 다시 시작되면 방화벽 규칙이 기본값으로 되돌아갑니다. 규칙 세트를 테스트하고 트래픽을 효과적으로 제어하는 것이 보장되면 다음 연산을 사용하여 규칙 세트를 영구화할 수 있습니다.
Red Hat Enterprise Linux, Fedora Linux 및 관련 배포판에서는 다음 명령을 실행할 수 있습니다.
service iptables save
Debian, Ubuntu 및 관련 배포판에서는 다음 명령을 사용하여 iptables
규칙을 /etc/iptables.conf
파일에 덤프할 수 있습니다.
iptables-save > /etc/iptables.conf
다음 작업을 실행하여 네트워크 규칙을 복원합니다.
iptables-restore < /etc/iptables.conf
이 명령을 rc.local
파일에 넣거나 다른 유사한 작업을 사용하여 /etc/network/if-up.d/iptables
파일에 넣습니다.
모든 iptables
규칙 나열
현재 적용된 모든 iptables
규칙을 나열하려면 시스템 셸에서 다음 작업을 사용합니다.
iptables -L
모든 iptables
규칙플러시
iptables
규칙을 입력할 때 구성 실수를 했거나 단순히 기본 규칙 세트로 되돌려야 하는 경우 시스템 셸에서 다음 작업을 사용하여 모든 규칙을 플러시할 수 있습니다.
iptables -F
이미 iptables
규칙을 영구적으로 설정한 경우 iptables
규칙을 모두 영구적으로 만들기 섹션에서 적절한 절차를 반복해야 합니다.