注意

本文档适用于 Ceph 开发版本。

KMIP 集成

KMIP可以用作安全的密钥管理服务服务器端加密(SSE-KMS).

  1. 设置 Ceph 的 KMIP 访问

  2. 在 KMIP 中创建密钥

  3. 配置 Ceph 对象网关

  4. 上传对象

在您可以使用 KMIP 与 ceph 之前,您需要做三件事。

设置 Ceph 的 KMIP 访问

在 KMIP 中设置 Ceph 非常依赖于您的 KMIP 实现所支持的功能。这里描述了两种实现,

  1. IBM 安全 Guardium 密钥生命周期管理器 (SKLM)。这是一个广泛支持的商业产品。

  1. 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. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.