이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

Kubernetes/Kubernetes 이론

Privileged Container

이쿠우우 2020. 9. 20. 09:09
반응형

 

 

Privileged Container

 

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로 실행됨.

 

 

 

Docker의 Privileged Container

 

Docker의 경우도 

Container는 Default로 Unprivileged 임.

 

일반적으로 Privileged Container를 생성하면

Container가 Host의 모든 주요자원에 접근할 수 있지만

Docker의 경우 옵션으로 

Host 주요자원 중 필요한 기능만 접근 가능한 Privileged Container를 생성할 수 있음

 

 

 


 

 

 

 

Privileged Container 생성하기

 

Docker 에서 Privileged Container 생성하기

 

Unprivileged Container에서 Host 자원 접근해보기

 

Docker Container는 Default로 Unprivileged 이므로

일반적으로 Container를 생성해봄.

[명령어]

docker run -it -d --name [생성할 container 이름] [images ID]

 

 

해당 Container로 접속

[명령어]

docker exec -it [Container ID] /bin/bash

 

 

network IP 주소를 변경해봄

 

[결과]

일반적인 Unprivileged Container에서

eth0 네트워크 장치의 IP주소를 변경하려고 했을때 권한문제로 실패함.

즉 Host 자원에 접근하는 권한이 없음.

 

Privileged Container에서 Host 자원 접근해보기

 

이번에는 Privileged Container를 생성해봄.

 

[명령어]

docker run -it -d --privileged --name [생성할 container 이름] [images ID]

 

 

해당 Container로 접속

[명령어]

docker exec -it [Container ID] /bin/bash

network IP 주소를 변경해봄

 

 

 

[결과]

Privileged Container에서는

eth0 네트워크 장치의 IP주소를 변경에 성공함

즉 Privilged Container는 Host 자원 접근하고 변경할 수 있음

 

 

 


 

 

 

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

 

상위 Deployment 생성

 

Unprivileged Container에서 Host 자원 접근해보기

 

 

[결과]

일반적인 Unprivileged Container에서

eth0 네트워크 장치의 IP주소를 변경하려고 했을때 권한문제로 실패함.

즉 Host 자원에 접근하는 권한이 없음.

 

 

Privileged Container에서 Host 자원 접근해보기

 

 

 

[결과]

kubernetes Container 옵션

securityContext: 

         privileged: true

을 추가한 결과 생성되는 Container가 Privileged 로 생성되어서

eth0 네트워크 장치의 IP주소를 변경에 성공함

즉 Privilged Container는 Host 자원 접근하고 변경할 수 있음

 

 


 

 

 

세밀한 Privileged Mode 권한 설정

 

Privileged Mode를 true로 주게 되면 linux 의 모든 커널 기능을 사용할 수 있는 권한이 주어지는데

이러한 설정은 보안에 최약점으로 활용될 수 있음.

그래서 정말 필요한 기능만 선정해서 권한을 부여할 수 있는 capabilities 설정이 있음

privileged 설정을 false로 하고

capabilites로 특정 권한만 부여할 수 있음

 

[ 권한 목록 및 설정 참고 ]

https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-capabilities-for-a-container

https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities

 

예제 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: false
       capabilities:
             add: ["NET_ADMIN", "NET_RAW"]

 

 

 

iksoon-tomcat Container 생성 시

linux 커널의 NET_ADMIN과 NET_RAW 권한 만을 컨테이너에 부여한 예제.

NET_ADMIN = Perform various network-related operations.

NET_RAW = Use RAW and PACKET sockets.

 

 

 

 


 

 

 

그렇다면 kubernetes yaml 파일에서 사용한 옵션인

securityContext 옵션은 어떤 역할을 하는지 알 필요가 있음

다음 글은 securityContext 에 대해서 알아보겠음

 

 

 

 


제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!




 

 

 

 

 

 

참고

https://tttsss77.tistory.com/153

https://bcho.tistory.com/1275?category=731548

https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities

https://twpower.github.io/179-run-container-as-privileged-mode

반응형

'Kubernetes > Kubernetes 이론' 카테고리의 다른 글

Pod Security Policy (PSP)  (2) 2020.09.20
Security Context  (0) 2020.09.20
Kubernetes Private Registry image 사용법  (0) 2020.09.20
Helm  (0) 2020.09.07
Kubernetes Update  (2) 2020.08.23