docker user namespace remap

# 기본적으로 docker 실행시 root(uid=0, root 이름이 아니더라도 커널은 uid 로 구분하기 때문에 uid=0이면 root다) 로 실행되는데,
# 다음과 같이 docker 실행시 호스트의 root 권한의 디렉토리를 바인딩(마운트)하면
# docker container 안에서 호스트의 root 파일을 변경할 수 있어 위험하다.
docker run -v /etc:/host_etc -it ubuntu

# container 에서 사용자 id 를 보면 root 다.
id
uid=0(root) gid=0(root) groups=0(root)

# container 에서 host 파일을 수정할 수 있다.
echo "hacker ysoftman ..!" >> /host_etc/ysoftman.txt

# user namespace 를 확인해보면
# host 의 user namespace 와
ls -ahl /proc/$$/ns/user
lrwxrwxrwx 1 root root 0 Dec 15 03:33 /proc/897/ns/user -> 'user:[4026531837]'

# docker container 의 user namespace 가 같다.(공유)
ls -ahl /proc/$$/ns/user
lrwxrwxrwx 1 root root 0 Dec 15 03:36 /proc/1/ns/user -> 'user:[4026531837]'

# 이를 방지하기해 docker 실행시 생성되는 사용자 gid,uid 범위를 제한할 수 있다.
# host 에서 dockremap 사용자를 추가
sudo useradd dockremap

# host 에서 dockremap 의 uid,gid 20000~30000 범위 설정
sudo vi /etc/subuid
dockremap:200000:300000

sudo vi /etc/subgid
dockremap:200000:300000

# docker.service 파일을 생성하고 다음과 같이 설정하자
sudo vi /etc/systemd/system/docker.service
[Service]
ExecStart=/usr/bin/dockerd --userns-remap=default

# docker daemon 재시작
# 참고로 stop docker 시 다음 에러 발생시 docker.socket 도 중지한다.
# sudo systemctl stop docker
# Warning: Stopping docker.service, but it can still be activated by:
#  docker.socket
sudo systemctl daemon-reload
sudo systemctl stop docker.socket
sudo systemctl stop docker
sudo systemctl start docker
sudo systemctl status docker

# 다시 docker container 를 실행
docker run -v /etc:/host_etc -it ubuntu

# 이제는 container 에서 host 파일을 수정할 수 없다.
echo "hacker ysoftmancd ..!" >> /host_etc/ysoftman.txt
bash: /host_etc/ysoftman.txt: Permission denied

# host 에서 ps 를 해보면 docker container bash 가 20000번대의 uid로 실행되는것을 알 수 있다.
ps -ef | grep bash
200000    1408  1379  0 03:26 pts/0    00:00:00 bash

# docker container 에서 id 를 보면 여전히 root 로 보이지만
# host 와 user namespace 를 다르다. 
id
uid=0(root) gid=0(root) groups=0(root)

# user namespace 를 확인해보면
# host 의 user 네임스페이스와 
ls -ahl /proc/$$/ns/user
lrwxrwxrwx 1 root root 0 Dec 15 03:33 /proc/897/ns/user -> 'user:[4026531837]'

# docker container 의 user 네임스페이스들 다르게 된걸 알 수 있다.
ls -ahl /proc/$$/ns/user
lrwxrwxrwx 1 root root 0 Dec 15 03:32 /proc/1/ns/user -> 'user:[4026532195]'

comments:

댓글 쓰기