DevOps/Kubernetes

Kubernetes Pod Security Admission - Namespace Level

Jen'_' 2023. 10. 27. 09:17
반응형

개요

일반 Kubernetes Cluster를 사용할 때는 PSP, PSA를 고려하지 않았지만.. Redhat OpenShift를 사용하면서 Namespace를 생성하면 자동으로 PSA가 붙어서 Pod에 대한 보안이 적용되고 동작이 제한되었다. OCP를 잘 사용하기 위해 PSA에 대한 개념을 정리한다.

 

Pod Security Policy가 kubernetes v1.21부터 Deprecated 되면서, 이보다 더욱 향상된 기능으로 Pod Security Admission을 제공한다.

Pod Security Admission Controller는 Pod Security Standards를 사용하며, 이는 정확하게 사전 정의된 세 가지 Pod Security Policies(Privileged, Baseline, Restricted)으로 가정할 수 있다.

 

Pod Security Admission

Kubernetes Pod Security Standards은 파드에 대한 다양한 격리 수준을 정의한다. 이러한 표준을 사용하면 명확하고 일관된 방식으로 파드의 동작을 제한하는 방법을 정의할 수 있다.

쿠버네티스는 Pod Security Standards을 적용하기 위해 내장형 Pod Security admission controller를 제공한다. Pod security restrictions은 파드가 생성될 때 namespace 수준에서 적용된다.

 

Policy Mode

선택한 라벨은 잠재적인 위반이 감지된 경우 컨트롤 플레인이 수행하는 작업을 정의한다.

Mode Description
enforce 정책을 위반하면 포드가 거부됩니다.
audit 정책 위반으로 인해 감사 로그 에 기록된 이벤트에 감사 주석이 추가되지만 그렇지 않은 경우에는 허용됩니다.
warn 정책 위반은 사용자에게 경고를 표시하지만 그렇지 않은 경우에는 허용됩니다.

 

각 모드에는 사용되는 정책을 결정하는 두 가지 레이블이 있다.

# 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>

# Optional: per-mode version label that can be used to pin the policy to the
# version that shipped with a given Kubernetes minor version (for example v1.28).
#
# MODE must be one of `enforce`, `audit`, or `warn`.
# VERSION must be a valid Kubernetes minor version, or `latest`.
pod-security.kubernetes.io/<MODE>-version: <VERSION>

 

참고

https://kubernetes.io/docs/concepts/security/pod-security-admission/#pod-security-admission-labels-for-namespaces

 

pod security standards

LEVEL : <LEVEL> 대신 포드 보안 표준 중 하나를 정의해야 한다. 현재 세 가지 포드 보안 표준을 사용할 수 있다.

Profile Description
Privileged 제한되지 않은 정책으로 가능한 가장 광범위한 수준의 권한을 제공합니다. 이 정책은 알려진 권한 상승을 허용합니다.
Baseline 알려진 권한 에스컬레이션을 방지하는 최소한의 제한 정책. 기본(최소로 지정된) 파드 구성을 허용한다.
Restricted 현재 파드 강화 모범 사례를 따르는 매우 제한적인 정책.

 

참고

https://kubernetes.io/docs/concepts/security/pod-security-standards/#profile-details

 

이러한 각 정책은 파드 사양 내에서 제한되는 필드와 허용되는 값을 정의한다. 이러한 정책에 의해 제한되는 일부 필드는 다음과 같다:

  • spec.containers[*].ports
  • spec.volumes[*].hostPath
  • spec.securityContext
  • spec.containers[*].securityContext

 

참고

https://medium.com/geekculture/pod-security-admission-controller-namespace-level-52158281d918

https://medium.com/@LachlanEvenson/hands-on-with-kubernetes-pod-security-admission-b6cac495cd11

 

테스트

nginx namespace를 생성하고 pod를 생성해 보겠다.

 

Namespace 생성

$ kubectl create ns nginx
$ kubectl get ns nginx -oyaml
apiVersion: v1
kind: Namespace
metadata:
  annotations:
    openshift.io/sa.scc.mcs: s0:c27,c4
    openshift.io/sa.scc.supplemental-groups: 1000710000/10000
    openshift.io/sa.scc.uid-range: 1000710000/10000
  labels:
    kubernetes.io/metadata.name: nginx
    pod-security.kubernetes.io/audit: restricted
    pod-security.kubernetes.io/audit-version: v1.24
    pod-security.kubernetes.io/warn: restricted
    pod-security.kubernetes.io/warn-version: v1.24
  name: nginx
spec:
  finalizers:
  - kubernetes
status:
  phase: Active
  • pod-security.kubernetes.io/audit: restricted
    • auth mode에 restricted pod security standards가 붙었다.
  • pod-security.kubernetes.io/warn: restricted
    • warn mode에 restricted pod security standards가 붙었다.

 

Pod 생성

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    securityContext:
      runAsUser: 0  # 위반

runAsUser를 0(root)으로 설정하면 restricted pod security standard를 위반한다.

하지만 위의 파드를 생성해 보겠다.

 

$ kubectl apply -f nginx.yaml 
Warning: would violate PodSecurity "restricted:v1.24": 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), runAsUser=0 (container "nginx" must not set runAsUser=0), seccompProfile (pod or container "nginx" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost")
pod/nginx created

restricted:v1.24를 위반했다고 경고 메시지가 나오긴 하지만 파드가 생성되었다.

왜냐하면 restricted standard가 audit, warn mode에 적용되었기 때문이다.

 

이와 같이 PSA를 사용해서 Pod 보안 규칙을 제어하고 설정할 수 있다.

반응형