ゼロトラストとは、ネットワーク境界の内外を問わず、暗黙の信頼が存在しないことを意味します。Alibaba Cloud Service Mesh (ASM) は、クラウドネイティブのゼロトラストを実装するための主要なプラットフォームです。ID 認証と権限付与をアプリケーションコードから ASM に移行します。これにより、動的で更新が容易な、すぐに使える機能が提供されます。新しいポリシーは即座に有効になります。このトピックでは、ASM でゼロトラストシステムを使用する理由と方法について説明します。
背景情報
マイクロサービスは、スケーラビリティ、アジリティ、独立したスケーリング、ビジネスロジックの分離、独立したライフサイクル管理、分散開発の容易さなど、多くの利点を提供します。しかし、マイクロサービスの分散型の性質は、セキュリティ上の課題も増大させます。各マイクロサービスは潜在的な攻撃対象です。Kubernetes は、マイクロサービスをホストし、オーケストレーションするための優れたプラットフォームを提供します。しかし、デフォルトでは、マイクロサービス間のすべてのやり取りは安全ではありません。プレーンテキストの HTTP を介して通信するため、十分に安全ではありません。セキュリティをネットワーク境界のみに依存するだけでは不十分です。内部サービスが侵害された場合、攻撃者はそのマシンを使用して内部ネットワークを攻撃できます。したがって、内部呼び出しも安全でなければなりません。この原則が、ゼロトラストセキュリティの中核となる価値です。ゼロトラストは、あらゆる場所で明示的な認証を要求し、最小権限の原則を使用してリソースへのアクセスを制限します。
Service Mesh テクノロジーの重要な価値は、開発者の生産性を低下させることなく、アプリケーションの本番環境を効果的に保護できる能力にあります。Service Mesh テクノロジーは、マイクロサービスアーキテクチャにゼロトラストネットワークセキュリティモデルを採用するために必要な基盤を提供します。これは、すべてのアクセスに対する強力な ID 認証、コンテキストベースの権限付与、および包括的なモニタリングとロギングなどのセキュリティ目標を達成するのに役立ちます。これらのメッシュ機能を使用することで、メッシュ内のすべてのアプリケーションにセキュリティ制御を提供できます。たとえば、すべてのトラフィックが暗号化され、アプリケーションへのすべてのトラフィックがポリシー実行ポイント (PEP) によって検証されます。
レイヤー 3 ネットワークセキュリティ制御に Kubernetes ネットワークポリシーを使用することに加えて、ASM はポリシー制御機能を提供します。これらの機能には、ピア認証とリクエスト認証、および Istio 権限付与ポリシーが含まれます。Alibaba Cloud ASM が提供するゼロトラストセキュリティ機能は、ユーザーがこれらのセキュリティ目標を達成するのに役立ちます。
ASM 機能を構築するための理論的フレームワークには、次のコンポーネントが含まれます:
ワークロード ID: これはゼロトラストの基盤です。クラウドネイティブのワークロードに統一された ID を提供します。ASM は、Service Mesh 内の各ワークロードに使いやすい ID 定義を提供します。また、特定のシナリオ向けに ID システムを拡張するためのカスタムメカニズムも提供し、コミュニティの SPIFFE 標準と互換性があります。
セキュリティ証明書: これはゼロトラストのキャリアです。ASM は、証明書の発行、ライフサイクル管理、およびローテーションメカニズムを提供します。すべてのプロキシが使用する X.509 TLS 証明書を通じて ID を確立し、証明書と秘密鍵のローテーションを提供します。
ポリシー実行: これはゼロトラストのエンジンです。ポリシーベースの信頼エンジンは、ゼロトラストアーキテクチャを構築する中核です。ASM の Ambient モードは、Istio RBAC 権限付与ポリシーをサポートします。
可視化と分析: これはゼロトラストへの洞察を提供します。ASM は、ポリシー実行のログとメトリックを監視して各ポリシーのパフォーマンスを評価するための可観測性メカニズムを提供します。
ASM を使用してゼロトラストを実装する理由
アプリケーションコードに直接セキュリティメカニズムを構築する従来の方法と比較して、ASM アーキテクチャにはいくつかのセキュリティ上の利点があります:
Ztunnel プロキシのライフサイクルはアプリケーションから独立しているため、これらのプロキシの管理が容易になります。
動的な構成が可能です。アプリケーションを再デプロイすることなく、ポリシーを簡単に更新でき、変更は即座に有効になります。
ASM の集中管理アーキテクチャにより、企業のセキュリティチームは組織全体のセキュリティポリシーを構築、管理、およびデプロイできます。これにより、開発者が構築したビジネスアプリケーションがデフォルトで保護されます。開発者は、追加の作業なしでこれらのセキュリティポリシーをすぐに使用できます。
ASM は、JWT などのリクエストに添付されたエンドユーザーの資格情報を認証する機能を提供します。
ASM アーキテクチャを使用すると、ID 認証および権限付与システムをメッシュ内のサービスとしてデプロイできます。メッシュ内の他のサービスと同様に、これらのセキュリティシステムもメッシュからセキュリティ保証を受けます。これらの保証には、転送中の暗号化、ID 認識、ポリシー実行ポイント、およびエンドユーザー資格情報の認証と権限付与が含まれます。
ASM を使用すると、単一のコントロールプレーンを使用して、堅牢な ID とアクセスの管理、透過的な TLS と暗号化、ID 認証と権限付与、および監査ログを実装できます。ASM はこれらの機能をすぐに使える状態で提供します。簡単なインストールと管理により、開発者、システム管理者、およびセキュリティチームはマイクロサービスアプリケーションを保護できます。
ASM でゼロトラストシステムを使用する方法
ASM は、クラウドネイティブ環境での攻撃対象領域を減らし、ゼロトラストアプリケーションネットワークに必要な基本フレームワークを提供できます。ASM でサービス間のセキュリティを管理することにより、エンドツーエンドの暗号化、サービスレベルの ID 認証、およびきめ細かな権限付与ポリシーを確保できます。
ASM システムでは、次のことができます:
サービス間で双方向 TLS 認証またはサーバーサイド TLS 認証を実装します。自動証明書ローテーションなどのライフサイクル管理がサポートされています。メッシュ内のすべての通信は認証され、暗号化されます。
ID ベースのきめ細かな権限付与と、他のパラメーターに基づく権限付与を有効にします。ロールベースアクセス制御 (RBAC) に基づいて、「最小権限」のスタンスをサポートします。これは、許可されたサービスのみが ALLOW または DENY ルールに従って相互に通信できることを意味します。

