버전 1.15

Anthos Service Mesh 및 Anthos Config Management를 사용하여 앱 보안 강화

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

이 튜토리얼에서는 클러스터 및 앱의 보안 상태를 개선하는 방법을 보여줍니다. 사용자가 안정적인 서비스 메시를 모니터링하고 관리하는 데 도움이 되는 도구 모음인 Anthos Service Mesh를 사용하여 조직에서 온라인 상점의 앱을 관리하는 플랫폼 관리자라고 가정해 봅시다. 즉, 메시와 앱의 안전을 책임져야 하는 위치입니다.

Anthos Config Management정책 컨트롤러구성 동기화를 사용하면 잘못된 구성을 방지하고 Anthos Service Mesh 정책을 자동으로 검사할 수 있습니다. 정책 컨트롤러를 사용 설정하면 클러스터에 완전히 프로그래밍 가능한 정책을 적용할 수 있습니다. 또한 정책 컨트롤러에는 Anthos Service Mesh 보안 번들과 함께 사용할 수 있는 제약조건 템플릿의 기본 라이브러리가 제공되어 메시 보안 취약점 및 권장사항의 규정 준수를 감사합니다. 구성 동기화는 Kubernetes 선언적 구성 파일의 중앙 집합으로 등록된 클러스터 상태를 지속적으로 조정합니다. 정책 컨트롤러와 구성 동기화를 함께 사용하면 Anthos Service Mesh 정책 구성에 제약조건을 지속적으로 적용할 수 있습니다.

다음은 이 튜토리얼에서 Anthos Service Mesh, 정책 컨트롤러, 구성 동기화가 함께 작동하여 어떻게 이 튜토리얼에서 사용되는 인그레스 게이트웨이Online Boutique 샘플 앱을 관리하고 보호하는지를 개괄적으로 보여주는 다이어그램입니다.

이 튜토리얼에서 만드는 아키텍처를 보여주는 다이어그램

목표

  • Google Kubernetes Engine (GKE) 클러스터를 만들고 Fleet에 클러스터 등록하기
  • 클러스터에 정책 컨트롤러, 구성 동기화, Anthos Service Mesh 설치
  • 여러 저장소를 동기화하도록 구성 동기화 구성
  • 구성 동기화를 사용하여 구성, 앱, Istio 리소스를 배포하기 위한 권장사항 적용
  • 구성 동기화를 사용하여 클러스터 구성, Online Boutique 샘플 앱, 인그레스 게이트웨이 배포
  • 정책 컨트롤러의 Anthos Service Mesh 정책 번들을 활용하여 다음 보안 권장사항 적용
    • 메시의 모든 워크로드에 자동 사이드카 삽입이 있는지 확인합니다.
    • 메시의 모든 트래픽을 암호화
    • 메시의 모든 워크로드가 세분화된 액세스 제어를 갖도록 보장합니다.

비용

이 가이드에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

  • GKE.
  • Anthos. Anthos 결제에는 Anthos Service Mesh 및 Anthos Config Management 구성요소에 대한 결제가 포함됩니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 튜토리얼을 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않게 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  2. Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

개발 환경 준비

이 섹션에서는 Anthos Service Mesh, 정책 컨트롤러, 구성 동기화를 설치할 수 있도록 환경을 준비합니다.

  1. Google Cloud 콘솔에서 Cloud Shell을 활성화합니다.

    Cloud Shell 활성화

  2. Google Cloud CLI를 최신 버전으로 업그레이드합니다.

    gcloud components update
    
  3. 이 튜토리얼에서 만드는 파일을 저장하려면 환경 변수를 사용하여 디렉터리를 만듭니다.

    WORK_DIR=~/asm-acm-tutorial-dir
    mkdir $WORK_DIR
    
  4. 이 튜토리얼의 나머지 부분을 간소화하려면 다음 환경 변수를 만듭니다.

    PROJECT_ID=PROJECT_ID
    gcloud config set project $PROJECT_ID
    CLUSTER=asm-acm-tutorial
    CLUSTER_ZONE=us-east4-a
    PROJECT_NUMBER=$(gcloud projects describe ${PROJECT_ID} --format='get(projectNumber)')
    

    PROJECT_ID를 이 튜토리얼에 사용할 프로젝트 ID로 바꿉니다.

    Cloud Shell을 승인하라는 메시지가 표시되면 승인을 클릭하여 작업을 완료합니다.

  5. 이 튜토리얼에 필요한 API를 사용 설정합니다.

    gcloud services enable \
        mesh.googleapis.com \
        anthos.googleapis.com
    

    이 작업을 완료하는 데 1분 이상 걸릴 수 있습니다.

