クラウドプロバイダーで管理する RSA-3072 の非対称鍵ペアを OpenAI に登録します。
秘密鍵は AWS KMS、Azure Key Vault、Google Cloud KMS のいずれかに保管されます。OpenAI は登録時に、対応する公開鍵のコピーを保存します。
鍵を登録しても、製品機能やストレージは設定されません。このガイドでは、PSP の復号に使用する鍵を扱います。
- 組織 ID を用意します。クラウド側の信頼関係の設定、鍵の登録、API へのアクセスには、すべて同じ組織を使用してください。
- 外部鍵の読み書き権限を持つ組織の管理用 API キーを作成し、
OPENAI_ADMIN_KEY に安全な方法で読み込みます。プロジェクトの推論用 API キーは使用できません。
- RSA-3072 鍵を有効な状態で作成し、このガイドで説明する範囲に限定して公開鍵の読み取り権限を OpenAI に付与できることを確認します。
- 秘密鍵の使用は、権限のあるユーザーに限定します。古いバージョンの鍵を必要とするレコードがある間は、そのバージョンを保持してください。
鍵を登録する前に、利用するプロバイダーの手順に従ってください。どのプロバイダーでも RSA-3072 を使用し、OpenAI には公開鍵とメタデータの読み取り権限のみを付与します。
KMS > カスタマー管理型のキー > キーの作成 を開き、リージョンを選択します。次のように設定してください。
- キーのタイプ: 非対称
- キーの使用法: 暗号化および復号
- キー仕様:
RSA_3072
自組織の鍵管理者を指定して、鍵の作成を完了します。鍵は有効なままにし、末尾が key/<CUSTOMER_KMS_KEY_ID> の ARN を省略せずにコピーします。エイリアスの ARN は使用しないでください。
IAM > ポリシー > ポリシーの作成 > JSON を開きます。<CUSTOMER_KMS_KEY_ARN> を実際の鍵の ARN に置き換え、ポリシーを OpenAI-PublicKeyRead という名前で保存します。
12345678910{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["kms:DescribeKey", "kms:GetPublicKey"],
"Resource": "<CUSTOMER_KMS_KEY_ARN>"
}
]
}
この鍵は復号に対応していますが、OpenAI が必要とするのは上記の読み取り権限のみです。OpenAI に鍵の使用者や管理者の権限を付与しないでください。
IAM > ロール > ロールの作成 > カスタム信頼ポリシー を開きます。<OPENAI_ORG_ID> を自組織の OpenAI 組織 ID に置き換えます。OpenAI のプリンシパルは変更しないでください。
1234567891011121314151617{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::790389265272:role/EnterpriseKeyManagement"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "<OPENAI_ORG_ID>"
}
}
}
]
}
OpenAI-PublicKeyRead をアタッチしてロールを作成し、ロールの ARN をコピーします。鍵の登録時には、同じ組織 ID を external_id に指定します。
キーポリシーでロールに必要な権限が付与されていることを確認します。キーポリシーが権限の付与を IAM に委任していない場合は、次のステートメントを追加します。<CUSTOMER_ROLE_ARN> を実際のロールの ARN に置き換え、既存の管理者権限は維持してください。
この KMS キーポリシーの "Resource": "*" は、ポリシーをアタッチした鍵にのみ適用されます。IAM ポリシーでは、対象の鍵の ARN を明示的に指定します。
123456789{
"Sid": "AllowPublicKeyRead",
"Effect": "Allow",
"Principal": {
"AWS": "<CUSTOMER_ROLE_ARN>"
},
"Action": ["kms:DescribeKey", "kms:GetPublicKey"],
"Resource": "*"
}
登録に備えて、ロールの ARN と鍵の ARN を控えておきます。
テナント管理者に依頼して、テナントに EKM - OpenAI Azure を追加します。アプリケーション ID は 20a14814-5ab7-4612-a671-1382b412bf93 です。
Azure CLI をインストールしてサインインし、アプリケーションが存在するか確認します。
123az login --tenant '<CUSTOMER_TENANT_ID>'
az ad sp show --id '20a14814-5ab7-4612-a671-1382b412bf93' \
--query '{name:displayName,objectId:id}' -o table
アプリケーションが存在しない場合は、次のコマンドで追加します。
az ad sp create --id '20a14814-5ab7-4612-a671-1382b412bf93' \
--query '{name:displayName,objectId:id}' -o table
ロールの割り当てに使用するため、このテナント内のオブジェクト ID を控えておきます。
キー コンテナー > 作成 を開きます。サブスクリプション、リソースグループ、コンテナー名、リージョンを指定します。アクセス構成で Azure ロールベースのアクセス制御を選択します。
管理者には、このコンテナーの Key Vault 暗号化責任者など、鍵の作成を許可するロールが必要です。そのロールを OpenAI に付与しないでください。
コンテナーでオブジェクト > キー > 生成/インポートを開き、次のように設定します。
- 名前:
<OPENAI_ORG_ID>--asymmetric-key(自組織の OpenAI 組織 ID を使用)
- キーの種類: RSA
- RSA キー サイズ: 3072
- 有効: はい
有効化日や有効期限を設定した場合は、鍵が現在有効であることを確認します。鍵で許可する操作には復号化を含めます。OpenAI には鍵の読み取り権限のみを付与します。
Key Vault 内の RSA-HSM 鍵も使用できます。スタンドアロンの Managed HSM エンドポイントには対応していません。
鍵の読み取りを許可する DataAction を持つカスタムロールを作成します。次の定義を public-key-reader.json として保存し、サブスクリプションとリソースグループの値を置き換えます。
123456789101112{
"Name": "OpenAI Public Key Reader",
"IsCustom": true,
"Description": "Read key metadata and public keys.",
"Actions": [],
"NotActions": [],
"DataActions": ["Microsoft.KeyVault/vaults/keys/read"],
"NotDataActions": [],
"AssignableScopes": [
"/subscriptions/<CUSTOMER_SUBSCRIPTION_ID>/resourceGroups/<CUSTOMER_RESOURCE_GROUP>"
]
}
VAULT_RESOURCE_ID には、コンテナーのプロパティに表示される Azure リソース ID を設定します。HTTPS URI は使用しません。OPENAI_SP_ID には、このテナント内のアプリケーションのオブジェクト ID を設定し、対象の鍵をスコープとしてロールを割り当てます。
123456789101112az role definition create --role-definition @public-key-reader.json
OPENAI_SP_ID='<CUSTOMER_OPENAI_SP_OBJECT_ID>'
VAULT_RESOURCE_ID='<CUSTOMER_VAULT_RESOURCE_ID>'
KEY_NAME='<OPENAI_ORG_ID>--asymmetric-key'
KEY_SCOPE="$VAULT_RESOURCE_ID/keys/$KEY_NAME"
az role assignment create \
--assignee-object-id "$OPENAI_SP_ID" \
--assignee-principal-type ServicePrincipal \
--role 'OpenAI Public Key Reader' \
--scope "$KEY_SCOPE"
従来のアクセスポリシーを使用しているコンテナーでは、代わりに鍵の Get 権限を付与します。既存のアクセス許可モデルは維持してください。
テナント ID、コンテナーの URI、鍵の名前を控えます。有効な鍵のバージョンを開き、キー識別子の末尾にある 32 桁の 16 進数のバージョン値をコピーします。
鍵を管理するプロジェクトで Cloud KMS を有効にし、フェデレーション用のプロジェクトで IAM と Security Token Service を有効にします。両者が別々のプロジェクトの場合は、両方で Cloud KMS を有効にしてください。
フェデレーション用プロジェクトの 12 桁のプロジェクト番号を控えます。KMS プロジェクトは別のプロジェクトでもかまいません。
セキュリティ > 鍵管理を開きます。キーリングを作成し、次の設定で鍵を作成します。
- 保護レベル: ソフトウェア
- 目的: 非対称復号
- アルゴリズム: 3072 ビット RSA、OAEP パディング、SHA256 ダイジェスト
KMS のプロジェクト ID、ロケーション、キーリング、鍵の名前、有効なバージョンをコピーします。バージョンには "1" のような具体的な値を指定し、"latest" や "0" は使用しないでください。非対称鍵にはプライマリバージョンがありません。
IAM と管理 > Workload Identity 連携を開きます。openai-keys などの名前でグローバルプールを作成し、openai-google などの名前で OIDC プロバイダーを作成します。プロバイダーは次のように設定します。
| プロバイダーの設定 |
値 |
| 発行元 URL |
https://accounts.google.com |
| 許可するオーディエンス |
自組織の OpenAI 組織 ID と完全に一致する値 |
| 属性マッピング |
google.subject = assertion.sub |
| 属性条件 |
assertion.sub == '105900137572174660365' |
オーディエンスには自組織の OpenAI 組織 ID を使用します。発行元と OpenAI のサブジェクトは変更しないでください。
IAM と管理 > ロールで、次の権限を持つカスタムロールを KMS プロジェクトに作成します。
cloudkms.cryptoKeyVersions.get
cloudkms.cryptoKeyVersions.viewPublicKey
両方の権限が必要です。公開鍵の閲覧者ロールだけでは足りません。復号、署名、サービスアカウントの権限借用を許可する必要はありません。
鍵の権限タブでアクセス権を付与を選択します。<CUSTOMER_GCP_PROJECT_NUMBER> と <CUSTOMER_GCP_POOL_ID> を置き換え、次のプリンシパルにロールを割り当てます。
principal://iam.googleapis.com/projects/<CUSTOMER_GCP_PROJECT_NUMBER>/locations/global/workloadIdentityPools/<CUSTOMER_GCP_POOL_ID>/subject/105900137572174660365
プールが属するプロジェクトの番号を使用し、権限を付与する範囲をこの鍵に限定してください。鍵に設定した IAM 権限は、その鍵の各バージョンにも適用されます。登録に備えて、プール ID、プロバイダー ID、オーディエンスに指定した組織 ID、KMS の各識別子を控えておきます。
以下の例では curl と Bash 互換のシェルを使用します。OPENAI_ADMIN_KEY を安全な方法で読み込んでから、組織 ID を設定します。
123456API_BASE="https://api.openai.com/v1"
ORG_ID="<OPENAI_ORG_ID>"
: "${OPENAI_ADMIN_KEY:?Load your organization admin key securely}"
KEYS_URL="$API_BASE/organization/external_keys"
purpose に指定できる列挙値は ekm(デフォルト)と psp_decryption です。このガイドで扱う非対称鍵には psp_decryption を使用してください。ekm は Enterprise Key Management(EKM)用です。
利用するプロバイダーのリクエストを registration.json として保存します。JSON ではシェル変数が展開されないため、例の値を実際の値に置き換えてください。
12345678{
"type": "aws",
"purpose": "psp_decryption",
"name": "asymmetric-key-aws",
"role_arn": "<CUSTOMER_ROLE_ARN>",
"external_id": "<OPENAI_ORG_ID>",
"kms_arn": "<CUSTOMER_KMS_KEY_ARN>"
}
123456789{
"type": "azure",
"purpose": "psp_decryption",
"name": "asymmetric-key-azure",
"tenant_id": "<CUSTOMER_TENANT_ID>",
"vault_uri": "https://<CUSTOMER_VAULT_NAME>.vault.azure.net",
"key_name": "<OPENAI_ORG_ID>--asymmetric-key",
"key_version": "<CUSTOMER_KEY_VERSION>"
}
1234567891011121314{
"type": "gcp",
"purpose": "psp_decryption",
"name": "asymmetric-key-gcp",
"workload_identity_project_number": "<CUSTOMER_GCP_PROJECT_NUMBER>",
"workload_identity_pool_id": "openai-keys",
"workload_identity_provider_id": "openai-google",
"audience": "<OPENAI_ORG_ID>",
"kms_project_id": "<CUSTOMER_KMS_PROJECT_ID>",
"kms_key_ring_name": "asymmetric-keys",
"kms_key_name": "asymmetric-key",
"kms_key_location": "us-central1",
"kms_key_version": "1"
}
12345curl --fail-with-body -sS "$KEYS_URL" \
-H "Authorization: Bearer $OPENAI_ADMIN_KEY" \
-H "OpenAI-Organization: $ORG_ID" \
-H "Content-Type: application/json" \
--data @registration.json
登録時には、鍵を保存する前に検証が行われます。成功すると HTTP 200 が返り、レスポンスには extkey ID とプロバイダーの設定が含まれます。レスポンスフィールドの例を以下に示します。
12345678{
"id": "extkey_11111111111111111111111111111111",
"object": "organization.external_key",
"name": "asymmetric-key-gcp",
"type": "gcp",
"purpose": "psp_decryption",
"api_project_ids": []
}
返された登録 ID を保存します。
KEY_ID="<EXTERNAL_KEY_ID>"
GET は保存済みの登録情報を返します。POST /validate は現在のアクセス状況を再確認し、保存済みの公開鍵と照合して鍵の有効性を再検証します。レコードの復号やスナップショットの更新は行いません。
123curl --fail-with-body -sS "$KEYS_URL/$KEY_ID" \
-H "Authorization: Bearer $OPENAI_ADMIN_KEY" \
-H "OpenAI-Organization: $ORG_ID"
123curl --fail-with-body -sS -X POST "$KEYS_URL/$KEY_ID/validate" \
-H "Authorization: Bearer $OPENAI_ADMIN_KEY" \
-H "OpenAI-Organization: $ORG_ID"
成功時のレスポンス(HTTP 200)は次のとおりです。
{ "status": "success" }
鍵、権限、ネットワークの設定を変更した場合は、再度検証してください。IAM の設定を変更した場合は、変更が反映されてから再試行してください。
登録した鍵を PSP の復号に使用するには、プロジェクトでその鍵を選択します。
purpose=psp_decryption を指定すると、この用途で登録した非対称鍵の一覧を取得できます。フィルターを省略するとすべての用途の登録情報が返り、purpose=ekm を指定すると EKM 用の登録情報のみが返ります。
123456curl --fail-with-body -sS --get "$KEYS_URL" \
-H "Authorization: Bearer $OPENAI_ADMIN_KEY" \
-H "OpenAI-Organization: $ORG_ID" \
--data-urlencode "purpose=psp_decryption" \
--data-urlencode "order=asc" \
--data-urlencode "limit=20"
has_more が true の間は、after に last_id の値を指定して次のページを取得します。purpose、order、limit は変更しないでください。
- AWS では新しい鍵を、Azure または GCP では鍵の新しいバージョンを作成し、読み取り権限を付与します。
- 新しい鍵またはバージョンを登録します。
- プロジェクトで新しい
extkey ID を選択し、選択内容を確認します。
登録情報は登録時点のスナップショットであり、クラウド側で鍵をローテーションしても更新されません。古い秘密鍵を必要とするレコードがある場合は、その秘密鍵を保持してください。選択する鍵を変更しても、既存のレコードは移行されません。
登録を削除する前に、アクティブなすべてのプロジェクトで鍵の選択を解除するか、別の鍵を選択してください。
123curl --fail-with-body -sS -X DELETE "$KEYS_URL/$KEY_ID" \
-H "Authorization: Bearer $OPENAI_ADMIN_KEY" \
-H "OpenAI-Organization: $ORG_ID"
削除に成功すると HTTP 200 が返り、レスポンスには object: "organization.external_key.deleted" が含まれます。クラウド側の鍵は削除されません。
| エラー |
確認事項 |
| 401 または 403 |
組織の管理用 API キーを使用し、外部鍵の登録に必要な権限があることを確認してください。 |
400 external_key_provider_error |
クラウド側の信頼関係、読み取り権限、ネットワークアクセス、鍵が有効かどうか、鍵のアルゴリズムを確認してください。 |
| 400 リクエスト検証エラー |
用途、対象の AWS 鍵の ARN、Azure または GCP の鍵の正確なバージョンを確認してください。 |
| 404 |
登録 ID と組織を確認してください。削除済みの登録や別の組織の登録は使用できません。 |
external_key_used_by_active_projects |
アクティブなすべてのプロジェクトで鍵の選択を解除するか、別の鍵を選択してください。 |
| 鍵が登録時の鍵と一致しない |
置き換え用の鍵を登録し、新しい ID を選択してください。 |
サポートに問い合わせる際は、エラーの内容と x-request-id をお知らせください。認証情報は決して共有しないでください。