Docker Security

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

๊ธฐ๋ณธ Docker ์—”์ง„ ๋ณด์•ˆ

Docker ์—”์ง„์€ Linux ์ปค๋„์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ Cgroups๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฒฉ๋ฆฌํ•˜์—ฌ ๊ธฐ๋ณธ์ ์ธ ๋ณด์•ˆ ๊ณ„์ธต์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์ธ ๋ณดํ˜ธ๋Š” Capabilities dropping, Seccomp, ๋ฐ SELinux/AppArmor๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋˜์–ด ์ปจํ…Œ์ด๋„ˆ ๊ฒฉ๋ฆฌ๋ฅผ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค. auth plugin์€ ์‚ฌ์šฉ์ž ํ–‰๋™์„ ์ถ”๊ฐ€๋กœ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Docker Security

Docker ์—”์ง„์— ๋Œ€ํ•œ ์•ˆ์ „ํ•œ ์ ‘๊ทผ

Docker ์—”์ง„์€ Unix ์†Œ์ผ“์„ ํ†ตํ•ด ๋กœ์ปฌ์—์„œ ๋˜๋Š” HTTP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›๊ฒฉ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›๊ฒฉ ์ ‘๊ทผ์„ ์œ„ํ•ด์„œ๋Š” HTTPS์™€ TLS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ฐ€์„ฑ, ๋ฌด๊ฒฐ์„ฑ ๋ฐ ์ธ์ฆ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

Docker ์—”์ง„์€ ๊ธฐ๋ณธ์ ์œผ๋กœ unix:///var/run/docker.sock์—์„œ Unix ์†Œ์ผ“์„ ํ†ตํ•ด ์ˆ˜์‹  ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค. Ubuntu ์‹œ์Šคํ…œ์—์„œ Docker์˜ ์‹œ์ž‘ ์˜ต์…˜์€ /etc/default/docker์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. Docker API ๋ฐ ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ ์›๊ฒฉ ์ ‘๊ทผ์„ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜์—ฌ Docker ๋ฐ๋ชฌ์„ HTTP ์†Œ์ผ“์„ ํ†ตํ•ด ๋…ธ์ถœํ•˜์‹ญ์‹œ์˜ค:

DOCKER_OPTS="-D -H unix:///var/run/docker.sock -H tcp://192.168.56.101:2376"
sudo service docker restart

๊ทธ๋Ÿฌ๋‚˜ Docker ๋ฐ๋ชฌ์„ HTTP๋กœ ๋…ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ๋ณด์•ˆ ๋ฌธ์ œ๋กœ ์ธํ•ด ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. HTTPS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ๋ณดํ˜ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์„ ๋ณดํ˜ธํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์˜ ์‹ ์›์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ ์„œ๋กœ์˜ ์‹ ์›์„ ์ƒํ˜ธ ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„์˜ ์‹ ์›์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ธ์ฆ์„œ๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์˜ˆ๋Š” ์ด ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€์˜ ๋ณด์•ˆ

์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋Š” ๊ฐœ์ธ ๋˜๋Š” ๊ณต์šฉ ์ €์žฅ์†Œ์— ์ €์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Docker๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์œ„ํ•œ ์—ฌ๋Ÿฌ ์ €์žฅ ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • Docker Hub: Docker์˜ ๊ณต์šฉ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์„œ๋น„์Šค.
  • Docker Registry: ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ํ˜ธ์ŠคํŒ…ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ.
  • Docker Trusted Registry: ์—ญํ•  ๊ธฐ๋ฐ˜ ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ฐ LDAP ๋””๋ ‰ํ† ๋ฆฌ ์„œ๋น„์Šค์™€์˜ ํ†ตํ•ฉ ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ Docker์˜ ์ƒ์—…์  ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ œ๊ณต.

์ด๋ฏธ์ง€ ์Šค์บ”

์ปจํ…Œ์ด๋„ˆ๋Š” ๊ธฐ๋ณธ ์ด๋ฏธ์ง€ ๋˜๋Š” ๊ธฐ๋ณธ ์ด๋ฏธ์ง€ ์œ„์— ์„ค์น˜๋œ ์†Œํ”„ํŠธ์›จ์–ด๋กœ ์ธํ•ด ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Docker๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ๋ณด์•ˆ ์Šค์บ”์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ทจ์•ฝ์ ์„ ๋‚˜์—ดํ•˜๋Š” Nautilus๋ผ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. Nautilus๋Š” ๊ฐ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ๋ ˆ์ด์–ด๋ฅผ ์ทจ์•ฝ์  ์ €์žฅ์†Œ์™€ ๋น„๊ตํ•˜์—ฌ ๋ณด์•ˆ ๊ตฌ๋ฉ์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