現在、ASM はワークロード ID、ピア認証、リクエスト認証、および権限付与ポリシーの基本的なゼロトラストセキュリティ機能を提供しています。
ワークロード ID
アプリケーションが ASM 環境で実行されると、ASM は各サービスに一意の ID を提供します。この ID は、サービスが ASM で実行されている他のマイクロサービスに接続するときに使用されます。サービス ID は、サービス間のアクセスが許可されているかどうかを確認するために、サービス間の双方向検証に使用できます。サービス ID は、権限付与ポリシーでも使用できます。
ASM を使用して Kubernetes 上で実行されているワークロードを管理する場合、ASM は各ワークロードにサービス ID を提供します。この ID は、ワークロードのサービスアカウントトークンに基づいています。
ASM のサービス ID は SPIFFE 標準に準拠しており、次のフォーマットです: spiffe://<trust-domain>/ns/<namespace>/sa/<service-account>。
ASM コンソールにログインして、Kubernetes クラスターから接続されているサービスを表示できます。
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。
[ワークロード ID] ページの上部で、[データプレーン] をクラスター ID に設定し、[名前空間] を選択して、Kubernetes クラスターからサービスメッシュに接続されているサービスのワークロード ID を表示します。
ピア認証
ASM は、ピア認証とリクエスト認証の 2 種類の認証を提供します。ピア認証とは、2 つのマイクロサービスが対話するときに、ピアツーピアの ID 認証のために双方向 TLS を有効にできることを意味します。
リクエストのクライアントとサーバーの両方で Ambient モードが有効になっている場合、ASM ではデフォルトで mTLS 通信が有効になります。
クライアントのみが Ambient モードのクライアント Pod を持つ場合、サーバーはメッシュプロキシを持つかどうかに基づいて mTLS 通信を有効にするかどうかを決定します。
サーバーのみが Ambient モードを有効にしている場合、デフォルトの mTLS モードは PERMISSIVE であり、プレーンテキストと暗号化されたトラフィックの両方を受け入れます。サーバーに PeerAuthentication ポリシーを設定し、mTLS モードを STRICT に設定すると、リクエストは失敗します。
リクエスト認証
ASM は、ピア認証とリクエスト認証の 2 種類の認証を提供します。リクエスト認証により、エンドユーザーとシステムはマイクロサービスと対話できます。この操作は通常、JSON Web トークン (JWT) を使用して実行されます。
マイクロサービスがリクエストされると、リクエスト認証ポリシーを作成して、サービスへのリクエストに対して JWT 認証を実行できます。リクエスト認証は、JWT を含むリクエストに対して JWT 認証を実行します。有効な JWT を持つリクエストのみがサービスに正常にアクセスできます。リクエスト認証は、JWT を含まないリクエストに対して JWT 認証を実行しません。したがって、JWT を持たないリクエストは、制限なくサービスにアクセスできます。
権限付与ポリシーとリクエスト認証を併用することで、有効な JWT を持つリクエストのみがサービスにアクセスできるようにすることができます。無効な JWT を持つリクエストや JWT を持たないリクエストは失敗します。次の例では、アプリケーションが存在する名前空間で Waypoint を有効にする必要があります。
リクエストされた bookinfo アプリケーションをデプロイします。詳細については、「サンプルアプリケーションをデプロイし、暗号化通信のために Ambient モードを有効にする」をご参照ください。
リクエストを送信する sleep アプリケーションをデプロイします。
ACK クラスターに対応する kubeconfig 環境で、sleep.yaml ファイルを作成します。
次のコマンドを実行して、sleep アプリケーションをデプロイします。
kubectl apply -f sleep.yaml -n default
リクエスト認証ポリシーを作成して、details サービスへのインバウンドリクエストに JWT 認証を適用します。
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。表示されたページで、[作成] をクリックします。
作成ページで、次の情報を設定して details ワークロードの JWT ルールを定義し、[作成] をクリックします。

