TLS 1.0 および TLS 1.1 には既知の脆弱性があり、HTTPS トラフィックが中間者攻撃やデータ侵害にさらされる可能性があります。これらのリスクを軽減するために、Service Mesh (ASM) イングレスゲートウェイで TLS 1.2 以降を強制するように設定します。また、TLS 1.2 の脆弱な暗号スイートを無効にする必要もあります。
前提条件
開始する前に、次のものが揃っていることを確認してください:
v1.14 以降の Enterprise Edition または Ultimate Edition の Service Mesh (ASM) インスタンス。詳細については、「ASM インスタンスの作成」および「ASM インスタンスの更新」をご参照ください。
ASM インスタンスに追加されたクラスターです。詳細については、「ASM インスタンスにクラスターを追加する」をご参照ください。
クラスターにデプロイされたイングレスゲートウェイ。詳細については、「イングレスゲートウェイの作成」をご参照ください。
ASM インスタンスにデプロイされたアプリケーションです。詳細については、「ASM インスタンスにアプリケーションをデプロイする」をご参照ください。
ステップ 1: TLS 証明書と秘密鍵の準備
イングレスゲートウェイ用の TLS 証明書と秘密鍵を作成または取得し、ゲートウェイが参照できる認証情報として保存します。
この例では、aliyun.com ドメインを使用します。このドメインの証明書と秘密鍵がすでにある場合は、それぞれ aliyun.com.crt と aliyun.com.key に名前を変更します。ない場合は、次の openssl コマンドで自己署名証明書を生成します。
自己署名証明書の生成
ルート証明書と秘密鍵の作成:
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 \ -subj '/O=myexample Inc./CN=aliyun.com' \ -keyout aliyun.root.key -out aliyun.root.crtaliyun.comのサーバー証明書と秘密鍵の作成:openssl req -out aliyun.com.csr -newkey rsa:2048 -nodes \ -keyout aliyun.com.key -subj "/CN=aliyun.com/O=myexample organization" openssl x509 -req -days 365 -CA aliyun.root.crt -CAkey aliyun.root.key \ -set_serial 0 -in aliyun.com.csr -out aliyun.com.crt
証明書の保存
ご利用の ASM インスタンスのバージョンに基づいて、次のいずれかの方法を選択します。
v1.17 より前の ASM バージョン
kubectl を使用してイングレスゲートウェイの Pod が実行されているクラスターに接続し、istio-system 名前空間にシークレットを作成します:
kubectl create -n istio-system secret tls myexample-credential \
--key=aliyun.com.key --cert=aliyun.com.crtシークレット名は istio または prometheus で始めることはできず、token フィールドを含めることはできません。
ASM v1.17 以降
ASM コンソールにログインします。左側のナビゲーションウィンドウで、[Service Mesh] > [メッシュ管理] を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。左側のナビゲーションウィンドウで、[ASM ゲートウェイ] > [証明書管理] を選択します。
[証明書管理] ページで、[作成] をクリックします。[証明書情報] パネルで、次のパラメーターを設定し、[OK] をクリックします。
パラメーター 説明 名前 証明書名を入力します。この例では、 myexample-credentialと入力します。公開鍵証明書 ステップ 1 で生成された aliyun.com.crtファイルの内容を入力します。秘密鍵 ステップ 1 で生成された aliyun.com.keyファイルの内容を入力します。
ステップ 2: TLS バージョンポリシーを持つ Istio ゲートウェイの作成
最小 TLS バージョンを強制する Istio ゲートウェイリソースを定義します。minProtocolVersion フィールドは、ゲートウェイが受け入れる TLS バージョンを制御します。
ASM インスタンスの左側のナビゲーションウィンドウで、[ASM ゲートウェイ] > [ゲートウェイ] を選択します。[YAML から作成] をクリックします。
名前空間とシナリオテンプレートを選択し、次の YAML を貼り付けます。この設定では、
minProtocolVersionがTLSV1_2に設定され、TLS 1.2 および TLS 1.3 の接続を受け入れ、それより古いバージョンはすべて拒否します。minProtocolVersionフィールドは、受け入れられる最小バージョンを制御します。サポートされている値は次のとおりです:値 効果 TLSV1_0TLS 1.0 以降を受け入れます (非推奨 -- 重大なセキュリティリスクあり) TLSV1_1TLS 1.1 以降を受け入れます (非推奨) TLSV1_2TLS 1.2 以降を受け入れます (推奨ベースライン) TLSV1_3TLS 1.3 のみを受け入れます apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: mysdsgateway spec: selector: istio: ingressgateway servers: - hosts: - '*' port: name: https number: 443 protocol: HTTPS tls: credentialName: myexample-credential minProtocolVersion: TLSV1_2 mode: SIMPLE
ステップ 3: 仮想サービスの作成
VirtualService リソースを作成して、ゲートウェイからアプリケーションにトラフィックをルーティングします。
ASM インスタンスの左側のナビゲーションウィンドウで、[トラフィック管理センター] > [VirtualService] を選択します。[YAML から作成] をクリックします。
名前空間とシナリオテンプレートを選択し、次の YAML を貼り付けます:
apiVersion: networking.istio.io/v1beta1 kind: VirtualService metadata: name: bookinfo-tlsversion-sample spec: gateways: - mysdsgateway-tlsversion-sample hosts: - '*' http: - match: - uri: exact: /productpage - uri: prefix: /static - uri: exact: /login - uri: exact: /logout - uri: prefix: /api/v1/products route: - destination: host: productpage port: number: 9080
ステップ 4: TLS バージョンの検証
ゲートウェイと仮想サービスをデプロイした後、意図した TLS バージョンのみが受け入れられることを確認します。testssl.sh は、サーバーが特定の TLS/SSL プロトコルをサポートしているかどうかを確認し、暗号化の欠陥を特定できる無料のコマンドラインツールです。
次のコマンドを実行して、Docker コンテナで testssl.sh を実行します。
<ingress-gateway-ip>をイングレスゲートウェイの IP アドレスに置き換えます。docker run --rm -ti registry.cn-hangzhou.aliyuncs.com/acs/testssl.sh \ https://<ingress-gateway-ip>/productpageTLS 1.2 以降の場合に期待されるプロトコルの出力:
Testing protocols via sockets except NPN+ALPN SSLv2 not offered (OK) SSLv3 not offered (OK) TLS 1 not offered TLS 1.1 not offered TLS 1.2 offered (OK) TLS 1.3 offered (OK): finalnot offeredが TLS 1 および TLS 1.1 に対して表示されることは、これらのバージョンが無効になっていることを示しています。offeredが TLS 1.2 および TLS 1.3 に対して表示されることは、これらのバージョンがアクティブであることを示しています。クライアントシミュレーションのセクションには、クライアントごとの接続結果が表示されます:
クライアントシミュレーションの結果は、TLS 1.2 以降をサポートするクライアントのみが接続を確立できることを示しています。
(オプション) 特定の TLS バージョンへの固定
一部のコンプライアンスポリシーでは、ある範囲のバージョンを受け入れるのではなく、ゲートウェイを単一の TLS バージョンに制限する必要があります。規制またはセキュリティ要件で義務付けられている場合にのみ、次の設定を適用してください。
TLS 1.2 のみ
minProtocolVersion と maxProtocolVersion の両方を TLSV1_2 に設定します:
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: mysdsgateway
namespace: default
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- '*'
port:
name: https
number: 443
protocol: HTTPS
tls:
credentialName: myexample-credential
maxProtocolVersion: TLSV1_2
minProtocolVersion: TLSV1_2
mode: SIMPLEこの設定を適用した後、次のコマンドを実行して、TLS 1.2 のみがサポートされていることを確認します:
docker run --rm -ti registry.cn-hangzhou.aliyuncs.com/acs/testssl.sh \
https://<ingress-gateway-ip>/productpage期待される出力:
Testing protocols via sockets except NPN+ALPN
SSLv2 not offered (OK)
SSLv3 not offered (OK)
TLS 1 not offered
TLS 1.1 not offered
TLS 1.2 offered (OK)
TLS 1.3 not offered and downgraded to a weaker protocolTLS 1 および TLS 1.1 の not offered、そして TLS 1.3 の not offered and downgraded to a weaker protocol は、TLS 1.2 のみが受け入れられることを示しています。
クライアントシミュレーションの出力:
クライアントシミュレーションの結果は、TLS 1.2 をサポートするクライアントのみが接続を確立できることを示しています。
TLS 1.2 に固定すると、パフォーマンスが向上し、セキュリティが強化された TLS 1.3 が無効になります。特定のコンプライアンス要件で TLS 1.2 のみが必須とされている場合にのみ、この設定を使用してください。
TLS 1.3 のみ
minProtocolVersion と maxProtocolVersion の両方を TLSV1_3 に設定します:
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: mysdsgateway
namespace: default
spec:
selector:
istio: ingressgateway
servers:
- hosts:
- '*'
port:
name: https
number: 443
protocol: HTTPS
tls:
credentialName: myexample-credential
maxProtocolVersion: TLSV1_3
minProtocolVersion: TLSV1_3
mode: SIMPLEこの設定を適用した後、次のコマンドを実行して、TLS 1.3 のみがサポートされていることを確認します:
docker run --rm -ti registry.cn-hangzhou.aliyuncs.com/acs/testssl.sh \
https://<ingress-gateway-ip>/productpage期待される出力:
Testing protocols via sockets except NPN+ALPN
SSLv2 not offered (OK)
SSLv3 not offered (OK)
TLS 1 not offered
TLS 1.1 not offered
TLS 1.2 not offered
TLS 1.3 offered (OK): finalTLS 1.0、TLS 1.1、および TLS 1.2 の not offered は、TLS 1.3 のみが受け入れられることを示しています。
クライアントシミュレーションの出力:
クライアントシミュレーションの結果は、TLS 1.3 をサポートするクライアントのみが接続を確立できることを示しています。
TLS 1.3 のみのモードは、Android 6.0~8.1、IE 11 (Win 7/8.1)、Java 8、LibreSSL 2.8、および 1.1.1 より前の OpenSSL バージョンを含む古いクライアントからの接続を中断させます。本番環境でこのモードを有効にする前に、クライアントの互換性を評価してください。