すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:承認ポリシーを使用して、ASM インスタンス内のサービスから外部データベースへのアクセストラフィックを制御する

最終更新日:Jan 17, 2025

データベースを保護するには、データベースへのアクセスを許可されているサービスを制限する必要があります。たとえば、本番環境の特定の名前空間内のサービスのみが本番環境のデータベースにアクセスできるように指定できます。このようにして、開発環境のサービスから本番環境へのアクセストラフィックを拒否できます。サービスメッシュ(ASM)のゼロトラストセキュリティシステムを使用すると、承認ポリシーを動的に構成して、名前空間内のサービスから外部データベースへのアクセストラフィックを制御できます。これはリスクの軽減に役立ちます。このトピックでは、承認ポリシーを使用して、名前空間内のサービスから外部 ApsaraDB RDS データベースへのアクセストラフィックを制御する方法について説明します。この例では、demo-server 名前空間が使用されます。

前提条件

クラスターが ASM インスタンスに追加されています。詳細については、「クラスターを ASM インスタンスに追加する」をご参照ください。

手順 1:自動サイドカープロキシインジェクションを有効にする

demo-server という名前の名前空間を作成し、その名前空間のサービスを承認および管理できるように、名前空間の自動サイドカープロキシインジェクションを有効にします。詳細については、「グローバル名前空間を管理する」をご参照ください。

手順 2:データベースクライアントを作成する

demo-server 名前空間で、特定の外部データベースへの接続要求を送信するために使用されるクライアントを作成します。

  1. オンプレミスの PC で CLI を開き、次のコマンドを実行して、外部データベースへの接続に使用されるパスワードを Base64 でエンコードします。

    echo  <Database connection password> | base64 
  2. クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続します。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。

  3. demo-server 名前空間に MySQL クライアントを作成します。

    1. 次の内容を含む k8s-mysql.yaml ファイルを作成します。

      apiVersion: v1
      data:
        password: {yourPasswordBase64}  # Base64 でエンコードされたデータベース接続パスワード。
      kind: Secret
      metadata:
        name: mysql-pass
      type: Opaque
      ---
      
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          name: lbl-k8s-mysql
        name: k8s-mysql
      spec:
        progressDeadlineSeconds: 600
        replicas: 1
        revisionHistoryLimit: 10
        selector:
          matchLabels:
            name: lbl-k8s-mysql
        strategy:
          rollingUpdate:
            maxSurge: 25%
            maxUnavailable: 25%
          type: RollingUpdate
        template:
          metadata:
            labels:
              name: lbl-k8s-mysql
          spec:
            containers:
              - env:
                  - name: MYSQL_ROOT_PASSWORD
                    valueFrom:
                      secretKeyRef:
                        key: password
                        name: mysql-pass
                image: 'mysql:latest'
                imagePullPolicy: Always
                name: mysql
                ports:
                  - containerPort: 3306
                    name: mysql
                    protocol: TCP
                resources:
                  limits:
                    cpu: 500m
                terminationMessagePath: /dev/termination-log
                terminationMessagePolicy: File
                volumeMounts:
                  - mountPath: /var/lib/mysql
                    name: k8s-mysql-storage
            dnsPolicy: ClusterFirst
            restartPolicy: Always
            schedulerName: default-scheduler
            securityContext: {}
            terminationGracePeriodSeconds: 30
            volumes:
              - emptyDir: {}
                name: k8s-mysql-storage
    2. 次のコマンドを実行して MySQL クライアントを作成します。

      kubectl apply -f k8s-mysql.yaml -n demo-server
  4. サイドカープロキシが MySQL クライアントに挿入されていることを確認します。

    1. ACK コンソール にログインします。左側のナビゲーションペインで、[クラスター] をクリックします。

    2. [クラスター] ページで、管理するクラスターを見つけて名前をクリックします。左側のペインで、[ワークロード] > [ポッド] を選択します。

    3. [ポッド] ページで、MySQL クライアントのポッド名をクリックします。

      [コンテナー] タブに、istio-proxy という名前のサイドカープロキシが表示されます。これは、サイドカープロキシが MySQL クライアントに挿入されていることを示しています。

手順 3:出口ゲートウェイを作成する

Service Meshインスタンス内のサービスから外部 Web サイトへのアクセストラフィックを制御するには、出口ゲートウェイを使用できます。出口ゲートウェイの承認ポリシーを構成した後、外部データベースへのアクセスを許可するかどうかを制御する条件を指定することもできます。

  1. ASM コンソール にログインします。左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

  2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、[ASM ゲートウェイ] > [出口ゲートウェイ] を選択します。

  3. [出口ゲートウェイ] ページで、[作成] をクリックします。

  4. [作成] ページで、出口ゲートウェイの [名前] パラメーターを egressgateway に設定し、[クラスター] ドロップダウンリストからクラスターを選択し、[プロトコル] パラメーターを [TCP] に設定し、サービスポート13306[ポートマッピング] セクションの 作成 パラメーターを に設定して、 をクリックします。

    構成項目の説明については、「出口ゲートウェイを作成する」をご参照ください。

