データベースを保護するには、データベースへのアクセスを許可されているサービスを制限する必要があります。たとえば、本番環境の特定の名前空間内のサービスのみが本番環境のデータベースにアクセスできるように指定できます。このようにして、開発環境のサービスから本番環境へのアクセストラフィックを拒否できます。サービスメッシュ(ASM)のゼロトラストセキュリティシステムを使用すると、承認ポリシーを動的に構成して、名前空間内のサービスから外部データベースへのアクセストラフィックを制御できます。これはリスクの軽減に役立ちます。このトピックでは、承認ポリシーを使用して、名前空間内のサービスから外部 ApsaraDB RDS データベースへのアクセストラフィックを制御する方法について説明します。この例では、demo-server 名前空間が使用されます。
前提条件
クラスターが ASM インスタンスに追加されています。詳細については、「クラスターを ASM インスタンスに追加する」をご参照ください。
手順 1:自動サイドカープロキシインジェクションを有効にする
demo-server という名前の名前空間を作成し、その名前空間のサービスを承認および管理できるように、名前空間の自動サイドカープロキシインジェクションを有効にします。詳細については、「グローバル名前空間を管理する」をご参照ください。
手順 2:データベースクライアントを作成する
demo-server 名前空間で、特定の外部データベースへの接続要求を送信するために使用されるクライアントを作成します。
オンプレミスの PC で CLI を開き、次のコマンドを実行して、外部データベースへの接続に使用されるパスワードを Base64 でエンコードします。
echo <Database connection password> | base64クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続します。詳細については、「クラスターの kubeconfig ファイルを取得し、kubectl を使用してクラスターに接続する」をご参照ください。
demo-server 名前空間に MySQL クライアントを作成します。
次の内容を含む 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次のコマンドを実行して MySQL クライアントを作成します。
kubectl apply -f k8s-mysql.yaml -n demo-server
サイドカープロキシが MySQL クライアントに挿入されていることを確認します。
ACK コンソール にログインします。左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけて名前をクリックします。左側のペインで、 を選択します。
[ポッド] ページで、MySQL クライアントのポッド名をクリックします。
[コンテナー] タブに、istio-proxy という名前のサイドカープロキシが表示されます。これは、サイドカープロキシが MySQL クライアントに挿入されていることを示しています。
手順 3:出口ゲートウェイを作成する
Service Meshインスタンス内のサービスから外部 Web サイトへのアクセストラフィックを制御するには、出口ゲートウェイを使用できます。出口ゲートウェイの承認ポリシーを構成した後、外部データベースへのアクセスを許可するかどうかを制御する条件を指定することもできます。
ASM コンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
[出口ゲートウェイ] ページで、[作成] をクリックします。
[作成] ページで、出口ゲートウェイの [名前] パラメーターを egressgateway に設定し、[クラスター] ドロップダウンリストからクラスターを選択し、[プロトコル] パラメーターを [TCP] に設定し、サービスポート13306[ポートマッピング] セクションの 作成 パラメーターを に設定して、 をクリックします。
構成項目の説明については、「出口ゲートウェイを作成する」をご参照ください。
手順 4:外部サービスにアクセスするためのポリシーを構成する
デフォルトでは、ASM インスタンス内のサービスはすべての外部サービスにアクセスできます。特定の外部 Web サイトへのアクセスを制御するには、ASM コンソールの ASM インスタンスの送信トラフィックポリシーパラメーターを REGISTRY_ONLY に設定します。このようにして、サービスエントリとして登録されていない外部サービスには、この Service Meshインスタンス内のサービスからアクセスできません。
外部サービスにアクセスするためのポリシーを構成します。
ASM コンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
[グローバル] タブで、[送信トラフィックポリシー] をクリックし、[送信トラフィックポリシー] パラメーターを [REGISTRY_ONLY] に設定して、[設定の更新] をクリックします。
外部データベースをサービスエントリとして登録します。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。表示されるページで、[YAML から作成] をクリックします。
[作成] ページで、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 にトラフィックをルーティングします。
Istio ゲートウェイを作成します。
ASM コンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。表示されるページで、[YAML から作成] をクリックします。
[作成] ページで、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 認証に合格する必要があります。
宛先ルールを作成します。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。表示されるページで、[YAML から作成] をクリックします。
[作成] ページで、デモサーバー[名前空間] ドロップダウンリストから 作成 を選択し、次の内容を 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 認証に合格する必要があります。
仮想サービスを作成します。
ASM インスタンスの詳細ページで、左側のナビゲーションペインの を選択します。表示されるページで、[YAML から作成] をクリックします。
[作成] ページで、デモサーバー[名前空間] ドロップダウンリストから 作成 を選択し、次の内容を 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: 100http セクションでは、2 つの照合ルールが構成されています。最初の照合ルールでは、gateways パラメーターが mesh に設定されています。これは、最初の照合ルールが demo-server 名前空間に挿入されたサイドカープロキシに適用され、demo-server 名前空間から出口ゲートウェイのポート 13306 にトラフィックをルーティングするために使用されることを示します。2 番目の照合ルールでは、gateways パラメーターが istio-system/istio-egressgateway に設定されています。これは、照合ルールが出口ゲートウェイから登録済みデータベースのポート 3306 にトラフィックをルーティングするために使用されることを示します。
手順 6:承認ポリシーを使用して demo-server 名前空間内のサービスから外部データベースへのアクセストラフィックを制御できることを確認する
承認ポリシーを作成し、承認ポリシーの action パラメーターを変更して、demo-server 名前空間内のサービスから外部データベースへのアクセストラフィックを拒否または許可できます。このようにして、外部データベースへのアクセスを制御できます。
demo-server 名前空間から外部データベースへのアクセストラフィックを拒否する承認ポリシーを作成します。
ASM コンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。表示されるページで、[作成] をクリックします。
[作成] ページで、関連パラメーターを構成し、[作成] をクリックします。
パラメーター
説明
名前
承認ポリシーの名前。
ポリシータイプ
[拒否] に設定します。
ゲートウェイスコープ タブ
ASM ゲートウェイ
[egressgateway] を選択します。egressgateway を選択すると、[一致ラベル] パラメーターはデフォルトで [istio:egressgateway] に設定されます。
リクエストの照合ルール
[名前空間] をオンにして、demo-frontend に設定します。

