6.5. HashiCorp Vault

作为存储管理员,您可以在 HashiCorp Vault 中安全地存储密钥、密码和证书,以用于 Ceph 对象网关。HashiCorp Vault 为 Ceph 对象网关使用的服务器端加密提供安全密钥管理服务。

Ceph Vault 集成图

基本工作流:

  1. 客户端根据对象的密钥 ID 从 Vault 请求创建 secret key。
  2. 客户端将带有对象的密钥 ID 的对象上传到 Ceph 对象网关。
  3. 然后,Ceph 对象网关从 Vault 请求新创建的机密密钥。
  4. Vault 通过将机密密钥返回到 Ceph 对象网关来回复请求。
  5. 现在,Ceph 对象网关可以使用新的机密密钥加密对象。
  6. 在加密完成后,对象存储在 Ceph OSD 上。
重要

红帽与我们的技术合作伙伴合作,将本文档作为为客户提供服务。但是,红帽不提供对这个产品的支持。如果您需要此产品的技术协助,请联系 Hashicorp 以获得支持。

6.5.1. 先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 安装 Ceph 对象网关软件.
  • 安装 HashiCorp Vault 软件。

6.5.2. Vault 的 secret 引擎

HashiCorp Vault 提供多个机密引擎来生成、存储或加密数据。应用程序接口(API)会向 secret 引擎发送数据调用,要求对其数据执行操作,机密引擎返回该操作请求的结果。

Ceph 对象网关支持两个 HashiCorp Vault secret 引擎:

  • Key/Value 版本 2
  • Transit

Key/Value 版本 2

Key/Value secret 引擎将随机 secret 存储在 Vault 中的磁盘上。使用 kv 引擎的版本 2,键可以具有可配置的版本数。默认版本数量为 10。删除版本不会删除底层数据,而是将数据标记为已删除,从而允许取消删除的版本。您可以使用 API 端点或 destroy 命令永久删除版本的数据。要删除密钥的所有版本和元数据,您可以使用 metadata 命令或 API 端点。密钥名称必须是字符串,当使用命令行界面时,引擎会将非字符串值转换为字符串。要保留非字符串值,请提供 JSON 文件或使用 HTTP 应用编程接口(API)。

注意

对于访问控制列表(ACL)策略,Key/Value secret 引擎可识别 创建更新功能之间的区别。

Transit

Transit secret 引擎对传输中数据执行加密功能。Transit secret 引擎可以生成哈希值,可以是随机字节的来源,也可对数据进行签名和验证。在使用 Transit secret 引擎时,Vault 不会存储数据。Transit secret 引擎允许将同一密钥用于多个目的,从而支持密钥生成。此外,传输机密引擎支持密钥版本控制。Transit secret 引擎支持这些关键类型:

aes128-gcm96
带有 128 位 AES 密钥和 96 位非ce 的 AES-GCM;支持加密、解密、密钥派生和聚合加密
aes256-gcm96
带有 256 位 AES 密钥和 96 位非ce 的 AES-GCM;支持加密、解密、密钥生成和聚合加密(默认)
chacha20-poly1305
ChaCha20-Poly1305,带有 256 位密钥;支持加密、解密、密钥加密和聚合加密
ed25519
Ed25519; 支持签名、签名验证和密钥生成
ecdsa-p256
使用 curve P-256 的 ECDSA;支持签名和签名验证
ecdsa-p384
使用 curve P-384 的 ECDSA;支持签名和签名验证
ecdsa-p521
使用 curve P-521 的 ECDSA;支持签名和签名验证
rsa-2048
2048 位 RSA 密钥;支持加密、解密、签名和签名验证
rsa-3072
3072 位 RSA 密钥;支持加密、解密、签名和签名验证
rsa-4096
4096 位 RSA 密钥;支持加密、解密、签名和签名验证

其它资源

6.5.3. Vault 的身份验证

HashiCorp Vault 支持多种类型的身份验证机制。Ceph 对象网关目前支持 Vault 代理方法。Ceph 对象网关使用 rgw_crypt_vault_authrgw_crypt_vault_addr 选项来配置 HashiCorp Vault 的使用。

重要

红帽支持使用 Vault 代理作为容器的身份验证方法,容器上不支持使用令牌身份验证。

