컨테이너 보안 · 최소 권한 · 퀴즈
퀴즈: 최소 권한
문항 6개. 정답과 해설은 풀어 본 뒤에 보여 드립니다.
`docker run --rm -v /etc:/host-etc alpine:3.20 sh -c 'echo "# injected" >> /host-etc/hosts'` 가 호스트 파일을 실제로 수정합니다. 가장 정확한 설명은?
- 도커 데몬의 알려진 버그이며 최신 버전에서는 이미 막혀 있는 동작이다
- alpine 이미지에만 있는 취약점이다
- `>>` 추가 리다이렉션만 허용되고 덮어쓰기는 막혀 있다
- 유저 네임스페이스를 쓰지 않으면 컨테이너의 UID 0 이 호스트의 UID 0 과 같으므로 마운트된 경로에 그 권한이 그대로 적용된다
Dockerfile 에 `USER app` 이라고 썼더니 쿠버네티스가 `container has runAsNonRoot and image has non-numeric user (app), cannot verify user is non-root` 로 파드를 거부했습니다. 올바른 수정은?
- `runAsNonRoot` 를 false 로 바꾼다
- 파드에 `runAsUser: 0` 을 명시한다
- 이미지에 `/etc/passwd` 를 추가한다
- `USER 10001:10001` 처럼 숫자 UID 로 지정한다
비특권 사용자로 실행하는 서비스가 80번 포트를 열어야 합니다. 가장 단순하고 권장되는 해법은?
- 컨테이너를 root 로 되돌린다
- 앱 포트를 8080 으로 바꾸고 서비스 계층에서 80 으로 노출한다
- `--privileged` 를 붙인다
- `NET_BIND_SERVICE` capability 를 추가한다
다음 중 컨테이너 기본 capability 세트(약 14개)에 **포함되지 않는** 것은?
- CAP_SYS_ADMIN
- CAP_CHOWN
- CAP_SETUID
- CAP_NET_RAW
CI 러너 컨테이너에 도커 소켓(`/var/run/docker.sock`)을 마운트하는 것이 `--privileged` 와 사실상 같은 위험으로 취급되는 이유는?
- 소켓 파일이 setuid 비트를 가지고 있기 때문
- 소켓 통신은 암호화되지 않기 때문
- 그 소켓으로 호스트 루트 파일시스템을 마운트한 특권 컨테이너를 새로 띄울 수 있기 때문
- 도커 소켓은 seccomp 프로파일을 우회하기 때문
CVE-2019-5736 과 CVE-2024-21626 의 공통점으로 가장 정확한 것은?
- 둘 다 런타임(runc) 의 버그였지만 컨테이너가 호스트와 같은 커널 아래 있기 때문에 호스트 침해로 이어졌다
- 둘 다 커널 취약점이었다
- 둘 다 이미지 레지스트리의 인증 문제였다
- 둘 다 seccomp 프로파일을 끄지 않으면 발생하지 않는다