相互認証

サーバー認証の実装に加えて、相互(クライアントおよびサーバー)認証を実装することもできます。クライアント認証によって、コントローラは、承認および検証されたエージェントのみが接続を確立できることを保証できます。以下の手順に、相互認証を実装するためのワークフローの概略を示します。

はじめに

  • 以下のエージェントはクライアント認証をサポートします。
    • Javaエージェント
    • データベースエージェント
    • マシンエージェント
    • Windows 用の .NET エージェント

      注: Azure App Services などの Azure PaaS 環境を除きます。
  • 最初に 1 つのエージェントでクライアント認証をセットアップして検証することをお勧めします。そのエージェントに対してクライアント認証が機能することを確認した後、追加のエージェントの構成を続行します。
  • 一部のエージェントに対してはサーバ認証のみ、その他に対してはサーバ認証およびクライアント認証を行う「ハイブリッド」環境では、Glassfish で複数の HTTP リスナーをセットアップおよび構成し、1 つはサーバ認証のみ、もう 1 つはサーバ認証とクライアント認証の両方を行うこともできます。
  • このページで説明されている以下の手順では、キーストアのデフォルトキーおよびキーストアパスワード(changeit)を使用します。

    1. コントローラ SSL と証明書」の「キーストアパスワードの変更」の説明に従って、このデフォルトパスワードを変更します。
    2. これらの手順を実行する場合は新しいパスワードを使用します。
  • 以下の手順でプレーンテキストのパスワードを使用する代わりに、「エージェントのログイン情報の暗号化」の説明に従って、暗号化されたパスワードを指定できます。

エージェントでのサーバー認証のセットアップ

エージェントでサーバー認証を確立するには、コントローラの証明書に署名した機関のルート証明書を含むエージェントトラストストアを作成する必要があります。

承認されたエージェントごとに、次の手順を実行します。

  1. 次のいずれかのルート証明書を取得します。
    • オンプレミスコントローラの証明書に署名したパブリック認証局(CA)のルート証明書。
    • オンプレミスコントローラのコントローラ証明書に署名した内部 CA のルート証明書。
  2. Java keytool コマンドを実行して、エージェントトラストストアを作成します。
    keytool -import -alias rootCA -file /usr/home/appdynamics/DigicertGlobalRootCA.pem -keystore cacerts.jks -storepass MySecurePassnword
    例:
    keytool -import -alias rootCA -file /usr/home/appdynamics/DigicertGlobalRootCA.pem -keystore cacerts.jks -storepass MySecurePassnword
    注: トラストストアのパスワードをメモします。これは、後で承認されたエージェントを設定するために必要になります。
  3. エージェントのトラストストアをエージェント構成ディレクトリにインストールします。
    <authorized_agent_home>/conf/
  4. 承認されたエージェントごとに、<agent-home>/conf/controller-info.xml ファイルの以下のプロパティを次のように指定します。
    • <controller-ssl-enabled>true</controller-ssl-enabled>
    • <controller-port>8181</controller-port>
    • <controller-keystore-filename>cacerts.jks</controller-keystore-filename>
    • <controller-keystore-password>MySecurePassnword</controller-keystore-password>

エージェントでのクライアントキーストアのセットアップ

