Security Context
참고) 환경
Master Node server
OS = CentOS 7
리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64
docker version : 1.13.1
api verison : 1.26
Worker Node server
OS = CentOS 7
리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64
docker version : 1.13.1
api verison : 1.26
Kubernetes version
1.18
Security Context 란?
securityContext는 Pod 또는 Container의
권한부여, 환경설정, 접근 제어를 제어하는 기능을 제공함.
Container 프로세스들이 사용하는 사용자(runAsUser)와 그룹(fsGroup),
가용량, 권한 설정, 보안 정책(SELinux/AppArmor/Seccomp)을 설정하기 위해 사용됨
Pod의 Spec: 에 설정되는 항목에 대한 권한을 설정함.
Security Context를 사용해서 제어가능한 목록
Policy 내 설정 | 설명 |
privileged | Privileged Container 생성 제어. Privileged container는 Host의 모든 리소스에 접근할 수 있음. 보통 privileged 설정은 false로 하고 아래있는 hostPID, IPC, Network, Ports 옵션으로 권한을 조정함. |
hostPID, hostIPC | host pid, ipc namespace 사용 제어 해당 설정을 true로 하면 Container는 Node의 PID, IPC namespace를 사용할 수 있어서 Container에서 실행 중인 프로세스가 Host 즉 Node의 모든 프로세스를 보거나 IPC를 통해 통신할 수 있음. |
hostNetwork, | host Network 사용 제어 Pod안에 있는 모든 container들이 Worker Node의 network namespace와 동일한 네트워크를 사용하도록 설정. container 에서 eth0 network interface에 접근 가능. |
hostPorts | host Port 사용 제어 min, mx설정으로 사용가능한 hostport 범위를 지정. 특정 Port 번호를 설정하면 Container가 생성된 Node에 해당 Port가 열리게 되고 설정된 Port로 들어오는 요청은 proxying 되지 않으고 곧바로 컨테이너로 직접 전달 됨. 해당 Container가 위치한 Node의 Port만 열림. |
volumes | volumes 사용 제어 volume object 다양한 종류 중에서 특정 종류만 사용 가능하도록 설정 가능 |
allowedHostPaths | 호스트 파일 시스템의 사용 제어 |
allowedFlexVolumes | Flex volume 드라이버 설정 |
fsGroup | Pod의 volume을 소유한 FSGroup 할당 |
readOnlyRootFilesystem | 읽기 전용 root filesystem 설정 |
runAsUser, runAsGroup, supplementalGroups |
Container의 사용자 및 그룹 ID 지정 Container에서 application, 프로세스를 실행하면 default로 root 계정이 실행하게 되는데 해당 설정을 사용하면 특정 user, Group으로 실행되도록 변경 할 수 있음 |
allowPrivilegeEscalation, defaultAllowPrivilegeEscalation |
Privileged Container 권한 부여 제어 |
defaultAddCapabilities, allowedCapabilities |
Container에서 Linux 기능 사용 여부 |
requiredDropCapabilities, | Container에서 Linux 기능 사용 못하게 함. |
seLinux | 컨테이너의 SELinux 프로필 |
allowedProcMountTypes | 컨테이너의 마운트 타입 설정 |
annotations | 컨테이너의 AppArmor, seccomp, sysctl 프로필 |
Security Context 실습
일반적인 Pod 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-tomcat spec: containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.5 ports: - containerPort: 8080 |
[생성 후 User 확인]
일반적으로 Pod 내부에 실행된 Container는
root 권한으로 어플리케이션이 동작하고 있음.
SecurityContext를 사용해서 Container 사용자 변경해보기
[사전 작업]
peksoon/iksoon_tomcat:1.0.6 image에는
iksoon user가 추가되어있고
UID : 1000
GID : 1000
으로 생성 해놓았음
[예제 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-tomcat spec: securityContext: runAsUser: 1000 fsGroup: 1000 containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.6 ports: - containerPort: 8080 |
[생성 후 User 확인]
securityContext 설정으로
runAsUser 옵션으로 계정의 UID를 명시하고
fsGroup 옵션으로 GID를 명시해서 container를 생성한 결과
UID 1000 에 해당하는 iksoon 으로 어플리케이션이 동작하고 있음.
[ 결론 ]
이와 같이 SecurityContext로 Pod 내부에 생성되는
Container의 권한부여, 환경설정, 접근 제어를 설정할 수 있음.
SecurityContext는 Pod 에 부여할 수도 있고 Container에 부여할 수도 있음
[SecurityContext를 Pod에 부여한 예제 yaml 파일]
Pod 에 부여하게 되면
Pod 내부에 있는 다수의 Container에 모두 동일하게 SecurityContext가 적용됨
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-tomcat spec: securityContext: runAsUser: 1000 fsGroup: 1000 containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.6 ports: - containerPort: 8080 containers: - name: iksoon-mysql image: peksoon/iksoon_mysql:1.0.2 ports: - containerPort: 8080 |
[SecurityContext를 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-tomcat spec: containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.6 ports: - containerPort: 8080 securityContext: runAsUser: 1000 fsGroup: 1000 |
제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!
참고
https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
https://bcho.tistory.com/1275?category=731548
https://yogae.github.io/kubernetes/2019/06/03/kubernetes_network_security.html
https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities
'Kubernetes > Kubernetes 이론' 카테고리의 다른 글
Admission Controller (0) | 2020.11.05 |
---|---|
Pod Security Policy (PSP) (2) | 2020.09.20 |
Privileged Container (0) | 2020.09.20 |
Kubernetes Private Registry image 사용법 (0) | 2020.09.20 |
Helm (0) | 2020.09.07 |