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://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 |