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

Alibaba Cloud Service Mesh:TCP リクエストに対する承認ポリシーの設定

最終更新日:Jan 14, 2025

サービス間の TCP リクエストをきめ細かく制御するために、TCP リクエストに対する承認ポリシーを設定して、サービスインタラクションの権限を管理できます。これにより、承認されたリクエストのみが特定のサービスにアクセスできるようになり、サービスのセキュリティと信頼性が向上します。

前提条件

手順 1:サンプルアプリケーションをデプロイする

リクエストを受信する TCP サービスとして tcp-echo アプリケーションを、リクエストを送信する TCP サービスとして sleep アプリケーションをデプロイします。

  1. リクエストを受信する TCP サービスをデプロイします。

    1. 以下の内容を含む tcp-echo.yaml ファイルを作成します。

      tcp-echo はリクエストを受信した後、リクエストコンテンツの先頭に hello を付加し、付加されたコンテンツをレスポンスとして返します。たとえば、tcp-echo が world を受信した場合、hello world が返されます。

      展開して tcp-echo.yaml ファイルを表示する

      apiVersion: v1
      kind: Service
      metadata:
        name: tcp-echo
        labels:
          app: tcp-echo
          service: tcp-echo
      spec:
        ports:
        - name: tcp
          port: 9000
        - name: tcp-other
          port: 9001
        selector:
          app: tcp-echo
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: tcp-echo
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: tcp-echo
            version: v1
        template:
          metadata:
            labels:
              app: tcp-echo
              version: v1
          spec:
            containers:
            - name: tcp-echo
              image: docker.io/istio/tcp-echo-server:1.2
              imagePullPolicy: IfNotPresent
              args: [ "9000,9001,9002", "hello" ]
              ports:
              - containerPort: 9000
              - containerPort: 9001
    2. kubectl を使用してクラスターに接続します。次のコマンドを実行して、foo 名前空間でリクエストを受信する TCP サービスとして tcp-echo サービスをデプロイします。

      kubectl を使用してクラスターに接続する方法の詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。

      kubectl apply -f tcp-echo.yaml -n foo
  2. リクエストを送信する TCP サービスをデプロイします。

    1. 以下の内容を含む sleep.yaml ファイルを作成します。

      展開して sleep.yaml ファイルを表示する

      #Sleep サービス
      apiVersion: v1
      kind: ServiceAccount
      metadata:
        name: sleep
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: sleep
        labels:
          app: sleep
          service: sleep
      spec:
        ports:
        - port: 80
          name: http
        selector:
          app: sleep
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: sleep
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: sleep
        template:
          metadata:
            labels:
              app: sleep
          spec:
            terminationGracePeriodSeconds: 0
            serviceAccountName: sleep
            containers:
            - name: sleep
              image: curlimages/curl
              command: ["/bin/sleep", "3650d"]
              imagePullPolicy: IfNotPresent
              volumeMounts:
              - mountPath: /etc/sleep/tls
                name: secret-volume
            volumes:
            - name: secret-volume
              secret:
                secretName: sleep-secret
                optional: true
      ---
    2. 次のコマンドを実行して、foo 名前空間で TCP リクエストを送信する sleep サービスをデプロイします。

      kubectl apply -f sleep.yaml -n foo

手順 2:承認ポリシーを設定する前に、tcp-echo サービスが想定どおりにリクエストできるかどうかを確認する

  1. 次のコマンドを実行して、sleep サービスからのリクエストがポート 9000 経由で tcp-echo サービスにアクセスできるかどうかを確認します。

    kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9000" | nc tcp-echo 9000' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'

    期待される出力:

    hello port 9000
    connection succeeded

    この出力は、sleep サービスからのリクエストがポート 9000 経由で tcp-echo サービスにアクセスできることを示しています。

  2. 次のコマンドを実行して、sleep サービスからのリクエストがポート 9001 経由で tcp-echo サービスにアクセスできるかどうかを確認します。

    kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9001" | nc tcp-echo 9001' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'

    期待される出力:

    hello port 9001
    connection succeeded

    この出力は、sleep サービスからのリクエストがポート 9001 経由で tcp-echo サービスにアクセスできることを示しています。

手順 3:承認ポリシーを設定する

TCP リクエストがポート 9000 経由で tcp-echo サービスにアクセスできるように承認ポリシーを設定するには、次の手順を実行します。

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

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

  3. 次のいずれかの方法で承認ポリシーを作成します。

    重要

    TCP リクエストの承認ポリシーを設定する場合は、[リクエストターゲットの追加] セクションの [メソッド] スイッチをオンにしないでください。このスイッチは HTTP リクエストにのみ適しており、TCP リクエストには適していません。このスイッチを使用して TCP リクエストに設定された ALLOW ルールは無効です。Service Meshは無効な ALLOW ルールを無視します。したがって、TCP リクエストに対してこのスイッチをオンにすると、TCP リクエストは拒否され、connection rejected が返されます。

    方法 1:YAML を使用して承認ポリシーを作成する

    1. [authorizationpolicy] ページで、[YAML から作成] をクリックします。

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

      kind: AuthorizationPolicy
      apiVersion: security.istio.io/v1beta1
      metadata:
        name: demo
        namespace: foo
      spec:
        action: ALLOW
        rules:
          - to:
              - operation:
                  ports:
                    - '9000'

    方法 2:グラフィカルユーザーインターフェース (GUI) を使用して承認ポリシーを作成する

    1. [authorizationpolicy] ページで、[作成] をクリックします。

    2. [作成] ページで、パラメーターを設定し、[作成] をクリックします。

      パラメーター

      説明

      [名前]

      承認ポリシーの名前。この例では、値は demo に設定されています。

      [ポリシータイプ]

      承認アクション。この例では、値は [許可] に設定されています。

      [名前空間]

      承認ポリシーを作成する名前空間。この例では、[ワークロードスコープ] タブの [名前空間] パラメーターは [foo] に設定されています。

      [有効スコープ]

      承認ポリシーの有効スコープ。この例では、値は [名前空間スコープ] に設定されています。

      [リクエスト一致ルール]

      承認ポリシーのリクエスト一致ルール。この例では、[リクエストターゲットの追加] セクションで [ポート] がオンになっており、値は 9000 に設定されています。

手順 4:作成した承認ポリシーが有効になっているかどうかを確認する

  1. 次のコマンドを実行して、sleep サービスからのリクエストがポート 9001 経由で tcp-echo サービスにアクセスできるかどうかを確認します。

    kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9001" | nc tcp-echo 9001' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'

    期待される出力:

    connection rejected

    この出力は、sleep サービスからのリクエストがポート 9001 経由で tcp-echo サービスにアクセスできないことを示しています。

  2. 次のコマンドを実行して、sleep サービスからのリクエストがポート 9000 経由で tcp-echo サービスにアクセスできるかどうかを確認します。

    kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9000" | nc tcp-echo 9000' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'

    期待される出力:

    hello port 9000
    connection succeeded

    この出力は、sleep サービスからのリクエストがポート 9000 経由で tcp-echo サービスにアクセスできることを示しています。

参照