外部データベースにアクセスします。
ACK コンソール にログインします。左側のナビゲーションペインで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけて名前をクリックします。左側のペインで、 を選択します。
[ポッド] ページで、k8s-mysql コンテナーを見つけて、ターミナル[アクション] 列の コンテナー: Mysql をクリックします。次に、 をクリックします。
k8s-mysql コンテナーのターミナルで次のコマンドを実行して、外部データベースにアクセスします。
mysql --user=root --password=$MYSQL_ROOT_PASSWORD --host rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.comERROR 2013エラーが返されます。これは、demo-server 名前空間内のサービスが外部データベースにアクセスできないことを示しています。
承認ポリシーの action パラメーターの値を ALLOW に変更して、demo-server 名前空間から外部データベースへのアクセストラフィックを許可します。
ASM コンソール にログインします。左側のナビゲーションペインで、 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションペインで、 を選択します。
[authorizationpolicy] ページで、管理するポリシーを見つけて、YAML[アクション] 列の をクリックします。
[編集] ダイアログボックスで、action パラメーターの値を ALLOW に変更し、[OK] をクリックします。
k8s-mysql コンテナーのターミナルで次のコマンドを実行して、外部データベースにアクセスします。
mysql --user=root --password=$MYSQL_ROOT_PASSWORD --host rm-xxxxxxx.mysql.xxxx.rds.aliyuncs.comWelcome to the MySQL monitorメッセージが返されます。これは、demo-server 名前空間内のサービスが外部データベースにアクセスできることを示しています。テスト結果は、承認ポリシーを使用して、名前空間内のサービスから外部データベースへのアクセストラフィックを制御できることを示しています。