GKE 클러스터 설정

이 섹션에서는 GKE 클러스터를 만든 다음 Fleet에 등록합니다. Fleet은 클러스터 및 기타 리소스를 논리적으로 구성하기 위한 Google Cloud 개념으로, 멀티 클러스터 기능을 사용 및 관리하고 시스템 전체에 일관된 정책을 적용할 수 있습니다.

이 섹션에서 만드는 클러스터는 Anthos Service Mesh, 정책 컨트롤러, 구성 동기화를 설치하는 클러스터입니다. 또한 Online Boutique 샘플 앱을 배포하는 클러스터입니다.

클러스터를 설정하려면 다음 단계를 완료하세요.

  1. GKE 클러스터를 만듭니다.

    gcloud container clusters create ${CLUSTER} \
        --zone ${CLUSTER_ZONE} \
        --machine-type=e2-standard-4 \
        --num-nodes 4 \
        --workload-pool ${PROJECT_ID}.svc.id.goog \
        --labels mesh_id=proj-${PROJECT_NUMBER}
    

    이 작업을 완료하는 데 5분 이상 걸릴 수 있습니다.

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

    kubeconfig entry generated for asm-acm-tutorial.
    NAME: asm-acm-tutorial
    LOCATION: us-east4-a
    MASTER_VERSION: 1.21.10-gke.2000
    MASTER_IP: 34.85.159.120
    MACHINE_TYPE: e2-standard-4
    NODE_VERSION: 1.21.10-gke.2000
    NUM_NODES: 4
    STATUS: RUNNING
    
  2. Fleet에 클러스터를 등록합니다.

    gcloud container fleet memberships register ${CLUSTER} \
        --project=${PROJECT_ID} \
        --gke-cluster=${CLUSTER_ZONE}/${CLUSTER} \
        --enable-workload-identity
    

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

    kubeconfig entry generated for asm-acm-tutorial.
    Waiting for membership to be created...done.
    Created a new membership [projects/PROJECT_ID/locations/global/memberships/asm-acm-tutorial] for the cluster [asm-acm-tutorial]
    Generating the Connect Agent manifest...
    Deploying the Connect Agent on cluster [asm-acm-tutorial] in namespace [gke-connect]...
    Deployed the Connect Agent on cluster [asm-acm-tutorial] in namespace [gke-connect].
    Finished registering the cluster [asm-acm-tutorial] with the Fleet.
    

저장소 살펴보기

다음 설치 섹션에서 Anthos Config Management 매니페스트 acm-config.yaml를 적용합니다. 이 매니페스트는 클러스터가 Anthos Config Management 샘플 저장소의 asm-acm-tutorial 폴더에서 동기화되도록 구성합니다. 이 폴더에는 튜토리얼의 나머지 부분을 완료하는 데 필요한 모든 구성 파일이 있습니다.

이 튜토리얼을 간소화하려면 sed 명령어를 사용하여 acm-config.yaml을 업데이트합니다. 구성 동기화는 acm-config.yaml 파일을 사용하여 이 튜토리얼의 각 단계에 필요한 매니페스트를 배포합니다. 파일 하나를 업데이트하면 파일을 반복적으로 조작하고 git 명령어를 반복적으로 실행하지 않고도 클러스터, 메시, 애플리케이션 보안의 개념과 흐름에 집중할 수 있습니다.

