バージョン 1.14

Anthos Service Mesh と Anthos Config Management を使用してアプリのセキュリティを強化する

このチュートリアルでは、クラスタとアプリのセキュリティ体制を改善する方法について説明します。ご自身が信頼性の高いサービス メッシュのモニタリングと管理に役立つ一連のツール Anthos Service Mesh を使用してオンライン ストア用のアプリを管理している組織のプラットフォーム管理者であると想定してください。メッシュとアプリを保護するのは、ご自身の責任です。

構成ミスを防止し、Anthos Service Mesh ポリシーを自動的に検証するには、Anthos Config ManagementPolicy ControllerConfig Sync を使用します。Policy Controller を使用すると、クラスタに対して完全にプログラム可能なポリシーを適用できます。Policy Controller には、メッシュのセキュリティ脆弱性とベスト プラクティスのコンプライアンスを監査するために、Anthos Service Mesh のセキュリティ バンドルと併用できる制約テンプレートのデフォルト ライブラリが付属しています。Config Sync は、中央の Kubernetes 宣言型構成ファイルを使用してクラスタの状態を継続的に調整します。Policy Controller と Config Sync を併用すると、Anthos Service Mesh ポリシーの構成に制約を継続的に適用できます。

次の図は、Anthos Service Mesh、Policy Controller、Config Sync が連携して、このチュートリアルで使用する Online Boutique サンプルアプリを管理し保護する方法を示しています。

このチュートリアル用に作成するアーキテクチャを示す図

目標

  • Google Kubernetes Engine(GKE)クラスタを作成し、そのクラスタをフリートに登録する。
  • Policy Controller、Config Sync、Anthos Service Mesh をクラスタにインストールする。
  • Online Boutique のサンプルアプリと Ingress ゲートウェイをデプロイする。
  • 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、Policy Controller、Config Sync をインストールできるよう環境を準備します。

  1. Cloud Shell セッションを開きます。このセッションを開くには、このページの右上隅にある Cloud Shell をアクティブにする」をクリックし、[確認] をクリックします。ページの下部にあるフレーム内で 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 \
        container.googleapis.com \
        gkehub.googleapis.com \
        mesh.googleapis.com \
        anthos.googleapis.com
    

    このオペレーションは、完了までに 1 分以上かかることがあります。

GKE クラスタの設定

このセクションでは、GKE クラスタを作成してフリートに登録します。フリートとは、複数のクラスタと他のリソースを論理的に編成するための Google Cloud のコンセプトで、フリートを使用することによって、マルチクラスタ機能の使用と管理、複数のシステム間での一貫したポリシーの適用が可能になります。

このセクションで作成するクラスタは、Anthos Service Mesh、Policy Controller、Config Sync をインストールするクラスタです。また、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. クラスタをフリートに登録します。

    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 ファイルを更新し、各ステップに必要なマニフェストをデプロイします。1 つのファイルを更新すると、ファイルを繰り返し操作して git add|commit|push コマンドを実行することなく、クラスタ、メッシュ、アプリケーションを保護するコンセプトとフローに注力できます。

acm-config.yaml マニフェストを適用する前に、リポジトリの全体的な構造と内容を理解しておくと便利です。

Config Sync の機能を使用して複数のリポジトリと同期する場合、asc-acm-tutorial リポジトリには、2 つの最上位のフォルダ、root-synconline-boutique が含まれます。

root-sync フォルダ

root-sync フォルダは、ルート リポジトリです。このリポジトリは複数のサブフォルダに分割されており、各サブフォルダにはこのチュートリアルの別の部分のリソースとポリシーが格納されています。

Online Boutique サンプルアプリと Ingress ゲートウェイを設定するためのリソースが格納されたフォルダが 2 つあります。

  • init: Online Boutique アプリに RepoSync を設定するためのリソース。
  • deployments: Ingress ゲートウェイと Online Boutique の名前空間とアプリをデプロイするためのリソース。

