kmg28801 / kubernetes-study

2 stars 0 forks source link

Chapter 13. 클러스터 노드와 네트워크 보안 #14

Open kmg28801 opened 1 year ago

kmg28801 commented 1 year ago

13장 실습 관련 주의사항

파드에서 호스트 노드의 네임스페이스 사용

호스트 네트워크 네임스페이스를 사용하지 않고 호스트 포트에 바인딩

image

노드의 PID와 IPC 네임스페이스 사용

컨테이너의 보안 컨텍스트 구성

컨테이너 이미지에 지정된 사용자로 컨테이너가 실행된다. Dockerfile에서 이것은 USER 지시문으로 지정한다. 생략하면 컨테이너는 루트로 실행된다.

컨테이너를 특정 사용자로 실행

apiVersion: v1
kind: Pod
metadata:
  name: pod-as-user-guest
spec:
  containers:
  - name: main
    image: alpine
    command: ["/bin/sleep", "999999"]
    securityContext:
      runAsUser: 405

컨테이너가 루트로 실행되는 것 방지

특권 모드에서 파드 실행

apiVersion: v1
kind: Pod
metadata:
  name: pod-privileged
spec:
  containers:
  - name: main
    image: alpine
    command: ["/bin/sleep", "999999"]
    securityContext:
      privileged: true

컨테이너에서 기능 제거

apiVersion: v1
kind: Pod
metadata:
  name: pod-drop-chown-capability
spec:
  containers:
  - name: main
    image: alpine
    command: ["/bin/sleep", "999999"]
    securityContext:
      capabilites:
        drop:
        - CHOWN

프로세스가 컨테이너의 파일시스템에 쓰는 것 방지

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-readonly-filesystem
spec:
  containers:
  - name: main
    image: alpine
    command: ["/bin/sleep", "999999"]
    securityContext:
      readOnlyRootFilesystem: true
    volumeMounts:
    - name: my-volume
      mountPath: /volume
      readOnly: false
  volumes:
  - name: my-volume
    emptyDir:

운영 환경에서 보안 강화를 위해 왠만하면 파드 실행할 때 컨테이너의 readOnlyRootFilesystem 속성을 true로 설정하는 게 좋다.

컨테이너가 다른 사용자로 실행될 때 볼륨 공유

apiVersion: v1
kind: Pod
metadata:
  name: pod-with-shared-volume-fsgroup
spec:
  securityContext:
    fsGroup: 555
    supplementalGroups: [666, 777]
  containers:
  - name: first
    image: alpine
    command: ["/bin/sleep", "999999"]
    securityContext:
      runAsUser: 1111  # 첫번째 컨테이너는 사용자 ID 1111로 실행
    volumeMounts:
    - name: shared-volume
      mounPath: /volume
      readOnly: false
  - name: second
    image: alpine
    command: ["/bin/sleep", "999999"]
    securityContext:
      runAsUser: 2222
    volumeMounts:
    - name: shared-volume
      mountPath: /volume
      readOnly: false
  volumes:
  - name: shared-volume
    emptyDir:

PodSecurityPolicy 리소스 소개

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: default
spec:
  hostIPC: false
  hostPID: false
  hostNetwork: false
  hostPorts:
  - min: 10000
    max: 11000
  - min: 13000
    max: 14000
  privileged: false
  readOnlyRootFilesystem: true   # 컨테이너는 읽기 전용 루트파일시스템으로 강제 실행된다.
  runAsUser:
    rule: RunAsAny # 컨테이너는 모든 사용자와 그룹으로 실행할 수 있다.
  fsGroup:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  seLinux:
    rule: RunAsAny
  volumes:
  - '*' # 모든 볼륨 유형을 파드에 사용할 수 있다.

runAsUser, fsGroup, supplementalGroups 정책

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: default
spec:
  hostIPC: false
  hostPID: false
  hostNetwork: false
  hostPorts:
  - min: 10000
    max: 11000
  - min: 13000
    max: 14000
  privileged: false
  readOnlyRootFilesystem: true
  runAsUser:
    rule: MustRunAs
    ranges:
    - min: 2
      max: 2
  fsGroup:
    rule: MustRunAs
    ranges:
    - min: 2
      max: 10
    - min: 20
      max: 30
  supplementalGroups:
    rule: MustRunAs
    ranges:
    - min: 2
      max: 10
    - min: 20
      max: 30
  seLinux:
    rule: RunAsAny
  volumes:
  - '*' # 모든 볼륨 유형을 파드에 사용할 수 있다.

PodSecurityPolicies는 파드를 만들거나 업데이트할 때만 적용되므로 정책을 변경해도 기존 파드에는 영향을 미치지 않는다.

컨테이너에 어떤 기능을 추가할지 지정

모든 컨테이너에 기능 추가

컨테이너에서 기능 제거

파드가 사용할 수 있는 볼륨 유형 제한

각각의 사용자와 그룹에 다른 PodSeucirtyPolicies 할당

apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: privileged # 정책 이름
spec:
  privileged: true
  readOnlyRootFilesystem: true
  runAsUser:
    rule: RunAsAny
  fsGroup:
    rule: RunAsAny
  supplementalGroups:
    rule: RunAsAny
  seLinux:
    rule: RunAsAny
  volumes:
  - '*' # 모든 볼륨 유형을 파드에 사용할 수 있다.
kmg88801@cloudshell:~ (awesome-caster-376906)$ kubectl get psp
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
NAME                    PRIV    CAPS   SELINUX    RUNASUSER   FSGROUP     SUPGROUP    READONLYROOTFS   VOLUMES
default                 false          RunAsAny   MustRunAs   MustRunAs   MustRunAs   true             *
gce.gke-metrics-agent   false          RunAsAny   RunAsAny    RunAsAny    RunAsAny    false            hostPath,secret,configMap
privileged              true           RunAsAny   RunAsAny    RunAsAny    RunAsAny    true             *

네임스페이스에서 네트워크 격리 사용

일부 클라이언트 파드만 서버 파드 연결 허용

네임스페이스간 네트워크 격리

image

CIDR

아웃바운드 트래픽 제한