Elastic Stackの基本的なセキュリティを設定する

Elasticsearchを初めて起動すると、elasticユーザーのためにパスワードが生成され、TLSが自動的に構成されます。Elasticsearchノードを起動する前にセキュリティを手動で構成した場合、自動構成プロセスはあなたのセキュリティ構成を尊重します。ノード証明書を更新するなど、TLS構成をいつでも調整できます。

クラスターに複数のノードがある場合、ノード間でTLSを構成する必要があります。プロダクションモードのクラスターは、TLSを有効にしないと起動しません。

トランスポート層は、ノードの暗号化と認証のために相互TLSに依存しています。TLSを正しく適用することで、悪意のあるノードがクラスターに参加し、他のノードとデータを交換することを防ぎます。HTTP層でのユーザー名とパスワード認証を実装することは、ローカルクラスターのセキュリティに役立ちますが、ノード間の通信のセキュリティにはTLSが必要です。

ノード間でTLSを構成することは、無許可のノードがクラスターにアクセスするのを防ぐための基本的なセキュリティ設定です。

トランスポートコンテキストの理解

トランスポート層セキュリティ(TLS)は、ネットワーク通信にセキュリティ制御(暗号化など)を適用するための業界標準プロトコルの名前です。TLSは、以前はセキュアソケットレイヤー(SSL)と呼ばれていたものの現代的な名前です。Elasticsearchのドキュメントでは、TLSとSSLの用語が互換的に使用されています。

トランスポートプロトコルは、Elasticsearchノードが互いに通信するために使用するプロトコルの名前です。この名前はElasticsearchに特有で、トランスポートポート(デフォルト9300)とHTTPポート(デフォルト9200)を区別します。ノードはトランスポートポートを使用して互いに通信し、RESTクライアントはHTTPポートを使用してElasticsearchと通信します。

transportという言葉は両方の文脈に現れますが、異なる意味を持ちます。ElasticsearchのトランスポートポートとHTTPポートの両方にTLSを適用することが可能です。これらの重複する用語が混乱を招く可能性があるため、明確にするために、このシナリオではElasticsearchのトランスポートポートにTLSを適用しています。次のシナリオでは、ElasticsearchのHTTPポートにTLSを適用します。

証明書機関を生成する

クラスターに任意の数のノードを追加できますが、ノード同士が通信できる必要があります。クラスター内のノード間の通信はトランスポートモジュールによって処理されます。クラスターを保護するためには、ノード間の通信が暗号化され、検証されていることを確認する必要があります。これは相互TLSによって実現されます。

セキュアなクラスターでは、Elasticsearchノードは他のノードと通信する際に自分自身を識別するために証明書を使用します。

クラスターはこれらの証明書の真正性を検証する必要があります。推奨されるアプローチは、特定の証明書機関(CA)を信頼することです。ノードがクラスターに追加されるとき、同じCAによって署名された証明書を使用する必要があります。

トランスポート層には、既存の共有CAではなく、別の専用CAを使用することをお勧めします。これにより、ノードのメンバーシップが厳密に制御されます。elasticsearch-certutilツールを使用して、クラスター用のCAを生成します。

  • 1. Elasticsearchを起動する前に、任意の単一ノードでelasticsearch-certutilツールを使用して、クラスター用のCAを生成します。

シェル

  1. ./bin/elasticsearch-certutil ca
  • 1.1. プロンプトが表示されたら、デフォルトのファイル名であるelastic-stack-ca.p12を受け入れます。このファイルには、CAの公開証明書と各ノードの証明書に署名するために使用される秘密鍵が含まれています。
    • 1.2. CAのパスワードを入力します。プロダクション環境にデプロイしない場合は、パスワードを空白のままにすることもできます。
  • 2. 任意の単一ノードで、クラスター内のノード用の証明書と秘密鍵を生成します。前のステップで生成したelastic-stack-ca.p12出力ファイルを含めます。