Vault 代理

Vault 代理是在客户端节点上运行的守护进程,提供客户端缓存以及令牌续订。Vault 代理通常在 Ceph 对象网关节点上运行。运行 Vault 代理并刷新令牌文件。在此模式中使用 Vault 代理时,您可以使用文件系统权限限制谁有权使用令牌。此外,Vault 代理也可以充当代理服务器,即 Vault 将根据需要添加令牌,并将其添加到传递到它的请求之前,将它们转发到实际服务器。Vault 代理仍然可以像在文件系统中存储令牌时一样处理令牌续订。需要保护 Ceph 对象网关用于连接到 Vault 代理的网络,例如,Vault 代理仅侦听 localhost。

其它资源

  • 如需更多信息,请参阅 Vault 项目站点上的 Vault 代理 文档。

6.5.4. Vault 的命名空间

将 HashiCorp Vault 用作企业服务,可为组织内的团队可以使用的隔离命名空间提供集中管理。这些隔离的命名空间环境称为 租户,组织内的团队可以利用这些租户将其策略、机密和身份与其他团队隔离。Vault 的命名空间功能帮助支持单一基础架构内的安全多租户。

其它资源

6.5.5. 传递引擎兼容性支持

旧版 Ceph 的兼容性支持将 Transit 引擎用作简单的密钥存储。您可以使用 Transit 引擎中的 compat 选项来配置兼容性支持。您可以使用以下命令禁用之前的支持:

示例

[ceph: root@host03 /]# ceph config set client.rgw rgw_crypt_vault_secret_engine transit compat=0

注意

这是将来的版本的默认方法,您可以使用当前版本进行新的安装。

当前版本的正常默认设置为:

示例

[ceph: root@host03 /]# ceph config set client.rgw rgw_crypt_vault_secret_engine transit compat=1

这可实现新创建的对象的新引擎,仍允许将旧引擎用于旧对象。若要访问旧对象和新对象,Vault 令牌必须具有旧的和新传输策略。

您可以使用以下命令强制使用旧引擎:

示例

[ceph: root@host03 /]# ceph config set client.rgw rgw_crypt_vault_secret_engine transit compat=2

如果 Vault 以 export/encryption-key 结束,则默认选择此模式。

重要

在配置了 client.rgw 选项后,您需要重启 Ceph 对象网关守护进程,使新值生效。

其它资源

  • 如需更多信息,请参阅 Vault 项目站点上的 Vault 代理 文档。

6.5.6. 为 Vault 创建令牌策略

令牌策略指定所有 Vault 令牌的电源。一个令牌可以有多个策略。您应该在配置中使用所需的策略。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 安装 HashiCorp Vault 软件。
  • 对 HashiCorp Vault 节点的根级别访问权限。

流程

  1. 创建令牌策略:

    1. 对于 Key/Value secret 引擎:

      示例

      [root@vault ~]# vault policy write rgw-kv-policy -<<EOF
       path "secret/data/*" {
         capabilities = ["read"]
       }
      EOF

    2. 对于 Transit 引擎:

      示例

      [root@vault ~]# vault policy write rgw-transit-policy -<<EOF
        path "transit/keys/*" {
          capabilities = [ "create", "update" ]
          denied_parameters = {"exportable" = [], "allow_plaintext_backup" = [] }
        }
      
        path "transit/keys/*" {
          capabilities = ["read", "delete"]
        }
      
        path "transit/keys/" {
          capabilities = ["list"]
        }
      
        path "transit/keys/+/rotate" {
          capabilities = [ "update" ]
        }
      
        path "transit/*" {
          capabilities = [ "update" ]
        }
      EOF

      注意

      如果您在较旧版本的 Ceph 上使用了 Transit secret 引擎,则令牌策略为:

      示例

      [root@vault ~]# vault policy write old-rgw-transit-policy -<<EOF
        path "transit/export/encryption-key/*" {
          capabilities = ["read"]
        }
      EOF

6.5.7. 将 Ceph 对象网关配置为使用 Vault

要将 Ceph 对象网关配置为使用 HashiCorp Vault,必须将其设置为加密密钥存储。目前,Ceph 对象网关支持两种不同的机密引擎,以及两种不同的身份验证方法。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 安装 Ceph 对象网关软件.
  • Ceph 对象网关节点的根级别访问权限.