구성 동기화의 여러 저장소 동기화 기능을 활용하려면 다음 리소스를 사용합니다.

  • RootSync 저장소로 사용되는 root-sync에는 RepoSyncs, Constraints, ClusterRole, RoleBindingsistio-system과 같은 일부 시스템 네임스페이스에 포함된 리소스를 포함하여 클러스터의 모든 구성이 포함됩니다.
  • ingress-gateway는 첫 번째 RepoSync로서 인그레스 게이트웨이를 배포하고 이 튜토리얼 전체에서 점진적으로 보호하는 데 필요한 모든 리소스를 포함합니다.
  • 두 번째 RepoSynconline-boutique에는 Online Boutique 앱을 배포하고 이 튜토리얼 전체에서 점진적으로 보호하는 데 필요한 모든 리소스가 포함되어 있습니다.

정책 컨트롤러, 구성 동기화, 관리형 Anthos Service Mesh 설치

클러스터를 만들고 등록했으므로 이제 클러스터에 구성 동기화, 정책 컨트롤러, Anthos Service Mesh를 설치하고 기본 RootSync의 구성에서 동기화하도록 클러스터를 구성합니다.

  1. Fleet에서 Anthos Config Management 사용 설정

    gcloud beta container fleet config-management enable
    
  2. Fleet에서 Anthos Service Mesh를 사용 설정합니다.

    gcloud container fleet mesh enable
    
  3. Google에서 관리형 Anthos Service Mesh의 권장 구성을 적용할 수 있도록 Anthos Service Mesh 자동 관리를 사용 설정합니다.

    gcloud container fleet mesh update \
        --management automatic \
        --memberships ${CLUSTER}
    
  4. 구성 동기화 및 정책 컨트롤러를 설치 및 구성하려면 다음 Anthos Config Management 매니페스트를 만듭니다.

    cat <<EOF > $WORK_DIR/acm-config.yaml
    applySpecVersion: 1
    spec:
      policyController:
        enabled: true
        templateLibraryInstalled: true
        referentialRulesEnabled: true
      configSync:
        enabled: true
        sourceFormat: unstructured
        syncRepo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples
        syncBranch: main
        secretType: none
        policyDir: asm-acm-tutorial/root-sync/init
    EOF
    

    Anthos Config Management 구성 필드에 대한 상세 설명은 gcloud 적용 사양 필드를 참조하세요.

  5. 파일을 적용합니다.

    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    이 파일을 적용하면 정책 컨트롤러 및 구성 동기화가 클러스터에 설치됩니다. 그런 다음 구성 동기화가 기본 RootSync의 모든 구성을 클러스터에 동기화하기 시작합니다. 이러한 구성은 다음 주요 구성요소를 설치하고 구성합니다.

  6. 정책 컨트롤러 및 구성 동기화가 성공적으로 설치되었는지 확인하려면 Anthos Config Management 상태를 확인합니다.

    gcloud beta container fleet config-management status
    

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

    Name: asm-acm-tutorial
    Status: SYNCED
    Last_Synced_Token: 4b3384d
    Sync_Branch: main
    Last_Synced_Time: 2022-05-04T21:32:58Z
    Policy_Controller: INSTALLED
    Hierarchy_Controller: PENDING
    

    Status 또는 Policy_Controller 행에 PENDING 또는 NOT_INSTALLED가 표시되면 몇 분 정도 기다린 후 gcloud beta container fleet config-management status을 다시 실행합니다.

  7. Anthos Service Mesh를 성공적으로 설치하려면 상태를 설명합니다.

    gcloud container fleet mesh describe
    

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

    createTime: '2022-09-13T23:12:56.477042921Z'
    membershipSpecs:
      projects/PROJECT_NUMBER/locations/global/memberships/asm-acm-tutorial:
        mesh:
          management: MANAGEMENT_AUTOMATIC
    membershipStates:
      projects/PROJECT_NUMBER/locations/global/memberships/asm-acm-tutorial:
        servicemesh:
          controlPlaneManagement:
            details:
            - code: REVISION_READY
              details: 'Ready: asm-managed'
            state: ACTIVE
          dataPlaneManagement:
            details:
            - code: OK
              details: Service is running.
            state: ACTIVE
        state:
          code: OK
          description: |-
            Revision(s) ready for use: asm-managed.
            All Canonical Services have been reconciled successfully.
          updateTime: '2022-09-14T00:19:10.571552206Z'
    name: projects/PROJECT_ID/locations/global/features/servicemesh
    resourceState:
      state: ACTIVE
    spec: {}
    state:
      state: {}
    updateTime: '2022-09-14T00:19:14.135113118Z'
    

    state.code: OK 대신 state.code: ERROR이 표시되면 몇 분 기다렸다가 다시 gcloud container fleet mesh describe를 실행합니다. 튜토리얼을 진행하기 전에 servicemesh.controlPlaneManagement.details.code 필드에 REVISION_READY 값이 있는지 확인해야 합니다.

