Pod Security Standards (PSS) and Pod Security Admission (PSA)
PSS는 "보안 스펙트럼을 광범위하게 포괄하기 위해 세 가지 정책을 정의합니다. 이러한 정책은 누적적이며 매우 허용적인 것부터 매우 제한적인 것까지 다양합니다."
정책 수준
•
Privileged
◦
무제한(보안되지 않음) 정책으로, 가능한 가장 광범위한 수준의 권한을 제공한다. 이 정책은 알려진 권한 상승을 허용한다. 정책이 없는 상태이다. 로깅 에이전트, CNI, 스토리지 드라이버 및 권한 액세스가 필요한 기타 시스템 전체 애플리케이션과 같은 애플리케이션에 적합하다.
•
Baseline
◦
알려진 권한 상승을 방지하는 최소한의 제한적인 정책입니다. 기본(최소로 지정된) 파드 구성을 허용한다. 기준선 정책은 호스트네트워크, 호스트PID, 호스트IPC, 호스트경로, 호스트포트, 리눅스 기능 추가 불가 및 기타 여러 제한 사항의 사용을 금지한다.
•
Restricted
◦
현재 파드 강화 모범 사례를 따르는 매우 제한적인 정책. 이 정책은 기준선을 상속하며 루트 또는 루트 그룹으로 실행할 수 없는 것과 같은 추가 제한을 추가한다. 제한된 정책은 애플리케이션의 기능에 영향을 미칠 수 있다. 주로 보안이 중요한 애플리케이션을 실행하는 것을 대상으로 한다.
•
PSA admission controller 는 아래 나열된 세 가지 작동 모드를 통해 PSS 정책에 명시된 제어를 구현
◦
enforce : 정책을 위반하면 파드가 거부된다.
◦
audit: 정책 위반은 감사 로그에 기록된 이벤트에 감사 어노테이션을 추가하지만, 그 외에는 허용된다.
◦
warn: 정책 위반은 사용자 대상 경고를 트리거하지만, 그 외에는 허용된다.
요약 정리
•
privileged: 거의 모든 Pod가 허용됨
•
baseline: 기본적인 보안 요구사항을 충족하는 Pod만 허용됨
◦
호스트 네임스페이스 사용 금지
◦
호스트 포트 사용 금지
◦
allowPrivilegeEscalation 설정 필요
◦
runAsNonRoot 설정 필요
◦
seccompProfile 설정 필요
◦
capabilities 설정 필요
•
restricted: 가장 엄격한 보안 요구사항을 충족하는 Pod만 허용됨
◦
baseline 요구사항 포함
◦
allowPrivilegeEscalation을 false로 설정해야 함
◦
runAsNonRoot를 true로 설정해야 함
◦
seccompProfile을 RuntimeDefault 또는 Localhost로 설정해야 함
◦
capabilities.drop에 ALL을 설정해야 함
◦
호스트 네임스페이스 사용 금지
◦
호스트 포트 사용 금지
Admission Controllers 검증
순서도
•
API 요청: 사용자가 Kubernetes API에 요청을 보냅니다(예: Pod 생성)
•
인증/권한 확인: 요청이 유효한 사용자에게서 온 것인지 인증(AuthN)하고 권한(AuthZ)을 확인
•
어드미션 컨트롤러:
◦
Mutating Admission: 요청 내용을 변경할 필요가 있을 경우 수정 (예: 기본 값을 추가).
◦
Validating Admission: 요청이 규칙(PSS 등)을 따르는지 확인
•
etcd에 저장: 요청이 유효하면 클러스터 상태(etcd)에 저장
•
Admission Controller(어드미션 컨트롤러)
Kubernetes에서 어드미션 컨트롤러는 API 서버로 들어오는 요청을 필터링하거나 변환하는 역할
◦
요청이 etcd(클러스터 상태 저장소)에 기록되기 전에 요청을 검사하고 규칙을 적용
◦
요청이 유효한지 확인하거나 특정 보안 규정을 만족하는지 점검
•
PSS와 PSA
◦
PSS (Pod Security Standards): Kubernetes 클러스터에서 Pod가 따라야 하는 보안 규칙(표준) 예를 들어, 루트 권한을 사용하는 컨테이너는 금지되거나, 특정 보안 설정이 강제될 수 있다.
◦
PSA (Pod Security Admission): PSS를 적용하는 도구 요청된 Pod가 PSS를 따르는지 확인하는 Kubernetes 어드미션 컨트롤러의 한 종류
•
PSA를 통한 보안 예시
◦
PSA를 사용하는 Validating Admission 단계에서 Pod의 설정을 확인
◦
예를 들어, Pod가 "루트 권한을 가진 컨테이너를 사용하지 말라"는 PSS 규정을 준수하는지 검사
◦
규정을 위반한 요청은 거부되고, 준수한 요청만 etcd에 기록
요약 정리
•
PSA는 "Kubernetes가 Pod 보안 규칙을 검사하는 보안 게이트
•
PSS는 이 게이트를 통과하기 위한 "규칙의 집합"
•
이를 통해 Kubernetes 클러스터의 보안을 강화할 수 있다.
다이어그램
실습
실습 목표
•
프로파일 요구사항을 만족하는 포드 허용
•
프로파일 요구사항을 만족하지 못하는 포드 차단
•
포드가 PSS 프로파일 요구사항을 만족하지 못하더라도 Deployment 허용
•
포드가 프로파일 요구사항을 만족하지 못하는 경우 쿠버네티스 API 서버 클라이언트에 “Forbidden” 응답
•
Deployment 리소스에 대해 실패한(Forbidden) 포드 정보 반영
•
PSA Controller 응답과 관련한 쿠버네티스 API 서버로그에 대해 실패한(Forbidden) 포드 정보 반영
•
Deployment 에 포함된 포드 사양이 PSS 프로파일의 요구사항을 만족하지 못하는 경우 쿠버네티스 API 서버 클라이언트에 경고메시지 전달
Create Namespace And Add label
apiVersion: v1
kind: Namespace
metadata:
name: policy-test
labels:
pod-security.kubernetes.io/enforce-version: "v1.29"
pod-security.kubernetes.io/audit-version: "v1.29"
pod-security.kubernetes.io/warn-version: "v1.29"
# pod-security.kubernetes.io/enforce: privileged
# pod-security.kubernetes.io/audit: privileged
# pod-security.kubernetes.io/warn: privileged
# pod-security.kubernetes.io/enforce: baseline
# pod-security.kubernetes.io/audit: baseline
# pod-security.kubernetes.io/warn: baseline
# pod-security.kubernetes.io/enforce: restricted
# pod-security.kubernetes.io/audit: restricted
# pod-security.kubernetes.io/warn: restricted
YAML
복사
Test
#!/usr/bin/env bash
#set -o errexit
NEWLINE=$'\n'
#clear
kubectl apply -f 0-ns.yaml
echo "${NEWLINE}"
echo ">>> 1. Good config..."
kubectl apply -f 1-ok.yaml
sleep 2
kubectl delete -f 1-ok.yaml
sleep 2
echo "${NEWLINE}"
echo ">>> 2. Deployment - Missing container security context element..."
kubectl apply -f 2-dep-sec-cont.yaml
sleep 2
echo "${NEWLINE}"
echo ">>> 3. Pod - Missing container security context element..."
kubectl apply -f 3-pod.yaml
sleep 2
echo "${NEWLINE}"
echo ">>> 4. Pod - Pod security context, but Missing container security context element..."
kubectl apply -f 4-pod.yaml
sleep 2
echo "${NEWLINE}"
echo ">>> 5. Pod - Container security context element present, with incorrect settings..."
kubectl apply -f 5-pod.yaml
sleep 2
echo "${NEWLINE}"
echo ">>> 6. Pod - Container security context element present, with incorrect spec.hostNetwork, spec.hostPID, spec.hostIPC settings..."
kubectl apply -f 6-pod.yaml
sleep 2
echo "${NEWLINE}"
YAML
복사
chmod +x test.sh
./test.sh
Shell
복사
정책 바꾸기 위한 리소스 삭제
kubectl delete ns policy-test 2>&1
Shell
복사