Cloud Service Mesh 보안 정책 제약조건 사용

정책 컨트롤러는 Cloud Service Mesh 보안 번들과 함께 사용하여 메시 보안 취약점 및 권장사항의 규정 준수를 감사할 수 있는 제약조건 템플릿의 기본 라이브러리와 함께 제공됩니다.

이 제약조건 번들은 다음 도메인에서 정책을 적용하고 시행합니다.

  • Cloud Service Mesh mTLS 트래픽 적용
  • Cloud Service Mesh AuthorizationPolicy 권장사항
  • Cloud Service Mesh 워크로드 보안 적용

Cloud Service Mesh 정책 번들 제약조건

제약조건 이름 제약조건 설명 컨트롤 ID
asm-policy-v0.0.1-asm-ingressgateway-label ingressgateway 포드에만 istio ingressgateway 라벨 사용 적용 1.1.1
asm-policy-v0.0.1-asm-sidecar-injection 워크로드 포드에 istio 프록시 사이드카가 항상 삽입되도록 적용 1.1.2
asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny 메시 수준 기본 거부 AuthorizationPolicy 적용 1.2.1
asm-policy-v0.0.1-asm-authz-policy-normalization AuthorizationPolicy 정규화 적용 1.2.2
asm-policy-v0.0.1-asm-authz-policy-safe-pattern AuthorizationPolicy 안전 패턴 적용 1.2.3
asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls 메시 수준 엄격한 mtls PeerAuthentication 적용 1.3.1
asm-policy-v0.0.1-asm-peer-authn-strict-mtls 모든 PeerAuthentications로 엄격한 mtls를 덮어쓸 수 없음 적용 1.3.2
asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers 잘 알려진 HTTP 요청 헤더를 포함하지 않도록 jwtRules outputPayloadToHeader 적용 1.4.1

번들 프로필

Cloud Service Mesh 보안 정책 번들에서는 엄격한 정도에 따라 두 개의 프로필을 사용할 수 있습니다. 낮은 엄격도에서는 적용되는 제약조건이 적으므로 유연성이 높아집니다. 높은 엄격도에는 더 많은 제약조건이 적용되어 더욱 안전한 정책 제어가 가능합니다.

낮은 엄격도

낮은 엄격도의 프로필에는 다음과 같은 정책 제약조건이 적용됩니다.

  • istio:ingressgateway 라벨은 Istio 인그레스 게이트웨이 포드에서만 사용할 수 있습니다.

  • AuthorizationPolicy에서 hosts 또는 notHosts 필드는 istio:ingressgateway 라벨이 있는 Istio 인그레스 게이트웨이를 선택해야 사용할 수 있습니다.

  • AuthorizationPolicy에서 methods 또는 notMethods 필드가 사용되는 경우 값이 대문자여야 합니다.

  • AuthorizationPolicy에서 request.headers 필드가 사용되는 경우 값에 공백이 포함될 수 없습니다.

  • AuthorizationPolicy에서 paths 또는 notPaths 필드가 사용되는 경우 값이 정규화된 값이어야 합니다.

높은 엄격도

높은 엄격도에는 낮은 엄격도의 모든 제약조건과 다음 제약조건이 포함됩니다.

  • 모든 워크로드 포드에서 sidecar.istio.io/inject: false 주석을 적용하여 프록시 삽입을 우회할 수 없습니다.

  • 기본 거부 규칙을 정의하는 메시 수준 AuthorizationPolicy가 적용됩니다.

  • AuthorizationPolicyALLOW-with-positive-matching 또는 DENY-with-negative-match를 따라야 합니다.

  • AuthorizationPolicy에서 hosts 또는 notHosts 필드가 사용되는 경우 값이 <host-name><host-name>:*의 쌍이어야 합니다.

  • 엄격한 mTLS를 정의하는 메시 수준 PeerAuthentication이 적용됩니다.

  • 메시의 모든 PeerAuthentication에서 mTLS 모드는 UNSET 또는 STRICT만 가능하여 엄격한 mTLS를 따릅니다.

번들 설정

KPT setter 설명
엄격도 Cloud Service Mesh 번들 엄격도 프로필, 옵션은 '낮음' 또는 '높음'(기본값)

