リークを回避するために Elasticsearch を構成する方法

過去 XNUMX 年間、データベースからの漏洩が多数発生しました Elasticsearch (ここで, ここで и ここで)。 多くの場合、個人データはデータベースに保存されていました。 データベースの展開後に、管理者がいくつかの簡単な設定をわざわざチェックしていれば、こうした漏洩は回避できたはずです。 今日はそれらについてお話します。

私たちの実務では、152-FZ、Cloud-152 の要件に準拠した IaaS プラットフォーム内の情報セキュリティ ツール、OS、ソフトウェアのログの保存と分析に Elasticsearch を使用していることをすぐに予約しましょう。 

リークを回避するために Elasticsearch を構成する方法

データベースがインターネットに「はみ出している」かどうかを確認します

既知の漏れのほとんどのケース (ここで, ここで) 攻撃者は簡単かつ気取らずにデータにアクセスしました。データベースはインターネット上に公開されており、認証なしで接続することができました。  

まず、インターネット上での公開について考えてみましょう。 なぜこのようなことが起こるのでしょうか? 実際のところ、Elasticsearch をより柔軟に運用するには、 おすすめです XNUMX つのサーバーからなるクラスターを作成します。 データベースが相互に通信するには、ポートを開く必要があります。 その結果、管理者はデータベースへのアクセスをいかなる方法でも制限しないため、どこからでもデータベースに接続できます。 外部からデータベースにアクセスできるかどうかを簡単に確認できます。 ブラウザに入力するだけ http://[IP/Имя Elasticsearch]:9200/_cat/nodes?v

中に入ることができたら、走って閉めてください。

データベースへの接続を保護する

次に、認証なしではデータベースに接続できないようにします。

Elasticsearch にはデータベースへのアクセスを制限する認証モジュールがありますが、これは有料の X-Pack プラグイン セット (1 か月間無料で使用) でのみ利用できます。

良いニュースは、2019 年の秋に Amazon が X-Pack と重複する開発を開始したことです。 データベース接続時の認証機能は、Elasticsearch 7.3.2 バージョンでは無償ライセンスで利用可能となり、Elasticsearch 7.4.0 の新リリースもすでに開発中です。

このプラグインは簡単にインストールできます。 サーバー コンソールに移動し、リポジトリに接続します。

RPM ベース:

curl https://d3g5vo6xdbdb9a.cloudfront.net/yum/opendistroforelasticsearch-artifacts.repo -o /etc/yum.repos.d/opendistroforelasticsearch-artifacts.repo

yum update

yum install opendistro-security


DEB ベース:

wget -qO ‐ https://d3g5vo6xdbdb9a.cloudfront.net/GPG-KEY-opendistroforelasticsearch | sudo apt-key add -

SSL を介したサーバー間の対話の設定

プラグインをインストールすると、データベースに接続するポートの構成が変更されます。 SSL暗号化を有効にします。 クラスタ サーバーが相互に連携し続けるためには、SSL を使用してクラスタ サーバー間の対話を構成する必要があります。

