in 미분류

컨테이너에 ssh를 허락하지 마라

Docker 컨테이너를 만들면서 sshd 서버를 실행하게 되면 ssh로 컨테이너 내부에 접속할수 있습니다. 하지만 이런 접속을 허용하게 되면 다음과 같은 이슈가 생길수 있습니다.

  • ssh 키와 패스워드 관리가 어렵다.

컨테이너가 사용할  ssh 키와 패스워드는 어디에 보관해야 할까요. 이미지에 넣어서 빌드한다면 매번 새로운 ssh키와 패스워드를 만들어서 넣어줘야 안전합니다. 공용 이미지를 사용한다면 컨테이너 실행할때마다 새로운 키와 패스워드를 넣어야 합니다. 볼륨을 활용하는 방안도 생각할 수 있습니다. 이 경우 컨테이너는 볼륨을 읽기만 가능하도록 제한해야 합니다. 만약 여러 컨테이너가 함께 키와 패스워드를 공유할수도 있지만 이경우 외부에 정보가 유출되면 피해가 커질수 있어서 유의해야 합니다.

  • ssh 이슈가 발생하면 업그레이드해야 합니다.

ssh가 안정하다고 해도 종종 이슈가 발생하곤 합니다. 이 경우 실행중인 컨테이너를 업그레이드 해야 합니다.

  • ssh 서버를 실행하기 위한 프로세스 매니저도 필요합니다.

sshd만 필요한게 아니죠. Monit이나 Supervisor 같은 프로세스 매니저도 같이 설치해야 합니다. 컨테이너는 VM이 아니라 프로세스에 가깝습니다. Docker 데몬이 이 프로세스를 감시하는데 그 안에 또 하나의 프로세스 매니저가 실행되면 이제 복잡해 집니다.

  • 컨테이너는 Pet이 아니라 Cattle 입니다.

컨테이너는 이미지만 있다면 언제든지 동일한 컨테이너를 실행할 수 있어야 합니다. 컨테이너를 실행하고 ssh를 통해 직접 설정을 수정하면 이런 식의 스케일 아웃이 불가능합니다. 동일한 이미지를 이용해 만드는 컨테이너가 다양한 설정이 필요하다면 컨테이너를 실행할때 설정파일을 바꿀수 있도록 이미지를 만들어야 합니다. 외부에서 설정파일을 바꾸기 어려운 경우라면 이미지를 다양하게 만들수 있습니다.

ssh를 제공하지 않으면 컨테이너 사용자가 어떤 점을 불편해 할까요

  1. 데이터 백업
  2. 로그 확인
  3. 어플리케이션 재시작
  4. 설정 변경
  5. 디버깅

ssh 접근을 제한하는 대신 이런 작업을 외부에서 할수 있도록 해결책을 제시해야 합니다. 1번,2번은 볼륨을 이용해서 컨테이너 외부로 데이터를 보관하면 간단히 해결할 수 있습니다. 3번은 도커가 제공하는 api나 명령어(restart, kill) 이용하면 외부에서 컨테이너 재시작이 가능합니다. 4번도 볼륨으로 해결할수 있지만 제약이 따를수 있습니다. 사실 설정을 바꾸기보다는 새로운 설정을 가진 컨테이너를 만드는게 더 쉽고 용이합니다. 마지막 5번은 좀 어렵습니다. 한가지 해결책은 도커 명령어중 exec를 이용해 컨테이너에 attach 하는겁니다. 이 경우 이미지에 따라 기존에 실행되던 프로세스가 종료되어 사용할수 없기도 합니다. nsenter를 활용할수도 있다고 하는데 저는 아직 사용해 본적이 없습니다.

참고자료

https://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/

 

 

Write a Comment

Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.