For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Hauptnavigation

Föderation von Workload-Identitäten für Oracle Cloud Infrastructure konfigurieren

Nutze Oracle Cloud Infrastructure (OCI) als Anbieter für Workload-Identitäten, indem du ein Zugriffstoken des Oracle Identity Cloud Service (IDCS) gegen ein kurzlebiges OpenAI-Zugriffstoken austauschst. Ein OCI-Instanz-Principal signiert eine Token-Austauschanfrage an eine Identitätsdomain im selben Mandanten. OpenAI validiert das daraus resultierende Token und autorisiert den OCI-Workload, als zugeordnetes OpenAI-Dienstkonto zu handeln.

Für Codex erfährst du auf dieser Seite, wie du das Oracle-Token abrufst und prüfst. Konfiguriere anschließend die Workload-Identität für Codex, um das Token in eine Datei zu schreiben und Codex auf diese Datei zu verweisen. Die Dienstkontozuordnung und die SDK-Beispiele auf dieser Seite gelten für die OpenAI API.

Für dieses Setup benötigst du weder einen OpenAI-API-Schlüssel noch eine benutzerdefinierte Oracle-OAuth-Ressourcenanwendung oder Berechtigungen dynamischer Gruppen für eine benutzerdefinierte Anwendung.

OCI-Workload einrichten

Führe deinen Workload auf einer OCI-Compute-Instanz mit einem Instanz-Principal aus. Prüfe bei Oracle Kubernetes Engine (OKE), welche Identität die Anfrage signiert: Der standardmäßige Instanz-Principal-Signer identifiziert in der Regel den Worker-Node, nicht einen einzelnen Kubernetes-Pod.

Der Signer bezieht die Anmeldedaten vom OCI-Instanzmetadatendienst. Stelle sicher, dass der Workload den linklokalen Metadatenendpunkt erreichen kann:

curl --fail --silent \
  --header "Authorization: Bearer Oracle" \
  http://169.254.169.254/opc/v2/instance/id

Der Workload muss außerdem ausgehende HTTPS-Anfragen an die Identitätsdomain in seinem Mandanten senden können. Der Metadatenendpunkt selbst benötigt weder ein NAT-Gateway noch eine Internetverbindung.

Oracle-Identitätstoken anfordern

Verwende InstancePrincipalsSecurityTokenSigner aus dem OCI Python SDK, um eine OAuth-Token-Austauschanfrage an deine Identitätsdomain zu signieren:

POST https://<identity-domain>/oauth2/v1/token
Content-Type: application/x-www-form-urlencoded;charset=utf-8

grant_type=urn:ietf:params:oauth:grant-type:token-exchange
scope=urn:opc:idm:__myscopes__
requested_token_type=urn:ietf:params:oauth:token-type:access_token

Der Scope urn:opc:idm:__myscopes__ nutzt die bestehende Autorisierung des Instanz-Principals. Verwende das zurückgegebene IDCS-Zugriffstoken als Subjekttoken für die Föderation von Workload-Identitäten bei OpenAI. Ersetze die Zielgruppe des Oracle-Tokens nicht durch https://api.openai.com/v1. Konfiguriere den OpenAI-Anbieter mit einer Zielgruppe, die im tatsächlichen Oracle-Token enthalten ist.

Token prüfen

Setze TOKEN auf ein Zugriffstoken, das vom tatsächlichen OCI-Workload generiert wurde. Prüfe anschließend seine Claims mit dem vorhandenen lokalen JWT-Decoder:

const parts = process.env.TOKEN?.split(".") ?? [];
if (parts.length !== 3) {
  throw new Error("Expected a compact JWT with three segments");
}
if (!/^[A-Za-z0-9_-]+$/.test(parts[1]) || parts[1].length % 4 === 1) {
  throw new Error("JWT payload is not valid Base64URL");
}

const bytes = Buffer.from(parts[1], "base64url");
if (bytes.toString("base64url") !== parts[1]) {
  throw new Error("JWT payload is not valid Base64URL");
}
const decoded = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
const claims = JSON.parse(decoded);
if (claims === null || Array.isArray(claims) || typeof claims !== "object") {
  throw new Error("JWT payload is not a JSON object");
}
console.log(decoded);

Der Decoder untersucht das Token, ohne seine Signatur zu verifizieren. Behandle unverarbeitete Tokens als vertraulich, protokolliere sie nicht und füge keine Tokens aus dem Produktivbetrieb in JWT-Decoder von Drittanbietern ein.

Ein decodiertes Oracle-Zugriffstoken kann die folgenden Claims enthalten:

{
  "iss": "https://identity.oraclecloud.com/",
  "aud": [
    "https://idcs-example.us-phoenix-1.identity.oraclecloud.com",
    "https://idcs-example.identity.oraclecloud.com"
  ],
  "sub_type": "instance",
  "ipst_instance": "ocid1.instance.oc1.phx.<instance-id>",
  "ipst_compartment": "ocid1.compartment.oc1..<compartment-id>",
  "domain_id": "ocid1.domain.oc1..<domain-id>",
  "ca_ocid": "ocid1.tenancy.oc1..<tenancy-id>",
  "tenant": "idcs-example",
  "exp": 1782369434,
  "iat": 1782365834
}

