이쿠의 슬기로운 개발생활

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

클라우드/Kubernetes

24. 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

 

 

 

반응형