サービスメッシュにおける認証と権限付与を制御するために、ASMSecurityPolicy で JSON Web トークン (JWT) 認証を設定します。これにより、有効な JWT を持つリクエストのみが保護されたリソースにアクセスできるようになり、サービス間通信のセキュリティとプライバシーが向上します。
背景情報
JWT には、ユーザー情報などのデジタル署名されたクレームが含まれています。システムは署名を検証してトークンの真正性と整合性を確認し、それによってユーザーの ID を検証できます。
前提条件
-
ゲートウェイと仮想サービスが作成され、次のパスにアクセスできることを確認します。詳細については、「Istio リソースを使用してバージョンに基づいてトラフィックをルーティングする」のステップ 1 から 3 をご参照ください。
http://${GATEWAY_ADDRESS}/productpage http://${GATEWAY_ADDRESS}/api/v1/products/1 http://${GATEWAY_ADDRESS}/static/jquery.min.js
操作手順
-
ASM コンソールにログインします。左側のナビゲーションウィンドウで、 を選択します。
-
[メッシュ管理] ページで、対象の ASM インスタンス名をクリックします。左側のナビゲーションウィンドウで、 を選択します。
-
ASMSecurityPolicy ページで、Create をクリックします。
-
Create ASMSecurityPolicy ダイアログボックスで、JWT を選択し、OK をクリックします。
-
JWT Config ウィザードでパラメーターを設定し、Next をクリックします。
パラメーター
例
ASMSecurityPolicyName
test-jwt
Certification Rules
発行者
testing@secure.istio.io
JWKS Source
jwks
キー
{ "keys":[ {"e":"AQAB","kid":"DHFbpoIUqrY8t2zpA2qXfCmr5VO5ZEr4RzHU_-envvQ","kty":"RSA","n":"xAE7eB6qugXyCAG3yhh7pkDkT65pHymX-P7KfIupjf59vsdo91bSP9C8H07pSAGQO1MV_xFj9VswgsCg4R6otmg5PV2He95lZdHtOcU5DXIg_pbhLdKXbi66GlVeK6ABZOUW3WYtnNHD-91gVuoeJT_DwtGGcp4ignkgXfkiEm4sw-4sfb4qdt5oLbyVpmW6x9cfa7vs2WTfURiCrBoUqgBo_-4WTiULmmHSGZHOjzwa8WtrtOQGsAFjIbno85jp6MnGGGZPYZbDAa_b3y5u-YpW7ypZrvD8BgtKVjgtQgZhLAGezMt0ua3DRrWnKqTZ0BJ_EyxOGuHJrLsn00fnMQ"}]} -
Workload and Match Rules ページで、Add Workload Group をクリックします。New Workload Group ダイアログボックスでパラメーターを設定し、OK をクリックします。最後に、Submit をクリックします。
次の表に設定例を示します。
パラメーター
説明
Workload Group Name
値を test-policy に設定します。
Workload List
-
Add Workload をクリックします。
-
Add Workload ダイアログボックスで、Gateway Scope を選択します。
-
Select workloads セクションで、ターゲットワークロードを選択し、
アイコンをクリックして selected セクションに移動します。次に、OK をクリックします。
Match Rule List
次の Match Mode オプションが利用可能です:
-
Auth If Matched:ルールに一致するリクエストが成功するには、有効な JWT を携帯する必要があります。
-
Bypass Auth If Matched:ルールに一致するリクエストは、JWT なしでも、有効な JWT を携帯していても成功します。無効な JWT を持つリクエストは失敗します。
この例では、Match Mode を Auth If Matched に設定し、Matching Rules を Custom Matching Rules に設定し、Add Match Rule をクリックして次のルールを設定します。
-
ルール 1:Path スイッチを有効にし、その値を /static/* に設定します。
-
ルール 2:Path スイッチを有効にし、その値を /api/* に設定します。
Complete ページに、成功メッセージ ASMSecurityPolicy が正常に作成されました が表示されます。View YAML をクリックしてリソースの設定を確認するか、Complete をクリックして ASMSecurityPolicy ページに戻ります。
-
-
-
JWT 認証設定が有効であることを検証します。
-
次のコマンドを実行してアクセスをテストします。
curl -I http://${GATEWAY_ADDRESS}/productpage # 200 を返します。 curl -I http://${GATEWAY_ADDRESS}/api/v1/products/1 # 403 を返します。 curl -I http://${GATEWAY_ADDRESS}/static/jquery.min.js # 403 を返します。 # JWT を設定します。 TOKEN=eyJhbGciOiJSUzI1NiIsImtpZCI6IkRIRmJwb0lVcXJZOHQyenBBMnFYZkNtcjVWTzVaRXI0UnpIVV8tZW52dlEiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjQ2ODU5ODk3MDAsImZvbyI6ImJhciIsImlhdCI6MTUzMjM4OTcwMCwiaXNzIjoidGVzdGluZ0BzZWN1cmUuaXN0aW8iLCJzdWIiOiJ0ZXN0aW5nQHNlYcyVyZS5pc3Rpby5pbyJ9.CfNnxWP2tcnR9q0vxyxweaF3ovQYHYZl82hAUsn21bwQd9zP7c-LS9qd_vpdLG4Tn1A15NxfCjp5f7QNBUo-KC9PJqYpgGbaXhaGx7bEdFWjcwv3nZzvc7M__ZpaCERdwU7igUmJqYGBYQ51vr2njU9ZimyKkfDe3axcyiBZde7G6dabliUosJvvKOPcKIWPccCgefSj_GNfwIip3-SsFdlR7BtbVUcqR-yv-XOxJ3UcMI0tz3uMiiZcyPV7sNCU4KRnemRIMHVOfuvHsU60_GhGbiSFzgPTAa9WTltbnarTbxudb_YEOx12JiwYToeX0DCPb43W1tzIBxgm8NxUg # 次のリクエストはすべて 200 を返します。 curl -I http://${GATEWAY_ADDRESS}/productpage -H "Authorization: Bearer $TOKEN" curl -I http://${GATEWAY_ADDRESS}/api/v1/products/1 -H "Authorization: Bearer $TOKEN" curl -I http://${GATEWAY_ADDRESS}/static/jquery.min.js -H "Authorization: Bearer $TOKEN"設定ルールによると、
/apiまたは/staticで始まるパスへのリクエストが成功するには、有効な JWT を携帯する必要があります。/productpageパスへのリクエストには JWT は不要です。結果はコード内のコメントと一致しており、JWT 認証設定が有効であることが確認されます。 -
JWT 認証設定ルールを変更します。
-
ASMSecurityPolicy ページで、ターゲットの JWT 認証セキュリティポリシーを見つけ、Operator 列の edit をクリックします。
-
JWT Config ウィザードで、Next をクリックします。
-
Workload and Match Rules ページで、ターゲットのワークロードグループを見つけ、Operator 列の edit をクリックします。
-
New Workload Group ダイアログボックスでパラメーターを変更し、OK をクリックしてから、Submit をクリックします。
次の表に設定例を示します。
パラメーター
説明
Match Mode
Bypass Auth If Matched を選択します。
Matching Rules
/api/*の一致ルールを削除し、/static/*の一致ルールのみを保持します。
-
-
次のコマンドを実行して、変更された JWT 認証設定が有効であることを検証します。
curl -I http://${GATEWAY_ADDRESS}/productpage # 403 を返します。 curl -I http://${GATEWAY_ADDRESS}/api/v1/products/1 # 403 を返します。 curl -I http://${GATEWAY_ADDRESS}/static/jquery.min.js # 200 を返します。 # JWT を設定します。 TOKEN=eyJhbGciOiJSUzI1NiIsImtpZCI6IkRIRmJwb0lVcXJZOHQyenBBMnFYZkNtcjVWTzVaRXI0UnpIVV8tZW52dlEiLCJ0eXAiOiJKV1QifQ.eyJleHAiOjQ2ODU5ODk3MDAsImZvbyI6ImJhciIsImlhdCI6MTUzMjM4OTcwMCwiaXNzIjoidGVzdGluZ0BzZWN1cmUuaXN0aW8uaW8iLCJzdWIiOiJ0ZXN0aW5nQHNlY3VyZS5pc3Rpby5pbyJ9.CfNnxWP2tcnR9q0vxyxweaF3ovQYHYZl82hAUsn21bwQd9zP7c-LS9qd_vpdLG4Tn1A15NxfCjp5f7QNBUo-KC9PJqYpgGbaXhaGx7bEdFWjcwv3nZzvc7M__ZpaCERdwU7igUmJqYGBYQ51vr2njU9ZimyKkfDe3axcyiBZde7G6dabliUosJvvKOPcKIWPccCgefSj_GNfwIip3-SsFdlR7BtbVUcqR-yv-XOxJ3UcMI0tz3uMiiZcyPV7sNCU4KRnemRIMHVOfuvHsU60_GhGbiSFzgPTAa9WTltbnarTbxudb_YEOx12JiwYToeX0DCPb43W1tzIBxgm8NxUg # 次のリクエストはすべて 200 を返します。 curl -I http://${GATEWAY_ADDRESS}/productpage -H "Authorization: Bearer $TOKEN" curl -I http://${GATEWAY_ADDRESS}/api/v1/products/1 -H "Authorization: Bearer $TOKEN" curl -I http://${GATEWAY_ADDRESS}/static/jquery.min.js -H "Authorization: Bearer $TOKEN"変更された設定ルールによると、
/staticで始まるパスへのリクエストは、JWT なしでも、有効な JWT を携帯していても成功します。他のすべてのリクエストが成功するには、有効な JWT を携帯する必要があります。結果はコード内のコメントと一致しており、変更された JWT 認証設定が有効であることが確認されます。
-
関連ドキュメント
-
ASMSecurityPolicy の概念と機能の詳細については、「ASMSecurityPolicy の概要」をご参照ください。
-
メッシュ監査機能を有効にして、ユーザー操作を追跡できます。また、リソース操作に対する監査アラートを設定して、重要なリソースの変更を連絡先に迅速に通知することもできます。詳細については、「KubeAPI 操作監査の使用」および「メッシュリソース操作の監査アラートの設定」をご参照ください。