LabHub
배우기 러닝패스 코스

KCA — Kyverno認定アソシエイト

昇格の手順と、ポリシーなしで済むこと

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

정책을 관찰에서 강제로 승격하는 절차를 매니페스트와 스크립트로 구현하고, 같은 종류의 통제를 정책 엔진 없이 PSA 라벨만으로 세워 두 접근의 경계를 확인합니다.

왜 중요한가

정책 도구를 잘 쓰는 것과 정책을 잘 운영하는 것은 다른 기술입니다. 운영에서 중요한 것은 규칙의 정교함이 아니라 "지금 이 규칙을 강제로 올려도 되는가" 를 판단하는 절차입니다. 그 판단은 리포트에서 나오고, 절차는 스크립트로 굳혀야 사람이 바뀌어도 유지됩니다. 동시에 반대편 질문도 필요합니다. 파드 보안 수준처럼 표준화된 검사는 네임스페이스 라벨 두 줄로 끝나므로, 그런 것까지 정책 엔진에 넣으면 운영할 컴포넌트만 늘어납니다. 이 실습에서 두 방식을 나란히 세워 보면 그 경계가 분명해집니다.

단계

  1. /root/kca-ops/ 디렉터리를 만들고 policy-baseline.yaml 에 kind ClusterPolicy, metadata.name kca-baseline 을 쓰세요. spec.validationFailureActionAudit 으로 두고 spec.validationFailureActionOverridesEnforcekca-prod, Audit 으로 kca-dev 를 지정하는 두 항목을 넣으세요. 규칙도 최소 하나 이상 있어야 합니다.
  2. 같은 파일에 spec.webhookConfiguration.timeoutSeconds20, spec.webhookConfiguration.failurePolicyIgnore 로 두세요. deprecated 인 spec.webhookTimeoutSecondsspec.failurePolicy 는 쓰지 마세요.
  3. 같은 파일에 spec.backgroundtrue, spec.admissiontrue, spec.applyRulesAll 로 두고 규칙을 두 개 이상으로 만드세요.
  4. /root/kca-ops/policyexception.yaml 에 apiVersion kyverno.io/v2beta1, kind PolicyException, metadata.name kca-allow-monitoring 을 쓰세요. spec.exceptions[0].policyNamekca-baseline, ruleNames 에는 1단계에서 만든 규칙 이름을 넣고, spec.match.any[0].resources.namespaceskca-monitoring, namesprometheus-* 를 넣으세요.
  5. /root/kca-ops/promote.sh 를 실행 권한이 있는 셸 스크립트로 만드세요. 안에는 kyverno apply--resource 를 쓰는 로컬 검증, PolicyReport 확인, 웹훅 등록이나 UpdateRequest 확인, Enforce 로 올리는 단계, 그리고 실패 시 0 이 아닌 코드로 끝내는 처리가 모두 들어가야 합니다.
  6. 클러스터에 네임스페이스 kca-prod 를 만들고 라벨 pod-security.kubernetes.io/enforce=restrictedpod-security.kubernetes.io/enforce-version 을 붙이세요. 네임스페이스 kca-devpod-security.kubernetes.io/warn=baseline 만 붙이고 enforce 라벨은 붙이지 마세요.
  7. 네임스페이스 kca-prod 에 Deployment kca-hello 를 실제로 만드세요. 파드 수준 securityContext.runAsNonRoottrue, securityContext.seccompProfile.typeRuntimeDefault, 컨테이너 수준 securityContext.allowPrivilegeEscalationfalse, capabilities.drop 에는 ALL 이 들어가야 합니다. 그리고 네임스페이스 kca-monitoring 을 라벨 pod-security.kubernetes.io/enforce=privileged 와 함께 만드세요.

참고

네임스페이스별 차등 적용

/root/kca-ops/ 디렉터리를 만들고 policy-baseline.yaml 에 kind ClusterPolicy, metadata.name kca-baseline 을 쓰세요. spec.validationFailureActionAudit 으로 두고 spec.validationFailureActionOverridesEnforcekca-prod, Audit 으로 kca-dev 를 지정하는 두 항목을 넣으세요. 규칙도 최소 하나 이상 있어야 합니다.

