Kubernetes 이야기

pod security admission 본문

Kubernetes/보안

pod security admission

kmaster 2022. 8. 31. 13:58
반응형

Kubernetes v1.22에는 Pod 보안 승인 (PSA)이라는 새로운 승인 컨트롤러가 내장되어 있다. ( 기존 Pod Security Policy ( PSP )  는 Kubernetes 1.21부터 더 이상 사용되지 않으며 1.25버전부터 제거될 예정이다. )

 

PSA 컨트롤러의 목적은 Pod 보안 정책 (PSP)을 효과적으로 대체하지만 PSS( Pod 보안 표준 ) 라고 하는 공식 제어를 사용하는 것이다. PSS는 이름에서 알 수 있듯이 기술이 아니고 표준에 불과하다. 표준은 어떤 일이 일어나야 하는지를 지시하는 반면 기술(예: PSP)은 표준을 방법으로 구현한 것이다.. PSA는 PSS를 구현하는 기술로, 이 모든 것이 Kubernetes API 서버에 직접 내장되어 있다. Kubernetes v1.23부터 PSA는 기본적으로 활성화된다.

PSA를 사용하려면 적절한 레이블로 네임스페이스에 레이블만 지정하면 된다 . 형식은 다음과 같다.

# The per-mode level label indicates which policy level to apply for the mode.
#
# MODE must be one of `enforce`, `audit`, or `warn`.
# LEVEL must be one of `privileged`, `baseline`, or `restricted`.
pod-security.kubernetes.io/<MODE>: <LEVEL>

또는 
pod-security.kubernetes.io/<MODE>-version: <VERSION>

레이블에는 접두사, 모드 및 수준의 세 부분(선택적으로 네 부분)이 있다. 접두사 pod-security.kubernetes.io 뒤에는 항상 슬래시가 온다. MODE는 해당 네임스페이스에서 수행되어야 하는 동작을 지정한다. 옵션은 enforce(차단됨), audit(허용되지만 감사 로그에 표시됨) 및 warn(허용되지만 경고가 표시됨). LEVEL은 PSS의 어떤 프로파일이 privileged(완전히 제한되지 않음), baseline(최소한으로 제한됨), restricted (매우 제한적으로) 옵션인지를 나타낸다.

 

예)

apiVersion: v1
kind: Namespace
metadata:
  name: my-baseline-namespace
  labels:
    pod-security.kubernetes.io/enforce: baseline
    pod-security.kubernetes.io/enforce-version: v1.25

    # We are setting these to our _desired_ `enforce` level.
    pod-security.kubernetes.io/audit: restricted
    pod-security.kubernetes.io/audit-version: v1.25

 

만약 다음과 같이 설정되어 있다고 해보자.

pod-security.kubernetes.io/enforce: restricted

 

그리고, 해당 네임스페이스에 다음과 같은 기본적인 Nginx Pod를 생성해보자.

# k create ns psa
# k label namespaces psa pod-security.kubernetes.io/enforce=restricted --overwrite=true
# cat <<EOF | kubectl create -n psa -f -
apiVersion: v1
kind: Pod
metadata:
  name: my-nginx-pod
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
      protocol: TCP
EOF

Pod를 생성 시 다음과 같은 오류를 볼 수 있다.

Error from server (Forbidden): error when creating "STDIN": pods "my-nginx-pod" is forbidden: violates PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "nginx" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "nginx" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "nginx" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "nginx" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")

 

클러서트 전체에 정책을 적용하려는 경우에는 AdmissionConfiguration을 사용할 수 있다. 이 리소스를 사용하면 정책 정의가 기본적으로 클러스터 전체에 적용되며 네임스페이스 레이블을 통해 적용된 모든 정책이 우선 적용된다.

 

apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: PodSecurity
  configuration:
    apiVersion: pod-security.admission.config.k8s.io/v1beta1
    kind: PodSecurityConfiguration
    # Defaults applied when a mode label is not set.
    #
    # Level label values must be one of:
    # - "privileged" (default)
    # - "baseline"
    # - "restricted"
    #
    # Version label values must be one of:
    # - "latest" (default) 
    # - specific version like "v1.25"
    defaults:
      enforce: "privileged"
      enforce-version: "latest"
      audit: "privileged"
      audit-version: "latest"
      warn: "privileged"
      warn-version: "latest"
    exemptions:
      # Array of authenticated usernames to exempt.
      usernames: []
      # Array of runtime class names to exempt.
      runtimeClasses: []
      # Array of namespaces to exempt.
      namespaces: []

 

PSP로 작업하는 데 상당한 시간을 보내지만 PSA는 훨씬 더 간단하게 동일한 결과를 얻을 수 있다. Pod 사양의 모든 보안 관련 필드를 이해하기 위해 힘들게 세부적으로 들어가지 않고도 보안 모범 사례를 훨씬 쉽게 적용할 수 있다. 또한 네임스페이스 레이블을 사용하면 정책을 쉽게 적용하고 정책이 작동하는 모드를 선택할 수 있다.

 

 

반응형

'Kubernetes > 보안' 카테고리의 다른 글

OWASP Kubernetes Top Ten  (0) 2022.12.22
NGINX WAF  (0) 2022.09.24
KubeClarity  (0) 2022.08.25
Container/Kubernetes Compliance ( 컨테이너/쿠베네티스 규정 준수 )  (0) 2022.06.17
Kubernetes scan 도구 - popeye  (0) 2022.05.15
Comments