HYOK(Hold Your Own Key)为用户提供了云环境中数据安全的最高级别控制权。该模式允许用户完全掌控密钥的所有权与管理权,并能够通过自有的软件或硬件系统对数据进行加密。在火山方舟平台上,用户可通过“托管外部密钥”功能接入外部密钥,并在执行精调任务时将其指定为数据加密密钥。该密钥将用于加密用户的精调数据等敏感信息,并在任务全生命周期内确保数据加密存储。
下图是HYOK的原理流程图(以加密存储为例):
需说明以下几点:
传统方式 | HYOK 模式 |
|---|---|
由CloudKMS管理密钥,平台具备访问用户明文数据的潜在条件。 | 用户作为密钥的唯一持有者,从根本上掌控数据访问权限。即使云服务提供商也无法在未经授权的情况下访问明文数据。 |
火山方舟目前提供基础版本的XKS Proxy供用户参考和使用。后续将开放相关接入协议,用户可基于协议自行实现代理服务,并接入其他KMS或CloudHSM系统。
基础版XKS Proxy功能:
密钥来源 | aliyun/aws |
|---|---|
加密算法 | AES_256 |
说明
本节将介绍如何通过VPC终端节点服务托管外部密钥至外部密钥存储。其中,第1至4步为创建外部密钥存储所需的前置资源准备(本文以火山引擎资源为例)。如果您已具备相应资源,可跳过相关步骤。第5至9步为在火山方舟平台上创建外部密钥存储并托管外部密钥的具体操作指引。
VPC 终端节点服务需与外部密钥管理器所在 VPC 连接。您可使用符合外部密钥存储要求的现有 VPC;如无可用 VPC,请参照下图于火山引擎-私有网络中创建。
在创建所需的VPC终端节点服务前,您需要有一台可部署XKS Proxy的ECS实例。下图为在火山引擎-云服务器创建ECS实例的示例
CLB 用于将火山引擎 KMS 的访问流量路由至XKS Proxy。
您可根据下图指引在火山引擎-传统型负载均衡中创建CLB并配置监听端口:
说明
具体配置请根据实际需要确定。若仅用于方舟托管外部密钥,建议选用基础规格即可。
2100052433。请返回至步骤2中已创建的 ECS 实例,部署 XKS Proxy 并手动配置鉴权信息,包括:外部 KMS 的 ak/sk、用于验证火山引擎 KMS 身份的 ak/sk、保障连接安全的 CA 证书等元数据。
您可通过 SSH 或控制台连接到ECS 实例,并按下图指引完成 XKS Proxy 部署(本文以控制台连接为例):
# 下载压缩包 wget https://ark-public-cn-beijing.tos-cn-beijing.volces.com/xksproxy/xksproxy.tar.gz # 解压xksproxy压缩包 tar -zxvf xksproxy.tar.gz # 进入解压的文件夹 cd xksproxy
xksproxy/ ├── conf │ └── config.yaml # 配置文件 ├── scripts │ ├── README.md # CA/服务端证书生成指南 │ ├── ca.cnf │ ├── cert_gen.sh │ ├── generate_ca.sh │ ├── generate_server_cert.sh │ └── server.cnf └── xksproxy # 主程序
config.yaml 中配置路径。scripts/README.md 文档创建。# 1.记录上述Step4「创建VPC终端节点服务」步骤中的服务域名 # 假设域名为epsvc-xxx.cn-beijing.privatelink.volces.com # 2.打开scripts目录 cd xksproxy/scripts # 3.生成根证书和服务端证书 ./cert_gen.sh all --dns "*.epsvc-xxx.cn-beijing.privatelink.volces.com" --output /path/to/cert/dir
certs ├── ca.key # 私有CA私钥 ├── ca.pem # 私有CA证书 ├── ca.srl # 私有CA序列号 ├── cert.csr # 服务端证书签名请求 ├── cert.pem # 服务端证书 ├── key.pem # 服务端私钥 └── openssl.cnf # 服务端证书配置
conf 目录,编辑 config.yaml 文件。# cd conf server: host: "0.0.0.0" port: 443 read_timeout: 30 write_timeout: 30 path_prefix: "" # 路径前缀(选填) tls: enabled: true # 是否开启tls(目前必须开启) cert_path: "" # 服务端证书路径(必填) key_path: "" # 服务端密钥路径(必填) ca_path: "" # CA证书路径(必填) ca_base64: "" # CA证书der格式base64编码 (启动服务时自动填充) # SignV4 authentication configuration auth: access_key_id: "YOUR_ACCESS_KEY_ID" # 认证ak(留空则启动自动填充) secret_access_key: "YOUR_SECRET_ACCESS_KEY" # 认证sk(留空则启动自动填充) kms: - id: "local-kms" # 外部kms唯一标识 provider: "local" # 根据kms服务商填写,目前支持aliyun、aws和local(本地调试模式) region: "" # kms region endpoint: "" # kms服务endpoint access_key: "" # kms服务鉴权ak secret_key: "" # kms服务鉴权sk key_mapping: # 密钥映射 "external-key-1": "real-key-id-1" # key为xksproxy中该密钥别称,vaule为kms服务真实密钥id log: level: "info" file_path: "" max_size: 100 max_age: 7 max_backups: 5 # XKS proxy configuration xks_proxy: # xksproxy版本信息,保持不变即可 fleet_size: 1 vendor: "Volc XKS Proxy" model: "Volc XKS Proxy v1.0"
字段 | 描述 | 示例 | 是否必填 |
|---|---|---|---|
server.path_prefix | 路径前缀 | myxks | 否 |
server.tls.cert_path | 服务端证书路径 | /root/cert.pem | 是 |
server.tls.key_path | 服务端密钥路径 | /root/key.pem | 是 |
server.tls.ca_path | CA证书路径 | /root/ca.pem | 是 |
server.tls.ca_base64 | CA证书der格式base64编码 | / | 否(启动时自动填充) |
auth.access_key_id | 用于验证kms侧身份的ak,kms会使用该ak/sk做请求签名 | XT7II5R7F4OORP5Z4PRB | 否(留空则自动填充) |
auth.secret_access_key | 用于验证kms侧身份的ak,kms会使用该ak/sk做请求签名 | hHnacnaJEUa0AlYd6WZXUlPg9QG0Gzasrfjd4VkWIpp | 否(留空则自动填充) |
kms.id | 用于唯一标识外部kms | mykms | 是 |
kms.provider | kms的提供方,目前支持:
| local | 是 |
log.level | 日志级别
| error | 否 |
log.file_path | 日志存储位置 | /mypath/xksproxy.log | 否 |
log.max_size | 日志最大容量(MB) | 100 | 否(默认100MB) |
log.max_age | 日志最大存储时间(天) | 7 | 否(默认7天) |
log.max_backups | 日志最大存储数量 | 100 | 否(默认5个) |
xks_proxy.* | xksproxy的版本元信息 | / | 否 |
./xksproxy server
您需手动开通 KMS 服务并授予火山方舟相应访问权限,以便其代理您完成外部密钥的托管。
在火山方舟控制台中,选择对应的 VPC 终端节点服务,并配置代理连接信息。所需配置内容请参照步骤6中 config.yaml 文件的相应条目。
托管外部密钥将由方舟代理您在火山引擎 KMS 中创建一款用户主密钥。请选择步骤8中创建的外部密钥存储,并可按需自定义密钥环与密钥信息。
Q:可以使用其他厂商的KMS服务接入方舟的托管外部密钥功能吗?
A:可以,您使用的其他厂商KMS服务的ak/sk需具备以下权限:kms:Encrypt、kms:Decrypt 和 kms:DescribeKey。
Q:如果我已经拥有相关的云服务资源,是否还需要重新创建?
A:如果您已拥有相应的云服务资源(如ECS、CLB),并确保其与目标资源处于同一可用区且能正常访问外部密钥存储,则可以跳过相关创建步骤。
Q:XKS Proxy 无法连接到外部密钥存储应如何排查?
A:请按以下步骤依次检查:
Q:如果密钥已被删除,为何精调任务仍在进行?
A:精调任务仅在加密数据的输出和访问时需要访问密钥。若该阶段已完成,精调任务进程将不受密钥删除影响;若任务仍在进行且需访问加密数据,则会因密钥不可用而提示错误信息。
Q:使用托管外部密钥是否会带来时延性能的损失?
A:该功能的时延取决于火山引擎KMS、XKS Proxy及外部密钥存储接口的延时和网络情况。与直接使用火山引擎KMS相比,会有百毫秒级别的延迟差距,但不会对精调任务的整体性能产生影响。