이쿠의 슬기로운 개발생활

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

클라우드/Kubernetes

23. 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' 카테고리의 다른 글

25. Pod Security Policy (PSP)  (2) 2020.09.20
24. Security Context  (0) 2020.09.20
22. Kubernetes Private Registry image 사용법  (0) 2020.09.20
21. Helm  (0) 2020.09.07
20. Kubernetes 인증 ( Proxy )  (0) 2020.08.29