如何配置Elasticsearch以便不泄漏

在过去的一年中,Elasticsearch数据库这里这里那里发生了很多泄漏在许多情况下,个人数据存储在数据库中。如果管理员在部署数据库后麻烦检查一些简单设置,则可以避免这些泄漏。今天我们将讨论它们。

我们将立即做出保留,在实践中,我们将使用Elasticsearch在IaaS平台中存储日志并分析信息保护工具,操作系统和软件的日志,以满足152-,Cloud-152的要求。 



检查数据库是否“粘滞”


在大多数已知的泄漏情况下(在这里这里),攻击者可以简单,毫不费力地获得对数据的访问:数据库已发布在Internet上,并且可以不经身份验证即可连接到该数据库。  

首先,我们将处理Internet上的发布。为什么会这样呢?事实是,为了使Elasticsearch更加灵活地运行,建议创建由三个服务器组成的集群。为了使数据库彼此通信,您需要打开端口。因此,管理员不会限制对数据库的访问,您可以从任何地方连接到数据库。检查是否有外部访问数据库很容易。只需输入http:// [[IP / Elasticsearch名称]:9200 / _cat /节点?在浏览器中?V

如果您成功登录,则运行以关闭。

我们保护与数据库的连接


现在,我们将无法在没有身份验证的情况下连接到数据库。

Elasticsearch有一个身份验证模块,用于限制对数据库的访问,但是它仅在付费的X-Pack插件集中(免费使用1个月)。

好消息是,在2019年秋天,亚马逊开设了与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的专家。我们立即进行第二个。

  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进行未经授权连接的最低设置。

Source: https://habr.com/ru/post/undefined/


All Articles