ホスト間の信頼は、独自の認証局の有無にかかわらず確立できます。 最初の方法では、すべてが明確です。CA スペシャリストに連絡するだけで済みます。 すぐに XNUMX 番目に進みましょう。

  1. 完全なドメイン名を含む変数を作成します。

    export DOMAIN_CN="example.com"

  2. 秘密キーを作成します。

    openssl genrsa -out root-ca-key.pem 4096

  3. ルート証明書に署名します。 安全に保管してください。紛失または侵害された場合、すべてのホスト間の信頼を再構成する必要があります。

    openssl req -new -x509 -sha256 -subj "/C=RU/ST=Moscow/O=Moscow, Inc./CN=${DOMAIN_CN}" 
    -key root-ca-key.pem -out root-ca.pem

  4. 管理者キーを作成します。

    openssl genrsa -out admin-key-temp.pem 4096
    openssl pkcs8 -inform PEM -outform PEM -in admin-key-temp.pem -topk8 -nocrypt 
    -v1 PBE-SHA1-3DES -out admin-key.pem

  5. 証明書に署名するリクエストを作成します。

    openssl req -new -subj "/C=RU/ST=Moscow/O=Moscow Inc./CN=${DOMAIN_CN}/CN=admin " 
    -key admin-key.pem -out admin.csr

  6. 管理者証明書を作成します。

    openssl x509 -req -extensions usr_cert -in admin.csr -CA root-ca.pem 
    -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem

  7. Elasticsearch ノードの証明書を作成します。

    export NODENAME="node-01"
    openssl genrsa -out ${NODENAME}-key-temp.pem 4096
    openssl pkcs8 -inform PEM -outform PEM -in ${NODENAME}-key-temp.pem -topk8 -nocrypt 
    -v1 PBE-SHA1-3DES -out ${NODENAME}-key.pem

  8. 署名リクエストを作成します。

    openssl req -new -subj "/C=RU/ST=Moscow/O=Moscow Inc./CN=${NODENAME}.${DOMAIN_CN}"  
    -addext"subjectAltName=DNS:${NODENAME}.${DOMAIN_CN},DNS:www.${NODENAME}.${DOMAIN_CN}" 
    -key ${NODENAME}-key.pem -out ${NODENAME}.csr

  9. 証明書への署名:

    openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial 
    -sha256 -out node.pem

  10. Elasticsearch ノード間の証明書を次のフォルダーに配置します。

    /etc/elasticsearch/


    ファイルが必要です:

            node-01-key.pem
    	node-01.pem
    	admin-key.pem
    	admin.pem
    	root-ca.pem

  11. カスタマイズする /etc/elasticsearch/elasticsearch.yml – 証明書を含むファイルの名前を、弊社が生成した名前に変更します。

    opendistro_security.ssl.transport.pemcert_filepath: node-01.pem                                                                                                                                                                                    
    	opendistro_security.ssl.transport.pemkey_filepath: node-01-key.pem                                                                                                                                                                                 
    	opendistro_security.ssl.transport.pemtrustedcas_filepath: root-ca.pem                                                                                                                                                                              
    	opendistro_security.ssl.transport.enforce_hostname_verification: false                                                                                                                                                                             
    	opendistro_security.ssl.http.enabled: true                                                                                                                                                                                                         
    	opendistro_security.ssl.http.pemcert_filepath: node-01.pem                                                                                                                                                                                         
    	opendistro_security.ssl.http.pemkey_filepath: node-01-key.pem                                                                                                                                                                                      
    	opendistro_security.ssl.http.pemtrustedcas_filepath: root-ca.pem                                                                                                                                                                                   
    	opendistro_security.allow_unsafe_democertificates: false                                                                                                                                                                                           
    	opendistro_security.allow_default_init_securityindex: true                                                                                                                                                                                         
    	opendistro_security.authcz.admin_dn:                                                                                                                                                                                                               
    	  − CN=admin,CN=example.com,O=Moscow Inc.,ST=Moscow,C=RU                                                                                                                                                                                                  
    	opendistro_security.nodes_dn:                                                                                                                                                                                                                      
    	  − CN=node-01.example.com,O=Moscow Inc.,ST=Moscow,C=RU

内部ユーザーのパスワードの変更

  1. 以下のコマンドを使用して、パスワード ハッシュをコンソールに出力します。

    sh ${OD_SEC}/tools/hash.sh -p [пароль]

  2. ファイル内のハッシュを受信したハッシュに変更します。

    /usr/share/elasticsearch/plugins/opendistro_security/securityconfig/internal_users.yml

OSにファイアウォールを設定する

  1. ファイアウォールの起動を許可します。

    systemctl enable firewalld

  2. 起動しましょう:

    systemctl start firewalld

  3. Elasticsearch への接続を許可します。

    firewall-cmd --set-default-zone work
    firewall-cmd --zone=work --add-port=9200/TCP --permanent

  4. ファイアウォール ルールをリロードします。

    firewall-cmd --reload

  5. 就業規則は次のとおりです。

    firewall-cmd --list-all

すべての変更を Elasticsearch に適用する

  1. プラグインを含むフォルダーへの絶対パスを含む変数を作成します。

    export  OD_SEC="/usr/share/elasticsearch/plugins/opendistro_security/"

  2. パスワードを更新し、設定を確認するスクリプトを実行してみましょう。

    ${OD_SEC}/tools/securityadmin.sh -cd ${OD_SEC}/securityconfig/ 
    -icl -nhnv -cacert /etc/elasticsearch/root-ca.pem 
    -cert /etc/elasticsearch/admin.pem  
    -key /etc/elasticsearch/admin-key.pem

  3. 変更が適用されたかどうかを確認します。

    curl -XGET https://[IP/Имя Elasticsearch]:9200/_cat/nodes?v -u admin:[пароль] --insecure

以上が、Elasticsearch を不正な接続から保護するための最低限の設定です。

出所: habr.com

コメントを追加します