流程

  1. 使用 ceph config set client.rgw OPTION VALUE 命令启用 Vault 作为加密密钥存储:

    语法

    ceph config set client.rgw rgw_crypt_s3_kms_backend vault

  2. 添加以下选项和值:

    语法

    ceph config set client.rgw rgw_crypt_vault_auth agent
    ceph config set client.rgw rgw_crypt_vault_addr http://VAULT_SERVER:8100

  3. 根据用例自定义策略。
  4. 获取 role-id:

    语法

    vault read auth/approle/role/rgw-ap/role-id -format=json | \ jq -r .data.role_id > PATH_TO_FILE

  5. 获取 secret-id:

    语法

    vault read auth/approle/role/rgw-ap/role-id -format=json | \ jq -r .data.secret_id > PATH_TO_FILE

  6. 创建 Vault 代理的配置:

    示例

    pid_file = "/run/kv-vault-agent-pid"
    auto_auth {
      method "AppRole" {
        mount_path = "auth/approle"
        config = {
          role_id_file_path ="/root/vault_configs/kv-agent-role-id"
          secret_id_file_path ="/root/vault_configs/kv-agent-secret-id"
          remove_secret_id_file_after_reading ="false"
        }
      }
    }
    cache {
      use_auto_auth_token = true
    }
    listener "tcp" {
      address = "127.0.0.1:8100"
      tls_disable = true
    }
    vault {
      address = "http://10.8.128.9:8200"
    }

  7. 使用 systemctl 运行持久性守护进程:

    示例

    [root@host03 ~]# /usr/local/bin/vault agent -config=/usr/local/etc/vault/rgw-agent.hcl

  8. 当 Vault 代理运行时,令牌文件填充有效令牌。
  9. 选择 Vault 机密引擎,可以是 Key/Value 或 Transit。

    1. 如果使用 Key/Value,请添加以下行:

      示例

      [ceph: root@host03 /]# ceph config set client.rgw rgw_crypt_vault_secret_engine kv

    2. 如果使用 Transit,请添加以下行:

      示例

      [ceph: root@host03 /]# ceph config set client.rgw rgw_crypt_vault_secret_engine transit

  10. 使用 ceph config set client.rgw OPTION VALUE 命令将 Vault 命名空间设置为检索加密密钥:

    示例

    [ceph: root@host03 /]# ceph config set client.rgw rgw_crypt_vault_namespace testnamespace1

  11. 通过设置路径前缀来限制 Ceph 对象网关从 Vault 中检索加密密钥的位置:

    示例

    [ceph: root@host03 /]# ceph config set client.rgw rgw_crypt_vault_prefix /v1/secret/data

    1. 对于可导出的 Transit 键,请设置前缀路径,如下所示:

      示例

      [ceph: root@host03 /]# ceph config set client.rgw rgw_crypt_vault_prefix /v1/transit/export/encryption-key

      假设 Vault 服务器的域名是 vault-server,Ceph 对象网关将从以下 URL 获取加密传输密钥:

      示例

      http://vault-server:8200/v1/transit/export/encryption-key

  12. 重新启动 Ceph 对象网关守护进程。

    1. 要在存储集群中的单个节点上重启 Ceph 对象网关:

      语法

      systemctl restart ceph-CLUSTER_ID@SERVICE_TYPE.ID.service

      示例

      [root@host03 ~]# systemctl restart ceph-c4b34c6f-8365-11ba-dc31-529020a7702d@rgw.realm.zone.host01.gwasto.service

    2. 在存储集群的所有节点上重启 Ceph 对象网关:

      语法

      ceph orch restart SERVICE_TYPE

      示例

      [ceph: root@host03 /]# ceph orch restart rgw

其它资源

  • 如需了解更多详细信息,请参阅 Red Hat Ceph Storage 对象网关指南中的 Vault 的 Secret 引擎 部分。
  • 如需了解更多详细信息,请参阅 Red Hat Ceph Storage 对象网关指南中的 Vault 身份验证 部分。

6.5.8. 使用 kv 引擎创建密钥

配置 HashiCorp Vault Key/Value secret 引擎(kv),以便您可以创建用于 Ceph 对象网关的密钥。secret 作为键值对存储在 kv 机密引擎中。

