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

发布时间:2026/9/23 20:24:55

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),仅供参考
延伸阅读

更多相关文章

2026/9/23 20:19:55

雷蛇驱动官网图解原理:3步搞定配置卡壳

雷蛇驱动官网图解原理:3步搞定配置卡壳 配置环境就卡半天?别急,这锅不全是你的。很多开发者在调试雷蛇外设时,总以为去官网下载个安装包就能万事大吉。其实, 雷蛇驱动官网 背后的通信机制才是关键。今天咱们不聊虚的,直接通过 图解原理…

2026/9/23 20:19:55

从数据到决策:数据分析报告写作框架与避坑指南

开头我第一次写数据分析报告的时候,花了整整三天时间调格式、做图表,最后交上去,老板翻了三十秒,抬头问我:"所以呢?我们的问题到底出在哪?"那一刻我意识到,我做的是一份&q…

2026/9/23 23:45:20

嵌入式五大通信接口时序全解析:UART/SPI/I2C/CAN/USB

做嵌入式这些年,无论是带新人、做评审,还是自己调板子,来来回回绕不开的问题就那几个:模块之间用什么通信?信号线怎么接?波形为什么不对?我发现自己面试候选人也特别爱问通信接口,因…

2026/9/23 23:45:20

无源定位椭圆法:被动雷达多站融合定位算法解析

简介:面向无源雷达与被动定位研究场景,这份MATLAB源码实现椭圆法目标定位中的关键步骤——多站观测椭圆交点求解。它根据信号到达时间差/频率差信息构建椭圆模型,通过数值迭代计算目标平面位置,可避免手工解算非线性方程的繁琐并降…

2026/9/23 23:45:20

微信表情包怎么导出成图片素材?做图的人看这里

如果你做图、做贴纸、剪视频,大概遇到过这种卡壳——挑了半天,觉得某个微信表情正好贴合主题,想放进画面里。可你翻遍整个微信,就是拿不出那个「文件」。微信表情导出成图片素材,办法是把它发给「表情保存助手」这个公…

2026/9/23 23:45:20

湘楚有才单招:单招路上,信息差才是最大的不公平

同一个班的学生,成绩差不多,备考时间差不多,最后录取结果却可能差很多。问题出在哪里?很多时候,出在信息差上。有的学生知道目标院校今年扩招了,果断报考,顺利上岸;有的学生不知道,保守填报,浪费了分数。有的学生了解某所学校的职测侧重什么方向,提前针对性准备;有的学生一无所…

2026/9/23 23:40:20

全局规划与局部避障:Astar与DWA算法原理及源码实战

简介:基于Python实现的轮式机器人路径规划工程,融合A星全局路径规划与DWA动态窗口法,适用于机器人导航、自动驾驶等教学科研与个人学习场景。压缩包共50个文件,以13个Python脚本为核心,分别实现A星、DWA与主程序流程&a…

2026/9/23 12:07:00

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/23 0:01:54

3个实战技巧搞定形式英语:从看教程到跑通性能优化

3个实战技巧搞定形式英语:从看教程到跑通性能优化 看了一堆教程还是不会写项目?别慌,这种“眼高手低”的困境在开发者圈子里太常见了。很多人以为卡点在语法,其实真正拦路虎是缺乏将知识点串联成完整链路的能力。今天咱们不聊虚的,直接拿【形式英语】这…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码