์ž์„ธํ•œ ์ •๋ณด๋Š” ์—ฌ๊ธฐ์—์„œ ์ฝ์–ด๋ณด์„ธ์š” .

  • docker scan

docker scan ๋ช…๋ น์€ ์ด๋ฏธ์ง€ ์ด๋ฆ„ ๋˜๋Š” ID๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด Docker ์ด๋ฏธ์ง€๋ฅผ ์Šค์บ”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, hello-world ์ด๋ฏธ์ง€๋ฅผ ์Šค์บ”ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค:

docker scan hello-world

Testing hello-world...

Organization:      docker-desktop-test
Package manager:   linux
Project name:      docker-image|hello-world
Docker image:      hello-world
Licenses:          enabled

โœ“ Tested 0 dependencies for known issues, no vulnerable paths found.

Note that we do not currently have vulnerability data for your image.
trivy -q -f json <container_name>:<tag>
snyk container test <image> --json-file-output=<output file> --severity-threshold=high
clair-scanner -w example-alpine.yaml --ip YOUR_LOCAL_IP alpine:3.5

Docker ์ด๋ฏธ์ง€ ์„œ๋ช…

Docker ์ด๋ฏธ์ง€ ์„œ๋ช…์€ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ด๋ฏธ์ง€์˜ ๋ณด์•ˆ์„ฑ๊ณผ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋žตํ•œ ์„ค๋ช…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • Docker Content Trust๋Š” ์ด๋ฏธ์ง€ ์„œ๋ช…์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด The Update Framework (TUF)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ Notary ํ”„๋กœ์ ํŠธ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ Notary ๋ฐ TUF๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
  • Docker ์ฝ˜ํ…์ธ  ์‹ ๋ขฐ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด export DOCKER_CONTENT_TRUST=1์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ Docker ๋ฒ„์ „ 1.10 ์ด์ƒ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊บผ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ด ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋˜๋ฉด ์„œ๋ช…๋œ ์ด๋ฏธ์ง€๋งŒ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ์ด๋ฏธ์ง€ ํ‘ธ์‹œ์—๋Š” ๋ฃจํŠธ ๋ฐ ํƒœ๊น… ํ‚ค์— ๋Œ€ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•˜๋ฉฐ, Docker๋Š” ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•ด Yubikey๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ์„ธ๋ถ€์ •๋ณด๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฝ˜ํ…์ธ  ์‹ ๋ขฐ๊ฐ€ ํ™œ์„ฑํ™”๋œ ์ƒํƒœ์—์„œ ์„œ๋ช…๋˜์ง€ ์•Š์€ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๊ณ  ํ•˜๋ฉด โ€œNo trust data for latestโ€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ์ฒซ ๋ฒˆ์งธ ์ดํ›„์˜ ์ด๋ฏธ์ง€ ํ‘ธ์‹œ๋ฅผ ์œ„ํ•ด Docker๋Š” ์ด๋ฏธ์ง€๋ฅผ ์„œ๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํ‚ค์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ ํ‚ค๋ฅผ ๋ฐฑ์—…ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์„ธ์š”:

tar -zcvf private_keys_backup.tar.gz ~/.docker/trust/private

Docker ํ˜ธ์ŠคํŠธ๋ฅผ ์ „ํ™˜ํ•  ๋•Œ, ์šด์˜์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฃจํŠธ ๋ฐ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํ‚ค๋ฅผ ์ด๋™ํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ ๋ณด์•ˆ ๊ธฐ๋Šฅ

์ปจํ…Œ์ด๋„ˆ ๋ณด์•ˆ ๊ธฐ๋Šฅ ์š”์•ฝ

์ฃผ์š” ํ”„๋กœ์„ธ์Šค ๊ฒฉ๋ฆฌ ๊ธฐ๋Šฅ

์ปจํ…Œ์ด๋„ˆํ™”๋œ ํ™˜๊ฒฝ์—์„œ ํ”„๋กœ์ ํŠธ์™€ ๊ทธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฒฉ๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ๋ณด์•ˆ ๋ฐ ์ž์› ๊ด€๋ฆฌ์— ์žˆ์–ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ฃผ์š” ๊ฐœ๋…์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค:

