Shim Won

December 16, 2014 7:19 am

번역 Docker컨테이너 안에 SSHD를 실행하면 안되는 이유

전략…

컨테이너에서 SSH 서버를 기동하면 안되요. (물론, 컨테이너가 SSH 서버일 경우는 재외하고..)

SSH서버를 기동하고 싶어지죠, 왜냐면 그게 컨테이너 “안으로 들어가는” 가장 쉬운 방법이니까요. 이 업계의 사람이라면 거의 보무 SSH를 한번씩은 써봤을 겁니다. 많은 사람들이 SSH를 일상적으로사용하고, 공개키나 비밀키, 패스워드 없는 로그인, 키 에이전트, 뭐 가끔은 포트포워딩이나 그밖에 자잘한 테크닉에 정통해 있습니다.

그걸 염두해두면, 컨테이너 안의 SSH를 기동하라는 조언을 받아도 놀랍지 않습니다. 하지만, 두번 생각해 보세요.

Redis 서버나 Java 웹서비스의 Docker 이미지를 만든다고 합시다. 이제 몇가지 질문을 해볼께요.

SSH는 어디다 쓰시게요?

대부분, 백업, 로그 확인, 프로세스 재기동, 설정 변경, gdb, strace같은 툴로하는 디버그를 하고 싶겠죠. 하지만 이런 일들은 SSH가 없어도 하는 방법이 있습니다.

키와 패스워드는 어떻게 관리하실 껀가요?

대부분, 키와 페스워드를 이미지와 같이 굽던가, 볼룸에 넣습니다. 이제, 키와 패스워드를 갱신할 때를 생각해보세요. 이미지 안에 넣는경우, 이미지를 다시만들어, 다시 배포하고, 컨테이너를 다시 시작해야합니다. 완전히 잘못된건 아니지만, 우아하지도 않죠. 더 좋은 해결책은, 인증정보를 볼륨에 넣어두고 관리하는 것입니다. 이 방법은 동작하긴 하지만 심각한 결점이 있습니다. 컨테이너가 쓰기 권한을 부여해서 안되는걸 알고 있어야 합니다. 아니면 컨테이너가 인증정보를 파손시킬 수 있거든요. (그래서 컨테이너 안으로 들어갈수 없게 됩니다.) 여러 컨테이너가 인증 정보를 공유하고 있을 경우엔 더더욱 귀찮아 집니다. SSH를 다른것으로 대체할 수 있으면 걱정할게 하나 줄겠죠?

보안패치는 어떻게 관리하실 껀가요?

SSH서버는 꽤 안전하지만, 보안 문제가 생긴 경우, SSH를 사용하는 모든 컨테이너를 업그레이드 해야합니다. 이 말은 모든 SSH를 사용하는 서버를 다시 만들고 재기동해야한다는 말입니다. 전혀 상관없어보이는 memcached 서비스만 사용할 경우에도, 보안 권고에 맞춰 항상 갱신해 두어야 합니다. 왜냐하면, 컨테이너들의 공격할 수 있는 부분이 갑자기 커지거든요. 다시 한번 말하지만, SSH를 다른것으로 대체할 수 있다면, 이런 걱정을 분산 할 수 있겠죠?

“SSH서버만 추가”해서 될까요?

아닐껄요. Monit나 Supervisor같은 프로세스 메니져도 필요합니다. 왜냐면 Docker는 하나의 프로세스만 관찰하기 때문입니다. 여러 프로세스가 필요하다면, 톱레벨에 프로세스를 하나 추가해 나머지 모두를 관리하게 할 필요가 있습니다. 바꿔 말하면, 군더더기 없는(lean) 간단한 컨테이너를 좀더 복잡하게 만든다는 뜻입니다. 어플리케이션이 멈추었을 때(정상 종료든 크레쉬든), Docker에서 정보를 얻는 대신 프로세스 메니저로부터 정보를 얻어야합니다.

컨테이너에 어플을 넣는 거 이외의 억세스 정책과 보안 규정까지 담당하고 계신가요?

소규모에서는 그렇게 크게 문제가 되지 않습니다. 하지만 대규모라면, 당신이 컨테이너에 어플을 넣는 사람이라면 아마도 다른 사람이 리모트 억세스 정책을 담당하고 있을 겁니다. 또 회사에는 누가 어떻게 어떤 종류의 감사 추적(audit trail)을 통해 억세스 할 수 있는지 관리하는 엄격한 정책이 있을 겁니다. 이런 경우, 아마도 SSH 서버를 컨테이너에 넣고 싶지 않겠죠.

…후략