제약조건을 사용하여 감사

정책 컨트롤러 제약조건 객체를 사용하면 Kubernetes 클러스터에 정책을 적용할 수 있습니다. 제약조건에 시행 작업을 추가하면 정책 테스트를 지원할 수 있습니다. 그런 다음 제약조건 객체 및 로그에서 위반 사항을 볼 수 있습니다.

이 페이지는 감사 또는 시행 자동화를 제공하고 유지하여 클라우드 플랫폼 내에서 실행되는 모든 리소스가 조직의 규정 준수 요구사항을 충족하도록 보장하고 기본 기술 인프라의 수명 주기를 관리하는 IT 관리자와 운영자를 위해 작성되었습니다. Google Cloud 콘텐츠에서 참조하는 일반적인 역할 및 예시 작업에 대해 자세히 알아보려면 일반 GKE 기업 사용자 역할 및 태스크를 참조하세요.

시행 작업 유형

시행 작업에는 deny, dryrun, warn 등 세 가지가 있습니다.

deny가 기본 시행 작업입니다. 제약조건에 시행 작업을 추가하지 않더라도 자동으로 사용 설정됩니다. 위반이 있을 때 특정 클러스터 작업이 발생하지 않도록 하려면 deny를 사용합니다.

dryrun을 사용하면 트랜잭션을 적극적으로 차단하지 않고도 규칙 위반을 모니터링할 수 있습니다. deny 작업을 사용하여 활성 시행을 사용 설정하기 전에 제약조건이 의도한 대로 작동하는지 테스트할 수 있습니다. 이 방법으로 제약조건을 테스트하면 잘못 구성된 제약조건으로 인한 중단을 방지할 수 있습니다.

warndryrun와 비슷하지만 허용 시 발생하는 위반에 대한 즉각적인 메시지도 제공합니다.

또한 새 제약조건을 테스트하거나 플랫폼 업그레이드와 같은 마이그레이션 작업을 수행할 때는 정책이 정상적으로 작동하는지 테스트할 수 있도록 시행 작업을 deny에서 warn 또는 dryrun으로 전환하는 것이 좋습니다.

시행 작업 추가

제약조건에 enforcementAction: deny 또는 enforcementAction: dryrun을 추가할 수 있습니다.

audit.yaml이라는 다음 예시 제약조건은 dryrun 작업을 추가합니다.

#audit.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPAllowedUsers
metadata:
  name: user-must-be-3333
spec:
  enforcementAction: dryrun
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
  parameters:
    runAsUser:
      rule: MustRunAs
      ranges:
        - min: 3333
          max: 3333

제약조건을 만듭니다. 예를 들어 kubectl apply -f를 사용하여 적용합니다.

kubectl apply -f audit.yaml

감사 결과 보기

감사된 위반은 제약조건 객체에 추가되며 로그에 기록됩니다. 승인 컨트롤러가 거부하는 위반사항은 로그에 나타나지 않습니다.

제약조건 객체에서 감사 결과 보기

특정 제약조건의 위반사항을 확인하려면 다음 명령어를 실행하고 spec.status 필드를 봅니다.

kubectl get constraint-kind constraint-name -o yaml

audit.yaml에서 제약조건 출력을 보려면 다음 명령어를 실행합니다.

kubectl get K8sPSPAllowedUsers user-must-be-3333 -o yaml

표시되는 출력은 다음과 비슷합니다.

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPAllowedUsers
metadata:
  creationTimestamp: "2020-05-22T01:34:22Z"
  generation: 1
  name: user-must-be-3333
  resourceVersion: "13351707"
  selfLink: /apis/constraints.gatekeeper.sh/v1beta1/k8spspallowedusers/user-must-be-3333
  uid: 5d0b39a8-9bcc-11ea-bb38-42010a80000c
spec:
  enforcementAction: dryrun
  match:
    kinds:
    - apiGroups:
      - ""
      kinds:
      - Pod
  parameters:
    runAsUser:
      ranges:
      - max: 3333
        min: 3333
      rule: MustRunAs
 status:
  auditTimestamp: "2020-05-22T01:39:05Z"
  byPod:
  - enforced: true
    id: gatekeeper-controller-manager-6b665d4c4d-lwnz5
    observedGeneration: 1
 totalViolations: 5
  violations:
  - enforcementAction: dryrun
    kind: Pod
    message: Container git-sync is attempting to run as disallowed user 65533
    name: git-importer-86564db8cb-5r4gs
    namespace: config-management-system
  - enforcementAction: dryrun
    kind: Pod
    message: Container manager is attempting to run as disallowed user 1000
    name: gatekeeper-controller-manager-6b665d4c4d-lwnz5
    namespace: gatekeeper-system
  - enforcementAction: dryrun
    kind: Pod
    message: Container kube-proxy is attempting to run without a required securityContext/runAsUser
    name: kube-proxy-gke-fishy131-default-pool-7369b17c-cckf
    namespace: kube-system
  - enforcementAction: dryrun
    kind: Pod
    message: Container kube-proxy is attempting to run without a required securityContext/runAsUser
    name: kube-proxy-gke-fishy131-default-pool-7369b17c-jnhb
    namespace: kube-system
  - enforcementAction: dryrun
    kind: Pod
    message: Container kube-proxy is attempting to run without a required securityContext/runAsUser
    name: kube-proxy-gke-fishy131-default-pool-7369b17c-xrd8
    namespace: kube-system

로그에서 감사 결과 보기

로그 탐색기를 사용하여 정책 컨트롤러의 로그 데이터를 검색, 확인, 분석할 수 있습니다.

모든 정책 컨트롤러 로그를 가져오려면 다음 명령어를 실행합니다.

kubectl logs -n gatekeeper-system -l gatekeeper.sh/system=yes

감사 결과의 로그 행에 "process":"audit"가 있으므로 출력을 다른 명령어로 파이핑하고 해당 줄로 필터링할 수 있습니다. 예를 들어 jq를 사용하면 JSON 파일을 파싱하고 특정 로그 유형의 필터를 설정할 수 있습니다.

로깅의 감사 결과 예시:

{
"level":"info",
"ts":1590111401.9769812,
"logger":"controller",
"msg":"Container kube-proxy is attempting to run without a required securityContext/runAsUser",
"process":"audit",
"audit_id":"2020-05-22T01:36:24Z",
"event_type":"violation_audited",
"constraint_kind":"K8sPSPAllowedUsers",
"constraint_name":"user-must-be-3333",
"constraint_namespace":"",
"constraint_action":"dryrun",
"resource_kind":"Pod",
"resource_namespace":"kube-system",
"resource_name":"kube-proxy-gke-fishy131-default-pool-7369b17c-xrd8"
}

다음 단계