Search

PSS & PSA

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
복사