Utilizza i secret di Secret Manager

Questa pagina spiega come includere informazioni sensibili come password e chiavi API in Cloud Build.

Secret Manager è un servizio Google Cloud che archivia in modo sicuro chiavi API, password e altri dati sensibili. Per includere informazioni sensibili nelle build, puoi archiviare le informazioni in Secret Manager e configurare la build per l'accesso alle informazioni da Secret Manager.

Prima di iniziare

  • Abilita le API Cloud Build and Secret Manager.

    Abilita le API

  • Per utilizzare gli esempi di riga di comando in questa guida, installa e configura Google Cloud CLI.

  • Assicurati di aver archiviato il secret in Secret Manager. Per le istruzioni, consulta la sezione Creazione di un secret.

    • Prendi nota del nome e della versione del secret. Avrai bisogno di queste informazioni per configurare Cloud Build per accedere al secret.

Autorizzazioni IAM richieste

Concedi il ruolo IAM Accessore ai secret di Secret Manager (roles/secretmanager.secretAccessor) per il secret all'account di servizio Cloud Build:

  1. Apri la pagina di Secret Manager nella console Google Cloud:

    Vai alla pagina di Secret Manager

  2. Seleziona la casella di controllo del secret che vuoi utilizzare nella build.

  3. Se non è già aperto, fai clic su Mostra riquadro informazioni per aprirlo.

  4. Nel riquadro, in Autorizzazioni, fai clic su Aggiungi entità.

  5. Nella casella di testo Nuove entità, inserisci l'indirizzo email del tuo account di servizio Cloud Build nel modulo PROJECT_NUMBER@cloudbuild.gserviceaccount.com. PROJECT_NUMBER è il numero del progetto in cui esegui le build. Puoi trovare il numero del progetto nella pagina Impostazioni progetto.

  6. Nella casella a discesa Seleziona un ruolo, scegli Accessore ai secret di Secret Manager.

  7. Fai clic su Salva.

Configurazione delle build per accedere ai secret UTF-8 da Secret Manager

  1. Nella directory root del progetto, crea un file di configurazione di Cloud Build denominato cloudbuild.yaml o cloudbuild.json.

  2. Nel file di configurazione della build:

    • Dopo tutta la build steps, aggiungi un campo availableSecrets per specificare la versione del secret e le variabili di ambiente da utilizzare per il secret. Puoi includere variabili di sostituzione nel valore del campo secretVersion. Puoi specificare più di un secret in una build.
    • Nel passaggio della build in cui vuoi specificare il secret:
      • Aggiungi un campo entrypoint che punta a bash per utilizzare lo strumento bash nel passaggio di creazione. È obbligatorio per fare riferimento alla variabile di ambiente per il secret.
      • Aggiungi un campo secretEnv specificando la variabile di ambiente.
      • Nel campo args, aggiungi un flag -c come primo argomento. Qualsiasi stringa passata dopo -c viene trattata come un comando. Per ulteriori informazioni sull'esecuzione dei comandi bash con -c, consulta la documentazione di Bash.
      • Quando specifichi il secret nel campo args, specificalo utilizzando la variabile di ambiente con prefisso $$.

    Il seguente file di configurazione di compilazione di esempio mostra come accedere a Docker utilizzando il nome utente e la password di Docker archiviati in Secret Manager.

    YAML

    steps:
    - name: 'gcr.io/cloud-builders/docker'
      entrypoint: 'bash'
      args: ['-c', 'docker login --username=$$USERNAME --password=$$PASSWORD']
      secretEnv: ['USERNAME', 'PASSWORD']
    availableSecrets:
      secretManager:
      - versionName: projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION
        env: 'PASSWORD'
      - versionName: projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION
        env: 'USERNAME'
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=$$USERNAME --password=$$PASSWORD"
        ],
        "secretEnv": [
          "USERNAME",
          "PASSWORD"
        ]
      }
      ],
      "availableSecrets": {
        "secretManager": [{
          "versionName": "projects/PROJECT_ID/secrets/DOCKER_PASSWORD_SECRET_NAME/versions/DOCKER_PASSWORD_SECRET_VERSION",
          "env": "PASSWORD"
      }, {
        "versionName": "projects/PROJECT_ID/secrets/DOCKER_USERNAME_SECRET_NAME/versions/DOCKER_USERNAME_SECRET_VERSION",
        "env": "USERNAME"
         }]
      }
    }
    

    Sostituisci i valori segnaposto nei comandi riportati sopra con quanto segue:

    • PROJECT_ID: l'ID del progetto Google Cloud in cui hai archiviato i secret.
    • DOCKER_USERNAME_SECRET_NAME: il nome del secret corrispondente al nome utente Docker. Puoi trovare il nome del secret dalla pagina Secret Manager della console Google Cloud.
    • DOCKER_USERNAME_SECRET_VERSION: la versione del secret del tuo nome utente Docker. Puoi ottenere la versione del secret facendo clic sul nome di un secret nella pagina Secret Manager nella console Google Cloud.
    • DOCKER_PASSWORD_SECRET_NAME: il nome del secret corrispondente alla password Docker. Puoi trovare il nome del secret dalla pagina Secret Manager della console Google Cloud.
    • DOCKER_PASSWORD_SECRET_VERSION: la versione del secret della password Docker. Puoi ottenere la versione del secret facendo clic sul nome di un secret nella pagina Secret Manager nella console Google Cloud.
  3. Utilizza il file di configurazione della build per avviare una build utilizzando la riga di comando o per automatizzare le build utilizzando i trigger.

