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

基本工作流:
- 客户端根据对象的密钥 ID 从 Vault 请求创建 secret key。
- 客户端将带有对象的密钥 ID 的对象上传到 Ceph 对象网关。
- 然后,Ceph 对象网关从 Vault 请求新创建的机密密钥。
- Vault 通过将机密密钥返回到 Ceph 对象网关来回复请求。
- 现在,Ceph 对象网关可以使用新的机密密钥加密对象。
- 在加密完成后,对象存储在 Ceph OSD 上。
红帽与我们的技术合作伙伴合作,将本文档作为为客户提供服务。但是,红帽不提供对这个产品的支持。如果您需要此产品的技术协助,请联系 Hashicorp 以获得支持。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 安装 Ceph 对象网关软件.
- 安装 HashiCorp Vault 软件.
8.4.1. Vault 的 secret 引擎
HashiCorp Vault 提供多个机密引擎来生成、存储或加密数据。应用编程接口(API)向机密引擎发送数据调用,要求对该数据采取行动,机密引擎返回该操作请求的结果。
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 密钥;支持加密、解密、签名和签名验证
其它资源
- 如需更多信息,请参阅 Vault 项目网站上的 KV Secrets Engine 文档。
- 如需更多信息,请参阅 Vault 项目网站上的 Transit Secrets Engine 文档。
8.4.2. Vault 的身份验证
HashiCorp Vault 支持多种类型的身份验证机制。Ceph 对象网关目前支持 Vault 代理方法。Ceph 对象网关使用 rgw_crypt_vault_auth
和 rgw_crypt_vault_addr
选项来配置 HashiCorp Vault 的使用。
红帽支持使用 Vault 代理作为容器的身份验证方法,容器上不支持使用令牌身份验证。
Vault 代理
Vault 代理是在客户端节点上运行的守护进程,提供客户端缓存以及令牌续订。Vault 代理通常在 Ceph 对象网关节点上运行。运行 Vault 代理并刷新令牌文件。在此模式中使用 Vault 代理时,您可以使用文件系统权限限制谁有权使用令牌。另外,Vault 代理也可以充当代理服务器,即 Vault 将在需要时添加令牌,并将其添加到传递给它的请求中,然后再将它们转发到实际服务器。Vault 代理仍然可以像在文件系统中存储令牌时一样处理令牌续订。需要保护 Ceph 对象网关用于连接 Vault 代理的网络,例如,Vault 代理仅侦听 localhost。
其它资源
- 如需更多信息,请参阅 Vault 项目站点上的 Vault 代理 文档。
8.4.3. Vault 的命名空间
将 HashiCorp Vault 用作企业服务,可为组织内的团队可以使用的隔离命名空间提供集中管理。这些隔离的命名空间环境称为 租户,组织内的团队可以利用这些租户将其策略、机密和身份与其他团队隔离。Vault 的命名空间功能帮助支持单一基础架构内的安全多租户。
其它资源
- 如需更多信息,请参阅 Vault 项目站点上的 Vault Enterprise 命名空间 文档。
8.4.4. 传递引擎兼容性支持
旧版 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 代理 文档。
8.4.5. 为 Vault 创建令牌策略
令牌策略指定所有 Vault 令牌的电源。一个令牌可以有多个策略。您应该在配置中使用所需的策略。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 安装 HashiCorp Vault 软件。
- 对 HashiCorp Vault 节点的根级别访问权限。
流程
创建令牌策略:
对于 Key/Value secret 引擎:
示例
[root@vault ~]# vault policy write rgw-kv-policy -<<EOF path "secret/data/*" { capabilities = ["read"] } EOF
对于 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
如果您使用 SSE-KMS 和 SSE-S3,您应该将每个指向单独的容器。您可以使用单独的 Vault 实例,或者在通用传输点下单独挂载实例或不同的分支。如果您不使用单独的 Vault 实例,您可以使用 rgw_crypt_vault_prefix
和 rgw_crypt_sse_s3_vault_prefix
将 SSE-KMS 或 SSE-S3 指向 serparate 容器。向 SSE-KMS bucket 所有者授予 Vault 权限时,您不应该为它们授予 SSE-S3 密钥的权限;只有 Ceph 应该有权访问 SSE-S3 密钥。
8.4.6. 将 Ceph 对象网关配置为使用 SSE-KMS 和 Vault
要将 Ceph 对象网关配置为使用带 SSE-KMS 的 HashiCorp Vault 进行密钥管理,它必须设置为加密密钥存储。目前,Ceph 对象网关支持两种不同的机密引擎,以及两种不同的身份验证方法。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 安装 Ceph 对象网关软件.
- Ceph 对象网关节点的根级别访问权限.
流程
使用
ceph config set client.rgw OPTION VALUE
命令启用 Vault 作为加密密钥存储:语法
ceph config set client.rgw rgw_crypt_s3_kms_backend vault
添加以下选项和值:
语法
ceph config set client.rgw rgw_crypt_vault_auth agent ceph config set client.rgw rgw_crypt_vault_addr http://VAULT_SERVER:8100
- 根据用例自定义策略。
获取 role-id:
语法
vault read auth/approle/role/rgw-ap/role-id -format=json | \ jq -r .data.role_id > PATH_TO_FILE
获取 secret-id:
语法
vault read auth/approle/role/rgw-ap/role-id -format=json | \ jq -r .data.secret_id > PATH_TO_FILE
创建 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" }
使用 systemctl 运行持久性守护进程:
示例
[root@host03 ~]# /usr/local/bin/vault agent -config=/usr/local/etc/vault/rgw-agent.hcl
- 当 Vault 代理运行时,令牌文件填充有效令牌。
选择 Vault 机密引擎,可以是 Key/Value 或 Transit。
如果使用 Key/Value,请添加以下行:
示例
[ceph: root@host03 /]# ceph config set client.rgw rgw_crypt_vault_secret_engine kv
如果使用 Transit,请添加以下行:
示例
[ceph: root@host03 /]# ceph config set client.rgw rgw_crypt_vault_secret_engine transit
使用
ceph config set client.rgw OPTION VALUE
命令将 Vault 命名空间设置为检索加密密钥:示例
[ceph: root@host03 /]# ceph config set client.rgw rgw_crypt_vault_namespace testnamespace1
通过设置路径前缀来限制 Ceph 对象网关从 Vault 中检索加密密钥的位置:
示例
[ceph: root@host03 /]# ceph config set client.rgw rgw_crypt_vault_prefix /v1/secret/data
对于可导出的 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
重新启动 Ceph 对象网关守护进程。
在存储集群中的单个节点上重启 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
在存储集群的所有节点上重启 Ceph 对象网关:
语法
ceph orch restart SERVICE_TYPE
示例
[ceph: root@host03 /]# ceph orch restart rgw
其它资源
- 如需了解更多详细信息,请参阅 Red Hat Ceph Storage Object Gateway Guide 中的 Vault Secret engines 部分。
- 如需了解更多详细信息,请参阅 Red Hat Ceph Storage 对象网关指南中的 Vault 身份验证 部分。
8.4.7. 将 Ceph 对象网关配置为使用 SSE-S3 和 Vault
要将 Ceph 对象网关配置为使用带有 SSE-S3 的 HashiCorp Vault 进行密钥管理,它必须设置为加密密钥存储。目前,Ceph 对象网关仅使用 代理 身份验证方法。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 安装 Ceph 对象网关软件.
- Ceph 对象网关节点的根级别访问权限.
流程
登录到 Cephadm shell
示例
[root@host01 ~]# cephadm shell
启用 Vault 作为 secret 引擎以检索 SSE-S3 加密密钥:
语法
ceph config set client.rgw rgw_crypt_sse_s3_backend vault
要设置用于 SSE-S3 和 Vault 的验证方法,请配置以下设置:
语法
ceph config set client.rgw rgw_crypt_sse_s3_vault_auth agent ceph config set client.rgw rgw_crypt_sse_s3_vault_addr http://VAULT_AGENT:VAULT_AGENT_PORT
示例
[ceph: root@host01 ~]# ceph config set client.rgw rgw_crypt_sse_s3_vault_auth agent [ceph: root@host01 ~]# ceph config set client.rgw rgw_crypt_sse_s3_vault_addr http://vaultagent:8100
- 根据您的用例自定义策略,以设置 Vault 代理。
获取 role-id:
语法
vault read auth/approle/role/rgw-ap/role-id -format=json | \ jq -r .rgw-ap-role-id > PATH_TO_FILE
获取 secret-id:
语法
vault read auth/approle/role/rgw-ap/role-id -format=json | \ jq -r .rgw-ap-secret-id > PATH_TO_FILE
创建 Vault 代理的配置:
示例
pid_file = "/run/rgw-vault-agent-pid" auto_auth { method "AppRole" { mount_path = "auth/approle" config = { role_id_file_path ="/usr/local/etc/vault/.rgw-ap-role-id" secret_id_file_path ="/usr/local/etc/vault/.rgw-ap-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 = "https://vaultserver:8200" }
使用 systemctl 运行持久性守护进程:
示例
[root@host01 ~]# /usr/local/bin/vault agent -config=/usr/local/etc/vault/rgw-agent.hcl
- 当 Vault 代理运行时,令牌文件填充有效令牌。
设置 Vault 机密引擎,用于检索加密密钥,可以是 Key/Value 或 Transit。
如果使用 Key/Value,请设置以下内容:
示例
[ceph: root@host01 /]# ceph config set client.rgw rgw_crypt_sse_s3_vault_secret_engine kv
如果使用 Transit,请设置以下内容:
示例
[ceph: root@host01 /]# ceph config set client.rgw rgw_crypt_sse_s3_vault_secret_engine transit
可选:配置 Ceph 对象网关以访问特定命名空间中的 Vault 以检索加密密钥:
示例
[ceph: root@host01 /]# ceph config set client.rgw rgw_crypt_sse_s3_vault_namespace company/testnamespace1
注意Vault 命名空间允许团队在称为租户的隔离环境中操作。Vault 命名空间功能仅适用于 Vault Enterprise 版本。
可选:通过设置 URL 路径前缀来限制对 Vault secret 空间的特定子集的访问,其中 Ceph 对象网关从中检索加密密钥:
如果使用 Key/Value,请设置以下内容:
示例
[ceph: root@host01 /]# ceph config set client.rgw rgw_crypt_sse_s3_vault_prefix /v1/secret/data
如果使用 Transit,请设置以下内容:
示例
[ceph: root@host01 /]# ceph config set client.rgw rgw_crypt_sse_s3_vault_prefix /v1/transit
假设 Vault 服务器的域名是
vaultserver
,Ceph 对象网关将从以下 URL 获取加密的传输密钥:示例
http://vaultserver:8200/v1/transit
可选: 要使用自定义 SSL 认证通过 Vault 进行身份验证,请配置以下设置:
语法
ceph config set client.rgw rgw_crypt_sse_s3_vault_verify_ssl true ceph config set client.rgw rgw_crypt_sse_s3_vault_ssl_cacert PATH_TO_CA_CERTIFICATE ceph config set client.rgw rgw_crypt_sse_s3_vault_ssl_clientcert PATH_TO_CLIENT_CERTIFICATE ceph config set client.rgw rgw_crypt_sse_s3_vault_ssl_clientkey PATH_TO_PRIVATE_KEY
示例
[ceph: root@host01 /]# ceph config set client.rgw rgw_crypt_sse_s3_vault_verify_ssl true [ceph: root@host01 /]# ceph config set client.rgw rgw_crypt_sse_s3_vault_ssl_cacert /etc/ceph/vault.ca [ceph: root@host01 /]# ceph config set client.rgw rgw_crypt_sse_s3_vault_ssl_clientcert /etc/ceph/vault.crt [ceph: root@host03 /]# ceph config set client.rgw rgw_crypt_sse_s3_vault_ssl_clientkey /etc/ceph/vault.key
重新启动 Ceph 对象网关守护进程。
在存储集群中的单个节点上重启 Ceph 对象网关:
语法
systemctl restart ceph-CLUSTER_ID@SERVICE_TYPE.ID.service
示例
[root@host01 ~]# systemctl restart ceph-c4b34c6f-8365-11ba-dc31-529020a7702d@rgw.realm.zone.host01.gwasto.service
在存储集群的所有节点上重启 Ceph 对象网关:
语法
ceph orch restart SERVICE_TYPE
示例
[ceph: root@host01 /]# ceph orch restart rgw
其它资源
- 如需了解更多详细信息,请参阅 Red Hat Ceph Storage Object Gateway Guide 中的 Vault Secret engines 部分。
- 如需了解更多详细信息,请参阅 Red Hat Ceph Storage 对象网关指南中的 Vault 身份验证 部分。
8.4.8. 使用 kv
引擎创建密钥
配置 HashiCorp Vault Key/Value secret 引擎(kv
),以便您可以创建用于 Ceph 对象网关的密钥。secret 作为键值对存储在 kv
机密引擎中。
服务器端 encyption 的密钥长度必须为 256 位,并使用 base64
进行编码。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 安装 HashiCorp Vault 软件。
- 对 HashiCorp Vault 节点的根级别访问权限。
流程
启用 Key/Value 版本 2 secret 引擎:
示例
vault secrets enable -path secret kv-v2
创建新密钥:
语法
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
8.4.9. 使用传输引擎创建密钥
配置 HashiCorp Vault Transit 机密引擎(transit
),以便您可以创建用于 Ceph 对象网关的密钥。使用 Transit secret 引擎创建密钥必须可以导出,才能使用 Ceph 对象网关进行服务器端加密。
先决条件
- 一个正在运行的 Red Hat Ceph Storage 集群。
- 安装 HashiCorp Vault 软件。
- 对 HashiCorp Vault 节点的根级别访问权限。
流程
启用 Transit secret 引擎:
[root@vault ~]# vault secrets enable transit
创建新的可导出密钥:
语法
vault write -f transit/keys/BUCKET_NAME exportable=true
示例
[root@vault ~]# vault write -f transit/keys/mybucketkey exportable=true
注意默认情况下,上述命令会创建一个
aes256-gcm96
类型密钥。启用密钥轮转:
语法
vault write -f transit/keys/BUCKET_NAME/rotate exportable=true
示例
[root@vault ~]# vault write -f transit/keys/mybucketkey/rotate exportable=true
指定密钥轮转的持续时间:
语法
vault write -f transit/keys/BUCKET_NAME/config auto_rotate_period=DURATION
示例
[root@vault ~]# vault write -f transit/keys/mybucketkey/config auto_rotate_period=30d
在本例中,
30d
指定密钥在 30 天后轮转。要以小时为单位指定密钥轮转持续时间,请使用auto_rotate_period=1h
。1H
指定密钥每 1 小时轮转一次。通过确保
latest_version
值递增来验证密钥轮转是否成功:语法
vault read transit/export/encryption-key/BUCKET_NAME
示例
[root@vault ~]# vault read transit/export/encryption-key/mybucketkey
验证密钥的创建:
语法
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
注意需要提供完整密钥路径,包括密钥版本。
8.4.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)。
流程
使用 AWS 命令行客户端上传对象,并在请求中提供安全交换加密(SSE)密钥 ID:
对于 Key/Value secret 引擎:
示例(使用 SSE-KMS)
[user@client ~]$ aws --endpoint=http://radosgw:8000 s3 cp plaintext.txt s3://mybucket/encrypted.txt --sse=aws:kms --sse-kms-key-id myproject/mybucketkey
示例(使用 SSE-S3)
[user@client ~]$ aws s3api --endpoint http://rgw_host:8080 put-object --bucket my-bucket --key obj1 --body test_file_to_upload --server-side-encryption AES256
注意在示例中,Ceph 对象网关会从
http://vault-server:8200/v1/secret/data/myproject/mybucketkey
获取 secret对于 Transit 引擎:
示例(使用 SSE-KMS)
[user@client ~]$ aws --endpoint=http://radosgw:8000 s3 cp plaintext.txt s3://mybucket/encrypted.txt --sse=aws:kms --sse-kms-key-id mybucketkey
示例(使用 SSE-S3)
[user@client ~]$ aws s3api --endpoint http://rgw_host:8080 put-object --bucket my-bucket --key obj1 --body test_file_to_upload --server-side-encryption AES256
注意在示例中,Ceph 对象网关会从
http://vaultserver:8200/v1/transit/mybucketkey
获取 secret
其它资源
- 如需更多信息,请参阅 Vault 项目站点上的 安装 Vault 文档。