Study: DeveloperTools(DevTool)/DevTool: Container

[Docker] Privileged Container์— ๋Œ€ํ•˜์—ฌ

DrawingProcess 2022. 10. 3. 20:18
๋ฐ˜์‘ํ˜•
๐Ÿ’ก ๋ณธ ๋ฌธ์„œ๋Š” '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 ๋ถ€๋ถ„์„ ์ฐธ๊ณ ํ•˜์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

 

์ฐธ๊ณ 

๋ฐ˜์‘ํ˜•