手順 4:外部サービスにアクセスするためのポリシーを構成する

デフォルトでは、ASM インスタンス内のサービスはすべての外部サービスにアクセスできます。特定の外部 Web サイトへのアクセスを制御するには、ASM コンソールの ASM インスタンスの送信トラフィックポリシーパラメーターを REGISTRY_ONLY に設定します。このようにして、サービスエントリとして登録されていない外部サービスには、この Service Meshインスタンス内のサービスからアクセスできません。

  1. 外部サービスにアクセスするためのポリシーを構成します。

    1. ASM コンソール にログインします。左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

    2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、[データプレーンコンポーネント管理] > [サイドカープロキシ設定] を選択します。

    3. [グローバル] タブで、[送信トラフィックポリシー] をクリックし、[送信トラフィックポリシー] パラメーターを [REGISTRY_ONLY] に設定して、[設定の更新] をクリックします。

  2. 外部データベースをサービスエントリとして登録します。

    1. ASM インスタンスの詳細ページで、左側のナビゲーションペインの [クラスターとワークロードの管理] > [外部サービス(serviceentry)] を選択します。表示されるページで、[YAML から作成] をクリックします。

    2. [作成] ページで、istio-system[名前空間] ドロップダウンリストから 作成 を選択し、次の内容を YAML コードエディターにコピーします。次に、 をクリックします。

      apiVersion: networking.istio.io/v1beta1
      kind: ServiceEntry
      metadata:
        name: demo-server-rds
        namespace: demo-server
      spec:
        endpoints:
          - address: rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com   # 外部データベースのアドレス。
            ports:
              tcp: 3306  
        hosts:
          - rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com
        location: MESH_EXTERNAL
        ports:
          - name: tcp
            number: 3306  # 外部データベースのポート。
            protocol: TCP  # 外部データベースで使用されるプロトコル。
        resolution: DNS
                                      

手順 5:トラフィックポリシーを作成する

Istio ゲートウェイ、宛先ルール、および仮想サービスを作成して、demo-server 名前空間から出口ゲートウェイのポート 13306 に、次に外部データベースのポート 3306 にトラフィックをルーティングします。

  1. Istio ゲートウェイを作成します。

    1. ASM コンソール にログインします。左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

    2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、[ASM ゲートウェイ] > [ゲートウェイ] を選択します。表示されるページで、[YAML から作成] をクリックします。

    3. [作成] ページで、Istio システム[名前空間] ドロップダウンリストから 作成 を選択し、次の内容を YAML コードエディターにコピーします。次に、 をクリックします。

      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
        name: istio-egressgateway
        namespace: istio-system
      spec:
        selector:
          istio: egressgateway
        servers:
          - hosts:
              - '*'
            port:
              name: http-0
              number: 13306
              protocol: TLS
            tls:
              mode: ISTIO_MUTUAL

      上記のコードでは、mode パラメーターが ISTIO_MUTUAL に設定されています。これは、相互トランスポート層セキュリティ(mTLS)認証が有効になっていることを意味します。この場合、ASM インスタンス内のサービスは、外部 Web サイトにアクセスする前に TLS 認証に合格する必要があります。

  2. 宛先ルールを作成します。

    1. ASM インスタンスの詳細ページで、左側のナビゲーションペインの [トラフィック管理センター] > [destinationrule] を選択します。表示されるページで、[YAML から作成] をクリックします。

    2. [作成] ページで、デモサーバー[名前空間] ドロップダウンリストから 作成 を選択し、次の内容を YAML コードエディターにコピーします。次に、 をクリックします。

      apiVersion: networking.istio.io/v1beta1
      kind: DestinationRule
      metadata:
        name: demo-server-egress-gateway
        namespace: demo-server
      spec:
        host: istio-egressgateway.istio-system.svc.cluster.local
        subsets:
          - name: mysql-gateway-mTLS
            trafficPolicy:
              loadBalancer:
                simple: ROUND_ROBIN
              portLevelSettings:
                - port:
                    number: 13306 # 出口ゲートウェイのポート。
                  tls:
                    mode: ISTIO_MUTUAL
                    sni: rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com  # 外部データベースのホストアドレス。

      上記のコードでは、mode パラメーターが ISTIO_MUTUAL に設定されています。これは、mTLS 認証が有効になっていることを意味します。この場合、ASM インスタンス内のサービスは、外部 Web サイトにアクセスする前に TLS 認証に合格する必要があります。

  3. 仮想サービスを作成します。

    1. ASM インスタンスの詳細ページで、左側のナビゲーションペインの [トラフィック管理センター] > [virtualservice] を選択します。表示されるページで、[YAML から作成] をクリックします。

    2. [作成] ページで、デモサーバー[名前空間] ドロップダウンリストから 作成 を選択し、次の内容を YAML コードエディターにコピーします。次に、 をクリックします。

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: demo-server-through-egress-gateway
        namespace: demo-server
      spec:
        exportTo:
          - istio-system
          - demo-server
        gateways:
          - mesh
          - istio-system/istio-egressgateway
        hosts:
          - rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com
        tcp:
          - match:
              - gateways:
                  - mesh
                port: 3306
            route:
              - destination:
                  host: istio-egressgateway.istio-system.svc.cluster.local
                  port:
                    number: 13306
                  subset: mysql-gateway-mTLS
                weight: 100
          - match:
              - gateways:
                  - istio-system/istio-egressgateway
                port: 13306
            route:
              - destination:
                  host: rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com
                  port:
                    number: 3306
                weight: 100

      http セクションでは、2 つの照合ルールが構成されています。最初の照合ルールでは、gateways パラメーターが mesh に設定されています。これは、最初の照合ルールが demo-server 名前空間に挿入されたサイドカープロキシに適用され、demo-server 名前空間から出口ゲートウェイのポート 13306 にトラフィックをルーティングするために使用されることを示します。2 番目の照合ルールでは、gateways パラメーターが istio-system/istio-egressgateway に設定されています。これは、照合ルールが出口ゲートウェイから登録済みデータベースのポート 3306 にトラフィックをルーティングするために使用されることを示します。