시작하기 전에

  1. 이 안내에서 사용되는 gcloudkubectl 명령어를 제공하는 Google Cloud CLI를 설치하고 초기화합니다. Cloud Shell을 사용하는 경우 Google Cloud CLI가 사전 설치됩니다.
  2. 기본 제약조건 템플릿 라이브러리를 사용하여 클러스터에 v.1.11.2 이상의 정책 컨트롤러를 설치합니다. 또한 이 번들에는 참조 제약조건이 포함되어 있으므로 참조 제약조건에 대한 지원을 사용 설정해야 합니다.
  3. Cloud Service Mesh가 클러스터에 설치되었는지 확인합니다.

참조 제약조건에 맞게 정책 컨트롤러 구성

  1. 다음 YAML 매니페스트를 policycontroller-config.yaml로 저장합니다.

    apiVersion: config.gatekeeper.sh/v1alpha1
    kind: Config
    metadata:
      name: config
      namespace: "gatekeeper-system"
    spec:
      sync:
        syncOnly:
          - group: ""
            version: "v1"
            kind: "Namespace"
          - group: "security.istio.io"
            version: "v1beta1"
            kind: "AuthorizationPolicy"
          - group: "security.istio.io"
            version: "v1beta1"
            kind: "PeerAuthentication"
    

    이 매니페스트는 특정 종류의 객체를 감시하도록 정책 컨트롤러를 구성합니다.

  2. policycontroller-config.yaml 매니페스트를 적용합니다.

    kubectl apply -f policycontroller-config.yaml
    

Cloud Service Mesh 정책 번들 감사

정책 컨트롤러를 사용하면 Kubernetes 클러스터에 정책을 적용할 수 있습니다. 앞의 테이블에서 설명된 Cloud Service Mesh 보안 정책과 관련하여 워크로드 및 규정 준수를 테스트하는 데 도움이 되도록, '감사' 모드에서 이러한 제약조건을 배포하여 위반 사항을 표시할 수 있고 더 중요하게는 Kubernetes 클러스터에 적용하기 전에 문제를 해결할 기회를 가질 수 있습니다.

kubectl, kpt 또는 구성 동기화를 사용하여 dryrun으로 설정된 spec.enforcementAction으로 이러한 정책을 적용할 수 있습니다.

kubectl

  1. (선택사항) kubectl을 사용하여 정책 제약조건을 미리 봅니다.

    kubectl kustomize https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1
    
  2. kubectl을 사용하여 정책 제약조건을 적용합니다.

    kubectl apply -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1
    

    출력은 다음과 같습니다.

    asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny created
    asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-normalization created
    asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-safe-pattern created
    asmingressgatewaylabel.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-ingressgateway-label created
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls created
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-strict-mtls created
    asmrequestauthnprohibitedoutputheaders.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers created
    asmsidecarinjection.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-sidecar-injection created
    
  3. 정책 제약조건이 설치되었는지 확인하고 클러스터 전체에 위반 사항이 있는지 확인합니다.

    kubectl get -k https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1
    

    출력은 다음과 비슷합니다.

    NAME                                                                                                       ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny   dryrun               0
    
    NAME                                                                                                     ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-normalization   dryrun               0
    
    NAME                                                                                                  ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-safe-pattern   dryrun               0
    
    NAME                                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmingressgatewaylabel.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-ingressgateway-label   dryrun               0
    
    NAME                                                                                                     ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls   dryrun               0
    
    NAME                                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-strict-mtls   dryrun               0
    
    NAME                                                                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmrequestauthnprohibitedoutputheaders.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers   dryrun               0
    
    NAME                                                                                    ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmsidecarinjection.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-sidecar-injection   dryrun               0
    

