๐ก ๋ณธ ๋ฌธ์๋ 'Privileged Container'์ ๋ํด ์ ๋ฆฌํด๋์ ๊ธ์ ๋๋ค.
Dockerfile์ ์คํ์ํค๊ฑฐ๋ docker-compose ํ์ผ์ ์์ฑํ๋ค๋ณด๋ฉด privileged ์ต์ ์ ๋ณธ ์ ์์ ๊ฒ์ ๋๋ค. ํด๋น ์ต์ ์ ๋ํด ์ ๋ชจ๋ฅด๊ฑฐ๋ ๋์๋กญ์ง ์๊ฒ ๋์ด๊ฐ์ จ๋ ๋ถ๋ค์ ์ด ๊ธฐํ์ ์์๋์๋ ๊ฑธ ์ถ์ฒํฉ๋๋ค.
1. Privileged Container ๋?
์ผ๋ฐ์ ์ผ๋ก ์์ฑ๋๋ Container๋ Host์์ ๋ ๋ฆฝ๋ Linux namespace ์์ญ์ ๊ฐ์ง๊ณ ์์ด์ Host ์์คํ ์ ์ฃผ์์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ด ์์ต๋๋ค. ํ์ง๋ง ๋ค์ํ ์ข ๋ฅ์ Kubernetes Addon ๋ค์ด ๋์ํ๋ ๊ฒ์ ๋ณด๋ฉด ๊ฐ Addon ์ญํ ์ ์ํํ๋ Pod์ Container๊ฐ ์์ฑ๋๋ฉฐ ์์ฑ๋ Container๊ฐ Host์ ์์์ ์ ๊ทผํ์ฌ ๋์ํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ Container ์์๋ ๋ถ๊ตฌํ๊ณ Host ์์คํ ์ ์ฃผ์ ์์์ ์ ๊ทผํ ์ ์๋ Container๊ฐ ๋ฐ๋ก Privileged Container ์ ๋๋ค.
Privileged ์ต์ ์ผ๋ก Container๋ฅผ ์์ฑํ๋ฉด Container ์์์ Host์ ๋ฆฌ๋ ์ค ์ปค๋ ๊ธฐ๋ฅ์ ๋ชจ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. Privileged๋ Container๋ค๋ง ๋ชจ๋ Host์ ์ฃผ์ ์์์ ์ ๊ทผํ ์ ์์ผ๋ฉฐ, ์ผ๋ฐ์ ์ธ Container๋ ๋ณด์์ ํด๋น ๊ธฐ๋ฅ์ด ์๋ Unprivileged๋ก ์คํ๋ฉ๋๋ค.
2. Privileged Container ์์ฑํ๊ธฐ
2.1 Docker ์์ Privileged Container ์์ฑํ๊ธฐ
Docker์ ๊ฒฝ์ฐ, Container๋ Default๋ก Unprivileged ๋ก ์์ฑ๋ฉ๋๋ค. ์ด ๋ชจ๋์์๋ ์์คํ ์ฃผ์ ์์์ ์ ๊ทผํ ์ ์๋ ๊ถํ์ด ๋ถ์กฑํ๊ธฐ์, ๋คํธ์ํฌ ์ธํฐํ์ด์ค์ ํ์ฑํ/๋นํ์ฑํ๋ IP ์ฃผ์์ ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๋์ปค ๊ณต์ ๋ฌธ์์์๋ ๋ค์๊ณผ ๊ฐ์ด ํํํ๊ณ ์์ต๋๋ค.
By default, Docker containers are “unprivileged” and cannot, for example, run a Docker daemon inside a Docker container. This is because by default a container is not allowed to access any devices, but a “privileged” container is given access to all devices (see the documentation on cgroups devices).
2.1.1 Unprivileged Container์์ Host ์์ ์ ๊ทผํด๋ณด๊ธฐ
์๋ฅผ ๋ค์ด, Unprivileged ๋ชจ๋๋ก ์คํ๋ ๋์ปค ์ปจํ ์ด๋์์ eth0 ๋คํธ์ํฌ ์ธํฐํ์ด์ค์ IP ์ฃผ์๋ฅผ ๋ณ๊ฒฝํ๊ณ ๋นํ์ฑํํ๊ณ ์ ํ๋ ๊ฒฝ์ฐ ๊ถํ ๋ฌธ์ ๋ก ์คํจํ๊ฒ ๋ฉ๋๋ค.
$ docker run -it <image ID>
# ifconfig eth0 192.168.0.1
SIOCSIFADDR: Operation not permitted
SIOCSIFFLAGS: Operation not permitted
# ifconfig eth0 down
SIOCSIFFLAGS: Operation not permitted
2.1.2 Privileged Container์์ Host ์์ ์ ๊ทผํด๋ณด๊ธฐ
๊ฒฐ๊ตญ ์์คํ ๋ด ์ฅ์น ๋ฑ ์ฃผ์ ์์์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ๋์ปค ์ปจํ ์ด๋๋ฅผ Privileged ๋ชจ๋(--privileged)๋ก ์คํํด์ฃผ์ด์ผ ํฉ๋๋ค. ์ปจํ ์ด๋๋ฅผ Privileged ๋ชจ๋๋ก ์คํํ๋ฉด ์์คํ ์ ๋ชจ๋ ์ฅ์น์ ์ ๊ทผํ ์ ์์ผ๋ฉฐ ์ปค๋์ ๊ธฐ๋ฅ์ ๋๋ถ๋ถ ์ฌ์ฉํ ์ ์์ต๋๋ค.
$ docker run -it --privileged <image ID>
# ifconfig eth0 192.168.0.1
# ifconfig
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=400<CHANNEL_IO>
ether 3c:06:30:49:73:97
inet6 fe80::c86:6cd8:c778:78b8%en0 prefixlen 64 secured scopeid 0xb
inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
...
2.2 Kubernetes ์์ Privileged Container ์์ฑํ๊ธฐ: ์์ yamlํ์ผ
apiVersion: apps/v1
kind: Deployment
metadata:
name: iksoon-deployment
labels:
app: iksoontest
spec:
replicas: 1
selector:
matchLabels:
app: iksoon-pod
template:
metadata:
labels:
app: iksoon-pod
spec:
containers:
# Privileged Container ์์ฑ
- name: iksoon-tomcat
image: peksoon/iksoon_tomcat:1.0.2
ports:
- containerPort: 8080
securityContext:
- privileged: true
# Unprivileged Container ์์ฑ
- name: iksoon-myaql
image: peksoon/iksoon_myaql:1.0.2
ports:
- containerPort: 8080
2.2.1 Unprivileged Container์์ Host ์์ ์ ๊ทผํด๋ณด๊ธฐ
์ผ๋ฐ์ ์ธ Unprivileged Container์์ eth0 ๋คํธ์ํฌ ์ฅ์น์ IP์ฃผ์๋ฅผ ๋ณ๊ฒฝํ๋ ค๊ณ ํ์๋ ๊ถํ๋ฌธ์ ๋ก ์คํจํฉ๋๋ค. ์ฆ Unprivileged ๋ชจ๋๋ Host ์์์ ์ ๊ทผํ๋ ๊ถํ์ด ์์ต๋๋ค.
2.2.2 Privileged Container์์ Host ์์ ์ ๊ทผํด๋ณด๊ธฐ
Privileged ๋ก ์์ฑ๋ ์ปจํ ์ด๋์ ๊ฒฝ์ฐ eth0 ๋คํธ์ํฌ ์ฅ์น์ IP์ฃผ์๋ฅผ ๋ณ๊ฒฝ์ ์ฑ๊ณตํ์ต๋๋ค. ์ฆ Privilged Container๋ Host ์์ ์ ๊ทผํ๊ณ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
3. ์ธ๋ฐํ ๊ถํ์ ๊ฐ์ง Privileged Container ์์ฑํ๊ธฐ
Privileged Mode๋ฅผ true๋ก ์ฃผ๊ฒ ๋๋ฉด linux ์ ๋ชจ๋ ์ปค๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ ๊ถํ์ด ์ฃผ์ด์ง๋๋ฐ ์ด๋ฌํ ์ค์ ์ ๋ณด์์ ์ต์ฝ์ ์ผ๋ก ํ์ฉ๋ ์ ์์ต๋๋ค. ๊ทธ๋์ docker์ kubernetes์์๋ ํ์ํ ๊ธฐ๋ฅ๋ง ์ ์ ํด์ ๊ถํ์ ๋ถ์ฌํ ์ ์๋ capabilities ์ค์ ์ด ์์ต๋๋ค.
3.1 Docker ์์ ์ธ๋ฐํ ๊ถํ์ ๊ฐ์ง Privileged Container ์์ฑํ๊ธฐ
Docker ์ด๋ฏธ์ง๋ฅผ ์คํํจ์ ์์ด capabilites๋ก ํน์ ๊ถํ๋ง ๋ถ์ฌํ ์ ์์ต๋๋ค.
$ docker run --cap-add=["NET_ADMIN", "NET_RAW"] -it <image ID>
ํด๋น ์์ ๋ ์ปจํ ์ด๋์ linux ์ปค๋์ NET_ADMIN๊ณผ NET_RAW ๊ถํ ๋ง ๋ถ์ฌํ์ต๋๋ค.
- NET_ADMIN = Perform various network-related operations.
- NET_RAW = Use RAW and PACKET sockets.
๋์ฑ ์์ธํ ์ค์ ์ ๊ณต์ docker docs ๋ด Runtime privilege and Linux capabilitie ๋ถ๋ถ์ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
3.2 Kubernetes ์์ ์ธ๋ฐํ ๊ถํ์ ๊ฐ์ง Privileged Container ์์ฑํ๊ธฐ
yaml ํ์ผ์ ์ค์ ํจ์ ์์ด privileged ์ค์ ์ false๋ก ํ๊ณ capabilites๋ก ํน์ ๊ถํ๋ง ๋ถ์ฌํ ์ ์์ต๋๋ค.
...
containers:
- name: iksoon-tomcat
image: peksoon/iksoon_tomcat:1.0.2
ports:
- containerPort: 8080
securityContext:
- privileged: false
capabilities:
- add: ["NET_ADMIN", "NET_RAW"]
ํด๋น ์์ ๋ ์ปจํ ์ด๋์ linux ์ปค๋์ NET_ADMIN๊ณผ NET_RAW ๊ถํ ๋ง ๋ถ์ฌํ์ต๋๋ค.
- NET_ADMIN = Perform various network-related operations.
- NET_RAW = Use RAW and PACKET sockets.
๋์ฑ ์์ธํ ์ค์ ์ ๊ณต์ kubernetes docs ๋ด set-capabilities-for-a-container ๋ถ๋ถ์ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
์ฐธ๊ณ
- [Docker Official] Runtime privilege and Linux capabilitie: https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities
- [Kubernetes Official] set-capabilities-for-a-container : https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-capabilities-for-a-container
- [Blog] 23. Privileged Container: https://ikcoo.tistory.com/66
- [Blog] ๋์ปค (Docker) : Privileged ๋ชจ๋๋ก ์คํํ๊ธฐ: https://tttsss77.tistory.com/153
'Study: DeveloperTools(DevTool) > DevTool: Container' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Docker] ๋์ปค ์ฉ๋ ํ์ธ ๋ฐ ๊ด๋ฆฌ (feat. ์๋ฒ์ ์ฉ๋์ด ๊ฝ ์ฐจ๋ฒ๋ ธ๋ค) (1) | 2022.10.29 |
---|---|
[Docker] ๋์ปค ๋คํธ์ํฌ ์ ๋ฆฌ (feat. docker network) (0) | 2022.10.27 |
[Docker] docker-compose VS docker compose ์ฐจ์ด์ ๋น๊ต (0) | 2022.09.07 |
[Docker] Docker Compose ์ปค๋งจ๋ ์ฌ์ฉ๋ฒ (0) | 2022.09.06 |
[Docker] docker compose ์ ๋ฆฌ (feat. docker-compose.yml) (0) | 2022.09.05 |