---
title: Configura Google Cloud KMS per CMEK
url: https://platform.claude.com/docs/it/manage-claude/cmek-google-cloud-kms
description: Usa Google Cloud KMS per fornire una chiave di crittografia per la tua organizzazione.
---

Lascia che Claude Code configuri questa funzionalità per te

```text
/claude-api aiutami a configurare una chiave di crittografia gestita dal cliente con Google Cloud KMS
```

Questa guida illustra la configurazione di una chiave Google Cloud KMS come [chiave di crittografia gestita dal cliente (CMEK)](https://platform.claude.com/docs/it/manage-claude/cmek) per la tua organizzazione Anthropic.

<Warning>
  L'abilitazione di CMEK è permanente. Se la tua chiave KMS viene eliminata o disabilitata, Anthropic non può recuperare i dati crittografati con essa. Esamina gli [avvisi e le limitazioni](https://platform.claude.com/docs/it/manage-claude/cmek) prima di iniziare.
</Warning>

## Prerequisiti

* Un progetto Google Cloud con la fatturazione abilitata.
* L'API Cloud KMS abilitata (`cloudkms.googleapis.com`).
* Autorizzazioni per creare key ring e chiavi KMS, e per impostare la policy IAM su di essi (`roles/cloudkms.admin` o equivalente).
* Una chiave API Admin di Anthropic per la tua organizzazione.
* La [CLI `gcloud`](https://cloud.google.com/cli) installata e autenticata.
* I **log di audit di accesso ai dati** di Cloud KMS abilitati per il progetto (IAM & Admin > Audit Logs > Cloud Key Management Service, con `DATA_READ` e `DATA_WRITE`). Questi sono disattivati per impostazione predefinita; senza di essi, le operazioni di crittografia e decrittografia di Anthropic non producono voci in Cloud Logging.

## Email dell'account di servizio Anthropic

Per far sì che Anthropic utilizzi la tua chiave di crittografia, devi fornire all'account di servizio di Anthropic una chiave che possa usare per crittografare i dati. L'email dell'account di servizio per Anthropic CMEK è:

```text wrap
anthropic-cmek-client-us@gcp-anthropic-cmek-clients.iam.gserviceaccount.com
```

<Warning>
  Usa solo questa email dell'account di servizio pubblicata. Non fidarti mai di un identificatore fornito via email, chat o qualsiasi canale di onboarding.
</Warning>

<Note>
  **Condivisione limitata al dominio:** Se il tuo progetto è sotto un'organizzazione Google Cloud che applica `constraints/iam.allowedPolicyMemberDomains`, i seguenti binding IAM vengono rifiutati perché l'account di servizio Anthropic è esterno alla tua organizzazione. Hai bisogno di un'esenzione a livello di progetto su quel vincolo, oppure di aggiungere l'ID cliente Cloud Identity di Anthropic (formato `C0xxxxxxxx`) all'elenco consentito. Contatta Anthropic per l'ID cliente se necessario.
</Note>

## Configurazione della chiave di crittografia

<Steps>
  <Step title="Crea o scegli un key ring">
    Salta questo passaggio se hai già un key ring da riutilizzare. I key ring sono regionali. Scegli una posizione US a regione singola come `us-east5` che corrisponda alla geografia Anthropic che stai configurando. Le posizioni multi-regione come `us` e `global` non sono supportate.

    ```bash
    gcloud kms keyrings create <your-keyring-name> \
      --project=<your-project-id> \
      --location=<region>
    ```
  </Step>

  <Step title="Crea la chiave crittografica">
    Crea una chiave simmetrica con lo scopo `ENCRYPT_DECRYPT`. Anthropic consiglia vivamente la protezione HSM: le chiavi HSM di Cloud KMS sono validate FIPS 140-2 Level 3, e la differenza di costo rispetto alle chiavi software è ridotta.

    L'opzione `--labels` aggiunge l'etichetta dell'organizzazione, `anthropic-org-<ORGANIZATION_UUID>` con il valore `true`, dove `<ORGANIZATION_UUID>` è l'ID della tua organizzazione Anthropic in minuscolo. L'etichetta è necessaria affinché Anthropic possa validare la chiave.

    <Note>
      **Trovare l'ID della tua organizzazione:** copia il campo **Organization ID** nella pagina [Organization](https://platform.claude.com/settings/organization) (`platform.claude.com/settings/organization`) nella Claude Console, oppure in **Organization settings > Organization** su claude.ai, oppure leggi il campo `id` dall'endpoint [Organization Info](https://platform.claude.com/docs/it/api/organization/retrieve). Usa l'UUID semplice, non l'ID con prefisso `org_`.
    </Note>

    ```bash
    gcloud kms keys create <KEY_NAME> \
      --project=<PROJECT_ID> \
      --location=<REGION> \
      --keyring=<KEYRING_NAME> \
      --purpose=encryption \
      --protection-level=hsm \
      --labels=anthropic-org-<ORGANIZATION_UUID>=true
    ```

    Per la protezione software invece, ometti `--protection-level=hsm`. Nient'altro in questa guida cambia.

    Puoi anche creare la chiave dalla Google Cloud Console. Apri il key ring, fai clic su **Create key**, seleziona **Generated key**, imposta lo scopo e l'algoritmo su crittografia e decrittografia simmetrica, e scegli **HSM** sotto il livello di protezione.

    <Frame caption="Crea una chiave di crittografia/decrittografia simmetrica protetta da HSM con l'etichetta dell'organizzazione.">
      ![Pagina Create key di Google Cloud KMS con protezione HSM, crittografia/decrittografia simmetrica e l'etichetta anthropic-org impostata su true.](https://platform.claude.com/docs/images/cmek/gcp-create-key-label.png)
    </Frame>

    Per condividere una chiave tra più organizzazioni Anthropic, aggiungi una di queste etichette per ogni organizzazione. Una chiave può avere al massimo 64 etichette, incluse le tue.

    <Note>
      Per aggiungere l'etichetta a una chiave che non la possiede, esegui `gcloud kms keys update <KEY_NAME> --project=<PROJECT_ID> --location=<REGION> --keyring=<KEYRING_NAME> --update-labels=anthropic-org-<ORGANIZATION_UUID>=true`. Unisce l'etichetta a qualsiasi etichetta che la chiave possiede già.
    </Note>
  </Step>

  <Step title="Concedi all'account di servizio Anthropic l'accesso alla chiave">
    Sono necessari due binding IAM a livello di chiave. Entrambi sono limitati alla singola chiave crittografica, non all'intero progetto o all'intero key ring.

    Crittografia e decrittografia, che Anthropic usa per crittografare e decrittografare le chiavi dati che proteggono i dati del tuo workspace (crittografia a busta):

    ```bash
    gcloud kms keys add-iam-policy-binding <your-key-name> \
      --project=<your-project-id> \
      --location=<region> \
      --keyring=<your-keyring-name> \
      --member="serviceAccount:anthropic-cmek-client-us@gcp-anthropic-cmek-clients.iam.gserviceaccount.com" \
      --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
    ```

    Viewer, per la lettura dei metadati (`cryptoKeys.get`) che Anthropic esegue all'avvio per validare lo scopo e l'algoritmo della chiave:

    ```bash
    gcloud kms keys add-iam-policy-binding <your-key-name> \
      --project=<your-project-id> \
      --location=<region> \
      --keyring=<your-keyring-name> \
      --member="serviceAccount:anthropic-cmek-client-us@gcp-anthropic-cmek-clients.iam.gserviceaccount.com" \
      --role=roles/cloudkms.viewer
    ```

    Dalla Console, seleziona la chiave, apri il pannello **Permissions**, fai clic su **Grant access**, e aggiungi l'account di servizio con entrambi i ruoli Cloud KMS CryptoKey Encrypter/Decrypter e Cloud KMS Viewer. Assicurati di essere nella pagina delle autorizzazioni della chiave, non del key ring o del progetto, in modo che la concessione sia limitata solo a questa chiave.

    <Frame caption="Concedi all'account di servizio Anthropic entrambi i ruoli, limitati alla chiave.">
      ![Finestra di dialogo Grant access con l'account di servizio Anthropic a cui sono assegnati i ruoli Cloud KMS CryptoKey Encrypter/Decrypter e Viewer.](https://platform.claude.com/docs/images/cmek/gcp-grant-access.png)
    </Frame>
  </Step>

  <Step title="Annota il nome completo della risorsa chiave">
    Lo passi ad Anthropic quando registri la chiave. Il formato è:

    ```text wrap
    projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>
    ```

    Recuperalo con:

    ```bash
    gcloud kms keys describe <your-key-name> \
      --project=<your-project-id> \
      --location=<region> \
      --keyring=<your-keyring-name> \
      --format="value(name)"
    ```

    Dalla Console, apri la pagina dei dettagli della chiave e fai clic su **Copy resource name**.

    <Frame caption="Copia il nome completo della risorsa della chiave dal menu delle azioni.">
      ![Dettagli del key ring di Google Cloud con l'azione Copy resource name evidenziata nel menu delle azioni della chiave.](https://platform.claude.com/docs/images/cmek/gcp-copy-resource-name.png)
    </Frame>
  </Step>
</Steps>

## Registra la chiave con Anthropic

Il modo in cui registri la chiave dipende dal prodotto che usi.

<Tabs>
  <Tab title="Claude Platform">
    Puoi configurare la chiave nella Claude Console o tramite l'Admin API, con lo stesso risultato.

    <Tabs>
      <Tab title="Claude Console">
        <Steps>
          <Step title="Registra la chiave con Anthropic">
            Nella Claude Console, vai alla pagina [Data retention](https://platform.claude.com/settings/privacy#encryption-keys) (`platform.claude.com/settings/privacy`). Se non vedi **Encryption keys**, seleziona **Organization** dal menu a discesa nella parte superiore della pagina. In **Encryption keys**, fai clic su **Add key**. Inserisci un nome visualizzato, scegli **Google Cloud KMS** e fai clic su **Continue**. Incolla il nome completo della risorsa della chiave in **Key resource name** e fai clic su **Add**.

            Il passaggio dei dettagli della chiave mostra l'etichetta dell'organizzazione. Aggiungila alla chiave, come descrive [il passaggio di creazione](https://platform.claude.com/docs/it/manage-claude/cmek-google-cloud-kms#organization-label), prima di fare clic su **Add**.
          </Step>

          <Step title="Valida la chiave">
            Nell'elenco **Encryption keys**, fai clic su **Verify** accanto alla chiave. Quando il controllo ha esito positivo appare **Connected**. Se non riesce, un messaggio ne indica il motivo.
          </Step>

          <Step title="Collega la chiave a un workspace">
            Nella Claude Console, vai alla pagina [Data retention](https://platform.claude.com/settings/privacy) (`platform.claude.com/settings/privacy`) e seleziona il workspace dal menu a discesa nella parte superiore della pagina. In **Encryption key**, seleziona la chiave, fai clic su **Save** e conferma. Il collegamento di una chiave non può essere annullato. Per un workspace che riceve già richieste, la chiave può impiegare [fino a un giorno per avere effetto](https://platform.claude.com/docs/it/manage-claude/cmek#how-it-works).
          </Step>
        </Steps>
      </Tab>

      <Tab title="API">
        <Steps>
          <Step title="Registra la chiave con Anthropic">
            Crea una configurazione di chiave esterna tramite l'Admin API, usando il nome della risorsa dal passaggio Annota il nome completo della risorsa chiave sotto Configurazione della chiave di crittografia.

            <CodeGroup>
              ```bash cURL
              curl -sS "https://api.anthropic.com/v1/organizations/external_keys" \
                -H "x-api-key: $ANTHROPIC_API_KEY" \
                -H "anthropic-version: 2023-06-01" \
                -H "content-type: application/json" \
                -d '{
                  "display_name": "<friendly-name>",
                  "geo": "us",
                  "provider_config": {
                    "type": "gcp",
                    "key_name": "projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>"
                  }
                }'
              ```

              ```bash CLI
              ant organization:external-keys create <<'YAML'
              display_name: "<friendly-name>"
              geo: us
              provider_config:
                type: gcp
                key_name: "projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>"
              YAML
              ```

              ```python Python
              client = anthropic.Anthropic()

              external_key = client.organization.external_keys.create(
                  display_name="<friendly-name>",
                  geo="us",
                  provider_config={
                      "type": "gcp",
                      "key_name": "projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>",
                  },
              )

              print(f"id: {external_key.id}")
              print(f"display_name: {external_key.display_name}")
              ```

              ```typescript TypeScript
              const client = new Anthropic();

              const externalKey = await client.organization.externalKeys.create({
                display_name: "<friendly-name>",
                geo: "us",
                provider_config: {
                  type: "gcp",
                  key_name:
                    "projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>"
                }
              });

              console.log(`id: ${externalKey.id}`);
              console.log(`display_name: ${externalKey.display_name}`);
              ```

              ```csharp C#
              using Anthropic.Models.Organization.ExternalKeys;

              AnthropicClient client = new();

              var externalKey = await client.Organization.ExternalKeys.Create(new()
              {
                  DisplayName = "<friendly-name>",
                  Geo = Geo.Us,
                  ProviderConfig = new GcpExternalKeyConfig
                  {
                      KeyName = "projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>"
                  }
              });

              Console.WriteLine($"id: {externalKey.ID}");
              Console.WriteLine($"display_name: {externalKey.DisplayName}");
              ```

              ```go Go
              client := anthropic.NewClient()

              externalKey, err := client.Organization.ExternalKeys.New(context.Background(), anthropic.OrganizationExternalKeyNewParams{
              	DisplayName: anthropic.String("<friendly-name>"),
              	Geo:         anthropic.OrganizationExternalKeyNewParamsGeoUs,
              	ProviderConfig: anthropic.OrganizationExternalKeyNewParamsProviderConfigUnion{
              		OfGCP: &anthropic.GCPExternalKeyConfigParam{
              			KeyName: "projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>",
              		},
              	},
              })
              if err != nil {
              	log.Fatal(err)
              }

              fmt.Printf("id: %s\n", externalKey.ID)
              fmt.Printf("display_name: %s\n", externalKey.DisplayName)
              ```

              ```java Java
              import com.anthropic.models.organization.externalkeys.ExternalKeyCreateParams;

              void main() {
                  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

                  var params = ExternalKeyCreateParams.builder()
                      .displayName("<friendly-name>")
                      .geo(ExternalKeyCreateParams.Geo.US)
                      .gcpProviderConfig("projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>")
                      .build();
                  var externalKey = client.organization().externalKeys().create(params);

                  IO.println("id: " + externalKey.id());
                  IO.println("display_name: " + externalKey.displayName().orElseThrow());
              }
              ```

              ```php PHP
              use Anthropic\Organization\ExternalKeys\ExternalKeyCreateParams\Geo;
              // ...

              $client = new Client();

              $externalKey = $client->organization->externalKeys->create(
                  displayName: '<friendly-name>',
                  geo: Geo::US,
                  providerConfig: [
                      'type' => 'gcp',
                      'keyName' => 'projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>',
                  ],
              );

              echo "id: {$externalKey->id}\n";
              echo "display_name: {$externalKey->displayName}\n";
              ```

              ```ruby Ruby
              client = Anthropic::Client.new

              external_key = client.organization.external_keys.create(
                display_name: "<friendly-name>",
                geo: :us,
                provider_config: {
                  type: :gcp,
                  key_name: "projects/<your-project-id>/locations/<region>/keyRings/<your-keyring-name>/cryptoKeys/<your-key-name>"
                }
              )

              puts "id: #{external_key.id}"
              puts "display_name: #{external_key.display_name}"
              ```
            </CodeGroup>

            La risposta contiene l'ID della chiave esterna:

            ```json
            {
              "type": "external_key",
              "id": "ekey_<id>",
              "display_name": "<friendly-name>"
            }
            ```
          </Step>

          <Step title="Valida la chiave">
            Attiva un ciclo di crittografia e decrittografia sulla tua chiave.

            <CodeGroup>
              ```bash cURL
              curl -sS -X POST "https://api.anthropic.com/v1/organizations/external_keys/ekey_<id>/validate" \
                -H "x-api-key: $ANTHROPIC_API_KEY" \
                -H "anthropic-version: 2023-06-01"
              ```

              ```bash CLI
              ant organization:external-keys validate --external-key-id "ekey_<id>"
              ```

              ```python Python
              client = anthropic.Anthropic()

              validation = client.organization.external_keys.validate("ekey_<id>")

              print(f"status: {validation.status}")
              print(f"error: {validation.error}")
              ```

              ```typescript TypeScript
              const client = new Anthropic();

              const validation = await client.organization.externalKeys.validate("ekey_<id>");

              console.log(`status: ${validation.status}`);
              console.log(`error: ${validation.error}`);
              ```

              ```csharp C#
              AnthropicClient client = new();

              var validation = await client.Organization.ExternalKeys.Validate("ekey_<id>");

              Console.WriteLine($"status: {validation.Status.Raw()}");
              Console.WriteLine($"error: {validation.Error}");
              ```

              ```go Go
              client := anthropic.NewClient()

              validation, err := client.Organization.ExternalKeys.Validate(context.Background(), "ekey_<id>")
              if err != nil {
              	log.Fatal(err)
              }

              fmt.Printf("status: %s\n", validation.Status)
              fmt.Printf("error: %s\n", validation.Error)
              ```

              ```java Java
              AnthropicClient client = AnthropicOkHttpClient.fromEnv();

              var validation = client.organization().externalKeys().validate("ekey_<id>");

              IO.println("status: " + validation.status().asString());
              IO.println("error: " + validation.error().orElse(""));
              ```

              ```php PHP
              $client = new Client();

              $validation = $client->organization->externalKeys->validate(
                  externalKeyID: 'ekey_<id>',
              );

              echo "status: {$validation->status}\n";
              echo "error: {$validation->error}\n";
              ```

              ```ruby Ruby
              client = Anthropic::Client.new

              external_key_id = "ekey_<id>"
              validation = client.organization.external_keys.validate(external_key_id)

              puts "status: #{validation.status}"
              puts "error: #{validation.error}"
              ```
            </CodeGroup>

            Una risposta riuscita appare così:

            ```json
            { "type": "external_key_validation", "status": "success", "error": null }
            ```

            Se la validazione fallisce, le cause comuni sono:

            * **VPC Service Controls:** se un perimetro di servizio protegge Cloud KMS nel tuo progetto, aggiungi Anthropic a un livello di accesso sul perimetro (o escludi il progetto della chiave) in modo che Anthropic possa raggiungere la chiave.
            * **Condivisione limitata al dominio:** la policy org `constraints/iam.allowedPolicyMemberDomains` può rimuovere il binding dell'account di servizio Anthropic (vedi la nota precedente). Conferma che il binding sia presente con `gcloud kms keys get-iam-policy <your-key-name> --project=<your-project-id> --location=<region> --keyring=<your-keyring-name>`.
            * **Versione della chiave disabilitata o distrutta:** conferma che la versione primaria della chiave sia abilitata, e non disabilitata, programmata per la distruzione, o distrutta.
          </Step>

          <Step title="Collega la chiave a un workspace">
            Una volta validata la chiave, collegala a un nuovo workspace prima di inviare qualsiasi richiesta a quel workspace. Per un workspace che riceve già richieste, la chiave può impiegare [fino a un giorno per avere effetto](https://platform.claude.com/docs/it/manage-claude/cmek#how-it-works).

            <CodeGroup>
              ```bash cURL
              curl -sS -X POST "https://api.anthropic.com/v1/organizations/workspaces/<workspace-id>" \
                -H "x-api-key: $ANTHROPIC_API_KEY" \
                -H "anthropic-version: 2023-06-01" \
                -H "content-type: application/json" \
                -d '{
                  "external_key_id": "ekey_<id>"
                }'
              ```

              ```bash CLI
              ant organization:workspaces update \
                --workspace-id "<workspace-id>" \
                --external-key-id "ekey_<id>"
              ```

              ```python Python
              client = anthropic.Anthropic()

              workspace = client.organization.workspaces.update(
                  "<workspace-id>", external_key_id="ekey_<id>"
              )

              print(f"id: {workspace.id}")
              print(f"external_key_id: {workspace.external_key_id}")
              ```

              ```typescript TypeScript
              const client = new Anthropic();

              const workspace = await client.organization.workspaces.update("<workspace-id>", {
                external_key_id: "ekey_<id>"
              });

              console.log(`id: ${workspace.id}`);
              console.log(`external_key_id: ${workspace.external_key_id}`);
              ```

              ```csharp C#
              AnthropicClient client = new();

              var workspace = await client.Organization.Workspaces.Update("<workspace-id>", new()
              {
                  ExternalKeyID = "ekey_<id>"
              });

              Console.WriteLine($"id: {workspace.ID}");
              Console.WriteLine($"external_key_id: {workspace.ExternalKeyID}");
              ```

              ```go Go
              client := anthropic.NewClient()

              workspace, err := client.Organization.Workspaces.Update(
              	context.Background(),
              	"<workspace-id>",
              	anthropic.OrganizationWorkspaceUpdateParams{
              		ExternalKeyID: anthropic.String("ekey_<id>"),
              	},
              )
              if err != nil {
              	log.Fatal(err)
              }

              fmt.Printf("id: %s\n", workspace.ID)
              fmt.Printf("external_key_id: %s\n", workspace.ExternalKeyID)
              ```

              ```java Java
              import com.anthropic.models.organization.workspaces.WorkspaceUpdateParams;

              void main() {
                  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

                  var params = WorkspaceUpdateParams.builder()
                      .externalKeyId("ekey_<id>")
                      .build();
                  var workspace = client.organization().workspaces().update("<workspace-id>", params);

                  IO.println("id: " + workspace.id());
                  IO.println("external_key_id: " + workspace.externalKeyId().orElseThrow());
              }
              ```

              ```php PHP
              $client = new Client();

              $workspace = $client->organization->workspaces->update(
                  workspaceID: '<workspace-id>',
                  externalKeyID: 'ekey_<id>',
              );

              echo "id: {$workspace->id}\n";
              echo "external_key_id: {$workspace->externalKeyID}\n";
              ```

              ```ruby Ruby
              client = Anthropic::Client.new

              workspace_id = "<workspace-id>"
              workspace = client.organization.workspaces.update(
                workspace_id,
                external_key_id: "ekey_<id>"
              )

              puts "id: #{workspace.id}"
              puts "external_key_id: #{workspace.external_key_id}"
              ```
            </CodeGroup>
          </Step>
        </Steps>
      </Tab>
    </Tabs>
  </Tab>

  <Tab title="Claude Enterprise">
    In [claude.ai > Organization settings > Data and privacy](https://claude.ai/admin-settings/data-privacy-controls), apri **Encryption keys**, poi fai clic su **Add key**. Scegli **Google Cloud**, incolla il nome completo della risorsa chiave dal passaggio precedente, e fai clic su **Continue**. Anthropic valida la chiave con un ciclo di crittografia e decrittografia. Una volta che appare come verificata, la tua organizzazione è protetta da CMEK da quel momento in poi.

    Su Claude Enterprise, CMEK si applica all'intera organizzazione, quindi non c'è un passaggio separato di collegamento al workspace, e un'organizzazione può avere solo una chiave.
  </Tab>
</Tabs>

## Terraform

Per i deployment infrastructure-as-code, gli stessi passaggi corrispondono al provider `google` con le risorse `google_kms_key_ring`, `google_kms_crypto_key`, e `google_kms_crypto_key_iam_member`.
