Tanzu Kubernetes 릴리스 v1.25 이상은 PSA(포드 보안 승인) 컨트롤러를 사용하도록 설정합니다. PSA를 사용하면 네임스페이스 레이블을 사용하여 포드 보안을 균일하게 적용할 수 있습니다.

TKR 1.25 이상에서 PSA 사용

포드 보안 승인 컨트롤러는 TKG 클러스터에서 실행되는 포드에 보안 표준을 적용할 수 있는 Kubernetes 컨트롤러입니다. 기본적으로 Tanzu Kubernetes 릴리스 v1.25 이상은 PSA(포드 보안 승인) 컨트롤러를 사용하도록 설정합니다. PSA 컨트롤러는 더 이상 사용되지 않으며 제거된 PSP(포드 보안 정책) 컨트롤러를 대체합니다. TKR 1.24 및 이전 버전에 대한 PSP 구성 항목도 참조하십시오.

Tanzu Kubernetes 릴리스 v1.25는 PSA가 주의하도록 구성된 전환 릴리스입니다. Tanzu Kubernetes 릴리스 v1.26부터 PSA가 적용됩니다. TKG 클러스터 업그레이드에 대비하여 포드 워크로드를 PSP에서 PSA로 마이그레이션할 계획을 세워야 합니다. 지침은 포드 보안 정책에서 기본 제공 포드 보안 승인 컨트롤러로 마이그레이션을 참조하십시오.

PSA 클러스터 전체 구성

vSphere 8 업데이트 3부터는 v1beta1 API에서 사용할 수 있는 podSecurityStandard ClusterClass 변수를 사용하여 PSA 클러스터 전체를 구성할 수 있습니다. Cluster v1beta1 API의 내용을 참조하십시오.

PSA 모드

PSA 컨트롤러는 enforce, auditwarn의 세 가지 포드 보안 모드를 지원합니다. 이 표에는 각 PSA 모드와 그에 대한 설명이 나와 있습니다.
표 1. PSA 모드
모드 설명
enforce 보안 위반 시 포드가 거부됩니다.
audit 보안 위반 시 감사 로그에 기록된 이벤트에 감사 주석이 추가되지만 그 외에는 허용됩니다.
warn 보안 위반 시 사용자에게 주의가 표시되지만 그 외에는 허용됩니다.

PSA 표준

PSA 컨트롤러는 보안 스펙트럼을 포괄하는 세 가지 수준의 포드 보안 표준을 정의합니다. 포드 보안 표준은 누적되며 허용에서 제한에 이르기까지 다양합니다. 이 표에는 각 PSA 표준과 그에 대한 설명이 나와 있습니다.
표 2. PSA 표준
수준 설명
privileged 무제한 제어로, 가장 넓은 범위의 사용 권한 수준을 제공합니다. 이 보안 표준은 알려진 권한 에스컬레이션을 허용합니다.
baseline 알려진 권한 에스컬레이션을 방지하는 최소한의 제한적인 제어입니다. 이 보안 표준은 기본(최소로 지정됨) 포드 구성을 허용합니다.
restricted 엄격히 제한된 제어로 포드 강화 모범 사례를 따릅니다.

PSA 네임스페이스 레이블

PSA 컨트롤러는 Kubernetes 네임스페이스 수준에서 포드 보안을 적용합니다. 네임스페이스 레이블을 사용하여 지정된 네임스페이스의 포드에 사용할 PSA 모드 및 수준을 정의합니다.

Kubernetes는 네임스페이스에 사용할 표준을 정의하는 데 사용할 수 있는 레이블 집합을 제공합니다. 적용하는 레이블은 PSA 위반이 감지될 경우 Kubernetes 제어부에서 수행되는 작업을 정의합니다. 지정된 Kubernetes 네임스페이스에 대해 임의 또는 모든 모드를 구성하거나 서로 다른 모드에 대해 서로 다른 수준을 설정할 수도 있습니다.

PSA 네임스페이스 레이블 구문은 다음과 같습니다.
# MODE must be one of `enforce`, `audit`, or `warn`.
# LEVEL must be one of `privileged`, `baseline`, or `restricted`.
pod-security.kubernetes.io/<MODE>=<LEVEL>

보안 표준을 Kubernetes 버전에 고정하는 데 사용할 수 있는 모드별 버전 레이블을 적용할 수도 있습니다. 자세한 내용은 네임스페이스 레이블로 포드 보안 표준 적용을 참조하십시오.

TKG 클러스터에 대한 기본 PSA

기본적으로 Tanzu Kubernetes 릴리스 v1.25로 프로비저닝된 TKG 클러스터는 비시스템 네임스페이스에 대해 PSA 모드 warnauditrestricted로 설정됩니다. 이것은 비강제 설정으로, PSA 컨트롤러는 포드가 보안을 위반하는 경우 주의 및 감사 알림을 생성하지만 포드는 거부되지 않습니다.

