Elasticsearch

Elasticsearch 是数据库机密引擎所支持的插件之一。该插件可以根据为 Elasticsearch 配置的角色动态生成数据库凭据。

能力

数据库插件名称 根用户凭据轮换 动态角色 静态角色 自定义用户名
elasticsearch-database-plugin Yes Yes Yes(1.6+) Yes(1.8+)

开始使用

要使用该插件,我们必须先必须首先通过激活 X-Pack 启用 Elasticsearch 的本机安全领域(native realm of security)。这些说明将引导我们使用 Elasticsearch 7.1.1 完成此操作。

启用 Elasticsearch 的 X-Pack 安全机制

请阅读 Elastic Stack的安全加固并执行启用 X-Pack 安全机制的步骤

启用加密通信

该插件与 Elasticsearch 的安全 API 进行通信。Elasticsearch 要求这些通信启用 TLS 来加密通信流量。

要设置 Elaticsearch 的 TLS,请先阅读加密通信并执行加密 HTTP 客户端通信中的步骤。

启用了 Elasticsearch 端的 TLS 后,我们需要将生成的 .p12 证书转换成其他格式使得 Vault 可以使用。这里有一个使用 OpenSSL 将我们的 .p12 证书转换为 pem 格式的例子。

此外,在运行 Elasticsearch 的实例上,我们需要安装新生成的 CA 证书,该证书最初为 .p12 格式。为此,我们将 .p12 CA 证书转换为 pem,然后进一步将该 pem 转换为 crt,将该 crt 添加到 /usr/share/ca-certificates/extra,并执行 sudo dpkg-reconfigure ca-certificates 命令。

如果我们使用的不是 Ubuntu 系统,上述操作步骤可能会有所不同。请确保我们使用的是特定于当前操作环境的方法,我们不在此做一一说明。

设置密码

完成上述步骤后,通过运行 $ $ES_HOME/bin/elasticsearch-setup-passwords interactive 来验证是否已启用 X-Pack。如果它引导您完成多个密码输入步骤,就说明它已被成功设置。

为 Vault 创建一个角色

下面,我们推荐在 Elasticsearch 中为 Vault 创建一个专门用于管理机密的用户。

为此,首先创建一个角色,通过对 Elasticsearch 执行 POST,允许 Vault 获得管理用户和密码所需的最低权限。为实现该目标,我们使用名为 elastic 的 Vault 用户,密码就是之前通过 $ $ES_HOME/bin/elasticsearch-setup-passwords interactive 命令创建得到的:

$ curl \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{"cluster": ["manage_security"]}' \
    http://vaultuser:$PASSWORD@localhost:9200/_xpack/security/role/vault

然后我们在 Vault 中创建一个关联该角色的新用户:

curl \
    -X POST \
    -H "Content-Type: application/json" \
    -d @data.json \
    http://vaultuser:$PASSWORD@localhost:9200/_xpack/security/user/vault

例子中的 data.json 文件的内容是:

{
 "password" : "myPa55word",
 "roles" : [ "vault" ],
 "full_name" : "Hashicorp Vault",
 "metadata" : {
   "plugin_name": "Vault Plugin Database Elasticsearch",
   "plugin_url": "https://github.com/hashicorp/vault-plugin-database-elasticsearch"
 }
}

现在,Elasticsearch 已经完成了配置,可以与 Vault 一起使用了。

设置

  1. 如果数据库机密引擎尚未启用,先启用该机密引擎:
$ vault secrets enable database
Success! Enabled the database secrets engine at: database/

默认情况下,机密引擎会挂载到名字对应的路径上。要在不同路径上启用机密引擎,请使用 -path 参数。

  1. 使用合适的插件以及连接信息来配置 Vault:
$ vault write database/config/my-elasticsearch-database \
    plugin_name="elasticsearch-database-plugin" \
    allowed_roles="internally-defined-role,externally-defined-role" \
    username=vault \
    password=myPa55word \
    url=http://localhost:9200 \
    ca_cert=/usr/share/ca-certificates/extra/elastic-stack-ca.crt.pem \
    client_cert=$ES_HOME/config/certs/elastic-certificates.crt.pem \
    client_key=$ES_HOME/config/certs/elastic-certificates.key.pem
  1. 配置一个角色,将 Vault 中的名称映射到 Elasticsearch 中的角色定义。这被认为是最安全的角色类型,因为没有人可以通过在 Elasticsearch 中编辑角色的带外(out-of-band)权限来实现特权提升:
$ vault write database/roles/internally-defined-role \
      db_name=my-elasticsearch-database \
      creation_statements='{"elasticsearch_role_definition": {"indices": [{"names":["*"], "privileges":["read"]}]}}' \
      default_ttl="1h" \
      max_ttl="24h"
Success! Data written to: database/roles/internally-defined-role
  1. 或者配置一个角色,将 Vault 中的名称映射到 Elasticsearch 中预先存在的角色定义:
$ vault write database/roles/externally-defined-role \
      db_name=my-elasticsearch-database \
      creation_statements='{"elasticsearch_roles": ["pre-existing-role-in-elasticsearch"]}' \
      default_ttl="1h" \
      max_ttl="24h"
Success! Data written to: database/roles/externally-defined-role

使用方法

配置了机密引擎后,一个拥有搭配了合适权限的 Vault 令牌的用户或是机器可以生成数据库凭据。

  1. 通过读取搭配角色名的 /creds 端点来创建一个新的凭据:
$ vault read database/creds/my-role
Key                Value
---                -----
lease_id           database/creds/my-role/2f6a614c-4aa2-7b19-24b9-ad944a8d4de6
lease_duration     1h
lease_renewable    true
password           0ZsueAP-dqCNGZo35M0n
username           v-vaultuser-my-role-AgIViC5TdQHBdeiCxae0-1602541724

results matching ""

    No results matching ""