異なる Anthos Service Mesh ポリシーをデプロイするためのリソースを含むフォルダが 3 つあります。

  • enforce-sidecar-injection: NamespacePod にサイドカー インジェクションを適用するためのポリシーをデプロイするためのリソース。
  • enforce-strict-mtls: ポリシーをデプロイして、メッシュ全体と任意の PeerAuthenticationSTRICT mTLS を適用するためのリソース。
  • enforce-authorization-policies: ポリシーをデプロイして、メッシュ全体にデフォルトの deny AuthorizationPolicy を適用し、あらゆる AuthorizationPolicies に粒度の高いソース プリンシパルを適用するためのリソース。

残りの 3 つのフォルダには、Anthos Service Mesh ポリシー違反を修正するリソースをデプロイするためのリソースが格納されています。

  • fix-strict-mtls: デフォルトの STRICT mTLS PeerAuthenticationistio-system 名前空間にデプロイするためのリソース。
  • fix-default-deny-authorization-policy: デフォルトの deny AuthorizationPolicyistio-system 名前空間にデプロイするリソース。
  • deploy-authorization-policies: Online Boutique のサンプルアプリを機能させるため、粒度の高い AuthorizationPolicy リソースをデプロイするリソース。

online-boutique フォルダ

online-boutique フォルダは名前空間リポジトリです。このリポジトリには、Kustomize を使用して Online Boutique サンプルアプリをデプロイするために必要なリソースが含まれています。

Policy Controller、Config Sync、マネージド Anthos Service Mesh をインストールする

クラスタを作成して登録したら、Config Sync、Policy Controller、Anthos Service Mesh をクラスタにインストールし、asc-acm-tutorial フォルダの構成ファイルから同期するようにクラスタを構成できます。

  1. フリートで Anthos Config Management を有効にします。

    gcloud beta container fleet config-management enable
    
  2. フリートで Anthos Service Mesh を有効にします。

    gcloud container fleet mesh enable
    
  3. Anthos Service Mesh の自動コントロール プレーン管理を有効にして、マネージド Anthos Service Mesh の推奨構成を Google が適用できるようにします。

    gcloud container fleet mesh update \
        --control-plane automatic \
        --memberships ${CLUSTER}
    
  4. Config Sync と Policy Controller をインストールして構成するには、次の 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 apply spec フィールドをご覧ください。

  5. ファイルを適用します。

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

    このファイルを適用すると、Policy Controller と Config Sync がクラスタにインストールされます。次に、Config Sync は asm-acm-tutorial フォルダ内のすべての構成ファイルをクラスタと同期し始めます。これらの構成ファイルにより、次の主要コンポーネントがインストールされ、構成されます。

    • Online Boutique アプリを構成する RepoSync オブジェクトが同期されます。

      apiVersion: configsync.gke.io/v1beta1
      kind: RepoSync
      metadata:
        name: repo-sync
      spec:
        sourceFormat: unstructured
        git:
          repo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples
          revision: HEAD
          branch: main
          dir: asm-acm-tutorial/online-boutique/init
          auth: none
    • Istio リソースを作成するには RepoSync リコンサイラに追加の権限が必要なため、リポジトリには、これらの権限を付与するためのクラスタロールとクラスタ ロール バインディングも含まれています。これは、クラスタに自動的に適用されるクラスタロールのマニフェストです。

      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        labels:
          rbac.authorization.k8s.io/aggregate-to-edit: "true"
        name: custom:aggregate-to-edit:istio
      rules:
      - apiGroups:
        - "networking.istio.io"
        - "security.istio.io"
        resources:
        - "virtualservices"
        - "authorizationpolicies"
        verbs:
        - "*"
  6. Policy Controller と Config Sync が正常にインストールされているかを確認するには、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-05-05T23:33:44.041608250Z'
    membershipSpecs:
      projects/841604900168/locations/global/memberships/asm-acm-tutorial:
        mesh:
          controlPlane: AUTOMATIC
    membershipStates:
      projects/841604900168/locations/global/memberships/asm-acm-tutorial:
        servicemesh:
          controlPlaneManagement:
            details:
            - code: REVISION_READY
              details: 'Ready: asm-managed'
            state: ACTIVE
        state:
          code: OK
          description: 'Revision(s) ready for use: asm-managed.'
          updateTime: '2022-05-05T23:45:38.800808838Z'
    name: projects/PROJECT_ID/locations/global/features/servicemesh
    resourceState:
      state: ACTIVE
    spec: {}
    state:
      state: {}
    updateTime: '2022-05-05T23:45:44.848011023Z'
    

    state.code: OK ではなく state.code: ERROR が表示された場合は、数分待ってから gcloud container fleet mesh describe を再度実行します。チュートリアルに進む前に、servicemesh.controlPlaneManagement.details[].code フィールドの値が REVISION_READY であるかを確認する必要があります。