정책 전체의 기본은 관찰 모드로 두고, 오버라이드 배열에서 네임스페이스별로 다른 동작을 지정합니다. action 과 namespaces 두 필드가 한 항목을 이룹니다.

webhookConfiguration 으로 이관

같은 파일에 spec.webhookConfiguration.timeoutSeconds20, spec.webhookConfiguration.failurePolicyIgnore 로 두세요. deprecated 인 spec.webhookTimeoutSecondsspec.failurePolicy 는 쓰지 마세요.

타임아웃과 실패 정책은 1.13부터 한 블록 아래로 옮겨갔습니다. 예전 위치의 필드는 남겨 두면 안 되고, 관찰 단계 정책이 클러스터를 멈추지 않게 하려면 실패 정책을 어느 쪽으로 둘지 생각해 보세요.

background·admission·applyRules

같은 파일에 spec.backgroundtrue, spec.admissiontrue, spec.applyRulesAll 로 두고 규칙을 두 개 이상으로 만드세요.

세 플래그는 각각 기존 리소스 스캔, 어드미션 적용, 규칙 적용 개수를 정합니다. 규칙을 여러 개 나열했는데 뒤쪽이 안 도는 문제를 만드는 것이 마지막 필드입니다.

PolicyException 으로 정당한 예외

/root/kca-ops/policyexception.yaml 에 apiVersion kyverno.io/v2beta1, kind PolicyException, metadata.name kca-allow-monitoring 을 쓰세요. spec.exceptions[0].policyNamekca-baseline, ruleNames 에는 1단계에서 만든 규칙 이름을 넣고, spec.match.any[0].resources.namespaceskca-monitoring, namesprometheus-* 를 넣으세요.

예외는 정책 이름과 규칙 이름을 함께 지목합니다. 네임스페이스만 적어 통째로 빼는 대신 이름 패턴까지 좁히세요.

승격 체크리스트 스크립트

/root/kca-ops/promote.sh 를 실행 권한이 있는 셸 스크립트로 만드세요. 안에는 kyverno apply--resource 를 쓰는 로컬 검증, PolicyReport 확인, 웹훅 등록이나 UpdateRequest 확인, Enforce 로 올리는 단계, 그리고 실패 시 0 이 아닌 코드로 끝내는 처리가 모두 들어가야 합니다.

로컬 검증, 리포트 확인, 진단, 그리고 실패 시 0 이 아닌 종료가 모두 들어가야 CI 게이트로 쓸 수 있습니다. 실행 권한도 잊지 마세요.

PSA 라벨로 두 등급 만들기

클러스터에 네임스페이스 kca-prod 를 만들고 라벨 pod-security.kubernetes.io/enforce=restrictedpod-security.kubernetes.io/enforce-version 을 붙이세요. 네임스페이스 kca-devpod-security.kubernetes.io/warn=baseline 만 붙이고 enforce 라벨은 붙이지 마세요.

여기서부터 실제 클러스터입니다. Pod Security Admission 은 네임스페이스 라벨로 동작하고 모드가 enforce·audit·warn 세 가지입니다. 버전 라벨을 함께 고정하는 이유도 생각해 보세요.

restricted 를 통과하는 워크로드

네임스페이스 kca-prod 에 Deployment kca-hello 를 실제로 만드세요. 파드 수준 securityContext.runAsNonRoottrue, securityContext.seccompProfile.typeRuntimeDefault, 컨테이너 수준 securityContext.allowPrivilegeEscalationfalse, capabilities.drop 에는 ALL 이 들어가야 합니다. 그리고 네임스페이스 kca-monitoring 을 라벨 pod-security.kubernetes.io/enforce=privileged 와 함께 만드세요.

restricted 등급은 네 가지를 요구합니다. 루트가 아닌 실행, 권한 상승 금지, 모든 케이퍼빌리티 제거, 그리고 seccomp 프로파일입니다. 예외 대상이 될 네임스페이스도 함께 만드세요.