すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:ASMイングレスゲートウェイでのmTLSサービスの設定と特定のクライアントアクセスの制限

最終更新日:Jan 13, 2025

ASM ゲートウェイは、外部 mTLS サービスをサポートしています。 mTLS プロトコルでは、クライアントはユーザーID情報を含む証明書を提示する必要があります。 承認ポリシーを設定して特定のユーザーへのアクセスを制限し、サービスの保護を強化できます。 このトピックでは、ASMイングレスゲートウェイでmTLSサービスを設定し、承認ポリシーによってアクセスを制限する方法について説明します。

前提条件

ステップ 1:mTLS通信証明書の生成

説明

証明書を作成する際に、証明書情報を入力する必要がある場合は、デフォルト値を使用してください。 これらのデフォルト値は、設定ファイルに事前設定されています。

  1. ルート証明書を生成するために、次の内容で ca.cnf ファイルを作成します。

    展開して CNF ファイルの内容を表示

    HOME = .`
    RANDFILE = $ENV::HOME/.rnd
    ####################################################################
    [ ca ]
    default_ca = CA_default # デフォルトのCAセクション
    [ CA_default ]
    default_days = 1000 # 証明書の有効期間
    default_crl_days = 30 # 次のCRLまでの期間
    default_md = sha256 # 公開鍵のデフォルトMDを使用
    preserve = no # 渡されたDNの順序を保持しない
    x509_extensions = ca_extensions # 証明書に追加する拡張機能
    email_in_dn = no # DNにメールを連結しない
    copy_extensions = copy # CSRから証明書にSANをコピーするために必要
    
    #====以下の7行は、他の証明書への署名用であり、CA証明書の作成用ではありません。====
    base_dir = .
    certificate = $base_dir/cacert.pem # CA証明書
    private_key = $base_dir/cakey.pem # CA秘密鍵
    new_certs_dir = $base_dir # 署名後の新しい証明書の場所
    database = $base_dir/index.txt # データベースインデックスファイル
    serial = $base_dir/serial.txt # 現在のシリアル番号
    unique_subject = no # 同じサブジェクトを持つ複数の証明書の作成を許可するために「no」に設定
    
    ####################################################################
    [ req ]
    default_bits = 4096
    default_keyfile = cakey.pem
    distinguished_name = ca_distinguished_name
    x509_extensions = ca_extensions
    string_mask = utf8only
    ####################################################################
    [ ca_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-asm
    organizationalUnitName = Organizational Unit (eg, division)
    organizationalUnitName_default = R&D
    commonName = Common Name (e.g. server FQDN or YOUR name)
    commonName_default = Test CA
    emailAddress = Email Address
    emailAddress_default = test@example.com
    ####################################################################
    [ ca_extensions ]
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid:always, issuer
    basicConstraints = critical, CA:true
    keyUsage = keyCertSign, cRLSign
    
    
    #====以下のすべての行は、他の証明書への署名用であり、CA証明書の作成用ではありません。======
    
    ####################################################################
    [ signing_policy ]
    countryName = optional
    stateOrProvinceName = optional
    localityName = optional
    organizationName = optional
    organizationalUnitName = optional
    commonName = supplied
    emailAddress = optional
    ####################################################################
    [ signing_req ]
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    basicConstraints = CA:FALSE
    keyUsage = digitalSignature, keyEncipherment
  2. 次のコマンドを実行して、ルート証明書を生成します。

    openssl req -x509 -config ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEM

    このコマンドは、cacert.pem ファイルと cakey.pem ファイルを生成します。

  3. サーバー証明書を生成するために、次の内容で 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
  4. サーバー証明書を生成するために、次のコマンドを順番に実行します。

    openssl req -config server.cnf -newkey rsa:2048 -sha256 -nodes -out server.csr -outform PEM
    touch index.txt
    echo '01' > serial.txt
    openssl ca -config ca.cnf -policy signing_policy -extensions signing_req -out servercert.pem -infiles server.csr

    これらのコマンドは、servercert.pem ファイルと serverkey.pem ファイルを生成します。

  5. クライアント証明書を生成するために、次の内容で 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

    クライアント証明書の CommonNametest.client で、新しいフィールド URI.1 = spiffe://test.client を Subject Alternative Name(SAN)情報に追加する必要があります。 spiffe:// 接頭辞は、ASM 承認ポリシーの principals フィールドが spiffe:// の後の部分と一致するため、必須です。

  6. クライアント証明書を生成するために、次のコマンドを順番に実行します。

    openssl req -config client.cnf -newkey rsa:2048 -sha256 -nodes -out clientcert.csr -outform PEM
    openssl ca -config ca.cnf -policy signing_policy -extensions signing_req -out clientcert.pem -infiles clientcert.csr

    これらのコマンドは、clientcert.pem ファイルと client.key.pem ファイルを生成します。

  7. 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 サービスにアクセスできるようにします。

  1. 次の内容でゲートウェイルールを更新します。

    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
  2. クライアント証明書を使用して 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 アクセスを制限する

  1. 次の内容で承認ポリシーをデプロイして、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
  2. クライアント証明書を使用して /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
  3. クライアント証明書を使用して /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%
  4. サーバー証明書を使用して /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 ]=-
    
           _...._
         .'  _ _ `.
        | ."` ^ `". _,
        \_;`"---"`|//
          |       ;/
          \_     _/
            `"""`