인그레스 게이트웨이 및 샘플 애플리케이션 배포

이 섹션에서는 Online Boutique 샘플 애플리케이션인그레스 게이트웨이를 배포하여 인그레스 트래픽을 관리합니다.

  1. Online Boutique 샘플 애플리케이션과 인그레스 게이트웨이를 배포합니다.

    다음 명령어는 sed를 통해 acm-config.yaml 매니페스트를 업데이트하여 인그레스 게이트웨이와 샘플 앱을 배포하는 데 필요한 리소스를 배포하는 구성 동기화를 가져옵니다.

    sed -i "s,root-sync/init,root-sync/deployments,g" $WORK_DIR/acm-config.yaml
    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    이 단계를 완료하는 데 몇 분 정도 걸릴 수 있습니다.

  2. RootSync 및 두 개의 RepoSyncs에 대한 구성 동기화 상태를 확인합니다.

    gcloud alpha anthos config sync repo describe
    

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

    getting 3 RepoSync and RootSync from projects/project_id/locations/global/memberships/asm-acm-tutorial
    [
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/deployments@main",
        "status": "SYNCED"
      },
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/ingress-gateway/deployments@main",
        "status": "SYNCED"
      },
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "95a30c052566357afb9db3d7f6153d9c0f219c03",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/online-boutique/deployments@main",
        "status": "SYNCED"
      }
    ]
    

    status: SYNCED 대신 status: RECONCILING이 표시되면 몇 분 기다렸다가 다시 gcloud alpha anthos config sync repo describe를 실행합니다.

    하나의 저장소 정보만 보려면 --sync-name--sync-namespace 플래그를 사용할 수 있습니다. 관리형 리소스를 자세히 보려면 --managed-resources 플래그를 추가합니다. 자세한 내용은 여러 클러스터에서 구성 동기화 상태 보기를 참조하세요.

  3. 인그레스 게이트웨이의 공개 IP 주소가 프로비저닝될 때까지 기다립니다.

    until kubectl -n asm-ingress get svc asm-ingressgateway -o jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done
    
  4. 인그레스 게이트웨이의 공개 IP 주소를 가져옵니다.

    EXTERNAL_IP=$(kubectl get svc asm-ingressgateway -n asm-ingress -o jsonpath="{.status.loadBalancer.ingress[*].ip}")
    
  5. 브라우저에서 IP 주소에 방문하여 Online Boutique 앱이 성공적으로 배포되었는지 확인합니다.

    echo http://${EXTERNAL_IP}
    

메시를 보호하기 위한 정책 시행

다음 섹션에서는 정책 컨트롤러를 활용하여 제약조건을 만들어Anthos Service Mesh 정책 번들의 정책을 적용합니다.

사이드카 프록시 삽입 적용