๋„ค์ž„์ŠคํŽ˜์ด์Šค

  • ๋ชฉ์ : ํ”„๋กœ์„ธ์Šค, ๋„คํŠธ์›Œํฌ ๋ฐ ํŒŒ์ผ ์‹œ์Šคํ…œ๊ณผ ๊ฐ™์€ ์ž์›์˜ ๊ฒฉ๋ฆฌ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ Docker์—์„œ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ปจํ…Œ์ด๋„ˆ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ˜ธ์ŠคํŠธ ๋ฐ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์™€ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • unshare์˜ ์‚ฌ์šฉ: unshare ๋ช…๋ น(๋˜๋Š” ๊ธฐ๋ณธ syscall)์€ ์ƒˆ๋กœ์šด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์–ด ์ถ”๊ฐ€์ ์ธ ๊ฒฉ๋ฆฌ ๊ณ„์ธต์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Kubernetes๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์ด๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š์ง€๋งŒ, Docker๋Š” ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.
  • ์ œํ•œ ์‚ฌํ•ญ: ์ƒˆ๋กœ์šด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ˜ธ์ŠคํŠธ์˜ ๊ธฐ๋ณธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ๋˜๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์นจํˆฌํ•˜๋ ค๋ฉด ์ผ๋ฐ˜์ ์œผ๋กœ ํ˜ธ์ŠคํŠธ์˜ /proc ๋””๋ ‰ํ† ๋ฆฌ์— ์ ‘๊ทผํ•ด์•ผ ํ•˜๋ฉฐ, nsenter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง„์ž…ํ•ฉ๋‹ˆ๋‹ค.

์ œ์–ด ๊ทธ๋ฃน (CGroups)

  • ๊ธฐ๋Šฅ: ์ฃผ๋กœ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ์ž์›์„ ํ• ๋‹นํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ ์ธก๋ฉด: CGroups ์ž์ฒด๋Š” ๊ฒฉ๋ฆฌ ๋ณด์•ˆ์„ ์ œ๊ณตํ•˜์ง€ ์•Š์ง€๋งŒ, ์ž˜๋ชป ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ release_agent ๊ธฐ๋Šฅ์ด ๋ฌด๋‹จ ์ ‘๊ทผ์— ์•…์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Šฅ๋ ฅ ๋“œ๋กญ

  • ์ค‘์š”์„ฑ: ํ”„๋กœ์„ธ์Šค ๊ฒฉ๋ฆฌ๋ฅผ ์œ„ํ•œ ์ค‘์š”ํ•œ ๋ณด์•ˆ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
  • ๊ธฐ๋Šฅ: ํŠน์ • ๋Šฅ๋ ฅ์„ ๋“œ๋กญํ•˜์—ฌ ๋ฃจํŠธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฃจํŠธ ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰๋˜๋”๋ผ๋„ ํ•„์š”ํ•œ ๋Šฅ๋ ฅ์ด ๋ถ€์กฑํ•˜๋ฉด ํŠน๊ถŒ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์ด๋Š” ๊ถŒํ•œ ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด syscall์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ๋Šฅ๋ ฅ์„ ๋“œ๋กญํ•œ ํ›„์˜ ๋‚จ์€ ๋Šฅ๋ ฅ์ž…๋‹ˆ๋‹ค:

Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep

Seccomp

Docker์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” syscalls๋ฅผ ๋”์šฑ ์ œํ•œํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.
๊ธฐ๋ณธ Docker Seccomp ํ”„๋กœํŒŒ์ผ์€ https://github.com/moby/moby/blob/master/profiles/seccomp/default.json์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AppArmor

Docker์—๋Š” ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ์ด ์žˆ์Šต๋‹ˆ๋‹ค: https://github.com/moby/moby/tree/master/profiles/apparmor

์ด๊ฒƒ์€ ๊ธฐ๋Šฅ, syscalls, ํŒŒ์ผ ๋ฐ ํด๋”์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ค„์ด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹คโ€ฆ

Namespaces

Namespaces๋Š” ์ปค๋„ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ถ„ํ• ํ•˜์—ฌ ํ•œ ์ง‘ํ•ฉ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•œ ์ง‘ํ•ฉ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณด๊ณ , ๋‹ค๋ฅธ ์ง‘ํ•ฉ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‹ค๋ฅธ ์ง‘ํ•ฉ์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณด๋„๋ก ํ•˜๋Š” Linux ์ปค๋„์˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋ฆฌ์†Œ์Šค์™€ ํ”„๋กœ์„ธ์Šค์˜ ์ง‘ํ•ฉ์— ๋Œ€ํ•ด ๋™์ผํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐ–์ง€๋งŒ, ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๋Š” ์—ฌ๋Ÿฌ ๊ณต๊ฐ„์— ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Docker๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ฒฉ๋ฆฌ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ Linux ์ปค๋„ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:

  • pid namespace
  • mount namespace
  • network namespace
  • ipc namespace
  • UTS namespace

๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š” ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•˜์„ธ์š”:

Namespaces

cgroups

Linux ์ปค๋„ ๊ธฐ๋Šฅ cgroups๋Š” cpu, memory, io, network bandwidth์™€ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํ”„๋กœ์„ธ์Šค ์ง‘ํ•ฉ์— ๋Œ€ํ•ด ์ œํ•œํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Docker๋Š” ํŠน์ • ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๋ฆฌ์†Œ์Šค ์ œ์–ด๋ฅผ ํ—ˆ์šฉํ•˜๋Š” cgroup ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ์€ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 500m๋กœ ์ œํ•œ๋˜๊ณ , ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 50m๋กœ ์ œํ•œ๋˜๋ฉฐ, cpu share๊ฐ€ 512, blkioweight๊ฐ€ 400์ธ ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค. CPU share๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ CPU ์‚ฌ์šฉ๋Ÿ‰์„ ์ œ์–ดํ•˜๋Š” ๋น„์œจ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 1024์ด๋ฉฐ 0์—์„œ 1024 ์‚ฌ์ด์˜ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์„ธ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋™์ผํ•œ CPU share 1024๋ฅผ ๊ฐ€์ง€๋ฉด, ๊ฐ ์ปจํ…Œ์ด๋„ˆ๋Š” CPU ๋ฆฌ์†Œ์Šค ๊ฒฝํ•ฉ ์‹œ ์ตœ๋Œ€ 33%์˜ CPU๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. blkio-weight๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ IO๋ฅผ ์ œ์–ดํ•˜๋Š” ๋น„์œจ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 500์ด๋ฉฐ 10์—์„œ 1000 ์‚ฌ์ด์˜ ๋ฒ”์œ„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

docker run -it -m 500M --kernel-memory 50M --cpu-shares 512 --blkio-weight 400 --name ubuntu1 ubuntu bash

์ปจํ…Œ์ด๋„ˆ์˜ cgroup์„ ์–ป์œผ๋ ค๋ฉด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

docker run -dt --rm denial sleep 1234 #Run a large sleep inside a Debian container
ps -ef | grep 1234 #Get info about the sleep process
ls -l /proc/<PID>/ns #Get the Group and the namespaces (some may be uniq to the hosts and some may be shred with it)

๋” ๋งŽ์€ ์ •๋ณด๋Š” ๋‹ค์Œ์„ ํ™•์ธํ•˜์„ธ์š”:

CGroups

๊ถŒํ•œ

๊ถŒํ•œ์€ ๋ฃจํŠธ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ—ˆ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์— ๋Œ€ํ•œ ๋” ์„ธ๋ฐ€ํ•œ ์ œ์–ด๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. Docker๋Š” Linux ์ปค๋„ ๊ถŒํ•œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์œ ํ˜•์— ๊ด€๊ณ„์—†์ด ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

Docker ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋  ๋•Œ, ํ”„๋กœ์„ธ์Šค๋Š” ๊ฒฉ๋ฆฌ์—์„œ ํƒˆ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฏผ๊ฐํ•œ ๊ถŒํ•œ์„ ํฌ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฏผ๊ฐํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ํƒˆ์ถœํ•  ์ˆ˜ ์—†๋„๋ก ๋ณด์žฅํ•˜๋ ค๋Š” ์‹œ๋„์ž…๋‹ˆ๋‹ค:

Linux Capabilities

Docker์˜ Seccomp

์ด๊ฒƒ์€ Docker๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ณด์•ˆ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค:

Seccomp

Docker์˜ AppArmor

AppArmor๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œํ•œ๋œ ์ž์› ์ง‘ํ•ฉ์œผ๋กœ ์ œํ•œํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋žจ๋ณ„ ํ”„๋กœํ•„์„ ์ œ๊ณตํ•˜๋Š” ์ปค๋„ ํ–ฅ์ƒ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.:

AppArmor