Ingress ゲートウェイとサンプル アプリケーションをデプロイする

このセクションでは、Online Boutique サンプル アプリケーションIngress ゲートウェイをデプロイして、上り(内向き)トラフィックを管理します。

  1. Online Boutique のサンプル アプリケーションと Ingress ゲートウェイをデプロイします。

    次のコマンドは、sed を使用して acm-config.yaml マニフェストを更新し、Ingress ゲートウェイとサンプルアプリのデプロイに必要なリソースを Config Sync がデプロイするようにします。

    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 の Config Sync ステータスを表示します。

    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/deployments@main",
        "status": "SYNCED"
      }
    ]
    

    status: SYNCED ではなく status: RECONCILING が表示された場合は、数分待ってから gcloud alpha anthos config sync repo describe を再度実行します。

    マネージド リソースを表示するには、--managed-resources フラグを追加します。詳細については、複数のクラスタの Config Sync のステータスを表示するをご覧ください。

  3. RepoSync の Config Sync ステータスを表示します。

    gcloud alpha anthos config sync repo describe \
        --sync-name repo-sync \
        --sync-namespace onlineboutique
    

    出力は次のようになります。

    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//online-boutique/deployments@main:HEAD",
        "status": "SYNCED"
      }
    ]
    

    status: SYNCED ではなく status: RECONCILING が表示された場合は、数分待ってから gcloud alpha anthos config sync repo describe を再度実行します。

  4. Ingress ゲートウェイのパブリック IP アドレスがプロビジョニングされるまで待ちます。

    until kubectl -n asm-ingress get svc asm-ingressgateway -o jsonpath='{.status.loadBalancer}' | grep "ingress"; do : ; done
    
  5. Ingress ゲートウェイのパブリック IP アドレスを取得します。

    EXTERNAL_IP=$(kubectl get svc asm-ingressgateway -n asm-ingress -o jsonpath="{.status.loadBalancer.ingress[*].ip}")
    
  6. ブラウザから IP アドレスにアクセスし、Online Boutique アプリが正常にデプロイされたことを確認します。

    echo http://${EXTERNAL_IP}
    

ポリシーを適用してメッシュを保護する

次のセクションでは、Policy Controller を活用し、制約を作成して Anthos Service Mesh ポリシー バンドルのポリシーを適用します。

サイドカー プロキシのインジェクションを適用する

