이쿠의 슬기로운 개발생활

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

Kubernetes/Kubernetes 이론

Security Context

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

 

 

 

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