Docker 컨테이너의 네트워크 액세스 제한 하고는이 컨테이너가 인터넷을 내부에서

SFTP 전용 Docker 컨테이너 를 만드는 중입니다.이 컨테이너는 자체 chroot환경 에서 파일을 업로드하고 관리하기 위해 여러 사람이 사용합니다 .

문서 상으로는 매우 안전합니다. 모든 형태의 bash로그인을 비활성화하고 다른 프로세스를 실행하지 않습니다. 그러나 나는 조금 더 강화하고 싶습니다.

SFTP 서버의 목적을 제외 하고는이 컨테이너가 인터넷을 내부에서 액세스하지 못하게하고 싶습니다.

명확하게하기 위해 : 외부 세계가 내 컨테이너에 액세스하지 못하게하는 방법을 알고 있습니다. 들어오는 iptables규칙을 설정할 수 있으며 docker run 명령에 SFTP 포트 만 노출시킬 수 있습니다.

그러나 컨테이너 내부 에서 실행될 때 다음 명령 (예 :)이 실패하게하고 싶습니다 .

curl google.com

제 의도는 해킹 된 컨테이너가 할 수있는 피해량을 줄이는 것입니다 (스팸 이메일을 보내는 데 사용할 수 없음 등).



답변

공격을 피하기 위해 도커 인스턴스 내에 일부 수신 규칙을 배치하는 것이 합리적이지만 도커 이미지가 연결된 업스트림 라우터의 아웃 바운드 (인터넷) 액세스를 제한해야합니다. 그 이유는 인스턴스 내부의 방화벽 규칙으로 아웃 바운드 액세스를 차단하려고하면 인스턴스가 손상되면 공격자가 해당 규칙을 제거 할 수 있기 때문입니다. 인스턴스의 라우터를 통한 발신을 차단하면 손상이 발생한 경우에도 아웃 바운드 액세스를 차단할 수 있습니다. 침입자는 라우터를 손상시켜야합니다.


필터링이 컨테이너의 호스트를위한 것이라는 설명을받은 후, 달성하려는 것이 조금 더 명확합니다. 이 경우 호스트에서 다음과 유사한 규칙을 추가합니다.

iptables -A FORWARD -s lo.cal.sub.net -d con.tai.ner.ip -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -d lo.cal.sub.net -j ACCEPT
iptables -A FORWARD -s ! lo.cal.sub.net -d con.tai.ner.ip -p tcp --dport sftp -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -d ! lo.cal.sub.net -p tcp --sport sftp -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -m state --state related,established -j ACCEPT
iptables -A FORWARD -s con.tai.ner.ip -j DROP

처음 두 규칙은 호스트와 컨테이너 간의 액세스를위한 것입니다. 세 번째 규칙은 (대략적으로) SFTP로 향하는 호스트의 서브넷이 아닌 것은 우리가 괜찮다고 말합니다. 네 번째는 기본적으로 두 번째에서 세 번째에 이르는 아웃 바운드 규칙입니다. 다섯 번째 규칙은 모든 것을 포괄하는 규칙이며 (사용되는 다른 관련 포트가있는 경우) 필요하지는 않지만 제거 할 수 있습니다. 마지막 규칙은 호스트 서브넷 이외의 다른 것에 대한 액세스를 방지하는 마법입니다. 처음 몇 규칙에는 액세스 권한이 부여되므로 앞의 규칙 중 어느 것도 적용되지 않는 한 트리거되지 않습니다. 여기에서 갈 수 없습니다 ” 외부로부터의 인바운드 트래픽은 세 번째 및 네 번째 규칙에 따라 충족됩니다.


답변

이것은 실제로 도커 특정 문제가 아닙니다. 이 문제를 해결할 수있는 몇 가지 방법이 있습니다.

  1. 상태 저장 iptables규칙을 사용하여 인바운드 및 관련 / 설정된 트래픽 연결을 허용 한 다음 다른 모든 것을 차단하십시오.

  2. 쉘을 실행할 수없는 ProFTPD 와 같은 sftp 전용 서비스를 사용하십시오 .

일반적으로 사용자가 쉘을 얻지 못하게하고 컨테이너 내에서 프로그램을 실행하지 못하게하는 경우 걱정할 필요가 없습니다.


답변

이것은 단지 빠른 브레인 스토밍이며 아직 테스트하지 않았습니다. 프로덕션 환경으로 가져 가기 전에 실험실에서 검사해야합니다.

비 SSH (SFTP) 및 웹 포트에서 아웃 바운드 트래픽을 방지하기 위해 IPTABLES 또는 다른 Layer4 방화벽을 통해 0.0.0.0/0으로 향하는 도커 컨테이너가 사용하는 세그먼트에서 트래픽을 DROP 또는 REJECT 트래픽에 적용 할 수 있습니다. 포트는 TCP22입니다.

웹에서 승인되지 않은 위치로 이동하는 문제를 해결하려면 인터페이스 docker0에서 수신 대기 중이고 사용중인 오징어 또는 블루 코트와 같은 필터링 / 캐싱 프록시 인스턴스를 설정하려고 할 수 있습니다. 인터넷에 나가기위한 호스트의 확실한 경로. 여기에서 여러 가지 기준에 따라 정책을 적용 할 수있을뿐만 아니라 정적 콘텐츠를 캐싱하여 네트워크 사용률을 절약 할 수 있습니다. 프록시를 투명하게 사용하기 위해 호스트 컴퓨터에서 NAT (IPTABLES 및 Masquerade가 Linux에서 이것을 제공한다고 생각합니다)를 사용하고 싶을 수도 있습니다 ( HTTP 만 프록시하고 싶다는 응답으로 이것을 설명 했지만 어떻게 해야할지 모르겠습니다. HTTPS 트래픽으로 수행 ). 이것은 회사의 정책을 준수하는 웹에 먼저 갈 이유가 있음을 의미합니다.

SFTP의 기반이되는 SSH의 특성으로 인해 컨테이너가 사용자가 제공 한 키 쌍만 사용할 수있는 정책을 구현하지 않으면 파일 이동을위한 트래픽 차단을 제공 할 수 없습니다. ” 전송 된 파일에 대한 가시성이나 제어권이 없었습니다.“고객 중 한 명이 불법적 인 물건 (IP 침해 등의 정보를 전송하거나 분류 레이블이있는 정보를 유출하기 위해 서비스를 사용하거나 CP에서 거래하는 경우)을 변호하는 경우 고객이하는 일에 대해 법정에 출두 할 경우 자주 전송되는 변경되지 않은 파일을 캐시 할 수없고 고객과의 계약서에 작성하는 정책은 본질적으로 기술적 인 수단을 통해 시행 할 수 없기 때문에 이는 좋지 않습니다.


답변