手順 6:承認ポリシーを使用して demo-server 名前空間内のサービスから外部データベースへのアクセストラフィックを制御できることを確認する

承認ポリシーを作成し、承認ポリシーの action パラメーターを変更して、demo-server 名前空間内のサービスから外部データベースへのアクセストラフィックを拒否または許可できます。このようにして、外部データベースへのアクセスを制御できます。

  1. demo-server 名前空間から外部データベースへのアクセストラフィックを拒否する承認ポリシーを作成します。

    1. ASM コンソール にログインします。左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

    2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、[メッシュセキュリティセンター] > [authorizationpolicy] を選択します。表示されるページで、[作成] をクリックします。

    3. [作成] ページで、関連パラメーターを構成し、[作成] をクリックします。

      パラメーター

      説明

      名前

      承認ポリシーの名前。

      ポリシータイプ

      [拒否] に設定します。

      ゲートウェイスコープ タブ

      ASM ゲートウェイ

      [egressgateway] を選択します。egressgateway を選択すると、[一致ラベル] パラメーターはデフォルトで [istio:egressgateway] に設定されます。

      リクエストの照合ルール

      [名前空間] をオンにして、demo-frontend に設定します。

      创建授权策略

  2. 外部データベースにアクセスします。

    1. ACK コンソール にログインします。左側のナビゲーションペインで、[クラスター] をクリックします。

    2. [クラスター] ページで、管理するクラスターを見つけて名前をクリックします。左側のペインで、[ワークロード] > [ポッド] を選択します。

    3. [ポッド] ページで、k8s-mysql コンテナーを見つけて、ターミナル[アクション] 列の コンテナー: Mysql をクリックします。次に、 をクリックします。

    4. k8s-mysql コンテナーのターミナルで次のコマンドを実行して、外部データベースにアクセスします。

      mysql --user=root --password=$MYSQL_ROOT_PASSWORD --host rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com

      ERROR 2013 エラーが返されます。これは、demo-server 名前空間内のサービスが外部データベースにアクセスできないことを示しています。

  3. 承認ポリシーの action パラメーターの値を ALLOW に変更して、demo-server 名前空間から外部データベースへのアクセストラフィックを許可します。

    1. ASM コンソール にログインします。左側のナビゲーションペインで、[サービスメッシュ] > [メッシュ管理] を選択します。

    2. [メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、[メッシュセキュリティセンター] > [authorizationpolicy] を選択します。

    3. [authorizationpolicy] ページで、管理するポリシーを見つけて、YAML[アクション] 列の をクリックします。

    4. [編集] ダイアログボックスで、action パラメーターの値を ALLOW に変更し、[OK] をクリックします。

  4. k8s-mysql コンテナーのターミナルで次のコマンドを実行して、外部データベースにアクセスします。

    mysql --user=root --password=$MYSQL_ROOT_PASSWORD --host rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.com

    Welcome to the MySQL monitor メッセージが返されます。これは、demo-server 名前空間内のサービスが外部データベースにアクセスできることを示しています。

    テスト結果は、承認ポリシーを使用して、名前空間内のサービスから外部データベースへのアクセストラフィックを制御できることを示しています。