kpt

  1. kpt를 설치하고 설정합니다. 이 안내에서는 kpt를 사용하여 Kubernetes 리소스를 맞춤설정하고 배포합니다.

  2. kpt를 사용하여 GitHub에서 Cloud Service Mesh 보안 정책 번들을 다운로드합니다.

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1
    
  3. set-enforcement-action kpt 함수를 실행하여 정책의 시정 조치를 dryrun으로 설정합니다.

    kpt fn eval asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 \
      -- enforcementAction=dryrun
    
  4. kpt setter 함수를 실행하여 Cloud Service Mesh 보안 정책 관련 필드를 설정합니다.

    kpt fn eval asm-policy-v0.0.1 --image gcr.io/kpt-fn/apply-setters:v0.2.0 -- \
    strictness-level="Low"
    
  5. 변경사항을 추적하는 리소스를 만드는 kpt로 작업 디렉터리를 초기화합니다.

    cd asm-policy-v0.0.1
    kpt live init
    
  6. kpt로 정책 제약조건을 적용합니다.

    kpt live apply
    

    출력은 다음과 같습니다.

    asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-authz-policy-mesh-default-deny created
    asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-authz-policy-normalization created
    asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-authz-policy-safe-pattern created
    asmingressgatewaylabel.constraints.gatekeeper.sh/asm-ingressgateway-label created
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-peer-authn-mesh-strict-mtls created
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-peer-authn-strict-mtls created
    asmsidecarinjection.constraints.gatekeeper.sh/asm-sidecar-injection created
    7 resource(s) applied. 7 created, 0 unchanged, 0 configured, 0 failed
    
  7. 정책 제약조건이 설치되었는지 확인하고 클러스터 전체에 위반 사항이 있는지 확인합니다.

    kpt live status --output table --poll-until current
    

    CURRENT 상태는 제약조건이 성공적으로 설치되었음을 확인합니다.

구성 동기화

  1. kpt를 설치하고 설정합니다. 이 안내에서는 kpt를 사용하여 Kubernetes 리소스를 맞춤설정하고 배포합니다.

구성 동기화를 사용하여 클러스터에 정책을 배포하는 운영자는 다음 안내를 따르세요.

  1. 구성 동기화의 동기화 디렉터리로 변경합니다.

    cd SYNC_ROOT_DIR
    

    resourcegroup.yaml.gitignore를 만들거나 추가하려면 다음 안내를 따르세요.

    echo resourcegroup.yaml >> .gitignore
    

  2. 전용 policies 디렉터리를 만듭니다.

    mkdir -p policies
    
  3. kpt를 사용하여 GitHub에서 Cloud Service Mesh 보안 정책 번들을 다운로드합니다.

    kpt pkg get https://github.com/GoogleCloudPlatform/gke-policy-library.git/bundles/asm-policy-v0.0.1 policies/asm-policy-v0.0.1
    
  4. set-enforcement-action kpt 함수를 실행하여 정책의 시정 조치를 dryrun으로 설정합니다.

    kpt fn eval policies/asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=dryrun
    
  5. kpt setter 함수를 실행하여 Cloud Service Mesh 보안 정책 관련 필드를 설정합니다.

    kpt fn eval policies/asm-policy-v0.0.1 --image gcr.io/kpt-fn/apply-setters:v0.2.0 -- \
    strictness-level="Low"
    
  6. (선택사항) 생성될 정책 제약조건을 미리 봅니다.

    kpt live init policies/asm-policy-v0.0.1
    kpt live apply --dry-run policies/asm-policy-v0.0.1
    

    출력은 다음과 같습니다.

    Dry-run strategy: client
    inventory update started
    inventory update finished
    apply phase started
    asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-mesh-default-deny apply successful
    asmauthzpolicynormalization.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-normalization apply successful
    asmauthzpolicysafepattern.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-authz-policy-safe-pattern apply successful
    asmingressgatewaylabel.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-ingressgateway-label apply successful
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-mesh-strict-mtls apply successful
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-peer-authn-strict-mtls apply successful
    asmrequestauthnprohibitedoutputheaders.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-request-authn-prohibited-output-headers apply successful
    asmsidecarinjection.constraints.gatekeeper.sh/asm-policy-v0.0.1-asm-sidecar-injection apply successful
    apply phase finished
    inventory update started
    inventory update finished
    apply result: 8 attempted, 8 successful, 0 skipped, 0 failed
    
  7. 구성 동기화의 동기화 디렉터리에 Kustomize가 사용되는 경우 루트 kustomization.yamlpolicies/asm-policy-v0.0.1를 추가합니다. 그렇지 않으면 policies/asm-policy-v0.0.1/kustomization.yaml 파일을 삭제합니다.

    rm SYNC_ROOT_DIR/policies/asm-policy-v0.0.1/kustomization.yaml
    
  8. 구성 동기화 저장소에 변경사항을 푸시합니다.

    git add SYNC_ROOT_DIR/policies/asm-policy-v0.0.1
    git commit -m 'Adding ASM security policy audit enforcement'
    git push
    
  9. 설치 상태를 확인합니다.

    watch gcloud beta container fleet config-management status --project PROJECT_ID
    

    SYNCED 상태는 정책 설치를 확인합니다.

