컨테이너 보안

김건호·2024년 8월 31일

2024년 KISA 클라우드 취약점 점검 가이드

https://isms.kisa.or.kr/main/csap/notice/

일부 항목을 직접 테스트 환경 서버에서 체크해보자 !

Host 설정

도커 그룹에 불필요한 사용자 제거

Docker 데몬은 root 권한이 필요하며 Docker 그룹에 추가된 사용자는 root 권한을 부여받게 된다. 따라서 컨테이너를 실행하고 호스트의 root 디렉터리를 컨테이너에 매핑 할 수 있어 컨테이너는 제한 없이 호스트 파일 시스템을 변경할 수 있는 위험이 존재한다. 따라서 도커 그룹에 불필요한 사용자를 제거하여 root 권한 부여를 제한해야 한다

진단

# cat /etc/group | grep docker
docker:x:999:
# cat /etc/group | grep root
root:x:0:

현재 시스템에서는 root외의 다른 계정, 그룹에서의 docker 사용 권한이 없다
만약에 있을 경우 etc/group 에서 불필요한 사용자를 모두 제거, root 그룹 dockerroot 그룹에서 불필요한 사용자를 제거한다

도커 데몬 audit 설정

진단

/usr/bin/docker 파일에 감사 설정이 적용 되어 있는 경우 합격

root@MyServer:~# auditctl -l | grep /usr/bin/docker
Command 'auditctl' not found, but can be installed with:
apt install auditd

현재 시스템의 경우 감사로그 설정이 되어 있지 않다

조치

auditd 설치
 apt install auditd
vi /etc/audit/rules.d/audit.rules
-w /usr/bin/docker # 추가
auditd 재시작
service auditd restart

이후에도 감사로그에 대한 설정이 많이 나오는데 실제로 고객사 가보면 감사로그 설정이 중요하다는 요청이 많았던게 생각이 난다

도커 데몬 설정

default bridge를 통한 컨테이너간 네트워크 트래픽 제한

docker의 기본 네트워크 인터페이스인 docker0이 활성화되어 있다면 동일한 호스트 네트워크를 통해 다른 컨테이너와 통신이 가능하며 네트워크 패킷을 모두 확인할 수 있다. 따라서 각 컨테이너간의 통신이 불가하도록 default bridge(docker0) 사용을 제한해야 한다.

3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:65:56:c1:79 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:65ff:fe56:c179/64 scope link
       valid_lft forever preferred_lft forever

도커는 docker0 인터페이스를 브릿지로 사용하여 컨테이너간 네트워크 통신이 가능하다

진단


root@MyServer:~# ps -ef | grep docker
root        3471       1  0 02:34 ?        00:00:01 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

docker 데몬에 --icc=false 옵션이 존재하지 않음 (취약)

root@MyServer:~#  docker network ls --quiet | xargs docker network inspect --format '{{.Name}}: {{ .Options }}'
bridge: map[com.docker.network.bridge.default_bridge:true com.docker.network.bridge.enable_icc:true com.docker.network.bridge.enable_ip_masquerade:true com.docker.network.bridge.host_binding_ipv4:0.0.0.0 com.docker.network.bridge.name:docker0 com.docker.network.driver.mtu:1500]
host: map[]
none: map[]

icc가 true로 되어 있어 통신이 가능한 보안 취약점이다

조치

# dockerd --icc=true 옵션 추가하여 데몬 재시작

/etc/default/docker에 DOCKER_OPTS='--icc=false" 문구 추가

/lib/systemd/system/docker.service 에 아래 내용 추가
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS

도커 데몬 재시작

root@MyServer:~# systemctl start docker
root@MyServer:~# systemctl status docker

옵션 적용 확인

root@MyServer:~#  docker network ls --quiet | xargs docker network inspect --format '{{.Name}}: {{ .Options }}'
...
com.docker.network.bridge.enable_icc:false
...

컨테이너 및 이미지 빌드 파일

root가 아닌 user로 컨테이너 실행

기본적으로 컨테이너의 user namespace는 호스트의 namespace와 동일하다. 즉, 컨테이너 내부의 root 사용자는 호스트 시스템의 root 사용자이므로 root로 실행되는 컨테이너 프로세스의 손상으로 Docker 호스트 또한 손상될 수 있다. 일반적으로 컨테이너에는 root 권한이 필요하지 않으므로 컨테이너에 있는 애플리케이션은 root 권한으로 실행하지 않아야 한다

진단

컨테이너에서 계정이 root로 실행되지 않아야 한다

도커 컨테이너에서 user 격리하는 내용은 내 블로그
https://velog.io/@numerok/%EB%8F%84%EC%BB%A4-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EA%B2%A9%EB%A6%AC#%EB%8F%84%EC%BB%A4-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88%EC%97%90%EC%84%9C-user-%EB%84%A4%EC%9E%84%EC%8A%A4%ED%8E%98%EC%9D%B4%EC%8A%A4-%EA%B2%A9%EB%A6%AC-%EC%8B%A4%EC%8A%B5---%EA%B3%BC%EC%A0%9C-3
에서 실습하였으니 참고 !!

profile
네.. 뭐.. 김건호입니다...

0개의 댓글