이 섹션에서는 메시의 모든 워크로드에 자동 사이드카 삽입이 사용 설정되도록 하는 정책을 적용합니다.

  1. 사이드카 프록시 삽입을 시행하려면 제약조건을 적용하세요.

    다음 명령어는 sed를 사용하여 관련 리소스를 배포하는 구성 동기화를 가져오도록 acm-config.yaml 파일을 업데이트합니다.

    sed -i "s,root-sync/deployments,root-sync/enforce-sidecar-injection,g" $WORK_DIR/acm-config.yaml
    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    위의 명령어는 다음 리소스를 배포합니다.

  2. RootSync의 구성 동기화 상태를 확인합니다.

    gcloud alpha anthos config sync repo describe \
        --sync-name root-sync \
        --sync-namespace config-management-system
    

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

    getting 1 RepoSync and RootSync from projects/project_id/locations/global/memberships/asm-acm-tutorial
    [
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-sidecar-injection@main",
        "status": "SYNCED"
      }
    ]
    

    status: SYNCED 대신 status: RECONCILING이 표시되면 몇 분 기다렸다가 다시 gcloud alpha anthos config sync repo describe를 실행합니다.

  3. Constraints가 생성되었는지 확인합니다.

    kubectl get constraints
    

    Policy Controller가 이러한 제약조건을 평가하는 데 몇 분 정도 걸릴 수 있습니다. TOTAL-VIOLATIONS 열에 값이 표시되지 않으면 기다렸다가 kubectl get constraints를 다시 실행합니다.

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

    NAME                                                                                       ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    podsidecarinjectionannotation.constraints.gatekeeper.sh/pod-sidecar-injection-annotation   deny                 0
    
    NAME                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label   deny                 0
    

    NamespacesPods를 올바르게 설정했으므로 이러한 Constraints에 대한 0TOTAL-VIOLATIONS입니다.

  4. 작동 중인 이러한 Constraints를 보려면 label이나 annotation이 없는 클러스터에 Namespace를 생성해 보십시오.

    kubectl create namespace test
    

    출력은 다음 오류와 유사합니다.

    Error from server (Forbidden): admission webhook "validation.gatekeeper.sh" denied the request: [namespace-sidecar-injection-label] you must provide labels: {"istio-injection"}
    

트래픽 암호화 적용