このセクションでは、ポリシーを適用して、メッシュ内のすべてのワークロードで自動サイドカー インジェクションが有効になっていることを確認します。

  1. サイドカー プロキシ インジェクションを適用するには、制約を適用します。

    次のコマンドは、sed を使用して acm-config.yaml ファイルを更新し、Config Sync が関連リソースのデプロイを開始するようにします。

    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 の Config Sync ステータスを表示します。

    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 には 0 TOTAL-VIOLATIONS があります。

  4. これらの Constraints を有効にするには、labelannotation のどちらも指定せずにクラスタに 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 ファイルを更新し、Config Sync が関連リソースのデプロイを開始するようにします。

    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 の Config Sync ステータスを表示します。

    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",
        "kind": "AsmPeerAuthnMeshStrictMtls",
        "message": "Root namespace <istio-system> does not have a strict mTLS PeerAuthentication",
        "name": "mesh-level-strict-mtls"
      }
    ]
    
  4. PeerAuthenticationistio-system にデプロイして、問題を修正します。メッシュ内のすべてのサービスが平文トラフィックを受け入れるのを防ぐには、mTLS モードを STRICT に設定してメッシュ全体の PeerAuthentication ポリシーを設定します。ポリシーをデプロイすると、コントロール プレーンが TLS 証明書を自動的にプロビジョニングし、ワークロードの相互認証を可能にします。

    次のコマンドは、sed を使用して acm-config.yaml ファイルを更新し、Config Sync が関連リソースのデプロイを開始するようにします。

    sed -i "s,root-sync/enforce-strict-mtls,root-sync/fix-strict-mtls,g" $WORK_DIR/acm-config.yaml
    gcloud beta container hub 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 の Config Sync ステータスを表示します。

    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 ファイルを更新し、Config Sync が関連リソースのデプロイを開始するようにします。

    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 の Config Sync ステータスを表示します。

    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",
        "kind": "AsmAuthzPolicyDefaultDeny",
        "message": "Root namespace <istio-system> does not have a default deny AuthorizationPolicy",
        "name": "default-deny-authorization-policies"
      }
    ]
    
  4. AuthorizationPolicyistio-system 名前空間にデプロイして、問題を修正します。

    次のコマンドは、sed を使用して acm-config.yaml ファイルを更新し、Config Sync が関連リソースのデプロイを開始するようにします。

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

    上記のコマンドは、istio-system 名前空間に次の deny-all AuthorizationPolicy を適用します。

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
      name: deny-all
    spec:
      {}
  5. RootSync の Config Sync ステータスを表示します。

    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}
    

    エラー RBAC: access denied が表示されます。これは、デフォルトの deny AuthorizationPolicy がメッシュ全体に適用されていることを示します。

  8. この問題を修正するには、asm-ingressonlineboutique の名前空間に、よりきめ細かな AuthorizationPolicies をデプロイします。

    次のコマンドは、sed を使用して acm-config.yaml ファイルを更新し、Config Sync が関連リソースのデプロイを開始するようにします。

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

    上述のコマンドは次のリソースを適用します。

  9. RootSync の Config Sync ステータスを表示します。

    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 を再度実行します。

  10. RepoSync の Config Sync ステータスを表示します。

    gcloud alpha anthos config sync repo describe \
        --sync-name repo-sync \
        --sync-namespace onlineboutique
    

    出力は次のようになります。

    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/online-boutique/authorization-policies@main",
        "status": "SYNCED"
      }
    ]
    

    status: SYNCED ではなく status: RECONCILING が表示された場合は、数分待ってから gcloud alpha anthos config sync repo describe を再度実行します。

  11. ブラウザから Online Boutique アプリに再度アクセスします。

    echo http://${EXTERNAL_IP}
    

    数分待ってから、ウェブサイトが期待どおりに動作することを再度確認します。

Anthos のセキュリティ機能のステータスを表示する

認証や認可ポリシーなどの Anthos セキュリティ機能のステータスは、Google Cloud コンソールで確認できます。

  1. コンソールで、Anthos の [セキュリティ] ページに移動します。

    Anthos の [セキュリティ] に移動

    [ポリシーの概要] には、サービスのアクセス制御(AuthorizationPolicies)や mTLS などのアプリケーション セキュリティのステータスが表示されます。

  2. [ポリシーの監査] をクリックして、クラスタと両方の名前空間(asm-ingressonlineboutique)のワークロード ポリシーのステータスを表示します。

    サービスのアクセス制御カードと mTLS ステータス カードには、概要が記載されています。

    サービス アクセス制御と mTLS ステータスの概要

    [ワークロード] リストに、各ワークロードのサービスのアクセス制御と mTLS ステータスが表示されます。

    各ワークロードとそのサービスのアクセス制御、mTLS ステータスの詳細なリスト

これで、Policy Controller と Config Sync を使用してクラスタとメッシュを保護できました。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

  1. コンソールで [リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

リソースを個別に削除する

個々のリソースを削除するには:

  1. クラスタをフリートから登録解除します。

    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
    

次のステップ