Esempio: accesso ai secret da script e processi

Nel campo secretEnv il valore del secret viene aggiunto all'ambiente e puoi accedere a questo valore tramite una variabile di ambiente da script o processi:

YAML

steps:
- name: python:slim
  entrypoint: python
  args: ['main.py']
  secretEnv: ['MYSECRET']
availableSecrets:
  secretManager:
  - versionName: projects/$PROJECT_ID/secrets/mySecret/versions/latest
    env: 'MYSECRET'

JSON

{
  "steps": [
  {
    "name": "python:slim",
    "entrypoint": "python",
    "args": [
        "main.py"
    ],
    "secretEnv": [
        "MYSECRET"
    ]
}
],
"availableSecrets": {
  "secretManager": [
    {
        "versionName": "projects/$PROJECT_ID/secrets/mySecret/versions/latest",
        "env": "MYSECRET"
    }
  ]
}
}

I seguenti contenuti di main.py stampano i primi cinque caratteri del secret:

import os
print(os.environ.get("MYSECRET", "Not Found")[:5], "...")

Esempio: autenticazione in Docker

In alcune situazioni, prima di interagire con le immagini Docker, la build deve essere autenticata in Docker. Ad esempio, l'autenticazione Docker è necessaria per le build al fine di eseguire il pull di immagini private ed eseguire il push di immagini private o pubbliche in Docker Hub. In questi casi, puoi archiviare il nome utente e la password Docker in Secret Manager, quindi configurare Cloud Build per l'accesso al nome utente e alla password da Secret Manager. Per istruzioni su come eseguire questa operazione, consulta Interazione con le immagini Docker Hub.

Esempio: creazione di una richiesta di pull GitHub

Un altro esempio in cui potresti configurare la build per l'accesso a informazioni sensibili di Secret Manager è la creazione di una richiesta di pull GitHub in risposta alle build. Per farlo:

  • Crea un token GitHub.
  • Archivia il token GitHub in Secret Manager.
  • Nel file di configurazione della build:
    • Dopo tutta la build steps, aggiungi un campo availableSecrets per specificare la versione del secret e la variabile di ambiente da utilizzare per il token GitHub.
    • Aggiungi un passaggio di build per richiamare il comando per creare una richiesta di pull GitHub.
  • Crea un trigger dell'app GitHub e utilizza il file di configurazione della build per richiamare il trigger.

Il seguente file di configurazione di esempio mostra come creare una richiesta di pull GitHub utilizzando il token GitHub:

YAML