이 섹션에서는 메시의 모든 트래픽이 암호화되도록 정책을 적용합니다.

  1. 트래픽 암호화를 시행하려면 제약조건을 적용하세요.

    다음 명령어는 sed를 사용하여 관련 리소스를 배포하는 구성 동기화를 가져오도록 acm-config.yaml 파일을 업데이트합니다.

    sed -i "s,root-sync/enforce-sidecar-injection,root-sync/enforce-strict-mtls,g" $WORK_DIR/acm-config.yaml
    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    위의 명령어는 다음 리소스를 배포합니다.

  2. RootSync의 구성 동기화 상태를 확인합니다.

    gcloud alpha anthos config sync repo describe \
        --sync-name root-sync \
        --sync-namespace config-management-system
    

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

    getting 1 RepoSync and RootSync from projects/project_id/locations/global/memberships/asm-acm-tutorial
    [
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-strict-mtls@main",
        "status": "SYNCED"
      }
    ]
    

    status: SYNCED 대신 status: RECONCILING이 표시되면 몇 분 기다렸다가 다시 gcloud alpha anthos config sync repo describe를 실행합니다.

  3. 다음 명령어를 실행하여 PeerAuthentication 위반에 대한 자세한 정보를 가져옵니다.

    kubectl get asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls -ojsonpath='{.status.violations}'  | jq
    

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

    [
      {
        "enforcementAction": "deny",
        "group": "constraints.gatekeeper.sh",
        "kind": "AsmPeerAuthnMeshStrictMtls",
        "message": "Root namespace <istio-system> does not have a strict mTLS PeerAuthentication",
        "name": "mesh-level-strict-mtls",
        "version": "v1beta1"
      }
    ]
    
  4. istio-systemPeerAuthentication을 배포하여 문제를 해결합니다. 메시의 모든 서비스에서 일반 텍스트 트래픽을 허용하지 않게 하려면 mTLS 모드를 STRICT로 설정하여 메시 전체 PeerAuthentication 정책을 설정합니다. 정책을 배포하면 워크로드가 서로 인증할 수 있도록 제어 영역에서 TLS 인증서를 자동으로 프로비저닝합니다.

    다음 명령어는 sed를 사용하여 관련 리소스를 배포하는 구성 동기화를 가져오도록 acm-config.yaml 파일을 업데이트합니다.

    sed -i "s,root-sync/enforce-strict-mtls,root-sync/fix-strict-mtls,g" $WORK_DIR/acm-config.yaml
    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    위의 명령어는 istio-system 네임스페이스에 다음 STRICT mTLS PeerAuthentication을 배포합니다. 이렇게 하면 전체 메시에 mTLS STRICT가 적용됩니다.

    apiVersion: security.istio.io/v1beta1
    kind: PeerAuthentication
    metadata:
      name: default
    spec:
      mtls:
        mode: STRICT
  5. RootSync의 구성 동기화 상태를 확인합니다.

    gcloud alpha anthos config sync repo describe \
        --sync-name root-sync \
        --sync-namespace config-management-system
    

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

    getting 1 RepoSync and RootSync from projects/project_id/locations/global/memberships/asm-acm-tutorial
    [
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/fix-strict-mtls@main",
        "status": "SYNCED"
      }
    ]
    

    status: SYNCED 대신 status: RECONCILING이 표시되면 몇 분 기다렸다가 다시 gcloud alpha anthos config sync repo describe를 실행합니다.

  6. Constraints가 생성되었는지 확인합니다.

    kubectl get constraints
    

    Policy Controller에서 이러한 Constraints를 평가하는 데 몇 분이 걸릴 수 있습니다. 각 행의 TOTAL-VIOLATIONS 열 아래에 값이 표시될 때까지 기다렸다가 이 kubectl get constraints 명령어를 다시 실행합니다.

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

    NAME                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label   deny                 0
    NAME                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls   deny                 0
    NAME                                                                               ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    destinationruletlsenabled.constraints.gatekeeper.sh/destination-rule-tls-enabled   deny                 0
    NAME                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/peerauthentication-strict-mtls   deny                 0
    NAME                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmsidecarinjection.constraints.gatekeeper.sh/pod-sidecar-injection-annotation   deny                 0
    

세밀한 액세스 제어 적용

