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