注意
本文档适用于 Ceph 开发版本。
KMIP 集成
KMIP可以用作安全的密钥管理服务服务器端加密(SSE-KMS).
在您可以使用 KMIP 与 ceph 之前,您需要做三件事。
设置 Ceph 的 KMIP 访问
在 KMIP 中设置 Ceph 非常依赖于您的 KMIP 实现所支持的功能。这里描述了两种实现,
IBM 安全 Guardium 密钥生命周期管理器 (SKLM)。这是一个广泛支持的商业产品。
PyKMIP。这是一个小型的 Python 项目,仅适用于实验和测试用途。
使用 IBM SKLM
IBMSKLM支持使用证书进行客户端身份验证。
在Advanced Configuration
,
Client Device Communication Certificates
下查找不受信任的客户端。选择Modify SSL/KMIP Certificates for Clients
,然后切换标志allow the server to trust this certificate and communicate...
.
使用 PyKMIP
PyKMIP没有特殊的注册过程,它只是信任证书。但是,证书必须由 pykmip 信任的证书颁发机构签发。PyKMIP 还希望证书包含“扩展密钥用途”的扩展。但是,可以通过在服务器配置中指定enable_tls_client_auth=False
来禁用这一点。
在 KMIP 中创建密钥
一些 KMIP 实现带有 Web 界面或其他管理工具来创建和管理密钥。如果您希望使用它,请参考您的相关文档。KMIP 协议也可以用于创建和管理密钥。PyKMIP 带有一个 Python 客户端库,可以用来这种方式。
在准备使用 pykmip 客户端之前,您需要有一个有效的 kmip 客户端密钥和证书,例如您为 ceph 创建的那个。
接下来,您需要下载并安装它:
virtualenv $HOME/my-kmip-env
source $HOME/my-kmip-env/bin/activate
pip install pykmip
然后,您需要为客户端准备一个配置文件,类似于这个:
cat <<EOF >$HOME/my-kmip-configuration
[client]
host={hostname}
port=5696
certfile={clientcert}
keyfile={clientkey}
ca_certs={clientca}
ssl_version=PROTOCOL_TLSv1_2
EOF
您需要将 {hostname} 替换为您的 kmip 主机名,还将 {clientcert} {clientkey} 和 {clientca} 替换为指向合适的 pem 编码证书的路径名,例如您为 ceph 创建的那个。
现在,您可以直接从 shell 运行此 Python 脚本:
python
from kmip.pie import client
from kmip import enums
import ssl
import os
import sys
import json
c = client.ProxyKmipClient(config_file=os.environ['HOME']+"/my-kmip-configuration")
while True:
l=sys.stdin.readline()
keyname=l.strip()
if keyname == "": break
with c:
key_id = c.create(
enums.CryptographicAlgorithm.AES,
256,
operation_policy_name='default',
name=keyname,
cryptographic_usage_mask=[
enums.CryptographicUsageMask.ENCRYPT,
enums.CryptographicUsageMask.DECRYPT
]
)
c.activate(key_id)
attrs = c.get_attributes(uid=key_id)
r = {}
for a in attrs[1]:
r[str(a.attribute_name)] = str(a.attribute_value)
print (json.dumps(r))
如果在 shell 提示符下输入所有内容,Python 将提示“>>>”,然后是“…”直到脚本被读取,之后它将读取并处理没有提示的名称,直到给出空行或文件结束符 (^D) 或发生错误。当然,如果您更喜欢,可以将此转换为常规的 Python 脚本。
配置 Ceph 对象网关
编辑 Ceph 配置文件以启用 Vault 作为服务器端加密的 KMS 后端:
rgw crypt s3 kms backend = kmip
rgw crypt kmip ca path: /etc/ceph/kmiproot.crt
rgw crypt kmip client cert: /etc/ceph/kmip-client.crt
rgw crypt kmip client key: /etc/ceph/private/kmip-client.key
rgw crypt kmip kms key template: pykmip-$keyid
您可能需要更改上面的路径以匹配您实际想要存储 kmip 证书数据的位置。
kmip 密钥模板描述了 ceph 在在 kmip 中查找之前如何修改它所给的名称。默认值只是“$keyid”。如果您不希望 ceph 看到您所有的 kmip 密钥,您可以使用此方法将 ceph 限制为仅您的 kmip 密钥命名空间中的指定子集。
上传对象
当将对象上传到网关时,在请求中提供 SSE 密钥 ID。例如,对于 kv 引擎,使用 AWS 命令行客户端:
aws --endpoint=http://radosgw:8000 s3 cp plaintext.txt \
s3://mybucket/encrypted.txt --sse=aws:kms --sse-kms-key-id mybucketkey
例如,对于传输引擎,使用 AWS 命令行客户端:
aws --endpoint=http://radosgw:8000 s3 cp plaintext.txt \
s3://mybucket/encrypted.txt --sse=aws:kms --sse-kms-key-id mybucketkey
对象网关将从 Vault 获取密钥,加密对象并将其存储在存储桶中。对下载对象的任何请求都将使网关自动从 Vault 获取相应的密钥并解密对象。
请注意,密钥将使用从密钥模板构造的名称从 kmip 获取,将$keyid
替换为提供的密钥。
使用上述 ceph 配置,
pykmip-mybucketkey
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.