Verwende das von deiner eigenen Identitätsdomain ausgestellte Token als maßgebliche Quelle. Konfiguriere den exakten Wert von iss und einen der aud-Werte des Tokens. Bevorzuge bei der Autorisierung eines Workloads die unveränderlichen Claims ipst_instance, ipst_compartment, domain_id und ca_ocid.

Föderation von Workload-Identitäten einrichten

Erstelle einen Anbieter für Workload-Identitäten für deine Oracle-Identitätsdomain. Füge anschließend eine Zuordnung für die OCI-Instanz oder das Compartment hinzu, die bzw. das das vorgesehene OpenAI-Dienstkonto nutzen darf.

Anbieter für Workload-Identitäten einrichten

  1. Erstelle den Anbieter für Workload-Identitäten. Gib unter Name einen eindeutigen Wert ein, etwa oracle-cloud-prod. Kennzeichne den vertrauenswürdigen Workload unter Beschreibung, beispielsweise mit Production OCI instance principal.

  2. Lege den Aussteller und die Zielgruppe fest. Setze OIDC-Aussteller-URL auf den iss-Claim des Tokens, etwa https://identity.oraclecloud.com/. Setze Zielgruppe auf einen der aud-Werte desselben Tokens.

  3. Konfiguriere die mandantenspezifische OIDC-Erkennung, sofern verfügbar. Wenn unter Fortgeschritten die Option Benutzerdefinierte URL für die OIDC-Erkennung verwenden angezeigt wird, aktiviere sie. Setze Benutzerdefinierte OIDC-Erkennungs-URL auf deine mandantenspezifische Identitätsdomain, etwa https://idcs-example.identity.oraclecloud.com. OpenAI ruft https://idcs-example.identity.oraclecloud.com/.well-known/openid-configuration ab und verwendet anschließend den Wert von jwks_uri aus dem Erkennungsdokument, um die öffentlichen Signaturschlüssel des Mandanten abzurufen. Wenn die Option für die benutzerdefinierte Erkennung nicht angezeigt wird, aktiviere stattdessen Hochgeladenes JWKS zur Token-Verifizierung verwenden und lade das öffentliche JWKS von https://<identity-domain>/admin/v1/SigningCert/jwk hoch.

  4. Füge Attributtransformationen nur hinzu, wenn du abgeleitete Attribute benötigst. Du kannst unverarbeitete Oracle-Claims wie ipst_instance, ipst_compartment, domain_id und ca_ocid direkt in den Assertions der Dienstkontozuordnung verwenden. Um ein Instanzattribut explizit abzuleiten, gib instance mit dem Ausdruck assertion.ipst_instance ein. Dadurch wird openai.instance erstellt.

Oracles Referenz zur OpenID-Connect-Erkennung zeigt, warum die benutzerdefinierte Erkennung wichtig ist: Das Erkennungsdokument kann den globalen Aussteller https://identity.oraclecloud.com/ angeben, während der Token-Endpunkt und jwks_uri unter der mandantenspezifischen Identitätsdomain veröffentlicht werden. Behalte den globalen Aussteller unter OIDC-Aussteller-URL bei und verwende die Mandantendomain für Benutzerdefinierte OIDC-Erkennungs-URL.

Wenn deine Identitätsdomain Erkennungsmetadaten beim Token-Aussteller veröffentlicht, lasse die benutzerdefinierte Erkennung deaktiviert und nutze die standardmäßige OIDC-Erkennung. Wenn OpenAI das Erkennungsdokument oder den Signaturschlüssel-Endpunkt des Mandanten nicht erreichen kann, deaktiviere die benutzerdefinierte Erkennung, aktiviere Hochgeladenes JWKS zur Token-Verifizierung verwenden und lade das öffentliche JWKS des Mandanten von https://<identity-domain>/admin/v1/SigningCert/jwk hoch. Die benutzerdefinierte Erkennung und ein hochgeladenes JWKS können nicht gleichzeitig aktiviert sein. Aktualisiere die hochgeladenen Schlüssel, wenn Oracle seine Signaturzertifikate rotiert.

Dienstkontozuordnung einrichten

  1. Erstelle eine Dienstkontozuordnung. Gib unter Name einen eindeutigen Wert ein, etwa oracle-instance-prod, und füge eine Beschreibung hinzu, die den vertrauenswürdigen OCI-Workload kennzeichnet.

  2. Verwende für den Abgleich die engstmögliche stabile OCI-Identität. Um einer einzelnen Instanz Zugriff zu gewähren, setze Schlüssel auf ipst_instance und Wert auf die exakte Instanz-OCID aus dem geprüften Token. Um Instanzen innerhalb eines Compartments Zugriff zu gewähren, setze Schlüssel auf ipst_compartment und Wert auf die exakte Compartment-OCID.

  3. Beschränke den Zugriff bei Bedarf auf eine Domain oder einen Mandanten. Füge weitere Zuordnungszeilen für domain_id oder ca_ocid hinzu, um den Workload auf eine bestimmte Oracle-Identitätsdomain oder einen bestimmten Mandanten zu beschränken. Füge sub_type mit dem Wert instance hinzu, wenn das Token diesen Claim enthält und du einen Instanz-Principal voraussetzen möchtest. Alle Zuordnungszeilen müssen übereinstimmen.

  4. Wähle das Ziel bei OpenAI. Wähle unter Projekt das Projekt aus, zu dem das Dienstkonto gehört. Wähle anschließend das Dienstkonto aus, das der vertrauenswürdige OCI-Workload nutzen darf.

  5. Schränke die API-Berechtigungen bei Bedarf ein. Wähle nur die Berechtigungen aus, die der Workload benötigt. Die Berechtigungen der Zuordnung können das ausgewählte Dienstkonto einschränken, ihm aber keine Berechtigungen gewähren, die es nicht bereits besitzt.