Docker์˜ SELinux

  • ๋ ˆ์ด๋ธ”๋ง ์‹œ์Šคํ…œ: SELinux๋Š” ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์™€ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฐ์ฒด์— ๊ณ ์œ ํ•œ ๋ ˆ์ด๋ธ”์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • ์ •์ฑ… ์ง‘ํ–‰: ํ”„๋กœ์„ธ์Šค ๋ ˆ์ด๋ธ”์ด ์‹œ์Šคํ…œ ๋‚ด ๋‹ค๋ฅธ ๋ ˆ์ด๋ธ”์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์„ ์ •์˜ํ•˜๋Š” ๋ณด์•ˆ ์ •์ฑ…์„ ์ง‘ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ ํ”„๋กœ์„ธ์Šค ๋ ˆ์ด๋ธ”: ์ปจํ…Œ์ด๋„ˆ ์—”์ง„์ด ์ปจํ…Œ์ด๋„ˆ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ œํ•œ๋œ SELinux ๋ ˆ์ด๋ธ”์ธ container_t๊ฐ€ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ ๋‚ด ํŒŒ์ผ ๋ ˆ์ด๋ธ”๋ง: ์ปจํ…Œ์ด๋„ˆ ๋‚ด์˜ ํŒŒ์ผ์€ ์ผ๋ฐ˜์ ์œผ๋กœ container_file_t๋กœ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค.
  • ์ •์ฑ… ๊ทœ์น™: SELinux ์ •์ฑ…์€ ์ฃผ๋กœ container_t ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ container_file_t๋กœ ๋ ˆ์ด๋ธ”์ด ์ง€์ •๋œ ํŒŒ์ผ๊ณผ๋งŒ ์ƒํ˜ธ์ž‘์šฉ(์ฝ๊ธฐ, ์“ฐ๊ธฐ, ์‹คํ–‰)ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์ปจํ…Œ์ด๋„ˆ ๋‚ด์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์†์ƒ๋˜๋”๋ผ๋„ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•ด๋‹น ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ๊ฐ์ฒด์™€๋งŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋„๋ก ์ œํ•œํ•˜์—ฌ ๊ทธ๋Ÿฌํ•œ ์†์ƒ์œผ๋กœ ์ธํ•œ ์ž ์žฌ์  ํ”ผํ•ด๋ฅผ ํฌ๊ฒŒ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

SELinux

AuthZ ๋ฐ AuthN

Docker์—์„œ ๊ถŒํ•œ ๋ถ€์—ฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ Docker ๋ฐ๋ชฌ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ์ฐจ๋‹จํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฐ์ •์€ ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฒ€ํ† ํ•˜์—ฌ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค:

  • ์ธ์ฆ ์ปจํ…์ŠคํŠธ: ์—ฌ๊ธฐ์—๋Š” ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ํฌ๊ด„์ ์ธ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€์™€ ์–ด๋–ป๊ฒŒ ์ธ์ฆํ–ˆ๋Š”์ง€๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • ๋ช…๋ น ์ปจํ…์ŠคํŠธ: ์ด๋Š” ์š”์ฒญ๊ณผ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ด€๋ จ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ปจํ…์ŠคํŠธ๋Š” ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ์˜ ํ•ฉ๋ฒ•์ ์ธ ์š”์ฒญ๋งŒ ์ฒ˜๋ฆฌ๋˜๋„๋ก ๋ณด์žฅํ•˜์—ฌ Docker ์ž‘์—…์˜ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.

AuthZ& AuthN - Docker Access Authorization Plugin

์ปจํ…Œ์ด๋„ˆ์—์„œ์˜ DoS

์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž์›์„ ์ ์ ˆํžˆ ์ œํ•œํ•˜์ง€ ์•Š์œผ๋ฉด, ์†์ƒ๋œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ํ˜ธ์ŠคํŠธ์— DoS๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • CPU DoS
# stress-ng
sudo apt-get install -y stress-ng && stress-ng --vm 1 --vm-bytes 1G --verify -t 5m

# While loop
docker run -d --name malicious-container -c 512 busybox sh -c 'while true; do :; done'
  • ๋Œ€์—ญํญ DoS
nc -lvp 4444 >/dev/null & while true; do cat /dev/urandom | nc <target IP> 4444; done

ํฅ๋ฏธ๋กœ์šด Docker ํ”Œ๋ž˜๊ทธ

โ€“privileged ํ”Œ๋ž˜๊ทธ

๋‹ค์Œ ํŽ˜์ด์ง€์—์„œ --privileged ํ”Œ๋ž˜๊ทธ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

Docker โ€“privileged

โ€“security-opt

no-new-privileges

๊ณต๊ฒฉ์ž๊ฐ€ ๋‚ฎ์€ ๊ถŒํ•œ ์‚ฌ์šฉ์ž๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ, ์ž˜๋ชป ๊ตฌ์„ฑ๋œ suid ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ณต๊ฒฉ์ž๊ฐ€ ์ด๋ฅผ ์•…์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๋‚ด์—์„œ ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ทธ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ์—์„œ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

