๋ชฉ์ฐจ
ย Docker Security
ย Process Isolation
Process Isolation์ด๋ ๊ฐ ์ปจํ
์ด๋๋ ๋
๋ฆฝ์ ์ผ๋ก ์คํ๋๋ฉฐ, ๋ค๋ฅธ ์ปจํ
์ด๋๋ ํธ์คํธ์ ํ๋ก์ธ์ค์ ์ํฅ์ ์ฃผ์ง ์๋๋ค๋ ๊ฒ์ ๋ปํ๋ค.
์ปจํ
์ด๋๋ ํธ์คํธ์ ๊ฐ์ ์ปค๋์ ๊ณต์ ํ๋ ํํ๋ฅผ ๊ฐ์ง๋๋ฐ, ์ด๋ ๊ฐ์ ๋จธ์ ๊ณผ ๋ฌ๋ฆฌ ์ปจํ
์ด๋๊ฐ ํธ์คํธ๋ก๋ถํฐ ์์ ํ ๊ฒฉ๋ฆฌ๋์ด ์์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ํธ์คํธ์ ์ปจํ
์ด๋๋ ๊ฐ์์ ๋ค์์คํ์ด์ค๋ฅผ ๊ฐ์ง๋ค. ์ปจํ
์ด๋์์ ์คํ๋๋ ๋ชจ๋ ํ๋ก์ธ์ค๋ ์ฌ์ค์ ํธ์คํธ ์คํ๋์ง๋ง, ๊ฐ์์ ๋ค์์คํ์ด์ค์์ ์คํ๋๋ค. ์ด๋ก ์ธํด Docker ์ปจํ
์ด๋๋ ์์ ์ ํ๋ก์ธ์ค๋ง์ ๋ณผ ์ ์๊ณ , ์ธ๋ถ ๋๋ ๋ค๋ฅธ ๋ค์์คํ์ด์ค์ ์๋ ํ๋ก์ธ์ค๋ ๋ณผ ์ ์๋ค.
์๋ฅผ ๋ค์ด, docker run ubuntu sleep 3600 ๋ช
๋ น์ ํตํด ์ฐ๋ถํฌ ์ปจํ
์ด๋๋ฅผ ์คํํ๋ค๊ณ ํ์. Docker ์ปจํ
์ด๋ ๋ด์์ ํ๋ก์ธ์ค๋ฅผ ๋์ดํ๋ฉด ํ๋ก์ธ์ค ID๊ฐ 1์ธ sleep ํ๋ก์ธ์ค๋ฅผ ํ์ธํ ์ ์๋ค.
# Docker Container ๋ด์์ ํ๋ก์ธ์ค ํ์ธ
$ ps aux
USER PID ... COMMAND
root 1 ... sleep 3600
Bash
๋ณต์ฌ
๋ฐ๋ฉด, Docker ํธ์คํธ์์๋ ํธ์คํธ๊ฐ ๊ฐ์ง ๋ชจ๋ ํ๋ก์ธ์ค๋ฅผ ํฌํจํ์ฌ ์์ ๋ค์์คํ์ด์ค์ ํ๋ก์ธ์ค๊น์ง ๋ชจ๋ ํ์ธํ ์ ์๋ค. ์ด๋, ๊ฐ์ ํ๋ก์ธ์ค์ผ์ง๋ผ๋ ํธ์คํธ์์์ ํ๋ก์ธ์ค ID์ ์ปจํ
์ด๋ ๋ด์์์ ํ๋ก์ธ์ค ID๊ฐ ๋ค๋ฅด๋ค.
# Host์์์ ํ๋ก์ธ์ค ํ์ธ
$ ps aus
USER PID ... COMMAND
...
root 3802 ... docker-containerd-shime -namespace m
root 3816 ... sleep 3600
Bash
๋ณต์ฌ
์ด๋ ํ๋ก์ธ์ค๊ฐ ์๋ก ๋ค๋ฅธ ๋ค์์คํ์ด์ค ๋ด์์ ์๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค ID๋ฅผ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฌํ ๋ฐฉ์์ผ๋ก Docker๋ ์์คํ
๋ด์ ์ปจํ
์ด๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ฒฉ๋ฆฌ๋๋ค.
ย User Security
ย Users
ํธ์คํธ๋ root ์ ์ ํ ๋ช
๊ณผ ๋ค์์ non-root ์ ์ ๋ฅผ ๊ฐ์ง๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Docker๋ ๋ฃจํธ ์ฌ์ฉ์๋ก์ ์ปจํ
์ด๋ ๋ด์ ํ๋ก์ธ์ค๋ฅผ ์คํํ๋ค. ์ปจํ
์ด๋ ๋ด์ธ๋ถ ๋ชจ๋์์ ํ๋ก์ธ์ค๋ ๋ฃจํธ ์ฌ์ฉ์๋ก ์คํ๋๋ค.
ย User Instruction
์ปจํ
์ด๋ ๋ด์์ ํ๋ก์ธ์ค๊ฐ ๋ฃจํธ ์ฌ์ฉ์๋ก ์คํ๋์ง ์๊ฒ ํ๋ ค๋ฉด docker run ๋ช
๋ น์ --user์ต์
์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ID๋ฅผ ์ง์ ํ ์ ์๋ค.
# ID๊ฐ 1000์ธ ์ฌ์ฉ์๋ก ์คํ
docker run --user=1000 ubuntu sleep 3600
Bash
๋ณต์ฌ
์ฌ์ฉ์ ๋ณด์์ ๊ฐํํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ Docker ์ด๋ฏธ์ง ์์ฑ ์ ์ฌ์ฉ์ ID๋ฅผ ์ ์ํ๋ ๊ฒ์ด๋ค. Dockerfile์ ์ฌ์ฉ์ ID๋ฅผ ์ค์ ํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ ์ ์๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์ ID๋ฅผ ๋ช
์ํ์ง ์๊ณ ํด๋น ์ด๋ฏธ์ง๋ฅผ ์คํํ ๊ฒฝ์ฐ, ํ๋ก์ธ์ค๋ ์ง์ ๋ ์ฌ์ฉ์ ID๋ก ์คํ๋๋ค.
# Dockerfile
FROM ubuntu
User 1000
Docker
๋ณต์ฌ
docker build -t my-ubuntu-image .
docker rub my-ubuntu-image sleep 3600
Bash
๋ณต์ฌ
ย Capabilities
Docker๋ ๋ฃจํธ ์ฌ์ฉ์์ ๊ธฐ๋ฅ์ ์ ํํ๋ ๋ณด์ ๊ธฐ๋ฅ์ ๊ตฌํํ์ฌ, ์ปจํ
์ด๋ ๋ด์ ๋ฃจํธ ์ฌ์ฉ์๊ฐ ํธ์คํธ์ ๋ฃจํธ ์ฌ์ฉ์์ ๋์ผํ์ง ์๋๋ก ํ๋ค. ์ฆ, ์ปจํ
์ด๋ ๋ด์ ๋ฃจํธ ์ฌ์ฉ์์ ํธ์คํธ์ ๋ฃจํธ ์ฌ์ฉ์๋ ๋์ผํ ๊ถํ์ ๊ฐ์ง ์๋๋ค.
Docker๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ปจํ
์ด๋๋ฅผ ์ ํ๋ ๊ธฐ๋ฅ(Capabilities)์ ๊ฐ์ง๊ณ ์คํํ๋ค. ๋ฐ๋ผ์ ์ปจํ
์ด๋ ๋ด์์ ์คํ๋๋ ํ๋ก์ธ์ค๋ ํธ์คํธ๋ฅผ ์ฌ๋ถํ
ํ๊ฑฐ๋ ํธ์คํธ ๋๋ ๋ค๋ฅธ ์ปจํ
์ด๋์ ์ํฅ์ ์ค ์ ์๋ ์์
์ ์ํํ ๊ถํ์ด ์๋ค.
Docker๋ Linux์ Capabilities๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ด๋ ํ์ผ ์์ , ํ๋ก์ธ์ค ์์ฑ ๋ฐ ์ข
๋ฃ, ๋คํธ์ํฌ ๊ด๋ จ ์์
, ์์คํ
์ฌ๋ถํ
๋ฑ์ ๋ค์ํ Linux ์์คํ
๊ธฐ๋ฅ์ ์๋ฏธํ๋ค. ๊ธฐ๋ฅ์ ๋ํ ์ ์ฒด ๋ฆฌ์คํธ๋ /usr/include/linux/capability.h์์ ํ์ธํ ์ ์๋ค.
ย Privilege
Docker๊ฐ ์ง๋ ์ฌ์ฉ์ ๊ถํ์ ๋ณ๊ฒฝ์ํฌ ์ ์๋ค. ํ์์ ๋ฐ๋ผ ๊ถํ์ ์กฐ์ ํจ์ผ๋ก์จ ํธ์คํธ ์์คํ
๋ฐ ๋ค๋ฅธ ์ปจํ
์ด๋์ ๋ํ ์ํฅ๋ ฅ์ ์กฐ์ ํ ์ ์๋ค.
Docker๊ฐ ๊ฐ์ง๋ Capabilities๋ฅผ ์ถ๊ฐ ๋ฐ ์ ์ธ์ํค๋ ๋ฐฉ๋ฒ์ docker run ๋ช
๋ น์ --cap-add, --cap-drop ์ต์
์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ๋ง์ผ ๋ชจ๋ ๊ถํ์ ํ์ฑํํ์ฌ ์ปจํ
์ด๋๋ฅผ ์คํํ๋ ค๋ฉด --privileged ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
# ๊ธฐ๋ฅ ์ถ๊ฐ
docker run --cap-run MAC_ADMIN ubuntu
# ๊ธฐ๋ฅ ์ ํ
docker run --cap-drop KILL ubuntu
# ๋ชจ๋ ๊ถํ ํ์ฑํ
docker run --privileged ubuntu
Bash
๋ณต์ฌ
ย Security Contexts
์ฟ ๋ฒ๋คํฐ์ค์์๋ ๋์ปค์์์ฒ๋ผ Linux์ Capabilities๋ฅผ ์กฐ์ ํ ์ ์๋ค. ์ฟ ๋ฒ๋คํฐ์ค์์ ์ปจํ
์ด๋๋ Pod์ ์บก์ํ๋์ด, Pod Level๊ณผ Container Level์์ ๋ณด์์ ์ค์ ํ ์ ์๋ค.
ย Pod Level
ํ๋ ์์ค์์ ๊ธฐ๋ฅ์ ๋ํ ์ค์ ์ ํ ๊ฒฝ์ฐ, ํ๋ ๋ด ๋ชจ๋ ์ปจํ
์ด๋์ ์ค์ ์ด ์ ์ฉ๋๋ค. security context๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด์๋ spec.securityContext ํ๋๋ฅผ ์ถ๊ฐํ๋ค.
apiVersion: v1
kind: Pod
metadata:
name: web-pod
spec:
securityContext:
runAsUser: 1000 # ์ฌ์ฉ์ ID ์ค์
containers:
- name: ubuntu
image: ubuntu
command: ["sleep", "3600"]
YAML
๋ณต์ฌ
ย Container Level
์ปจํ
์ด๋ ์์ค์์ ์ค์ ์ ํ ๊ฒฝ์ฐ, ์ค์ ๋ ์ปจํ
์ด๋์๋ง ์ ์ฉ๋๋ค. ๋ง์ผ ํ๋ ์์ค์์ ๊ตฌ์ฑ์ด ๋์ด ์๋ค๋ฉด, ์ปจํ
์ด๋์ ์ค์ ์ด ํ๋์ ์ค์ ์ ๋ฎ์ด์ด๋ค.
์ ์ ํ์ผ์์๋ ํ๋์์ ์ฌ์ฉํ securityContext ํ๋๋ฅผ spec.containers ์๋์ ๋ฌ์ผ ํ๋ค.
apiVersion: v1
kind: Pod
metadata:
name: web-pod
spec:
containers:
- name: ubuntu
image: ubuntu
command: ["sleep", "3600"]
securityContext:
runAsUser: 1000 # ์ฌ์ฉ์ ID ์ค์
capabilities:
add: ["MAC_ADMIN"] # ๊ธฐ๋ฅ ์ถ๊ฐ
drop: ["KILL"] # ๊ธฐ๋ฅ ์ ํ
# privileged: true # ๋ชจ๋ ๊ถํ ํ์ฑํ
YAML
๋ณต์ฌ
์ฃผ์ํ ์ ์ผ๋ก, capabilities๋ ์ปจํ
์ด๋ ๋ ๋ฒจ์์๋ง ์ง์๋๋ค.