Ein OKE-Workload, der den standardmäßigen Instanz-Principal-Signer verwendet, übernimmt die Identität des Worker-Nodes. Eine Zuordnung auf Instanzebene autorisiert diesen Node, nicht nur einen einzelnen Pod. Verwende eine spezifischere, unterstützte OCI-Workload-Identität, wenn du Pods voneinander isolieren musst, die sich einen Worker-Node teilen.

Token im Code verwenden

Installiere die Python-Pakete OpenAI, OCI und Requests:

pip install openai oci requests

Installiere für Ruby die Gems OpenAI und OCI:

gem install openai oci

Setze OCI_IDENTITY_DOMAIN_URL auf die Basis-URL der Identitätsdomain im selben Mandanten wie der Workload. Setze OPENAI_IDENTITY_PROVIDER_ID und OPENAI_SERVICE_ACCOUNT_ID auf die IDs aus deinem OpenAI-Anbieter und deiner Dienstkontozuordnung.

Das folgende Beispiel signiert eine Oracle-Token-Austauschanfrage mit dem OCI-Instanz-Principal und gibt das IDCS-Zugriffstoken an das OpenAI SDK zurück. Das SDK tauscht es bei Bedarf gegen ein kurzlebiges OpenAI-Zugriffstoken aus:

Mit einem OCI-Instanz-Principal authentifizieren
import os

import oci
import requests
from openai import OpenAI
from openai.auth import SubjectTokenProvider


def oracle_instance_principal_token_provider(
    identity_domain_url: str,
) -> SubjectTokenProvider:
    def get_token() -> str:
        signer = oci.auth.signers.InstancePrincipalsSecurityTokenSigner()
        response = requests.post(
            f"{identity_domain_url.rstrip('/')}/oauth2/v1/token",
            data={
                "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange",
                "scope": "urn:opc:idm:__myscopes__",
                "requested_token_type": "urn:ietf:params:oauth:token-type:access_token",
            },
            headers={
                "Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
            },
            auth=signer,
            timeout=30,
        )
        response.raise_for_status()

        token = response.json().get("access_token")
        if not isinstance(token, str) or not token:
            raise RuntimeError("Oracle IDCS did not return an access token.")

        return token

    return {"token_type": "jwt", "get_token": get_token}


client = OpenAI(
    workload_identity={
        "identity_provider_id": os.environ["OPENAI_IDENTITY_PROVIDER_ID"],
        "service_account_id": os.environ["OPENAI_SERVICE_ACCOUNT_ID"],
        "provider": oracle_instance_principal_token_provider(
            os.environ["OCI_IDENTITY_DOMAIN_URL"]
        ),
    },
)

response = client.responses.create(
    model="gpt-5.6-terra",
    input="Say hello from Oracle Cloud Infrastructure workload identity federation.",
)

print(response.output_text)

Der Anbieter für Subjekttokens fordert ein neues Oracle-Token an, wenn das OpenAI SDK die Anmeldedaten der Workload-Identität erneuern muss. Gib das Oracle-Subjekttoken oder das daraus resultierende OpenAI-Zugriffstoken niemals aus und speichere sie niemals dauerhaft.

Sicherheitsempfehlungen für OCI

  • Ordne mit ipst_instance eine einzelne Instanz zu, wenn nur ein Workload Zugriff haben soll.
  • Verwende ipst_compartment nur, wenn alle infrage kommenden Instanzen in diesem Compartment dieselbe Zuordnung nutzen sollen.
  • Füge domain_id oder ca_ocid hinzu, um die Beschränkung auf Identitätsdomains und Mandanten durchzusetzen.
  • Verwende für jede Anwendung und Umgebung ein separates OpenAI-Dienstkonto.
  • Prüfe, ob ein OKE-Token einen Worker-Node repräsentiert, bevor du dich auf eine Isolation auf Pod-Ebene verlässt.
  • Verwende die im ausgestellten Oracle-Token enthaltene Zielgruppe, statt eine OpenAI-spezifische Zielgruppe anzunehmen.
  • Wenn deine Identitätsdomain keine OIDC-Erkennung nutzen kann, rotiere die hochgeladenen öffentlichen Schlüssel, sobald Oracle seine Signaturschlüssel rotiert.