**Pod Security Standards (PSS)**는 Kubernetes에서 파드의 보안을 강화하기 위해 마련된 표준 가이드라인입니다. 이 표준은 파드에 적용할 수 있는 보안 정책을 세 가지(Privileged, Baseline, Restricted)로 정의하며, 이 중 **Restricted**는 가장 엄격한 수준의 보안을 요구합니다.


Restricted 표준이 요구하는 주요 사항

Restricted 프로파일은 민감한 정보에 대한 접근을 제한하고, 권한 상승을 방지하는 것을 목표로 합니다. 이 표준을 준수하는 파드는 다음과 같은 엄격한 보안 규칙을 따라야 합니다.

1. 권한 있는(Privileged) 컨테이너 사용 금지

  • **privileged: false**를 명시적으로 설정하거나, 기본값으로 사용해야 합니다.
  • 파드가 호스트 노드에 대한 완전한 접근 권한을 가지는 것을 차단하여 보안 위험을 최소화합니다.

2. 권한 상승(Privilege Escalation) 차단

  • **allowPrivilegeEscalation: false**를 설정해야 합니다.
  • 이는 파드 내의 프로세스가 부모 프로세스보다 더 높은 권한을 얻는 것을 금지하여, 보안 취약점을 통한 공격 경로를 막습니다.

3. 루트(Root) 권한 사용 제한

  • **runAsNonRoot: true**를 명시적으로 설정해야 합니다.
  • 컨테이너 내부의 프로세스가 루트가 아닌 사용자로 실행되도록 강제합니다. 이는 컨테이너에서 권한 상승 공격이 발생하더라도 시스템 전체에 미치는 영향을 제한합니다.
  • runAsUser 필드도 0이 아닌 값으로 설정해야 합니다.

4. 읽기 전용 루트 파일 시스템

  • **readOnlyRootFilesystem: true**를 설정해야 합니다.
  • 컨테이너의 루트 파일 시스템을 읽기 전용으로 만들어, 악의적인 사용자가 시스템 파일을 수정하거나 악성코드를 심는 것을 방지합니다.

5. 드롭된(Dropped) 기능 및 추가 기능

  • capabilities 필드를 사용하여 모든 기본 리눅스 기능(capabilities)을 드롭해야 합니다.
  • NET_BIND_SERVICE와 같이 파드 운영에 꼭 필요한 특정 기능(Capabilities)만 선택적으로 허용할 수 있습니다.

6. Seccomp 프로파일 사용

  • **seccompProfile: {type: RuntimeDefault or Localhost}**를 사용해야 합니다.
  • 컨테이너가 호출할 수 있는 시스템 콜(syscall)을 제한하여, 컨테이너가 의도치 않은 시스템 작업을 수행하는 것을 막습니다

 

테스트

1. 네임스페이스 생성 및 label 적용

controlplane:~$ k create ns pss-ns
namespace/pss-ns created

controlplane:~$ kubectl label --overwrite ns pss-ns \
  pod-security.kubernetes.io/enforce=restricted
namespace/pss-ns labeled

 

2. 테스트를 위한 deployment 기본 yaml 생성

k create deployment -n pss-ns  nginx-test --image=nginx --dry-run=client  -o yaml

 

3. 배포 후 결과 확인

  • Warning 에서 에러가 발생하고, 해당 항목을 수정 하여야 배포가 가능합니다
controlplane:~$ k apply -f deploy.yaml 
##아래와 같은 경고 출력됨##
Warning: would violate 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")
deployment.apps/nginx-test created
controlplane:~$

 

4. 조건에 맞게 항목 수정 후 배포

 

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx-test
  name: nginx-test
  namespace: pss-ns
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-test
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx-test
    spec:
      containers:
      - image: nginx
        name: nginx
        securityContext:                  #####여기서부터 구문 추가######
          allowPrivilegeEscalation: false
          capabilities:
            drop: ["ALL"]
          runAsNonRoot: true
          seccompProfile:
            type: RuntimeDefault

 

 

'k8s > CKS' 카테고리의 다른 글

[CKS] 쿠버네티스 API 서버 보안 강화: 익명 접근 차단  (0) 2025.09.09
[CKS] BOM 툴 trivy -1  (0) 2025.09.09
[CKS] cilium  (0) 2025.09.08
[CKS] k8s Cluster & node version upgrade  (0) 2025.09.08
[CKS] Pod Security Standards  (1) 2025.09.07

+ Recent posts