注意

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

KMIP 集成

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

在将 KMIP 与 Ceph 配合使用之前,您需要做三件事。您需要将 Ceph 与 KMIP 中的客户端信息相关联,并配置 Ceph 以使用该客户端信息。您还需要在 KMIP 中创建一个或多个密钥。

设置 Ceph 的 KMIP 访问

在 KMIP 中设置 Ceph 非常依赖于 KMIP 实现所支持的机制。这里描述了两种实现方式,

  1. IBM Security Guardium Key Lifecycle Manager (SKLM)。这是一个得到良好支持的商业产品。

  2. PyKMIP。这是一个小型 Python 项目,仅适用于实验和测试用途。

使用 IBM SKLM

IBM SKLM 支持使用证书进行客户端身份验证。证书可以是自签名证书(例如使用 OpenSSL 创建),也可以是使用 SKLM 创建的证书。然后应配置 Ceph(见下文)以使用 KMIP,并尝试使用它。这将失败,但会在 SKLM 中留下一个“不受信任的客户端设备证书”。然后可以使用 Web 界面将此证书升级为已注册客户端以完成注册过程。

Advanced ConfigurationClient 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 配置文件 以启用 KMIP 作为服务端加密的 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 密钥命名空间中指定的子集。

上传对象

将对象上传到 Ceph 对象网关时,请在请求中提供 SSE 密钥 ID。例如,使用 AWS 命令行客户端

aws --endpoint=http://radosgw:8000 s3 cp plaintext.txt \
s3://mybucket/encrypted.txt --sse=aws:kms --sse-kms-key-id mybucketkey

Ceph 对象网关将从 KMIP 获取密钥,加密对象并将其存储在存储桶中。任何下载对象的请求都将使 Ceph 对象网关自动从 KMIP 检索相应的密钥并解密对象。

请注意,将使用从密钥模板构造的名称从 KMIP 获取密钥,将 $keyid 替换为提供的密钥。

使用上面给出的 Ceph 配置,radosgw 将从以下位置获取密钥

pykmip-mybucketkey

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入