昇格の手順と、ポリシーなしで済むこと
한국어 원문으로 표시합니다.
목표
정책을 관찰에서 강제로 승격하는 절차를 매니페스트와 스크립트로 구현하고, 같은 종류의 통제를 정책 엔진 없이 PSA 라벨만으로 세워 두 접근의 경계를 확인합니다.
왜 중요한가
정책 도구를 잘 쓰는 것과 정책을 잘 운영하는 것은 다른 기술입니다. 운영에서 중요한 것은 규칙의 정교함이 아니라 "지금 이 규칙을 강제로 올려도 되는가" 를 판단하는 절차입니다. 그 판단은 리포트에서 나오고, 절차는 스크립트로 굳혀야 사람이 바뀌어도 유지됩니다. 동시에 반대편 질문도 필요합니다. 파드 보안 수준처럼 표준화된 검사는 네임스페이스 라벨 두 줄로 끝나므로, 그런 것까지 정책 엔진에 넣으면 운영할 컴포넌트만 늘어납니다. 이 실습에서 두 방식을 나란히 세워 보면 그 경계가 분명해집니다.
단계
/root/kca-ops/디렉터리를 만들고policy-baseline.yaml에 kindClusterPolicy,metadata.namekca-baseline을 쓰세요.spec.validationFailureAction은Audit으로 두고spec.validationFailureActionOverrides에Enforce로kca-prod,Audit으로kca-dev를 지정하는 두 항목을 넣으세요. 규칙도 최소 하나 이상 있어야 합니다.- 같은 파일에
spec.webhookConfiguration.timeoutSeconds를20,spec.webhookConfiguration.failurePolicy를Ignore로 두세요. deprecated 인spec.webhookTimeoutSeconds와spec.failurePolicy는 쓰지 마세요. - 같은 파일에
spec.background를true,spec.admission을true,spec.applyRules를All로 두고 규칙을 두 개 이상으로 만드세요. /root/kca-ops/policyexception.yaml에 apiVersionkyverno.io/v2beta1, kindPolicyException,metadata.namekca-allow-monitoring을 쓰세요.spec.exceptions[0].policyName은kca-baseline,ruleNames에는 1단계에서 만든 규칙 이름을 넣고,spec.match.any[0].resources.namespaces에kca-monitoring,names에prometheus-*를 넣으세요./root/kca-ops/promote.sh를 실행 권한이 있는 셸 스크립트로 만드세요. 안에는kyverno apply와--resource를 쓰는 로컬 검증, PolicyReport 확인, 웹훅 등록이나 UpdateRequest 확인,Enforce로 올리는 단계, 그리고 실패 시 0 이 아닌 코드로 끝내는 처리가 모두 들어가야 합니다.- 클러스터에 네임스페이스
kca-prod를 만들고 라벨pod-security.kubernetes.io/enforce=restricted와pod-security.kubernetes.io/enforce-version을 붙이세요. 네임스페이스kca-dev는pod-security.kubernetes.io/warn=baseline만 붙이고 enforce 라벨은 붙이지 마세요. - 네임스페이스
kca-prod에 Deploymentkca-hello를 실제로 만드세요. 파드 수준securityContext.runAsNonRoot는true,securityContext.seccompProfile.type은RuntimeDefault, 컨테이너 수준securityContext.allowPrivilegeEscalation은false,capabilities.drop에는ALL이 들어가야 합니다. 그리고 네임스페이스kca-monitoring을 라벨pod-security.kubernetes.io/enforce=privileged와 함께 만드세요.
참고
kubectl label ns kca-prod pod-security.kubernetes.io/enforce=restricted pod-security.kubernetes.io/enforce-version=latest로 두 라벨을 한 번에 붙일 수 있습니다.- 스크립트 검사는
bash -n /root/kca-ops/promote.sh로 미리 해 보세요. - 흔한 실수 1: PolicyException 을 네임스페이스 전체로 넓게 여는 것. 이름 패턴까지 좁혀야 예외가 예외로 남습니다.
- 흔한 실수 2: PSA 라벨에서 버전을 고정하지 않는 것. 클러스터 업그레이드가 정책 내용을 바꿔 버립니다.
네임스페이스별 차등 적용
/root/kca-ops/ 디렉터리를 만들고 policy-baseline.yaml 에 kind ClusterPolicy, metadata.name kca-baseline 을 쓰세요. spec.validationFailureAction 은 Audit 으로 두고 spec.validationFailureActionOverrides 에 Enforce 로 kca-prod, Audit 으로 kca-dev 를 지정하는 두 항목을 넣으세요. 규칙도 최소 하나 이상 있어야 합니다.
정책 전체의 기본은 관찰 모드로 두고, 오버라이드 배열에서 네임스페이스별로 다른 동작을 지정합니다. action 과 namespaces 두 필드가 한 항목을 이룹니다.
webhookConfiguration 으로 이관
같은 파일에 spec.webhookConfiguration.timeoutSeconds 를 20, spec.webhookConfiguration.failurePolicy 를 Ignore 로 두세요. deprecated 인 spec.webhookTimeoutSeconds 와 spec.failurePolicy 는 쓰지 마세요.
타임아웃과 실패 정책은 1.13부터 한 블록 아래로 옮겨갔습니다. 예전 위치의 필드는 남겨 두면 안 되고, 관찰 단계 정책이 클러스터를 멈추지 않게 하려면 실패 정책을 어느 쪽으로 둘지 생각해 보세요.
background·admission·applyRules
같은 파일에 spec.background 를 true, spec.admission 을 true, spec.applyRules 를 All 로 두고 규칙을 두 개 이상으로 만드세요.
세 플래그는 각각 기존 리소스 스캔, 어드미션 적용, 규칙 적용 개수를 정합니다. 규칙을 여러 개 나열했는데 뒤쪽이 안 도는 문제를 만드는 것이 마지막 필드입니다.
PolicyException 으로 정당한 예외
/root/kca-ops/policyexception.yaml 에 apiVersion kyverno.io/v2beta1, kind PolicyException, metadata.name kca-allow-monitoring 을 쓰세요. spec.exceptions[0].policyName 은 kca-baseline, ruleNames 에는 1단계에서 만든 규칙 이름을 넣고, spec.match.any[0].resources.namespaces 에 kca-monitoring, names 에 prometheus-* 를 넣으세요.
예외는 정책 이름과 규칙 이름을 함께 지목합니다. 네임스페이스만 적어 통째로 빼는 대신 이름 패턴까지 좁히세요.
승격 체크리스트 스크립트
/root/kca-ops/promote.sh 를 실행 권한이 있는 셸 스크립트로 만드세요. 안에는 kyverno apply 와 --resource 를 쓰는 로컬 검증, PolicyReport 확인, 웹훅 등록이나 UpdateRequest 확인, Enforce 로 올리는 단계, 그리고 실패 시 0 이 아닌 코드로 끝내는 처리가 모두 들어가야 합니다.
로컬 검증, 리포트 확인, 진단, 그리고 실패 시 0 이 아닌 종료가 모두 들어가야 CI 게이트로 쓸 수 있습니다. 실행 권한도 잊지 마세요.
PSA 라벨로 두 등급 만들기
클러스터에 네임스페이스 kca-prod 를 만들고 라벨 pod-security.kubernetes.io/enforce=restricted 와 pod-security.kubernetes.io/enforce-version 을 붙이세요. 네임스페이스 kca-dev 는 pod-security.kubernetes.io/warn=baseline 만 붙이고 enforce 라벨은 붙이지 마세요.
여기서부터 실제 클러스터입니다. Pod Security Admission 은 네임스페이스 라벨로 동작하고 모드가 enforce·audit·warn 세 가지입니다. 버전 라벨을 함께 고정하는 이유도 생각해 보세요.
restricted 를 통과하는 워크로드
네임스페이스 kca-prod 에 Deployment kca-hello 를 실제로 만드세요. 파드 수준 securityContext.runAsNonRoot 는 true, securityContext.seccompProfile.type 은 RuntimeDefault, 컨테이너 수준 securityContext.allowPrivilegeEscalation 은 false, capabilities.drop 에는 ALL 이 들어가야 합니다. 그리고 네임스페이스 kca-monitoring 을 라벨 pod-security.kubernetes.io/enforce=privileged 와 함께 만드세요.
restricted 등급은 네 가지를 요구합니다. 루트가 아닌 실행, 권한 상승 금지, 모든 케이퍼빌리티 제거, 그리고 seccomp 프로파일입니다. 예외 대상이 될 네임스페이스도 함께 만드세요.