ASM ゲートウェイは、外部 mTLS サービスをサポートしています。 mTLS プロトコルでは、クライアントはユーザーID情報を含む証明書を提示する必要があります。 承認ポリシーを設定して特定のユーザーへのアクセスを制限し、サービスの保護を強化できます。 このトピックでは、ASMイングレスゲートウェイでmTLSサービスを設定し、承認ポリシーによってアクセスを制限する方法について説明します。
前提条件
自動サイドカーインジェクションが有効になっています。 詳細については、サイドカープロキシインジェクションポリシーの設定をご参照ください。
イングレスゲートウェイとHTTPBin アプリケーションがデプロイされており、イングレスゲートウェイでポート 443 が有効になっています。 詳細については、HTTPBin アプリケーションのデプロイをご参照ください。
ステップ 1:mTLS通信証明書の生成
証明書を作成する際に、証明書情報を入力する必要がある場合は、デフォルト値を使用してください。 これらのデフォルト値は、設定ファイルに事前設定されています。
ルート証明書を生成するために、次の内容で ca.cnf ファイルを作成します。
次のコマンドを実行して、ルート証明書を生成します。
openssl req -x509 -config ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEMこのコマンドは、
cacert.pemファイルとcakey.pemファイルを生成します。サーバー証明書を生成するために、次の内容で server.cnf ファイルを作成します。
HOME = . RANDFILE = $ENV::HOME/.rnd #################################################################### [ req ] default_bits = 2048 default_keyfile = serverkey.pem distinguished_name = server_distinguished_name req_extensions = server_req_extensions string_mask = utf8only #################################################################### [ server_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = CN stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = bj localityName = Locality Name (eg, city) localityName_default = bj organizationName = Organization Name (eg, company) organizationName_default = test commonName = Common Name (e.g. server FQDN or YOUR name) commonName_default = test.com emailAddress = Email Address emailAddress_default = test@example.com #################################################################### [ server_req_extensions ] subjectKeyIdentifier = hash basicConstraints = CA:FALSE keyUsage = digitalSignature, keyEncipherment subjectAltName = @alternate_names nsComment = "OpenSSL Generated Certificate" #################################################################### [ alternate_names ] DNS.1 = test.comサーバー証明書を生成するために、次のコマンドを順番に実行します。
openssl req -config server.cnf -newkey rsa:2048 -sha256 -nodes -out server.csr -outform PEMtouch index.txt echo '01' > serial.txtopenssl ca -config ca.cnf -policy signing_policy -extensions signing_req -out servercert.pem -infiles server.csrこれらのコマンドは、
servercert.pemファイルとserverkey.pemファイルを生成します。クライアント証明書を生成するために、次の内容で client.cnf ファイルを作成します。
HOME = . RANDFILE = $ENV::HOME/.rnd #################################################################### [ req ] default_bits = 2048 default_keyfile = client.key.pem distinguished_name = server_distinguished_name req_extensions = server_req_extensions string_mask = utf8only #################################################################### [ server_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = CN stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = bj localityName = Locality Name (eg, city) localityName_default = bj organizationName = Organization Name (eg, company) organizationName_default = test.client commonName = Common Name (e.g. server FQDN or YOUR name) commonName_default = test.client emailAddress = Email Address emailAddress_default = test.client@example.com #################################################################### [ server_req_extensions ] subjectKeyIdentifier = hash basicConstraints = CA:FALSE keyUsage = digitalSignature, keyEncipherment subjectAltName = @alternate_names nsComment = "OpenSSL Generated Certificate" #################################################################### [ alternate_names ] URI.1 = spiffe://test.clientクライアント証明書の
CommonNameはtest.clientで、新しいフィールドURI.1 = spiffe://test.clientを Subject Alternative Name(SAN)情報に追加する必要があります。spiffe://接頭辞は、ASM 承認ポリシーのprincipalsフィールドがspiffe://の後の部分と一致するため、必須です。クライアント証明書を生成するために、次のコマンドを順番に実行します。
openssl req -config client.cnf -newkey rsa:2048 -sha256 -nodes -out clientcert.csr -outform PEMopenssl ca -config ca.cnf -policy signing_policy -extensions signing_req -out clientcert.pem -infiles clientcert.csrこれらのコマンドは、
clientcert.pemファイルとclient.key.pemファイルを生成します。ASM の証明書管理機能を使用して、mTLS 証明書をインポートします。 インポートされた証明書名が
test.comであることを確認します。 詳細については、ASM の証明書管理機能の使用をご参照ください。kubectl を使用して、シークレットを直接作成して証明書をインポートすることもできます。 データプレーンクラスターの kubeconfig を使用して、次のコマンドを実行します。
kubectl create -n istio-system secret generic test.com \ --from-file=tls.key=serverkey.pem \ --from-file=tls.crt=servercert.pem \ --from-file=ca.crt=cacert.pem
ステップ 2:ゲートウェイのポート 443 で mTLS リスナーを設定する
ASM ゲートウェイのポート 443 で mTLS リスナーを設定し、外部クライアントが mTLS 経由で HTTPBin サービスにアクセスできるようにします。
次の内容でゲートウェイルールを更新します。
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: httpbin namespace: default spec: selector: istio: ingressgateway servers: - hosts: - '*' port: name: test number: 80 protocol: HTTP - hosts: - test.com port: number: 443 name: https protocol: HTTPS tls: mode: MUTUAL credentialName: test.comクライアント証明書を使用して HTTPBin サービスにアクセスするには、次のコマンドを実行します。
curl --header "host:test.com" --resolve "test.com:443:${ASM gateway IP}" --cacert cacert.pem --cert clientcert.pem --key client.key.pem https://test.com/status/200 -I予期される出力:
HTTP/2 200 server: istio-envoy date: Sun, 28 Jul 2024 7:30:30 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 6
ステップ 3:承認ポリシーを設定して test.client アクセスを制限する
次の内容で承認ポリシーをデプロイして、test.client が HTTPBin アプリケーションの
/status/418パスにアクセスできないように制限します。 詳細については、HTTPリクエストの承認ポリシーの設定をご参照ください。apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: test namespace: istio-system spec: action: DENY rules: - from: - source: principals: - test.client to: - operation: paths: - /status/418 selector: matchLabels: istio: ingressgatewayクライアント証明書を使用して
/status/200パスにアクセスするには、次のコマンドを実行します。curl --header "host:test.com" --resolve "test.com:443:${ASM gateway IP}" --cacert cacert.pem --cert clientcert.pem --key client.key.pem https://test.com/status/200 -I予期される出力:
HTTP/2 200 server: istio-envoy date: Sun, 28 Jul 2024 7:33:30 GMT content-type: text/html; charset=utf-8 access-control-allow-origin: * access-control-allow-credentials: true content-length: 0 x-envoy-upstream-service-time: 6クライアント証明書を使用して
/status/418パスにアクセスするには、次のコマンドを実行します。curl --header "host:test.com" --resolve "test.com:443:${ASM gateway IP}" --cacert cacert.pem --cert clientcert.pem --key client.key.pem https://test.com/status/418予期される出力:
RBAC: access denied%サーバー証明書を使用して
/status/418パスにアクセスするには、次のコマンドを実行します。curl --header "host:test.com" --resolve "test.com:443:${ASM gateway IP}" --cacert cacert.pem --cert servercert.pem --key serverkey.pem https://test.com/status/418予期される出力:
-=[ teapot ]=- _...._ .' _ _ `. | ."` ^ `". _, \_;`"---"`|// | ;/ \_ _/ `"""`