重要

服务器端加密的密钥必须是 256 位,并且必须使用 base64 编码。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 安装 HashiCorp Vault 软件。
  • 对 HashiCorp Vault 节点的根级别访问权限。

流程

  1. 启用 Key/Value 版本 2 secret 引擎:

    示例

    vault secrets enable -path secret kv-v2

  2. 创建新密钥:

    语法

    vault kv put secret/PROJECT_NAME/BUCKET_NAME key=$(openssl rand -base64 32)

    示例

    [root@vault ~]# vault kv put secret/myproject/mybucketkey key=$(openssl rand -base64 32)
    
    ====== Metadata ======
    Key              Value
    ---              -----
    created_time     2020-02-21T17:01:09.095824999Z
    deletion_time    n/a
    destroyed        false
    version          1

6.5.9. 使用传输引擎创建密钥

配置 HashiCorp Vault Transit 机密引擎(transit),以便您可以创建用于 Ceph 对象网关的密钥。使用 Transit secret 引擎创建密钥必须可以导出,才能使用 Ceph 对象网关进行服务器端加密。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 安装 HashiCorp Vault 软件。
  • 对 HashiCorp Vault 节点的根级别访问权限。

流程

  1. 启用 Transit secret 引擎:

    [root@vault ~]# vault secrets enable transit
  2. 创建新的可导出密钥:

    语法

    vault write -f transit/keys/BUCKET_NAME exportable=true

    示例

    [root@vault ~]# vault write -f transit/keys/mybucketkey exportable=true

    注意

    默认情况下,上述命令会创建一个 aes256-gcm96 类型密钥。

  3. 验证密钥的创建:

    语法

    vault read transit/export/encryption-key/BUCKET_NAME/VERSION_NUMBER

    示例

    [root@vault ~]# vault read transit/export/encryption-key/mybucketkey/1
    
    Key     Value
    ---     -----
    keys    map[1:-gbTI9lNpqv/V/2lDcmH2Nq1xKn6FPDWarCmFM2aNsQ=]
    name    mybucketkey
    type    aes256-gcm96

    注意

    需要提供完整密钥路径,包括密钥版本。

6.5.10. 使用 AWS 和 Vault 上传对象

在上传对象到 Ceph 对象网关时,Ceph 对象网关将从 Vault 获取密钥,然后将对象加密并存储在 bucket 中。发出下载对象的请求时,Ceph 对象网关将自动从 Vault 检索对应的密钥并解密对象。若要上传对象,Ceph 对象网关从 Vault 获取密钥,然后加密对象并将其存储在 bucket 中。Ceph 对象网关从 Vault 检索对应的密钥,并在有下载对象的请求时解密对象。

注意

URL 使用基础地址(通过 rgw_crypt_vault_addr 选项和路径前缀设置)构建,该地址由 rgw_crypt_vault_prefix 选项设置。

先决条件

  • 一个正在运行的 Red Hat Ceph Storage 集群。
  • 安装 Ceph 对象网关软件.
  • 安装 HashiCorp Vault 软件。
  • 访问 Ceph 对象网关客户端节点.
  • 访问 Amazon Web Services(AWS)。

流程

  1. 使用 AWS 命令行客户端上传对象,并在请求中提供安全 Side Encryption(SSE)密钥 ID:

    1. 对于 Key/Value secret 引擎:

      示例

      [user@client ~]$ aws --endpoint=http://radosgw:8000 s3 cp plaintext.txt s3://mybucket/encrypted.txt --sse=aws:kms --sse-kms-key-id myproject/mybucketkey

      注意

      在示例中,Ceph 对象网关将从 http://vault-server:8200/v1/secret/data/myproject/mybucketkey获取 secret

    2. 对于 Transit 引擎:

      示例

      [user@client ~]$ aws --endpoint=http://radosgw:8000 s3 cp plaintext.txt s3://mybucket/encrypted.txt --sse=aws:kms --sse-kms-key-id mybucketkey

注意

在示例中,Ceph 对象网关将从 http://vaultserver:8200/v1/transit/mybucketkey获取 secret

6.5.11. 其它资源

  • 如需更多信息,请参阅 Vault 项目站点上的 安装 Vault 文档。