정책 위반 보기

정책 제약조건이 감사 모드로 설치되면 정책 컨트롤러 대시보드를 사용하여 UI에서 클러스터의 위반 사항을 볼 수 있습니다.

또한 kubectl을 사용하여 다음 명령어를 사용하여 클러스터에서 위반 사항을 볼 수 있습니다.

kubectl get constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.1 -o json | jq -cC '.items[]| [.metadata.name,.status.totalViolations]'

위반 사항이 있는 경우 제약조건당 위반 메시지 목록을 다음에서 볼 수 있습니다.

kubectl get constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.1 -o json | jq -C '.items[]| select(.status.totalViolations>0)| [.metadata.name,.status.violations[]?]'

Cloud Service Mesh 정책 번들 시정 조치 변경

클러스터에서 정책 위반을 검토한 후에는 허용 컨트롤러가 호환되지 않는 리소스가 클러스터에 적용되지 않도록 warn 또는 deny를 수행할 수 있도록 시행 모드 변경을 고려할 수 있습니다.

kubectl

  1. kubectl을 사용하여 정책의 시행 작업을 warn로 설정합니다.

    kubectl get constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.1 -o name | xargs -I {} kubectl patch {} --type='json' -p='[{"op":"replace","path":"/spec/enforcementAction","value":"warn"}]'
    
  2. 정책 제약조건 시행 작업이 업데이트되었는지 확인합니다.

    kubectl get constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.1
    

kpt

  1. set-enforcement-action kpt 함수를 실행하여 정책의 시정 조치를 warn으로 설정합니다.

    kpt fn eval -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  2. 정책 제약조건을 적용합니다.

    kpt live apply
    

구성 동기화

구성 동기화를 사용하여 클러스터에 정책을 배포하는 운영자는 다음 안내를 따르세요.

  1. 구성 동기화의 동기화 디렉터리로 변경합니다.

    cd SYNC_ROOT_DIR
    
  2. set-enforcement-action kpt 함수를 실행하여 정책의 시정 조치를 warn으로 설정합니다.

    kpt fn eval policies/asm-policy-v0.0.1 -i gcr.io/kpt-fn/set-enforcement-action:v0.1 -- enforcementAction=warn
    
  3. 구성 동기화 저장소에 변경사항을 푸시합니다.

    git add SYNC_ROOT_DIR/policies/asm-policy-v0.0.1
    git commit -m 'Adding ASM security policy bundle warn enforcement'
    git push
    
  4. 설치 상태를 확인합니다.

    gcloud alpha anthos config sync repo list --project PROJECT_ID
    

    SYNCED 열에 표시된 저장소는 정책 설치를 확인합니다.

테스트 정책 시행

다음 명령어를 사용하여 클러스터에 정책을 준수하지 않는 리소스를 만듭니다.

cat <<EOF | kubectl apply -f -
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: non-compliant-authz-policy
spec:
  action: ALLOW
  rules:
  - to:
    - operation:
        methods: ["get"]
EOF

다음 예시와 같이 허용 컨트롤러는 이 리소스가 위반하는 정책 위반을 나열하는 경고를 생성해야 합니다.

Warning: [asm-policy-v0.0.1-asm-authz-policy-normalization] in rules-to-operation, methods or notMethods must be uppercase
authorizationpolicy.security.istio.io/non-compliant-authz-policy created

Cloud Service Mesh 정책 번들 삭제

필요한 경우 클러스터에서 Cloud Service Mesh 정책 번들을 삭제할 수 있습니다.

kubectl

  • kubectl을 사용하여 정책을 삭제합니다.

    kubectl delete constraint -l policycontroller.gke.io/bundleName=asm-policy-v0.0.1
    

kpt

  • 정책을 삭제합니다.

    kpt live destroy
    

구성 동기화

구성 동기화를 사용하여 클러스터에 정책을 배포하는 운영자는 다음 안내를 따르세요.

  1. 구성 동기화 저장소에 변경사항을 푸시합니다.

    git rm -r SYNC_ROOT_DIR/policies/asm-policy-v0.0.1
    git commit -m 'Removing Cloud Service Mesh  policies'
    git push
    
  2. 상태를 확인합니다.

    gcloud alpha anthos config sync repo list --project PROJECT_ID
    

    SYNCED 열에 표시된 저장소는 정책 삭제를 확인합니다.