steps:
- name: 'launcher.gcr.io/google/ubuntu1604'
  id: Create GitHub pull request
  entrypoint: bash
  args:
  - -c
  - curl -X POST -H "Authorization:Bearer $$GH_TOKEN" -H 'Accept:application/vnd.github.v3+json' https://api.github.com/repos/GITHUB_USERNAME/REPO_NAME/pulls -d '{"head":"HEAD_BRANCH","base":"BASE_BRANCH", "title":"NEW_PR"}'
  secretEnv: ['GH_TOKEN']
availableSecrets:
  secretManager:
  - versionName: projects/PROJECT_ID/secrets/GH_TOKEN_SECRET_NAME/versions/latest
    env: GH_TOKEN

JSON

{
  "steps": [
  {
    "name": "launcher.gcr.io/google/ubuntu1604",
    "id": "Create GitHub pull request",
    "entrypoint": "bash",
    "args": [
      "-c",
       "curl -X POST -H \"Authorization:Bearer $$GH_TOKEN\" -H 'Accept:application/vnd.github.v3+json' https://api.github.com/repos/GITHUB_USERNAME/REPO_NAME -d '{\"head\":\"HEAD_BRANCH\",\"base\":\"BASE_BRANCH\", \"title\":\"NEW_PR\"}'
    ],
    "secretEnv": ['GH_TOKEN']
}
],
"availableSecrets": {
  "secretManager": [
  {
    "versionName": "projects/PROJECT_ID/secrets/GH_TOKEN_SECRET_NAME/versions/latest",
    "env": "GH_TOKEN"
  }
  ]
}
}

Sostituisci i valori segnaposto nei comandi riportati sopra con quanto segue:

  • PROJECT_ID: l'ID del progetto Google Cloud in cui hai archiviato i secret.
  • GITHUB_USERNAME: il nome utente GitHub del proprietario del repository.
  • REPO_NAME: il nome del repository GitHub.
  • HEAD_BRANCH: il nome del ramo in cui vengono implementate le modifiche. Per le richieste di pull tra repository nella stessa rete, lo spazio dei nomi head con un utente simile a questo: username:branch.
  • BASE_BRANCH: il nome del ramo in cui devono essere applicate le modifiche. Deve essere un ramo esistente nel repository attuale. Non puoi inviare una richiesta di pull a un repository che richiede un'unione a una base di un altro repository.
  • GH_TOKEN_SECRET_NAME: il nome del secret corrispondente al token GitHub.
  • NEW_PR: la nuova richiesta di pull che vuoi creare.

Configurazione delle build per accedere a secret non UTF-8 da Secret Manager

  1. Nel file di configurazione della build, aggiungi un passaggio di build per accedere alla versione del secret in Secret Manager e archiviarla in un file. Il seguente passaggio di build accede a secret-name e lo archivia in un file denominato decrypted-data.txt:

    YAML

    steps:
    - name: gcr.io/cloud-builders/gcloud
      entrypoint: 'bash'
      args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ]
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/gcloud",
        "entrypoint": "bash",
        "args": [
          "-c",
          "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt"
        ]
      }
      ]
    }
    
  2. Utilizza il file con i dati decriptati in un passaggio di build. Il seguente snippet di codice utilizza decrypted-data.txt per accedere a un registry Docker privato:

    YAML

    steps:
    - name: gcr.io/cloud-builders/gcloud
      entrypoint: 'bash'
      args: [ '-c', "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > decrypted-data.txt" ]
    - name: gcr.io/cloud-builders/docker
      entrypoint: 'bash'
      args: [ '-c', 'docker login --username=my-user --password-stdin < decrypted-data.txt']
    

    JSON

    {
      "steps": [
      {
        "name": "gcr.io/cloud-builders/gcloud",
        "entrypoint": "bash",
        "args": [
          "-c",
          "gcloud secrets versions access latest --secret=secret-name --format='get(payload.data)' | tr '_-' '/+' | base64 -d > password.txt"
         ]
      },
      {
        "name": "gcr.io/cloud-builders/docker",
        "entrypoint": "bash",
        "args": [
          "-c",
          "docker login --username=my-user --password-stdin < decrypted-data.txt"
         ]
      }
      ]
    }
    
  3. Utilizza il file di configurazione della build per avviare una build utilizzando la riga di comando o per automatizzare le build utilizzando i trigger.

Passaggi successivi