概览
借助企业密钥管理 (EKM),OpenAI 可以使用由你控制的主密钥来加密数据。本文档介绍如何设置你的 GCP 账户,以向 OpenAI 授予对你的 KMS 的有限访问权限。

步骤
1. 为 OpenAI 创建联合身份
OpenAI 将从其自有的 GCP 账户中签发一个身份令牌,该令牌大致如下所示。
azp 和 sub 是 OpenAI 在 GCP 中的服务账号 ID
aud 是你的 OpenAI 组织 ID。你也可以选择其他受众,例如你的 OpenAI 项目 ID(参见下文说明)
{
"aud": "org-xxxx",
"azp": "105900137572174660365",
"exp": 1747876928,
"iat": 1747873328,
"iss": "https://accounts.google.com",
"sub": "105900137572174660365"
}此步骤用于识别该身份令牌中的声明,并在提供该身份令牌时,让你的 GCP STS 能够签发访问令牌。
前往 IAM 和管理 > 工作负载身份联合,然后点击创建池

在创建身份池步骤中,为池名称输入任意内容。
请记住此名称,后续你需要将其注册到 OpenAI
在向池中添加提供方步骤中:
在“选择提供方”中,选择 OpenID Connect (OIDC)
在提供方名称字段中,输入任意内容。
在签发方 (URL) 部分,输入 https://accounts.google.com
在受众部分:
选择允许的受众
输入 OpenAI 向你传递令牌时应指定的受众。
对于 ChatGPT 或 API:你可以使用 OpenAI API 组织 ID (org-xxx)
对于 API:你可以填写特定的 API 项目 ID,以实现更精细的权限管控。

在属性映射部分:
为 google.subject 输入 assertion.sub

在属性条件部分:
输入
assertion.sub == "105900137572174660365"
完成后,你应在 https://console.cloud.google.com/iam-admin/workload-identity-pools 页面中看到你的工作负载身份池和工作负载身份提供方信息
工作负载身份池 ID

工作负载身份提供方 ID

2. 确保 KMS 已启用
前往 https://console.developers.google.com/apis/api/cloudkms.googleapis.com/overview 以启用 KMS。你无需在与识别 OpenAI 联合身份相同的 GCP 项目中创建 KMS;但如果项目不同,则必须至少确保两个项目中都已启用 KMS。
3. 创建新的 KMS 密钥
前往安全 > 数据保护 > 密钥管理
在概览选项卡下,点击创建密钥环
为密钥环选择任意名称
在“用途和算法”中,选择对称加密/解密

创建密钥环后,它应出现在密钥环选项卡中。点击该密钥环。
在密钥环详情页,点击创建密钥
为密钥选择任意名称
4. 为 KMS 上的加密/解密操作创建受限角色
前往 IAM 和管理 > 角色 > 创建角色
为角色标题和 ID 输入任意内容
点击“添加权限”,然后添加以下权限:
cloudkms.cryptoKeyVersions.useToDecrypt
cloudkms.cryptoKeyVersions.useToEncrypt
5. 将 OpenAI 的联合身份分配给用于加密/解密操作的 KMS 受限角色
前往安全 > 数据保护 > 密钥管理
点击你的密钥环名称,然后点击你的密钥名称以进入密钥详情页
如果你没有看到该页面,请返回创建 KMS 部分
点击权限标签页,然后点击授予访问权限按钮

将 OpenAI 的联合身份分配给你之前创建的自定义角色:
在添加主体部分,输入:principal://iam.googleapis.com/projects/<YOUR_GCP_PROJECT_NUMBER>/locations/global/workloadIdentityPools/<YOUR_GCP_WORKLOAD_IDENTITY_POOL>/subject/105900137572174660365
这里的 YOUR_GCP_PROJECT_NUMBER 是指你在其中创建 YOUR_GCP_WORKLOAD_IDENTITY_POOL 并配置识别 OpenAI 联合身份的那个项目。该项目可以与 KMS 所在的项目相同,但不是必须的。
如果项目不同,请前往 https://console.developers.google.com/apis/api/cloudkms.googleapis.com/overview,确保另一个项目也至少已启用 KMS。
在分配角色部分,选择你在上一步中创建的、用于 EKM 有限权限的自定义角色
6. 根据你自己的安全实践实施任何其他限制
以上是 OpenAI 设置 EKM 所需的最低要求信息。只要 OpenAI 能够正常调用你 KMS 上的加密和解密操作,你完全可以根据内部安全规范实施额外的密钥策略或限制。当你调用下文所述的 OpenAI 密钥注册端点时,我们将验证你的设置。
完成上述步骤后
ChatGPT Enterprise
请联系你的 OpenAI 联系人,并分享以下信息:
"workload_identity_project_number": "123456789012",
你注册 OpenAI 工作负载身份的 12 位 GCP 项目编号
"workload_identity_pool_id": "openai-azure",
包含你为 OpenAI 注册的工作负载身份提供方的池
"workload_identity_provider_id": "openai-ekm-service-role",
你为 OpenAI 注册的工作负载身份提供方
"kms_project_id": "adjective-noun-12345",
你的 KMS 所在的 GCP 项目名称
"kms_key_name": "openai-kms-key",
密钥管理系统主密钥的名称
"kms_key_ring_name": "openai-kms-key-ring",
包含你所管理的主密钥的密钥管理系统密钥环
"kms_key_location": "us-east1"
你的密钥管理系统主密钥所在区域
我们将为你的 ChatGPT 组织/工作空间启用 EKM。
API
向 OpenAI 注册你的外部密钥
请按照管理 API 中的外部密钥这篇 API 参考文档中的说明操作
首先,在 OpenAI 组织级别注册你的外部密钥,这将生成一个外部密钥 ID。
在此步骤中,我们将通过检查能否成功通过身份验证访问你的 KMS 来验证你在 GCP 中的设置。
此操作尚未在你的 OpenAI 项目中启用 EKM。
curl -X POST \
-H "Content-type: application/json" \
-H "Authorization: Bearer $TOKEN" \
"https://api.openai.com/v1/organization/external_keys" \
-d '{
"type": "gcp",
"name": "GCP EKM Config",
"workload_identity_project_number": "123456789012",
"workload_identity_pool_id": "openai-azure",
"workload_identity_provider_id": "openai-ekm-service-role",
"audience": <your org id or project id>,
"kms_project_id": "adjective-noun-12345",
"kms_key_name": "openai-kms-key",
"kms_key_ring_name": "openai-kms-key-ring",
"kms_key_location": "us-east1"
}'接着,创建一个关联至该外部密钥的 OpenAI 项目。完成后,EKM 即会在该项目中启用。
curl -X POST \
-H "Content-type: application/json" \
-H "Authorization: Bearer $TOKEN" \
"https://api.openai.com/v1/organization/projects" \
-d '{
"name": "Some Project",
"external_key_id": "extkey_xxxx"
}'