次のリストは、設定項目の一部を説明しています:
issuer: JWT の発行者。この例では testing@secure.istio.io に設定します。
audiences: JWT オーディエンスのリスト。このフィールドは、どのサービスが JWT を使用して宛先サービスにアクセスできるかを指定します。この例では空のままにしており、アクセスするサービスに制限がないことを意味します。
jwks: JWT リクエスト情報。この例では、JWT リクエスト情報を次のように設定します。詳細については、「jwks.json」をご参照ください。
{ "keys":[ {"e":"AQAB","kid":"DHFbpoIUqrY8t2zpA2qXfCmr5VO5ZEr4RzHU_-envvQ","kty":"RSA","n":"xAE7eB6qugXyCAG3yhh7pkDkT65pHymX-P7KfIupjf59vsdo91bSP9C8H07pSAGQO1MV_xFj9VswgsCg4R6otmg5PV2He95lZdHtOcU5DXIg_pbhLdKXbi66GlVeK6ABZOUW3WYtnNHD-91gVuoeJT_DwtGGcp4ignkgXfkiEm4sw-4sfb4qdt5oLbyVpmW6x9cfa7vs2WTfURiCrBoUqgBo_-4WTiULmmHSGZHOjzwa8WtrtOQGsAFjIbno85jp6MnGGGZPYZbDAa_b3y5u-YpW7ypZrvD8BgtKVjgtQgZhLAGezMt0ua3DRrWnKqTZ0BJ_EyxOGuHJrLsn00fnMQ"}]}
JWT ツールを使用して、JWT リクエスト情報を JWT にエンコードします。
{ "keys":[ {"e":"AQAB","kid":"DHFbpoIUqrY8t2zpA2qXfCmr5VO5ZEr4RzHU_-envvQ","kty":"RSA","n":"xAE7eB6qugXyCAG3yhh7pkDkT65pHymX-P7KfIupjf59vsdo91bSP9C8H07pSAGQO1MV_xFj9VswgsCg4R6otmg5PV2He95lZdHtOcU5DXIg_pbhLdKXbi66GlVeK6ABZOUW3WYtnNHD-91gVuoeJT_DwtGGcp4ignkgXfkiEm4sw-4sfb4qdt5oLbyVpmW6x9cfa7vs2WTfURiCrBoUqgBo_-4WTiULmmHSGZHOjzwa8WtrtOQGsAFjIbno85jp6MnGGGZPYZbDAa_b3y5u-YpW7ypZrvD8BgtKVjgtQgZhLAGezMt0ua3DRrWnKqTZ0BJ_EyxOGuHJrLsn00fnMQ"}]}エンコードされたトークンは次のようになります:
eyJhbGciOiJSUzI1NiIsImtpZCI6IkRIRmJwb0lVcXJZOHQyenBBMnFYZkNtcjVWTzVaRXI0UnpIVV8tZW52dlEiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjQ2ODU5ODk3MDAsImZvbyI6ImJhciIsImlhdCI6MTUzMjM4OTcwMCwiaXNzIjoidGVzdGluZ0BzZWN1cmUuaXN0aW8uaW8iLCJzdWIiOiJ0ZXN0aW5nQHNlY3VyZS5pc3Rpby5pbyJ9.CfNnxWP2tcnR9q0vxyxweaF3ovQYHYZl82hAUsn21bwQd9zP7c-LS9qd_vpdLG4Tn1A15NxfCjp5f7QNBUo-KC9PJqYpgGbaXhaGx7bEdFWjcwv3nZzvc7M__ZpaCERdwU7igUmJqYGBYQ51vr2njU9ZimyKkfDe3axcyiBZde7G6dabliUosJvvKOPcKIWPccCgefSj_GNfwIip3-SsFdlR7BtbVUcqR-yv-XOxJ3UcMI0tz3uMiiZcyPV7sNCU4KRnemRIMHVOfuvHsU60_GhGbiSFzgPTAa9WTltbnarTbxudb_YEOx12JiwYToeX0DCPb43W1tzIBxgm8NxUgリクエスト認証が有効であることを確認します。
次のコマンドを実行して、エンコードされた JWT を使用して details サービスにアクセスします。
export TOKEN=eyJhbGciOiJSUzI1NiIsImtpZCI6IkRIRmJwb0lVcXJZOHQyenBBMnFYZkNtcjVWTzVaRXI0UnpIVV8tZW52dlEiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjQ2ODU5ODk3MDAsImZvbyI6ImJhciIsImlhdCI6MTUzMjM4OTcwMCwiaXNzIjoidGVzdGluZ0BzZWN1cmUuaXN0aW8uaW8iLCJzdWIiOiJ0ZXN0aW5nQHNlY3VyZS5pc3Rpby5pbyJ9.CfNnxWP2tcnR9q0vxyxweaF3ovQYHYZl82hAUsn21bwQd9zP7c-LS9qd_vpdLG4Tn1A15NxfCjp5f7QNBUo-KC9PJqYpgGbaXhaGx7bEdFWjcwv3nZzvc7M__ZpaCERdwU7igUmJqYGBYQ51vr2njU9ZimyKkfDe3axcyiBZde7G6dabliUosJvvKOPcKIWPccCgefSj_GNfwIip3-SsFdlR7BtbVUcqR-yv-XOxJ3UcMI0tz3uMiiZcyPV7sNCU4KRnemRIMHVOfuvHsU60_GhGbiSFzgPTAa9WTltbnarTbxudb_YEOx12JiwYToeX0DCPb43W1tzIBxgm8NxUg kubectl exec $(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name}) -c sleep -- curl http://details:9080/details/1 -o /dev/null --header "Authorization: Bearer $TOKEN" -s -w '%{http_code}\n'`200` の応答が返され、アクセスが成功したことを示します。
次のコマンドを実行して、無効な JWT を使用して details サービスにアクセスします。
kubectl exec $(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name}) -c sleep -- curl http://details:9080/details/1 -o /dev/null --header "Authorization: Bearer badtoken" -s -w '%{http_code}\n'`403` の応答が返され、アクセスが失敗したことを示します。
次のコマンドを実行して、JWT なしで details サービスにアクセスします。
kubectl exec $(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name}) -c sleep -- curl http://details:9080/details/1 -o /dev/null -s -w '%{http_code}\n'`200` の応答が返され、アクセスが成功したことを示します。
結果に基づくと、有効な JWT ではアクセスが成功し、無効な JWT では失敗し、JWT がないと成功します。これは、リクエスト認証が有効であることを示しています。
権限付与ポリシー
マイクロサービスがリクエストされると、権限付与ポリシーを使用して、ポート、IP アドレス、ソースなどの要素に基づいてリクエストを制限できます。要件を満たすリクエストのみがサービスにアクセスできます。次の権限付与ポリシーは、リクエストソースを制限します。サービスにアクセスするには、リクエストに特定の発行者によって発行された JWT が含まれている必要があります。
次の例では、アプリケーションが存在する名前空間で Waypoint を有効にする必要があります。
リクエストされた bookinfo アプリケーションをデプロイします。詳細については、「ASM インスタンスに関連付けられたクラスターにアプリケーションをデプロイする」をご参照ください。
リクエストを送信する sleep アプリケーションをデプロイします。
次の内容で sleep.yaml ファイルを作成します。
ACK クラスターに対応する kubeconfig 環境で、次のコマンドを実行して sleep アプリケーションをデプロイします。
kubectl apply -f sleep.yaml -n default
権限付与ポリシーを作成します。
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。表示されたページで、[YAML から作成] をクリックします。
[作成] ページで、[default] 名前空間を選択し、次の YAML を設定してから、[作成] をクリックします。
フィールドの詳細については、「Authorization Policy」をご参照ください。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: require-jwt namespace: default spec: action: ALLOW rules: - from: - source: requestPrincipals: - testing@secure.istio.io/testing@secure.istio.io selector: matchLabels: app: details次のコマンドを実行して、JWT を持たないリクエストでサービスにアクセスします。
kubectl exec $(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name}) -c sleep -- curl http://details:9080/details/1 -o /dev/null -s -w '%{http_code}\n'期待される出力:
403JWT なしで details サービスへのアクセスが失敗します。これは、権限付与ポリシーが有効であることを示しています。権限付与ポリシーはすべてのリクエストを制限し、サービスに正常にアクセスするには
testing@secure.istio.ioによって発行された JWT を持つ必要があります。
まとめと参照ケース
まとめると、ASM は次のコアセキュリティ機能を提供します:
証明書の発行と CA のローテーションを簡素化する、完全な証明書ライフサイクル管理を備えたマネージド証明書インフラストラクチャ。
認証ポリシー、権限付与ポリシー、および安全なネーミング情報を Envoy プロキシに配布するためのマネージドコントロールプレーン API。
Ambient モードの Ztunnel と Waypoint は、セキュリティポリシーを適用してアプリケーションのセキュリティを確保できます。
Ztunnel と Waypoint は、不正アクセスを検出するのに役立つ豊富な可観測性データも提供します。
各ワークロードは X.509 TLS 証明書を使用して ID を確立し、各 Ztunnel プロキシはこの証明書を使用します。ASM は証明書と秘密鍵を提供し、定期的にローテーションします。特定の秘密鍵が侵害された場合、ASM はそれを迅速に新しいものに置き換え、攻撃対象領域を大幅に削減します。
参照ケース
イングレスゲートウェイで権限付与ポリシーを使用して、IP ベースのアクセス制御またはカスタム外部権限付与に基づくアクセス制御を実装します。
ある金融テクノロジーのお客様は、ASM 権限付与ポリシーを使用して、外部向けエリアとアプリケーションエリアを分離し、クラスターをまたがる多言語アプリケーションのアクセスを制御しています。また、エグレスゲートウェイを使用してメッシュトラフィックを監査し、権限付与ポリシーと組み合わせて、サードパーティサービスへのアプリケーションアクセスを制御しています。