no-new-privileges ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๊ถŒํ•œ ์ƒ์Šน์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

docker run -it --security-opt=no-new-privileges:true nonewpriv

๊ธฐํƒ€

#You can manually add/drop capabilities with
--cap-add
--cap-drop

# You can manually disable seccomp in docker with
--security-opt seccomp=unconfined

# You can manually disable seccomp in docker with
--security-opt apparmor=unconfined

# You can manually disable selinux in docker with
--security-opt label:disable

๋” ๋งŽ์€ --security-opt ์˜ต์…˜์€ ๋‹ค์Œ์„ ํ™•์ธํ•˜์„ธ์š”: https://docs.docker.com/engine/reference/run/#security-configuration

๊ธฐํƒ€ ๋ณด์•ˆ ๊ณ ๋ ค์‚ฌํ•ญ

๋น„๋ฐ€ ๊ด€๋ฆฌ: ๋ชจ๋ฒ” ์‚ฌ๋ก€

๋น„๋ฐ€์„ Docker ์ด๋ฏธ์ง€์— ์ง์ ‘ ํฌํ•จ์‹œํ‚ค๊ฑฐ๋‚˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ docker inspect ๋˜๋Š” exec์™€ ๊ฐ™์€ ๋ช…๋ น์„ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

Docker ๋ณผ๋ฅจ์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ๋” ์•ˆ์ „ํ•œ ๋Œ€์•ˆ์œผ๋กœ ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์—์„œ ์ž„์‹œ ํŒŒ์ผ ์‹œ์Šคํ…œ์œผ๋กœ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ์–ด docker inspect ๋ฐ ๋กœ๊น…๊ณผ ๊ด€๋ จ๋œ ์œ„ํ—˜์„ ์™„ํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฃจํŠธ ์‚ฌ์šฉ์ž์™€ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ exec ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋Š” ์—ฌ์ „ํžˆ ๋น„๋ฐ€์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Docker ๋น„๋ฐ€์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋”์šฑ ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋‹จ๊ณ„์—์„œ ๋น„๋ฐ€์ด ํ•„์š”ํ•œ ์ธ์Šคํ„ด์Šค์˜ ๊ฒฝ์šฐ, BuildKit์€ ๋นŒ๋“œ ์‹œ๊ฐ„ ๋น„๋ฐ€์„ ์ง€์›ํ•˜์—ฌ ๋นŒ๋“œ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

BuildKit์„ ํ™œ์šฉํ•˜๋ ค๋ฉด ์„ธ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด: export DOCKER_BUILDKIT=1
  2. ๋ช…๋ น์–ด์— ์ ‘๋‘์‚ฌ๋ฅผ ๋ถ™์—ฌ์„œ: DOCKER_BUILDKIT=1 docker build .
  3. Docker ๊ตฌ์„ฑ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜์—ฌ: { "features": { "buildkit": true } }, ์ดํ›„ Docker๋ฅผ ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

BuildKit์€ --secret ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ ์‹œ๊ฐ„ ๋น„๋ฐ€์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ, ์ด๋Ÿฌํ•œ ๋น„๋ฐ€์ด ์ด๋ฏธ์ง€ ๋นŒ๋“œ ์บ์‹œ๋‚˜ ์ตœ์ข… ์ด๋ฏธ์ง€์— ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

docker build --secret my_key=my_value ,src=path/to/my_secret_file .

์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ•„์š”ํ•œ ๋น„๋ฐ€์— ๋Œ€ํ•ด, Docker Compose์™€ Kubernetes๋Š” ๊ฐ•๋ ฅํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Docker Compose๋Š” ๋น„๋ฐ€ ํŒŒ์ผ์„ ์ง€์ •ํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋น„์Šค ์ •์˜์—์„œ secrets ํ‚ค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ docker-compose.yml ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค:

version: "3.7"
services:
my_service:
image: centos:7
entrypoint: "cat /run/secrets/my_secret"
secrets:
- my_secret
secrets:
my_secret:
file: ./my_secret_file.txt

์ด ๊ตฌ์„ฑ์€ Docker Compose๋กœ ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ๋น„๋ฐ€์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

Kubernetes ํ™˜๊ฒฝ์—์„œ๋Š” ๋น„๋ฐ€์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›๋˜๋ฉฐ Helm-Secrets์™€ ๊ฐ™์€ ๋„๊ตฌ๋กœ ์ถ”๊ฐ€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Kubernetes์˜ ์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด(RBAC)๋Š” Docker Enterprise์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋น„๋ฐ€ ๊ด€๋ฆฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.

