このページでは、アンビエント ネットワーキングで認可ポリシーを作成する方法について説明します。
前提条件
このドキュメントの手順を完了するには、次の条件を満たしている必要があります。
- Cloud Service Mesh アンビエント ネットワーキングが有効になっている実行中の GKE クラスタ。
- サンプル クライアントとサーバーのワークロードがデプロイされたアンビエント ネットワーキングに登録された名前空間(
ambient-testなど)。 GCPServerTLSPolicy(mtlsMode: Strictを含む)とGCPClientTLSPolicyを使用して、クライアントとサーバーのワークロード間で相互 TLS(mTLS)を有効にします。CLIENT_CERT_URI_SANに一致する ID ベースのGCPAuthzPolicyルールでは、クライアントの SPIFFE ID を抽出するためにアクティブな mTLS が必要です。
環境設定の詳細については、GKE アンビエント ネットワーキングを準備するをご覧ください。
デフォルトで拒否のポリシー
デフォルトでは、GKE Ambient Authorization Policy API は、ポリシーで制限されていない限り、すべてのトラフィックを許可します。これは、標準の Kubernetes NetworkPolicy の動作と一致します。
DENY_BY_DEFAULT アクションを使用すると、このデフォルトの動作を変更できます。Namespace に適用すると、このポリシーは、ALLOW ポリシーで明示的に許可されていない限り、その Namespace 内のワークロードへのすべてのトラフィックをブロックします。
このページでは、Cloud Service Mesh で DENY_BY_DEFAULT を構成して使用し、ワークロードのデフォルトで安全な状態を確立する方法について説明します。
制限事項
DENY_BY_DEFAULT ポリシーを適用する前に、次の制限事項に注意してください。
- Namespace ごとに作成できる
DENY_BY_DEFAULTポリシーは 1 つのみです。 DENY_BY_DEFAULTアクションを含むポリシーには、ルールを定義できません。- このアクションを使用して、すべての Pod をターゲットとする Namespace 全体のベースライン
matchLabels: {}を設定します。Pod ごとの制限にDENY_BY_DEFAULTを使用することはできません。
デフォルトで拒否の認可ポリシーを設定する
Namespace 全体でデフォルトで拒否のベースラインを確立し、特定のワークロードへのアクセスを選択的に許可する手順は次のとおりです。
アクションが
DENY_BY_DEFAULTに設定されたGCPAuthzPolicyを作成して、Namespace に適用します。cat <<EOF > deny-by-default-policy.yaml && kubectl apply -f deny-by-default-policy.yaml apiVersion: networking.gke.io/v1 kind: GCPAuthzPolicy metadata: name: deny-by-default-authz namespace: ambient-test spec: action: DENY_BY_DEFAULT enforcementLevel: L4 targetRefs: - group: "" kind: Pod selector: matchLabels: {} EOF出力は次のようになります。
gcpauthzpolicy.networking.gke.io/deny-by-default-authz createdこのポリシーは、デフォルトで
ambient-testNamespace 内のワークロードへのすべてのインバウンド(East-West と上り(内向き))トラフィックをブロックします。Namespace 内のワークロードから発信されるアウトバウンド トラフィックは制限されません。トラフィックを選択的に許可するには、
ALLOWポリシーを作成して適用します。cat <<EOF > allow-policy.yaml && kubectl apply -f allow-policy.yaml apiVersion: networking.gke.io/v1 kind: GCPAuthzPolicy metadata: name: allow-client-to-server namespace: ambient-test spec: action: ALLOW enforcementLevel: L4 targetRefs: - group: "" kind: Pod selector: matchLabels: app: server rules: - from: sources: - principals: - principalSelector: CLIENT_CERT_URI_SAN principal: type: Exact value: spiffe://PROJECT_ID.s3ns.svc.id.goog/ns/ambient-test/sa/client EOFPROJECT_ID は、実際のプロジェクト ID に置き換えます。
ポリシーの伝播には、コントローラの承認後、最大 3 分かかることがあります。3 分待ってから次の手順に進みます。
クライアントからサーバーへの接続をテストします。
ALLOWポリシーと一致するため、成功します。kubectl exec -it deploy/client -n ambient-test -- /bin/curl -fsLS server.ambient-test.svc.cluster.localサーバーからサーバー自体(または明示的な許可ポリシーのない他のワークロード)への接続をテストします。
DENY_BY_DEFAULTポリシーのため、失敗するはずです。kubectl exec -it deploy/server -n ambient-test -- /bin/curl -fsLS server.ambient-test.svc.cluster.local出力は次のようになります。
curl: (52) Empty reply from server.
ロギング
認可ポリシーによってリクエストが拒否されると、GKE Ambient Proxy アクセスログの JSON ペイロードに次のフィールドが含まれます。
jsonPayload.error_details:- rbac_access_denied_matched_policy[none]に設定します。
Cloud de Confiance コンソールのログ エクスプローラを使用して、拒否された接続のアクセスログエントリを表示できます。トラフィックが認証され、承認されていることを確認するをご覧ください。
下り(外向き)セキュリティ ポリシー
アンビエント ネットワーキング ワークロードから外部エンドポイントまたはインターネットへの送信トラフィックを検査して制御するには、Secure Web Proxy(SWP)を介して下り(外向き)トラフィックをルーティングします。
GCPBackend リソースと GCPEgressRouting リソースの構成手順については、Secure Web Proxy を介してアンビエント下り(外向き)トラフィックを転送するをご覧ください。