이 섹션에서는 메시의 모든 워크로드에 세분화된 액세스 제어가 포함되도록 정책을 적용합니다.

  1. 세분화된 액세스 제어를 적용하려면 제약조건을 적용하세요.

    다음 명령어는 sed를 사용하여 관련 리소스를 배포하는 구성 동기화를 가져오도록 acm-config.yaml 파일을 업데이트합니다.

    sed -i "s,root-sync/fix-strict-mtls,root-sync/enforce-authorization-policies,g" $WORK_DIR/acm-config.yaml
    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    위의 명령어는 다음 리소스를 배포합니다.

  2. RootSync의 구성 동기화 상태를 확인합니다.

    gcloud alpha anthos config sync repo describe \
        --sync-name root-sync \
        --sync-namespace config-management-system
    

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

    getting 1 RepoSync and RootSync from projects/project_id/locations/global/memberships/asm-acm-tutorial
    [
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/enforce-authorization-policies@main",
        "status": "SYNCED"
      }
    ]
    

    status: SYNCED 대신 status: RECONCILING이 표시되면 몇 분 기다렸다가 다시 gcloud alpha anthos config sync repo describe를 실행합니다.

  3. 다음 명령어를 실행하여 관련된 위반에 대한 자세한 정보를 가져옵니다.

    kubectl get asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/default-deny-authorization-policies -ojsonpath='{.status.violations}'  | jq
    

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

    [
      {
        "enforcementAction": "deny",
        "group": "constraints.gatekeeper.sh",
        "kind": "AsmAuthzPolicyDefaultDeny",
        "message": "Root namespace <istio-system> does not have a default deny AuthorizationPolicy",
        "name": "default-deny-authorization-policies",
        "version": "v1beta1"
      }
    ]
    
  4. istio-system 네임스페이스에 AuthorizationPolicy를 배포하여 문제를 해결합니다.

    다음 명령어는 sed를 사용하여 관련 리소스를 배포하는 구성 동기화를 가져오도록 acm-config.yaml 파일을 업데이트합니다.

    sed -i "s,root-sync/enforce-authorization-policies,root-sync/fix-default-deny-authorization-policy,g" $WORK_DIR/acm-config.yaml
    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    위의 명령어는 istio-system 네임스페이스에 다음과 같은 모두 거부 AuthorizationPolicy를 배포합니다.

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: deny-all
    spec:
      {}
  5. RootSync의 구성 동기화 상태를 확인합니다.

    gcloud alpha anthos config sync repo describe \
        --sync-name root-sync \
        --sync-namespace config-management-system
    

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

    getting 1 RepoSync and RootSync from projects/project_id/locations/global/memberships/asm-acm-tutorial
    [
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/fix-default-deny-authorization-policy@main",
        "status": "SYNCED"
      }
    ]
    

    status: SYNCED 대신 status: RECONCILING이 표시되면 몇 분 기다렸다가 다시 gcloud alpha anthos config sync repo describe를 실행합니다.

  6. Constraints가 생성되었는지 확인합니다.

    kubectl get constraints
    

    Policy Controller에서 이러한 Constraints를 평가하는 데 몇 분이 걸릴 수 있습니다. 각 행의 TOTAL-VIOLATIONS 열 아래에 값이 표시될 때까지 기다렸다가 이 kubectl get constraints 명령어를 다시 실행합니다.

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

    NAME                                                                             ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmsidecarinjection.constraints.gatekeeper.sh/pod-sidecar-injection-annotation   deny                 0
    NAME                                                                            ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    k8srequiredlabels.constraints.gatekeeper.sh/namespace-sidecar-injection-label   deny                 0
    NAME                                                                                      ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmauthzpolicydefaultdeny.constraints.gatekeeper.sh/default-deny-authorization-policies   deny                 0
    NAME                                                                          ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnmeshstrictmtls.constraints.gatekeeper.sh/mesh-level-strict-mtls   deny                 0
    NAME                                                                               ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    destinationruletlsenabled.constraints.gatekeeper.sh/destination-rule-tls-enabled   deny                 0
    NAME                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmpeerauthnstrictmtls.constraints.gatekeeper.sh/peerauthentication-strict-mtls   deny                 0
    NAME                                                                                              ENFORCEMENT-ACTION   TOTAL-VIOLATIONS
    asmauthzpolicyenforcesourceprincipals.constraints.gatekeeper.sh/authz-source-principals-not-all   deny                 0
    
  7. 브라우저에서 Online Boutique 앱으로 이동합니다.

    echo http://${EXTERNAL_IP}
    

    기본 거부 AuthorizationPolicy가 전체 메시에 적용될지 확인하는 RBAC: access denied 오류가 표시됩니다.

  8. asm-ingressonlineboutique 네임스페이스에 더 세분화된 AuthorizationPolicies를 배포하여 이 문제를 해결합니다.

    다음 명령어는 sed를 사용하여 관련 리소스를 배포하는 구성 동기화를 가져오도록 acm-config.yaml 파일을 업데이트합니다.

    sed -i "s,root-sync/fix-default-deny-authorization-policy,root-sync/deploy-authorization-policies,g" $WORK_DIR/acm-config.yaml
    gcloud beta container fleet config-management apply \
        --membership ${CLUSTER} \
        --config $WORK_DIR/acm-config.yaml
    

    위의 명령어는 다음 리소스를 배포합니다.

  9. RootSync 및 두 개의 RepoSyncs에 대한 구성 동기화 상태를 확인합니다.

    gcloud alpha anthos config sync repo describe
    

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

    getting 3 RepoSync and RootSync from projects/project_id/locations/global/memberships/asm-acm-tutorial
    [
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/root-sync/deploy-authorization-policies@main",
        "status": "SYNCED"
      },
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/ingress-gateway/authorization-policies@main",
        "status": "SYNCED"
      },
      {
        "clusters": [
          "projects/project_id/locations/global/memberships/asm-acm-tutorial"
        ],
        "commit": "7d15d49af13c44aa531a4565b2277ddcf8b81884",
        "errors": [],
        "source": "https://github.com/GoogleCloudPlatform/anthos-config-management-samples//asm-acm-tutorial/online-boutique/authorization-policies@main",
        "status": "SYNCED"
      }
    ]
    

    status: SYNCED 대신 status: RECONCILING이 표시되면 몇 분 기다렸다가 다시 gcloud alpha anthos config sync repo describe를 실행합니다.

    하나의 저장소 정보만 보려면 --sync-name--sync-namespace 플래그를 사용할 수 있습니다. 관리형 리소스를 자세히 보려면 --managed-resources 플래그를 추가하면 됩니다. 자세한 내용은 여러 클러스터에서 구성 동기화 상태 보기를 참조하세요.

  10. 브라우저에서 다시 Online Boutique 앱으로 이동합니다.

    echo http://${EXTERNAL_IP}
    

    몇 분 기다리면 웹사이트가 정상적으로 다시 작동합니다.

