如何配置 Elasticsearch 以避免泄漏

过去一年多发生数据库泄露事件 Elasticsearch (这里, 这里 и 这里)。 在许多情况下,个人数据存储在数据库中。 如果在部署数据库后,管理员能够费心检查一些简单的设置,那么这些泄漏本来是可以避免的。 今天我们就来谈谈它们。

我们立即预约一下,在我们的实践中,我们使用Elasticsearch来存储日志并分析我们的IaaS平台中的信息安全工具、操作系统和软件的日志,符合152-FZ、Cloud-152的要求。 

如何配置 Elasticsearch 以避免泄漏

我们检查数据库是否“突出”到互联网上

在大多数已知的泄漏案例中(这里, 这里)攻击者简单、毫不做作地获得了对数据的访问权限:数据库发布在互联网上,无需身份验证即可连接到该数据库。  

首先,我们来处理一下互联网上的发布。 为什么会出现这种情况? 事实是为了让Elasticsearch更加灵活的运行 建议 创建一个由三台服务器组成的集群。 为了使数据库能够相互通信,您需要打开端口。 因此,管理员不会以任何方式限制对数据库的访问,并且您可以从任何地方连接到数据库。 很容易检查数据库是否可以从外部访问。 只需在浏览器中输入即可 http://[IP/Имя Elasticsearch]:9200/_cat/nodes?v

如果你能进去,就跑去关门。

保护与数据库的连接

现在我们将使其无法在未经身份验证的情况下连接到数据库。

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

好消息是,2019 年秋季,亚马逊开放了与 X-Pack 重叠的开发项目。 连接数据库时的身份验证功能已在 Elasticsearch 7.3.2 版本的免费许可证下可用,并且 Elasticsearch 7.4.0 的新版本已在开发中。

这个插件很容易安装。 转到服务器控制台并连接存储库:

基于转速:

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

在操作系统中设置防火墙

  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

添加评论