gVisor

gVisor๋Š” Go๋กœ ์ž‘์„ฑ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปค๋„๋กœ, Linux ์‹œ์Šคํ…œ ํ‘œ๋ฉด์˜ ์ƒ๋‹น ๋ถ€๋ถ„์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ˜ธ์ŠคํŠธ ์ปค๋„ ๊ฐ„์˜ ๊ฒฉ๋ฆฌ ๊ฒฝ๊ณ„๋ฅผ ์ œ๊ณตํ•˜๋Š” runsc๋ผ๋Š” Open Container Initiative (OCI) ๋Ÿฐํƒ€์ž„์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. runsc ๋Ÿฐํƒ€์ž„์€ Docker ๋ฐ Kubernetes์™€ ํ†ตํ•ฉ๋˜์–ด ์ƒŒ๋“œ๋ฐ•์Šคํ™”๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‰ฝ๊ฒŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

GitHub - google/gvisor: Application Kernel for Containers

Kata Containers

Kata Containers๋Š” ๊ฒฝ๋Ÿ‰ ๊ฐ€์ƒ ๋จธ์‹ ์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ „ํ•œ ์ปจํ…Œ์ด๋„ˆ ๋Ÿฐํƒ€์ž„์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๋Š” ์˜คํ”ˆ ์†Œ์Šค ์ปค๋ฎค๋‹ˆํ‹ฐ์ž…๋‹ˆ๋‹ค. ์ด๋“ค์€ ์ปจํ…Œ์ด๋„ˆ์ฒ˜๋Ÿผ ๋А๊ปด์ง€๊ณ  ์ž‘๋™ํ•˜์ง€๋งŒ ํ•˜๋“œ์›จ์–ด ๊ฐ€์ƒํ™” ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋” ๊ฐ•๋ ฅํ•œ ์ž‘์—… ๋ถ€ํ•˜ ๊ฒฉ๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Kata Containers - Open Source Container Runtime Software | Kata Containers

