[Scenario Playbook Ep.42] 🚀 Security 편 #1 | Pod Security Policy 적용 및 사용자 제한
쿠버네티스에서 보안 강화를 위해 Pod의 실행 환경을 제한하고, 특정 사용자나 그룹이 보안 정책을 준수하도록 강제하는 것이 중요합니다.
이번 글에서는 Pod Security Policy(PSP)를 활용하여 보안 정책을 적용하고, RBAC를 사용하여 특정 사용자만 보안이 강화된 환경에서 Pod을 실행할 수 있도록 설정하는 방법을 다룹니다.
📌 글에서 다루는 상황들
1️⃣ Pod Security Policy(PSP)를 활용한 보안 강화
2️⃣ 특정 사용자 및 그룹에 대한 실행 제한
각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.
1️⃣ Pod Security Policy(PSP)를 활용한 보안 강화
❓ 문제 상황
운영팀에서 쿠버네티스 클러스터의 보안을 강화하기 위해, Pod의 실행 환경을 제한해야 하는 요구사항이 생겼습니다.
특히, 보안이 취약한 root 사용자 실행을 차단하고, privileged 모드를 비활성화해야 합니다.
• Pod이 root 사용자로 실행되지 않도록 제한해야 합니다.
• Pod이 privileged 모드에서 실행되지 않도록 설정해야 합니다.
• restricted-psp라는 Pod Security Policy를 적용해야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. Pod Security Policy(PSP)를 생성하여 보안 정책을 적용합니다.
• runAsUser.rule: MustRunAsNonRoot → root 사용 금지
• privileged: false → privileged 모드 비활성화
2. RBAC를 활용하여 PSP를 특정 네임스페이스에만 적용하도록 설정합니다.
✅ 정답 Manifest (Pod Security Policy 설정 및 적용)
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
name: restricted-psp # 보안 정책 이름
spec:
privileged: false # privileged 모드 비활성화
allowPrivilegeEscalation: false # 권한 상승 비활성화
requiredDropCapabilities:
- ALL # 모든 추가 권한 제거
runAsUser:
rule: MustRunAsNonRoot # root 사용자 실행 차단
seLinux:
rule: RunAsAny
fsGroup:
rule: RunAsAny
supplementalGroups:
rule: RunAsAny
volumes:
- 'configMap'
- 'emptyDir'
- 'secret'
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: team-a
name: use-restricted-psp
rules:
- apiGroups: ["policy"]
resources: ["podsecuritypolicies"]
verbs: ["use"]
resourceNames: ["restricted-psp"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: restricted-psp-binding
namespace: team-a
subjects:
- kind: User
name: "developer-a" # team-a의 개발자 계정
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: use-restricted-psp
apiGroup: rbac.authorization.k8s.io
📌 적용 후 예상 결과 값
1. Pod Security Policy 적용 확인
kubectl get psp
💡 예상 출력 값
NAME PRIV CAPS SELINUX RUNASUSER FSGROUP SUPGROUP READONLYROOTFS
restricted-psp false [] RunAsAny MustRunAsNonRoot RunAsAny RunAsAny false
2. team-a 개발자가 root 사용자로 실행되는 Pod을 배포할 수 있는지 확인 (차단됨)
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: insecure-pod
namespace: team-a
spec:
containers:
- name: busybox
image: busybox
securityContext:
runAsUser: 0 # root 사용자 실행 시도
command: ["sleep", "3600"]
EOF
💡 예상 출력 값
Error from server (Forbidden): pods "insecure-pod" is forbidden: violates PodSecurityPolicy "restricted-psp": runAsUser: running as root is not allowed
2️⃣ 특정 사용자 및 그룹에 대한 실행 제한
❓ 문제 상황
운영팀에서 일반 사용자는 보안 정책이 적용된 환경에서만 Pod을 배포하도록 제한해야 하는 요구사항이 생겼습니다.
즉, 보안 정책을 적용한 사용자만 특정 네임스페이스에서 Pod을 실행할 수 있어야 합니다.
• developer-a 사용자는 team-a 네임스페이스에서만 Pod을 실행할 수 있어야 합니다.
• developer-b 사용자는 team-b 네임스페이스에서만 Pod을 실행할 수 있어야 합니다.
✅ 어떻게 해결할 수 있을까요?
🛠️ 해결 방법
1. RBAC(Role-Based Access Control)을 활용하여 특정 사용자만 특정 네임스페이스에서 Pod을 실행할 수 있도록 설정합니다.
2. Role 및 RoleBinding을 활용하여 접근을 제한합니다.
✅ 정답 Manifest (사용자별 실행 제한 RBAC 설정)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: team-a
name: team-a-pod-executor
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["create", "delete", "get", "list", "watch", "update"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: team-a-pod-executor-binding
namespace: team-a
subjects:
- kind: User
name: "developer-a" # team-a의 개발자 계정
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: team-a-pod-executor
apiGroup: rbac.authorization.k8s.io
📌 적용 후 예상 결과 값
1. RBAC 설정 확인 (developer-a가 team-b에서 Pod을 생성할 수 있는지 확인)
kubectl auth can-i create pods --as=developer-a -n team-b
💡 예상 출력 값
no
2. developer-a가 자신의 네임스페이스에서 Pod을 생성할 수 있는지 확인
kubectl auth can-i create pods --as=developer-a -n team-a
💡 예상 출력 값
yes