도커 컨테이너(Docker Container)에 대한 쉘 권한과 접근에 대한 이야기

잠깐 시간내어 간단하게 글 작성합니다. docker 컨테이너 내부로 접근할 떄 보통 exec 명령으로 /bin/bash, /bin/sh를 호출하는 경우가 많습니다. 테스트 하다보니 권한 관련해서 좀 신기한게 있었네요. (물론 지나서 보면 별거 아니였습니다)

Execute shell on docker(not shell perm)

우선 docker 컨테이너 내 계정을 하나 만들어주는데, 쉘 권한을 제거해줍니다.

root@5331c196387b:/# useradd --shell /bin/false dtest

passwd 파일보면 쉘이 빠져있습니다.

root@5331c196387b:/# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
[….]
dtest:x:1001:1001::/home/dtest:/bin/false

일반 리눅스의 경우 계정에 해당하는 쉘이 없기 떄문에 su로 유저를 변경하여도 쉘을 가져갈 수 없습니다.

docker 컨테이너의 경우 docker에서 직접 실행할 프로그램을 지정해 줄 수 있기 때문에 계정 자체의 쉘 권한과는 관계없이 사용이 가능합니다.

> docker exec --user dtest -i -t 5331c196387b /bin/bash
dtest@5331c196387b:/$ whoami
dtest

Why?

개인적인 생각으론.. 위에서 이야기드린 쉘 권한은 무언가 직접적인 접근제어보단, 쉘에 접근했을 때 내려주는 프로그램의 경로를 /bin/false과 같이 의미없는 곳으로 전달해서 막는 방식입니다.

예를들면 A라는 계정에 위와 같이 /bin/false 로 주고 ssh를 통해 접근하였을 때 결과가 접근 자체가 안되는 것이 아닌 접근은 되지만 쉘을 받지 못해서 아무것도 처리 못하는 상황이 되는것입니다.

다시 docker 이야기로 오면, docker 컨테이너 내부에선 su나 ssh 등으로 로그인을 성공하여도 /bin/false를 주기 때문에 쉘을 실행할 수 없습니다. 그렇지만 docker 호스트에서 쉘을 내리는 경우 실행할 프로그램을 직접 지정해 줄 수 있기 떄문에 쉘 권한과 관계없이 가능해집니다.