ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Ceph RGW 集成 KMIP:以 KMIP 协议作为 SSE-KMS 密钥管理后端的完整配置指南

Ceph RGW 集成 KMIP:以 KMIP 协议作为 SSE-KMS 密钥管理后端的完整配置指南 存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载本文基于当前仓库 doc/radosgw/kmip.rst 整理结合 src/rgw/rgw_kms.cc、src/rgw/rgw_kmip_client.h、src/rgw/rgw_kmip_client_impl.cc 等源码深入讲解。导读Ceph 对象网关RadosGW支持将对象加密Server-Side Encryption的密钥托管到外部 KMS 系统KMIPKey Management Interoperability Protocol即是被支持的 KMS 后端之一。本文完整介绍如何在 KMIP 服务端注册 Ceph 客户端、创建加密密钥、配置 RGW 启用 KMIP 后端以及最终通过 AWS CLI 上传加密对象并理解密钥的获取链路。KMIP 在 Ceph 中的定位KMIP 是一个用于密钥管理的互操作协议在 Ceph 中可以充当服务端加密SSE-KMS参见 加密文档的安全密钥管理服务。当rgw_crypt_s3_kms_backend设置为kmip时RadosGW 不会像 Barbican、Vault 那样把密钥托管在自己的配置或独立 KMS 服务中而是通过 KMIP 协议向 KMIP 服务器发起密钥查找LOCATE、获取GET等操作取得对象的加密密钥后再完成对象数据的加解密。原始文档中的交互流程如下--------- --------- ------ ------- | Client | | RadosGW | | KMIP | | OSD | --------- --------- ------ ------- | create secret key for key ID | | |----------------------------------| | | | | | upload object with key ID | | |----------------------------------| request | | | secret key | | | for key ID | | |------------| | |------------| | | return | | | secret key | | | | | | encrypt | | | object with | | | secret key | | | | | | store | | | encrypted | | | object | | |------------|从 rgw_kms.cc 的代码可以看到RGW 在取密钥时是一个典型的“后端分派”结构根据rgw_crypt_s3_kms_backend的取值分别调用 Barbican、Vault、KMIP 或 testing本地测试实现KMIP 分支最终进入get_actual_key_from_kmip()。也就是说 KMIP 只是 RGW SSE-KMS 家族中的一个可插拔后端本文的配置并不影响其他后端的使用。在正式使用 KMIP 之前需要完成三件事在 KMIP 中为 Ceph 关联客户端信息把 Ceph 注册为可信客户端配置 CephRGW使用这份客户端信息在 KMIP 中创建一个或多个密钥。在 KMIP 中为 Ceph 配置访问权限在 KMIP 服务端登记 Ceph 的方式完全取决于你所使用的 KMIP 实现。原文档介绍了两种实现IBM Security Guardium Key Lifecycle ManagerSKLM商业产品支持完善和 PyKMIP小型 Python 项目仅适合实验与测试。使用 IBM SKLMIBM SKLM 使用证书对客户端进行认证。证书可以是自签名证书例如用 OpenSSL 生成也可以是 SKLM 签发的证书。操作路径大致如下先把 Ceph 配置为使用 KMIP见下文“配置 Ceph 对象网关”然后发起一次使用 KMIP 的操作这次操作预期会失败但它会在 SKLM 中留下一个 untrusted client device certificate不受信任的客户端设备证书通过 SKLM Web 界面完成注册进入Advanced Configuration→Client Device Communication Certificates找到不受信任的客户端选择Modify SSL/KMIP Certificates for Clients然后打开allow the server to trust this certificate and communicate...开关将其升级为已注册客户端。使用 PyKMIPPyKMIP 没有专门的注册流程它直接信任客户端证书。但有两个前提客户端证书必须由 PyKMIP 信任的证书颁发机构CA签发PyKMIP 倾向于证书带有 extended key usage 扩展。若证书缺少该扩展可以在服务端配置中设置enable_tls_client_authFalse来绕过。在 KMIP 中创建密钥部分 KMIP 实现自带 Web 界面或管理工具来创建和管理密钥此时直接参考对应产品的文档即可。KMIP 协议本身也支持创建与管理密钥PyKMIP 自带 Python 客户端库可以按如下方式使用。首先准备好 Ceph 将要使用的 KMIP 客户端证书与私钥即上一节为 Ceph 创建的那份证书。然后创建虚拟环境并安装pykmipvirtualenv $HOME/my-kmip-env source $HOME/my-kmip-env/bin/activate pip install pykmip接着为 pykmip 客户端准备一个配置文件默认端口为 5696即 KMIP 标准端口cat EOF $HOME/my-kmip-configuration [client] host{hostname} port5696 certfile{clientcert} keyfile{clientkey} ca_certs{clientca} ssl_versionPROTOCOL_TLSv1_2 EOF需要把{hostname}替换为 KMIP 主机名把{clientcert}、{clientkey}、{clientca}替换为 PEM 编码证书与密钥的路径——可以直接使用为 Ceph 创建的那份证书。随后在 shell 中直接运行下面的 Python 脚本它会从标准输入逐行读取密钥名为每个名字创建一个 256 位 AES 密钥并激活python from kmip.pie import client from kmip import enums import ssl import os import sys import json c client.ProxyKmipClient(config_fileos.environ[HOME]/my-kmip-configuration) while True: lsys.stdin.readline() keynamel.strip() if keyname : break with c: key_id c.create( enums.CryptographicAlgorithm.AES, 256, operation_policy_namedefault, namekeyname, cryptographic_usage_mask[ enums.CryptographicUsageMask.ENCRYPT, enums.CryptographicUsageMask.DECRYPT ] ) c.activate(key_id) attrs c.get_attributes(uidkey_id) r {} for a in attrs[1]: r[str(a.attribute_name)] str(a.attribute_value) print (json.dumps(r))若直接在 shell 交互提示符下粘贴Python 会先显示、...提示符等脚本读取完毕后开始处理每行输入的名称无提示符直到输入空行或 EOF^D为止遇到错误也会终止。你也可以把它改写成常规 Python 脚本文件来执行。注意脚本中创建的密钥用途掩码cryptographic usage mask同时包含ENCRYPT与DECRYPT这正是 RGW 加解密对象所必需的权限。配置 Ceph 对象网关编辑 Ceph 配置文件即 配置指南 中的ceph.conf启用 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 证书数据的位置调整。在 rgw.yaml.in 中KMIP 相关的全部配置项及其默认行为如下配置项说明rgw_crypt_s3_kms_backendSSE-KMS 密钥存储后端枚举值barbican默认、vault、testing、kmip设为kmip即启用本指南所述功能rgw_crypt_kmip_addrKMIP 服务器地址host:port。从源码 rgw_kmip_client_impl.cc 可以看到RGW 会解析地址中的端口未指定端口时默认使用5696rgw_crypt_kmip_ca_path用于校验 KMIP 服务器的 CA 证书路径rgw_crypt_kmip_username/rgw_crypt_kmip_password使用用户名/密码认证时的凭据与证书认证二选一rgw_crypt_kmip_client_cert/rgw_crypt_kmip_client_key使用客户端证书认证时的证书与私钥路径rgw_crypt_kmip_kms_key_templateSSE-KMS 模式下 KMIP 密钥名的模板$keyid会被替换为请求中的 key IDrgw_crypt_kmip_s3_key_templateSSE-S3 模式下 KMIP 密钥模板默认值为$keyidrgw_crypt_s3_kms_cache_enabled是否缓存 SSE-KMS 加密密钥默认true相关缓存参数还包括rgw_crypt_s3_kms_cache_max_size默认 128 个每个 AES-256 密钥约 32 字节加开销、rgw_crypt_s3_kms_cache_positive_ttl成功查询缓存 60 秒范围 10~3600、rgw_crypt_s3_kms_cache_transient_error_ttl瞬时错误缓存 10 秒、rgw_crypt_s3_kms_cache_negative_ttl永久性错误如密钥不存在缓存 120 秒rgw_crypt_suppress_logs抑制可能打印客户端密钥的日志默认true对密钥安全有实际意义密钥名模板key template的语义KMIP 密钥模板描述的是RGW 在向 KMIP 查询密钥前如何改写用户提供的 key ID。默认值就是$keyid。如果不希望 RGW 看到 KMIP 中全部密钥可以借此把 RGW 限制在 KMIP 密钥命名空间的指定子集内。这一逻辑在源码中对应 rgw_kms.cc 的KmipGetTheKey::keyid_to_keyname()它读取rgw_crypt_kmip_kms_key_template将字符串中的$keyid全部替换为请求携带的 key ID模板为空时直接使用 key ID。后续的get_uniqueid_for_keyname()通过 KMIPLOCATE操作按名称查找唯一 ID若查不到返回-ENOENT查到多个则返回-EINVALget_key_for_uniqueid()再通过 KMIPGET操作按唯一 ID 取回密钥字节。整个过程封装在 rgw_kmip_client.h 定义的RGWKMIPTransceiver中它支持的操作包括CREATE、LOCATE、GET、GET_ATTRIBUTES、GET_ATTRIBUTE_LIST、DESTROY——后两者为未来的管理能力预留RGW 当前取密钥主要走LOCATEGET。客户端连接层在 rgw_kmip_client_impl.cc 中实现协议版本固定为 KMIP 1.0通过 OpenSSL 建立 TLS 连接BIO_set_conn_hostname/BIO_set_conn_port并支持两种认证方式——客户端证书client cert/key与用户名/密码凭据UsernamePasswordCredential。上传加密对象配置完成后向 Ceph 对象网关上传对象时在请求中携带 SSE 的 key ID 即可。以 AWS 命令行客户端为例aws --endpointhttp://radosgw:8000 s3 cp plaintext.txt \ s3://mybucket/encrypted.txt --sseaws:kms --sse-kms-key-id mybucketkeyRGW 会从 KMIP 获取密钥、加密对象并存入 bucket任何下载对象的请求都会使 RGW 自动从 KMIP 取回对应密钥并解密对象。需要注意的是RGW 会用“密钥模板替换$keyid”构造出来的名称去 KMIP 中取密钥。以上面的 Ceph 配置为例--sse-kms-key-id mybucketkey对应的 KMIP 密钥名即为pykmip-mybucketkey因此在“在 KMIP 中创建密钥”一节中通过 pykmip 脚本创建的密钥名应与此模板规则保持一致例如创建名为pykmip-mybucketkey的密钥否则LOCATE将查不到密钥上传/下载会报错。小结与故障排查提示KMIP 集成让 Ceph 对象网关可以把对象加密密钥托管在符合 KMIP 标准的密钥管理系统中适合已有 KMIP 基础设施、希望统一密钥治理的场景。落地时请重点核对以下几点rgw_crypt_s3_kms_backend kmip是否生效这是后端分派 rgw_kms.cc 的入口判断rgw_crypt_kmip_addr是否可达未写端口时默认 5696客户端证书与 CA 是否被 KMIP 服务端信任SKLM 需完成 untrusted→registered 升级PyKMIP 需 CA 信任且注意 extended key usage 或关闭enable_tls_client_auth密钥名的模板替换结果pykmip-keyid与 KMIP 中实际创建的密钥名是否一致密钥的用途掩码需同时包含ENCRYPT与DECRYPT且密钥处于激活activate状态。以上配置均可在运行中通过ceph config set或写入ceph.conf完成涉及密钥与证书的配置项如rgw_crypt_kmip_client_key、密码建议以仅 RGW 进程可读的权限存放并保持rgw_crypt_suppress_logs默认开启以避免密钥泄露到日志。赞分享存储分布式文件系统对象存储后端高可用【免费下载链接】cephCeph is a distributed object, block, and file storage platform项目地址https://gitcode.com/gh_mirrors/ce/ceph点击查看免费下载相关推荐如何扩展Money Ruby库自定义货币加载器和启发式算法完整指南如何扩展Money Ruby库自定义货币加载器和启发式算法完整指南 Money Ruby库是一个强大的Ruby工具用于处理货币和货币转换。本文将详细介绍如何存储分布式文件系统对象存储后端高可用Serial Studio 开源版和Pro怎么选Serial Studio 开源版和Pro怎么选 你接了一块 Arduino 开发板想把它打印的温度值画成实时曲线。Serial Studio 是个跨平台遥测桌面应用数据可视化物联网mflux深度拆解从语义理解到像素生成的全链路技术揭秘mflux深度拆解从语义理解到像素生成的全链路技术揭秘 在AI图像生成领域mflux作为基于MLX框架的FLUX移植项目展现了一套完整而精妙的技术架构。与上一篇ClickHouse-Grafana插件数据可视化进阶世界地图、直方图、饼图等高级图表制作教程下一篇终极iOS开发实战指南从入门到精通的完整学习路径创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表