์š”์•ฝ ํŒ

  • --privileged ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— Docker ์†Œ์ผ“์„ ๋งˆ์šดํŠธํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. Docker ์†Œ์ผ“์€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฏ€๋กœ, ์˜ˆ๋ฅผ ๋“ค์–ด --privileged ํ”Œ๋ž˜๊ทธ๋กœ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ˜ธ์ŠคํŠธ๋ฅผ ์™„์ „ํžˆ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์‰ฌ์šด ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ root๋กœ ์‹คํ–‰ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‚ฌ์šฉ์ž ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ์ปจํ…Œ์ด๋„ˆ์˜ root๋Š” ์‚ฌ์šฉ์ž ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์žฌ๋งคํ•‘๋˜์ง€ ์•Š๋Š” ํ•œ ํ˜ธ์ŠคํŠธ์˜ root์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฃผ๋กœ Linux ๋„ค์ž„์ŠคํŽ˜์ด์Šค, ๊ธฐ๋Šฅ ๋ฐ cgroups์— ์˜ํ•ด ์•ฝ๊ฐ„ ์ œํ•œ๋ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค (--cap-drop=all) ๋ฐ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋งŒ ํ™œ์„ฑํ™”ํ•˜์‹ญ์‹œ์˜ค (--cap-add=...). ๋งŽ์€ ์ž‘์—… ๋ถ€ํ•˜์—๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ด๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž ์žฌ์ ์ธ ๊ณต๊ฒฉ ๋ฒ”์œ„๊ฐ€ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • โ€œno-new-privilegesโ€ ๋ณด์•ˆ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋” ๋งŽ์€ ๊ถŒํ•œ์„ ์–ป์ง€ ๋ชปํ•˜๋„๋ก ๋ฐฉ์ง€ํ•˜์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด suid ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ํ†ตํ•ด์„œ์ž…๋‹ˆ๋‹ค.
  • ์ปจํ…Œ์ด๋„ˆ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ œํ•œํ•˜์‹ญ์‹œ์˜ค. ๋ฆฌ์†Œ์Šค ์ œํ•œ์€ ์„œ๋น„์Šค ๊ฑฐ๋ถ€ ๊ณต๊ฒฉ์œผ๋กœ๋ถ€ํ„ฐ ๋จธ์‹ ์„ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • seccomp ์กฐ์ •ํ•˜์‹ญ์‹œ์˜ค, AppArmor (๋˜๋Š” SELinux) ํ”„๋กœํ•„์„ ์กฐ์ •ํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์— ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ์ž‘์—… ๋ฐ ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋งŒ ํ—ˆ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • ๊ณต์‹ Docker ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์„œ๋ช…์„ ์š”๊ตฌํ•˜์‹ญ์‹œ์˜ค ๋˜๋Š” ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ง์ ‘ ๋นŒ๋“œํ•˜์‹ญ์‹œ์˜ค. ๋ฐฑ๋„์–ด๊ฐ€ ์žˆ๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ƒ์†ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋˜ํ•œ ๋ฃจํŠธ ํ‚ค์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•ˆ์ „ํ•œ ์žฅ์†Œ์— ๋ณด๊ด€ํ•˜์‹ญ์‹œ์˜ค. Docker๋Š” UCP๋กœ ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•  ๊ณ„ํš์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ •๊ธฐ์ ์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์žฌ๋นŒ๋“œํ•˜์—ฌ ํ˜ธ์ŠคํŠธ์™€ ์ด๋ฏธ์ง€์— ๋ณด์•ˆ ํŒจ์น˜๋ฅผ ์ ์šฉํ•˜์‹ญ์‹œ์˜ค.
  • ๋น„๋ฐ€์„ ํ˜„๋ช…ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜์—ฌ ๊ณต๊ฒฉ์ž๊ฐ€ ์ ‘๊ทผํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ํ•˜์‹ญ์‹œ์˜ค.
  • Docker ๋ฐ๋ชฌ์„ ๋…ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ HTTPS๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค ํด๋ผ์ด์–ธํŠธ ๋ฐ ์„œ๋ฒ„ ์ธ์ฆ๊ณผ ํ•จ๊ป˜.
  • Dockerfile์—์„œ ADD ๋Œ€์‹  COPY๋ฅผ ์„ ํ˜ธํ•˜์‹ญ์‹œ์˜ค. ADD๋Š” ์ž๋™์œผ๋กœ ์••์ถ•๋œ ํŒŒ์ผ์„ ์ถ”์ถœํ•˜๊ณ  URL์—์„œ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. COPY๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ํ•œ ADD ์‚ฌ์šฉ์„ ํ”ผํ•˜์—ฌ ์›๊ฒฉ URL ๋ฐ Zip ํŒŒ์ผ์„ ํ†ตํ•œ ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•˜์ง€ ์•Š๋„๋ก ํ•˜์‹ญ์‹œ์˜ค.
  • ๊ฐ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐ€์ง€์‹ญ์‹œ์˜ค.
  • ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ssh๋ฅผ ๋‘์ง€ ๋งˆ์‹ญ์‹œ์˜ค. โ€œdocker execโ€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์— sshํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋” ์ž‘์€ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ง€์‹ญ์‹œ์˜ค.

Docker ํƒˆ์ถœ / ๊ถŒํ•œ ์ƒ์Šน

Docker ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ์žˆ๊ฑฐ๋‚˜ docker ๊ทธ๋ฃน์˜ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ํƒˆ์ถœํ•˜๊ณ  ๊ถŒํ•œ์„ ์ƒ์Šน์‹œํ‚ค๋ ค๊ณ  ์‹œ๋„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

Docker Breakout / Privilege Escalation

Docker ์ธ์ฆ ํ”Œ๋Ÿฌ๊ทธ์ธ ์šฐํšŒ

Docker ์†Œ์ผ“์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ docker ๊ทธ๋ฃน์˜ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ์ง€๋งŒ Docker ์ธ์ฆ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์˜ํ•ด ํ–‰๋™์ด ์ œํ•œ๋˜๋Š” ๊ฒฝ์šฐ, ์šฐํšŒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค:

AuthZ& AuthN - Docker Access Authorization Plugin

Docker ๊ฐ•ํ™”

  • ๋„๊ตฌ docker-bench-security๋Š” ํ”„๋กœ๋•์…˜์—์„œ Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐฐํฌํ•  ๋•Œ์˜ ์ผ๋ฐ˜์ ์ธ ๋ชจ๋ฒ” ์‚ฌ๋ก€๋ฅผ ํ™•์ธํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋Š” ๋ชจ๋‘ ์ž๋™ํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ, CIS Docker Benchmark v1.3.1์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
    Docker๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ˜ธ์ŠคํŠธ ๋˜๋Š” ์ถฉ๋ถ„ํ•œ ๊ถŒํ•œ์ด ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. README์—์„œ ์‹คํ–‰ ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค: https://github.com/docker/docker-bench-security.

์ฐธ๊ณ  ๋ฌธํ—Œ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