このトピックでは、Service Mesh(ASM)インスタンス内のアプリケーションへの特定のIPアドレスからのアクセスを制限する方法について説明します。
前提条件
v1.15.3.25以降のASMインスタンスにクラスタが追加されています。詳細については、ASMインスタンスへのクラスタの追加をご参照ください。
自動サイドカープロキシインジェクションが有効になっています。詳細については、自動サイドカープロキシインジェクションの有効化をご参照ください。
HTTPBinアプリケーションがデプロイされ、アクセス可能です。詳細については、HTTPBinアプリケーションのデプロイをご参照ください。
使用上の注意
この例では、ゲートウェイの externalTrafficPolicy フィールドは Local に設定されています。externalTrafficPolicy フィールドが Cluster に設定されている場合、送信元 IP アドレスは保持されません。
シナリオ 1:ASMインスタンス内のアプリケーションにアクセスするためのリクエストを開始するクライアントとASMゲートウェイの間にレイヤー 7 プロキシがデプロイされていない
次のコマンドを実行して HTTPBin アプリケーションにアクセスします。
curl 47.111.XXX.XX:80/ -Iクライアントの実際の IP アドレスは 106.11.XX.X です。ゲートウェイログの downstream_remote_address フィールドと x_forwarded_for フィールドの値が正しいことがわかります。この場合、ゲートウェイの ipBlocks と remoteIpBlocks の設定が有効になります。
サイドカープロキシのアクセスログの x_forwarded_for フィールドの値がクライアントの実際の IP アドレスであることがわかります。downstream_remote_address フィールドの値もクライアントの実際の IP アドレスですが、ポート情報が失われ、0 と表示されます。
例 1:ゲートウェイでブラックリストまたはホワイトリストを設定する
ipBlocks をテストする
次のコンテンツを使用して、gateway-test.yaml という名前の承認ポリシーを作成します。
ASM セキュリティポリシーまたはゲートウェイのブラックリストまたはホワイトリストを使用して、設定を簡素化できます。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test namespace: istio-system spec: action: DENY rules: - from: - source: ipBlocks: - 106.11.XX.X selector: matchLabels: istio: ingressgateway次のコマンドを実行して、承認ポリシーをデプロイします。
kubectl apply -f gateway-test.yaml次のコマンドを実行して HTTPBin アプリケーションにアクセスします。
curl 47.111.175.XX:XX/ -I予期される出力:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Thu, 31 Aug 2023 06:56:00 GMT server: istio-envoy
remoteIpBlocks をテストする
次のコンテンツを使用して gateway-test.yaml という名前の承認ポリシーを作成します。
ASM セキュリティポリシーまたはゲートウェイのブラックリストまたはホワイトリストを使用して設定を簡素化できます。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test namespace: istio-system spec: action: DENY rules: - from: - source: remoteIpBlocks: - 106.11.XX.X selector: matchLabels: istio: ingressgateway次のコマンドを実行して、承認ポリシーをデプロイします。
kubectl apply -f gateway-test.yaml次のコマンドを実行して HTTPBin アプリケーションにアクセスします。
curl 47.111.175.XX:XX/ -I予期される出力:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Thu, 31 Aug 2023 09:59:02 GMT server: istio-envoy
例 2:サイドカープロキシでブラックリストまたはホワイトリストを設定する
ipBlocks をテストする
次のコンテンツを使用して gateway-test.yaml という名前の承認ポリシーを作成します。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test namespace: default spec: action: DENY rules: - from: - source: ipBlocks: - 106.11.XX.X selector: matchLabels: app: httpbin次のコマンドを実行して、承認ポリシーをデプロイします。
kubectl apply -f gateway-test.yaml次のコマンドを実行して HTTPBin アプリケーションにアクセスします。
curl 47.111.175.XX:XX/ -I予期される出力:
HTTP/1.1 200 OK server: istio-envoy date: Thu, 31 Aug 2023 10:14:01 GMT content-type: text/html; charset=utf-8 content-length: 9593 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 2サイドカープロキシのアクセスログの
downstream_remote_addressフィールドの値がクライアント IP アドレスであり、ブロックされていないことがわかります。downstream_remote_addressの値は、常にipBlocksフィールドで指定された IP アドレスであるとは限りません。ipBlocksフィールドは、現在のプロキシと直接 TCP 接続を確立することが許可されていないクライアントの IP アドレスを指定します。この場合、TCP 接続の実際の送信元 IP アドレスは、ゲートウェイのポッド IP アドレスです。downstream_remote_addressは柔軟なフィールドであり、その値は常にダウンストリーム接続の物理 IP アドレスであるとは限りません。downstream_remote_addressフィールドは、ダウンストリーム接続のリモートアドレスを示します。アドレスが IP アドレスの場合、IP アドレスとポートが含まれます。リモートエンドの実際の物理アドレスではない場合があります。アドレスは、Proxy Protocol フィルターまたはx_forwarded_forリクエストヘッダーから推測される場合があります。ipBlocksフィールドのアドレスをゲートウェイのポッド IP アドレスに置き換えることができます。設定後、HTTPBin アプリケーションにアクセスできなくなります。
remoteIpBlocks をテストする
次のコンテンツを使用して gateway-test.yaml という名前の承認ポリシーを作成します。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test namespace: default spec: action: DENY rules: - from: - source: remoteIpBlocks: - 106.11.XX.X selector: matchLabels: app: httpbin次のコマンドを実行して、承認ポリシーをデプロイします。
kubectl apply -f gateway-test.yaml次のコマンドを実行して HTTPBin アプリケーションにアクセスします。
curl 47.111.XXX.XX:80/ -I予期される出力:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Thu, 31 Aug 2023 11:06:42 GMT server: istio-envoy x-envoy-upstream-service-time: 0remoteIpBlocks設定が有効になります。この場合、x_forwarded_forフィールドの値は downstream_remote_address フィールドの値と同じです。
シナリオ 2:ASMインスタンス内のアプリケーションにアクセスするためのリクエストを開始するクライアントとASMゲートウェイの間にレイヤー 7 プロキシがデプロイされている
このシナリオでは、ASM ゲートウェイが受信するリクエストの x_forwarded_for リクエストヘッダーには、レイヤー 7 プロキシによって追加されるデフォルト値が必要です。
リクエストが ASM ゲートウェイに到達する前に、x_forwarded_for リクエストヘッダーの値は 56.5.X.X, 72.9.X.X, 98.1.X.X である必要があります。最後の IP アドレス 106.11.XX.X は、ASM ゲートウェイによって追加されます。downstream_remote_address は、ゲートウェイに直接接続するピアエンドの IP アドレスを示します。この場合、これは物理 IP アドレスであり、有効なポートが含まれています。
サイドカープロキシのログは、x_forwarded_for リクエストヘッダーの値がゲートウェイの値と同じであることを示しています。downstream_remote_address の値は実際の物理アドレスではありません。x_forwarded_for リクエストヘッダーの値の最後の IP アドレスです。(x_forwarded_for フィールドには IP アドレスのみが含まれています。したがって、ここでのポートは 0 です。)
次のセクションでは、ipBlocks フィールド(このフィールドはピアエンドの実際の物理 IP アドレスを示します)はテストしません。remoteIpBlocks フィールドのみがテストされます。この場合、x_forwarded_for フィールドを配列として扱う必要があります。ASM ゲートウェイへの IP アドレスからのアクセスを拒否します。前のログの x_forwarded_for の最後の IP アドレスは、ASM ゲートウェイにアクセスすることが許可されていません。
例 1:x_forwarded_for フィールドの最後の IP アドレスに remoteIpBlocks を設定する x_forwarded_for フィールドの最後の IP アドレスまで
次のコンテンツを使用して gateway-test.yaml という名前の承認ポリシーを作成します。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test-ap-wg-gateway-test-istio-system-gateway-ingressgateway namespace: istio-system spec: action: DENY rules: - from: - source: remoteIpBlocks: - 106.11.XX.X selector: matchLabels: istio: ingressgateway次のコマンドを実行して、承認ポリシーをデプロイします。
kubectl apply -f gateway-test.yaml次のコマンドを実行して HTTPBin アプリケーションにアクセスします。
curl 47.111.175.XX:XX/ -H 'X-Forwarded-For: 56.5.X.X, 72.9.X.X, 98.1.X.X' -I予期される出力:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Thu, 31 Aug 2023 11:50:36 GMT server: istio-envoy出力は、
x_forwarded_forフィールドの最後の IP アドレスが ASM ゲートウェイにアクセスすることを許可されていないことを示しています。
例 2:イングレスゲートウェイの numTrustedProxies フィールドを 2 に設定する
イングレスゲートウェイの YAML ファイルの
specフィールドに次の設定を追加します。イングレスゲートウェイの YAML ファイルの編集方法の詳細については、ASM コンソールでイングレスゲートウェイを管理するをご参照ください。podAnnotations: proxy.istio.io/config: '{"gatewayTopology" : { "numTrustedProxies": 2 } }'説明この設定により、ゲートウェイが再起動します。
ゲートウェイが再起動した後、次のコマンドを実行して HTTPBin アプリケーションにアクセスします。
curl 47.111.XXX.XX:80/ -H 'X-Forwarded-For: 56.5.X.X, 72.9.X.X, 98.1.X.X' -I予期される出力:
HTTP/1.1 200 OK server: istio-envoy date: Thu, 31 Aug 2023 12:10:15 GMT content-type: text/html; charset=utf-8 content-length: 9593 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 2出力は、アクセスが成功し、
numTrustedProxiesフィールドの値がremoteIpBlocksフィールドの判断結果に影響を与えることを示しています。numTrustedProxiesが2に設定されている場合、ASM ゲートウェイは自身に最も近い 2 つのプロキシを信頼できるとみなし、3 番目に近いプロキシを信頼できないとみなします。したがって、remoteIpBlocksフィールドは、3 番目に近いプロキシの IP アドレスがゲートウェイにアクセスすることを拒否します。numTrustedProxiesが設定されていない場合、デフォルト値は 0 です。
例 3:承認ポリシーを使用して、ゲートウェイログの x_forwarded_for フィールドの最後から 3 番目の IP アドレスからのアクセスを拒否する
次のコンテンツを使用して gateway-test.yaml という名前の承認ポリシーを作成します。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test-ap-wg-gateway-test-istio-system-gateway-ingressgateway namespace: istio-system spec: action: DENY rules: - from: - source: remoteIpBlocks: - 72.9.X.X selector: matchLabels: istio: ingressgateway次のコマンドを実行して、承認ポリシーをデプロイします。
kubectl apply -f gateway-test.yaml次のコマンドを実行して HTTPBin アプリケーションにアクセスします。
curl 47.111.XXX.XX:80/ -H 'X-Forwarded-For: 56.5.X.X, 72.9.X.X, 98.1.X.X' -I予期される出力:
HTTP/1.1 403 Forbidden content-length: 19 content-type: text/plain date: Thu, 31 Aug 2023 12:38:09 GMT server: istio-envoy出力は、
x_forwarded_forフィールドで指定された最後から 3 番目の IP アドレスからのアクセスが拒否されたことを示しています。
例 4:上記の承認ポリシーの有効範囲を HTTPBin アプリケーションに変更する
次のコンテンツを使用して gateway-test.yaml という名前の承認ポリシーを作成します。
apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: gateway-test namespace: default spec: action: DENY rules: - from: - source: remoteIpBlocks: - 72.9.X.X selector: matchLabels: app: httpbin次のコマンドを実行して、承認ポリシーをデプロイします。
kubectl apply -f gateway-test.yaml次のコマンドを実行して HTTPBin アプリケーションにアクセスします。
curl 47.111.XXX.XX:80/ -H 'X-Forwarded-For: 56.5.X.X, 72.9.X.X, 98.1.X.X' -I予期される出力:
HTTP/1.1 200 OK server: istio-envoy date: Thu, 31 Aug 2023 12:39:36 GMT content-type: text/html; charset=utf-8 content-length: 9593 access-control-allow-origin: * access-control-allow-credentials: true x-envoy-upstream-service-time: 6出力は、アクセスが成功し、承認ポリシーが無効であることを示しています。上記の
numTrustedProxiesフィールドはゲートウェイ用に設定されています。サイドカープロキシのnumTrustedProxiesのデフォルト値は依然として 0 です。サイドカープロキシは、受信したx_forwarded_forリクエストヘッダーの最後の IP アドレスを確認します。したがって、リクエストは拒否されません。承認ポリシーの
remoteIpBlocksの値をサイドカープロキシログのx_forwarded_forの最後の IP アドレスに変更すると、アクセスは拒否されます。