Anthos 보안 기능 상태 보기

Google Cloud Console에서 인증 정책과 승인 정책을 포함한 Anthos 보안 기능의 상태를 볼 수 있습니다.

  1. Google Cloud Console에서 Anthos 보안 페이지로 이동합니다.

    Anthos 보안으로 이동

    정책 요약에는 서비스 액세스 제어(AuthorizationPolicies) 및 mTLS를 포함한 애플리케이션 보안 상태가 표시됩니다.

  2. 정책 감사를 클릭하여 클러스터 및 두 네임스페이스(asm-ingressonlineboutique)의 워크로드 정책 상태를 확인합니다.

    서비스 액세스 제어mTLS 상태 카드는 개략적인 개요를 제공합니다.

    서비스 액세스 제어 및 mTLS 상태의 개략적인 개요

    워크로드 목록에는 각 워크로드의 서비스 액세스 제어 및 mTLS 상태가 표시됩니다.

    각 워크로드와 서비스 액세스 제어, mTLS 상태의 세부정보 목록

이제 정책 컨트롤러 및 구성 동기화로 클러스터와 메시를 보호했습니다.

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

    클라우드 프로젝트를 삭제합니다.

    gcloud projects delete PROJECT_ID

개별 리소스 삭제

개별 리소스를 삭제하려면 다음 안내를 따르세요.

  1. Fleet에서 클러스터를 등록 취소합니다.

    gcloud container fleet memberships unregister ${CLUSTER} \
        --project=${PROJECT_ID} \
        --gke-cluster=${CLUSTER_ZONE}/${CLUSTER}
    

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

    kubeconfig entry generated for asm-acm-tutorial.
    Waiting for membership to be deleted...done.
    Deleting membership CR in the cluster...done.
    Deleting namespace [gke-connect] in the cluster...done.
    
  2. 클러스터를 삭제합니다.

    gcloud container clusters delete ${CLUSTER} \
        --zone ${CLUSTER_ZONE}
    

    메시지가 표시되면 y를 누릅니다. 이 명령어를 완료하는 데 약 5분이 걸릴 수 있습니다.

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

    Deleting cluster asm-acm-tutorial...done.
    Deleted [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/us-east4-a/clusters/asm-acm-tutorial].
    
  3. 생성된 파일을 삭제합니다.

    rm -r $WORK_DIR
    

다음 단계