シェル

  1. ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
  • --ca <ca_file>
    • 証明書に署名するために使用されるCAファイルの名前。elasticsearch-certutilツールのデフォルトファイル名はelastic-stack-ca.p12です。
    • 前のステップで設定しなかった場合は、CAのパスワードを入力するか、Enterを押します。
    • 証明書のパスワードを作成し、デフォルトのファイル名を受け入れます。
      出力ファイルはelastic-certificates.p12という名前のキーストアです。このファイルには、ノード証明書、ノードキー、およびCA証明書が含まれています。
  • 3. クラスター内のすべてのノードで、elastic-certificates.p12ファイルを$ES_PATH_CONFディレクトリにコピーします。

TLSでノード間通信を暗号化する

トランスポートネットワーキング層は、クラスター内のノード間の内部通信に使用されます。セキュリティ機能が有効になっている場合、ノード間の通信が暗号化されることを保証するためにTLSを使用する必要があります。

証明書機関と証明書を生成したので、これらのファイルを使用するようにクラスターを更新します。

Elasticsearchは、TLS関連のノード設定の値として構成されたすべてのファイル(証明書、キー、キーストア、またはトラストストアなど)を監視します。ホスト名が変更されたり、証明書が期限切れになる場合など、これらのファイルのいずれかを更新すると、Elasticsearchはそれらを再読み込みします。ファイルは、グローバルElasticsearch resource.reload.interval.high設定によって決定される頻度で変更をポーリングします。デフォルトは5秒です。

クラスター内の各ノードに対して次の手順を完了します。同じクラスターに参加するためには、すべてのノードが同じcluster.name値を共有する必要があります。

  • 1. $ES_PATH_CONF/elasticsearch.ymlファイルを開き、次の変更を加えます:
    • 1.1. cluster-name設定を追加し、クラスターの名前を入力します:

Yaml

  1. cluster.name: my-cluster
  • 1.2. node.name設定を追加し、ノードの名前を入力します。ノードの名前は、Elasticsearchが起動するときにマシンのホスト名にデフォルト設定されます。

Yaml

  1. node.name: node-1
  • 1.3. ノード間通信を有効にし、ノードの証明書へのアクセスを提供するために、次の設定を追加します。
    クラスター内のすべてのノードで同じelastic-certificates.p12ファイルを使用しているため、検証モードをcertificateに設定します:

Yaml

  1. xpack.security.transport.ssl.enabled: true
  2. xpack.security.transport.ssl.verification_mode: certificate
  3. xpack.security.transport.ssl.client_authentication: required
  4. xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
  5. xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
ホスト名の検証を使用する場合、検証モードをfullに設定します。DNSまたはIPアドレスに一致する各ホストに対して異なる証明書を生成する必要があります。詳細はTLS設定xpack.security.transport.ssl.verification_modeパラメータを参照してください。
  • 2. ノード証明書を作成する際にパスワードを入力した場合、次のコマンドを実行してElasticsearchキーストアにパスワードを保存します:

シェル

  1. ./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password

シェル

  1. ./bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password
  • 3. クラスター内の各ノードに対して前の手順を完了します。
  • 4. クラスター内のすべてのノードでElasticsearchを起動します。起動および停止の方法は、インストール方法によって異なります。
    たとえば、アーカイブ配布(tar.gzまたは.zip)でElasticsearchをインストールした場合、コマンドラインでCtrl+Cを入力してElasticsearchを停止できます。
    TLSをトランスポートに使用するように構成されたノードは、暗号化されていないトランスポート接続を使用するノードと通信できません(その逆も同様です)。

次は何ですか?

おめでとうございます!クラスター内のノード間の通信を暗号化し、TLSブートストラップチェックを通過できるようになりました。

さらにセキュリティを強化するために、Elastic Stackの基本的なセキュリティを設定し、HTTPSトラフィックを保護することをお勧めします。ElasticsearchクラスターのトランスポートインターフェースにTLSを構成することに加えて、ElasticsearchとKibanaのHTTPインターフェースにもTLSを構成します。