기본적으로 Tanzu Kubernetes 릴리스 v1.26 이상으로 프로비저닝된 TKG 클러스터는 비시스템 네임스페이스에 대해 PSA 모드 enforcerestricted로 설정됩니다. 포드가 보안을 위반하면 거부됩니다. 덜 제한적인 제어로 포드를 실행하도록 네임스페이스에서 PSA를 구성해야 합니다.
중요: kube-system, tkg-system 및 vmware-system-cloud-provider 네임스페이스에서 실행되는 일부 시스템 포드에는 상승된 권한이 필요합니다. 이러한 네임스페이스는 포드 보안에서 제외됩니다. 또한 시스템 네임스페이스의 포드 보안을 변경할 수 없습니다.
이 표에는 TKG 클러스터에 대한 기본 PSA 구성이 나열되어 있습니다.
표 3. TKG 클러스터에 대한 기본 PSA
TKr 버전 기본 PSA
TKr v1.25

모드: warn | 수준: restricted

모드: audit | 수준: restricted

모드: enforce | 수준: 설정되지 않음

TKr v1.26 이상

모드: enforce | 수준: restricted

네임스페이스 레이블을 사용하여 PSA 구성

Tanzu Kubernetes 릴리스 v1.25의 경우 다음 예제 명령을 사용하여 PSA 주의 및 감사 알림이 생성되지 않도록 지정된 네임스페이스에 대한 보안 수준을 변경합니다.
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/audit=privileged 
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/warn=privileged
Tanzu Kubernetes 릴리스 v1.26이상의 경우 다음 예제 명령을 사용하여 PSA 표준을 restricted에서 baseline으로 다운그레이드합니다.
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/enforce=baseline
예를 들어 기본 네임스페이스에 baseline 표준을 적용하려면 다음을 수행합니다.
kubectl label --overwrite ns default pod-security.kubernetes.io/enforce=baseline
Tanzu Kubernetes 릴리스 v1.26이상의 경우 다음 예제 명령을 사용하여 PSA 표준을 restricted에서 privileged으로 다운그레이드합니다.
kubectl label --overwrite ns NAMESPACE pod-security.kubernetes.io/enforce=privileged
예를 들어 기본 네임스페이스에 privileged 표준을 적용하려면 다음을 수행합니다.
kubectl label --overwrite ns default pod-security.kubernetes.io/enforce=privileged

Tanzu Kubernetes릴리스 v1.26 이상의 경우 다음 예제 명령을 사용하여 모든 비시스템 네임스페이스에서 PSA를 완화합니다.

kubectl label --overwrite ns --all pod-security.kubernetes.io/enforce=privileged
kubectl label --overwrite ns --all pod-security.kubernetes.io/warn=restricted

개별 포드에 대한 보안 컨텍스트 구성

PSA를 위반하는 포드를 실행하려고 하면 이를 나타내는 오류 메시지가 표시됩니다. 예를 들면 다음과 같습니다.
{"opType":"CREATE_POD","succeeded":false,"err":"creating pod example-pod: pods 
\"example-pod\" is forbidden: violates PodSecurity \"restricted:latest\": 
allowPrivilegeEscalation != false (container \"example-container\" must set 
securityContext.allowPrivilegeEscalation=false), unrestricted capabilities 
(container \"example-container\" must set securityContext.capabilities.drop=[\"ALL\"]), 
runAsNonRoot != true (pod or container \"example-container\" must set securityContext.runAsNonRoot=true), 
seccompProfile (pod or container \"example-container\" must set securityContext.seccompProfile.type to 
\"RuntimeDefault\" or \"Localhost\")","events":[]}
전체 네임스페이스에 PSA를 설정하는 대신 개별 포드에 대한 보안 컨텍스트를 구성할 수 있습니다. 개별 포드가 실행되도록 허용하려면 포드 규격에서 다음과 같이 보안 컨텍스트를 설정할 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
  name: example-pod 
spec:
  containers:
  - image: gcr.io/google_containers/busybox:1.24
    name: example-container
    command: ["/bin/sh", "-c", "echo 'hello' > /mnt/volume1/index.html && chmod o+rX /mnt /mnt/volume1/index.html && while true ; do sleep 2 ; done"]
    securityContext:
      allowPrivilegeEscalation: false
      runAsNonRoot: true
      seccompProfile:
        type: "RuntimeDefault"
      capabilities:
        drop: [all]
    volumeMounts:
    - name: example-volume-mount
      mountPath: /mnt/volume1
  restartPolicy: Never
  volumes:
  - name: example-volume
    persistentVolumeClaim:
    claimName: example-pvc