次の手順を実行して、署名済み証明書を作成してクライアントキーストアにインポートします。以下の手順ではコントローラを使用して証明書に署名しますが、サードパーティ認証局(CA)を使用することもできます。

  1. 新しいキーストアに新しいキーペアを作成するには、次のように入力します。
    <java-home>/bin/keytool -genkey -alias client-alias -keyalg RSA \
    -keystore clientkeystore.jks \
    -storepass changeit \
    -keypass changeit
    キーツールは、キーを生成するために必要な名前、組織、およびその他の情報を要求します。Splunk AppDynamics のアプリケーション エージェントは、デフォルト キーストア ファクトリ アルゴリズムとして SunX509 を使用します。環境内のキーストアで SunX509 以外を使用している場合は、アプリケーション エージェントにアルゴリズムを指定する必要があります。これを行うには、システムプロパティ appdynamics.agent.ssl.keymanager.factory.algorithm を使用します。たとえば、アルゴリズムを PKIX に設定するには、エージェントでモニタリングされる JVM の起動コマンドに以下を追加します。
    -Dappdynamics.agent.ssl.keymanager.factory.algorithm=PKIX
  2. 証明機関(CA)が署名できる証明書署名要求(client.csr)を生成します。
    <java-home>/bin/keytool -certreq -v -alias client-alias -file client.csr \
    -keystore clientkeystore.jks \
    -storepass changeit \
    -keypass changeit
  3. 信頼できる CA が署名した要求(client.csr)を取得します。以下のコマンドはコントローラを CA として使用し、コントローラが署名した証明書が含まれた新しいファイル(signedClient.cer)を作成します。
    <java-home>/bin/keytool -gencert -infile ./client.csr -outfile signedClient.cer -alias s1as \
    -keystore ./keystore.jks \
    -storepass changeit \
    -keypass changeit
  4. (オプション)署名済み証明書に関する情報を表示するには、以下のコマンドを入力します。
    <java-home>/bin/keytool -printcert -v -file ./signedClient.cer
  5. オプションclientkeystore.jks の内容を表示するには、以下のコマンドを入力します。
    <java-home>/bin/keytool -list -v -keystore clientkeystore.jks -storepass changeit
    キーストアには、client-alias(未署名)のエントリが表示されます。
  6. 署名された公開鍵証明書をクライアントキーストアにインポートします。このコマンドは、signedClient.cerclientkeystore.jks にインポートします。
    <java-home>/bin/keytool -importcert -v -alias client-alias -file ./signedClient.cer \
    -keystore clientkeystore.jks \
    -storepass changeit \
    -keypass changeit
    これで、コントローラの認証を検証する署名付き証明書によってパスワード保護された clientkeystore.jks ファイルがエージェント上に追加されました。
  7. 「Failed to establish chain from reply」というエラーが表示された場合は、発行元の認証局のルートと中間証明書をクライアントキーストアにインストールします。ルートCAチェーンは、証明書のCA署名の有効性を確立します。ほとんどの一般的なルートCAチェーンはバンドルされたJVMのトラストストアに含まれていますが、プライベートCAに属する証明書などは、追加でルート証明書のインポートが必要になる場合があります。インポートを行うには以下を実行します。
    <java-home>/bin/keytool -import -alias [Any_alias] -file <path_to_root_or_intermediate_cert> -keystore clientkeystore.jks -storepass changeit
  8. コントローラ上の信頼できるルート証明書に署名認証局の公開キーが含まれていることを確認します。この手順では、コントローラを認証局として使用しているため、公開鍵はすでに含まれています。検証するには、以下のとおり入力します。署名認証局の公開キーがエージェントの公開キー証明書に含まれるようになりました。
    <java-home>/bin/keytool -list -v -alias client-alias \
    -keystore clientkeystore.jks -storepass changeit
    署名認証局の公開キーがエージェントの公開キー証明書に含まれるようになりました。

クライアントキーストアにアクセスするためのエージェントの構成

承認されたエージェントごとに、次の手順を実行します。

  1. エージェントの以下のディレクトリに、生成された clientkeystore.jks ファイルをコピーします。
    • データベースエージェント:<database agent home>/conf
    • Java エージェント:<java-agent-home>/conf
    • マシンエージェント:<machine-agent-home>
  2. <agent-home>/conf/controller-info.xml ファイルで以下のプロパティを次のように指定します。
    • <use-ssl-client-auth>true</use-ssl-client-auth>
    • <asymmetric-keystore-filename>clientkeystore.jks</asymmetric-keystore-filename>
    • <asymmetric-keystore-password>changeit</asymmetric-keystore-password>
    • <asymmetric-key-password>changeit</asymmetric-key-password>
    • <asymmetric-key-alias>client-alias</asymmetric-key-alias>

コントローラでのクライアント認証の有効化

  1. 次のいずれかのルート証明書を取得します。
    • 承認されたエージェントであるクライアントの証明書に署名した、パブリック認証局(CA)のルート証明書。

    • 承認されたエージェントのクライアント証明書に署名した内部 CA のルート証明書。
  2. Java keytool を実行します。次に例を示します。
    <java-home>/bin/keytool -import -alias rootCA -file <root_certificate_file_name> -keystore <controller_home>/appserver/jetty/etc/cacerts.jks -storepass <truststore_password>
    例:
    keytool -import -alias rootCA -file /usr/home/appdynamics/DigicertGlobalRootCA.pem -keystore /opt/appdynamics/platform/product/controller/appserver/jetty/etc/cacerts.jks -storepass MySecurePassnword
  3. コントローラを再起動します。