Configure segredos (1.ª geração)

Pode usar o Secret Manager para armazenar de forma segura chaves de API, palavras-passe e outras informações confidenciais. Este guia mostra-lhe como configurar funções do Cloud Run para aceder a segredos armazenados no Secret Manager.

Este documento aborda as duas formas de disponibilizar um segredo à sua função:

  • Montar o segredo como um volume. Isto disponibiliza o segredo à função como um ficheiro. Se fizer referência a um segredo como um volume, a sua função acede ao valor do segredo a partir do Secret Manager sempre que o ficheiro é lido a partir do disco. Isto torna a montagem como um volume uma boa estratégia se quiser fazer referência à versão mais recente do segredo em vez de uma versão fixada do segredo. Este método também funciona bem se planear implementar a rotação de segredos.

  • Transmitir o segredo como uma variável de ambiente. Os valores das variáveis de ambiente são resolvidos no momento do arranque da instância. Por isso, se usar este método, recomendamos que faça referência a uma versão fixada do segredo em vez de fazer referência à versão mais recente do segredo.

Para mais informações sobre a utilização do Secret Manager, consulte a vista geral do Secret Manager. Para saber como criar e aceder a segredos, consulte o artigo Crie um segredo.

Antes de começar

  1. Enable the Secret Manager API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  2. Se ainda não o fez, crie um segredo no Secret Manager, conforme descrito em Crie um segredo.

Conceder acesso a segredos

A sua função pode aceder a segredos que residam no mesmo projeto que a função, bem como a segredos que residam noutro projeto. Para aceder a um segredo, a conta de serviço de tempo de execução da função tem de ter acesso concedido ao segredo.

Por predefinição, as funções do Cloud Run usam a conta de serviço predefinida do App Engine para fazer a autenticação no Secret Manager. Para utilização em produção, a Google recomenda que configure a sua função para autenticar através de uma conta de serviço gerida pelo utilizador à qual é atribuído o conjunto de funções menos permissivo necessário para realizar as tarefas da função.

Para usar o Secret Manager com as funções do Cloud Run, atribua a função roles/secretmanager.secretAccessor à conta de serviço associada à sua função:

  1. Aceda à página Secret Manager na Google Cloud consola:
    Aceder ao Secret Manager

  2. Clique na caixa de verificação junto ao segredo.

  3. Se ainda não estiver aberto, clique em Mostrar painel de informações para o abrir.

  4. No painel de informações, clique em Adicionar diretor.

  5. No campo Novos membros, introduza a conta de serviço que a sua função usa para a respetiva identidade. A conta de serviço da função é uma das seguintes:

  6. No menu pendente Selecionar uma função, escolha Secret Manager e, de seguida, Secret Manager Secret Accessor.

A preparar a sua função para aceder a segredos

Existem duas formas de disponibilizar um segredo à sua função:

  • Transmitir o segredo como uma variável de ambiente.
  • Montar o segredo como um volume.

Variáveis de ambiente

Para usar variáveis de ambiente para disponibilizar segredos à sua função:

  1. Definir uma variável de ambiente de tempo de execução durante a implementação da função.
  2. Torne o segredo acessível à sua função numa variável de ambiente.
  3. Aceder à variável de ambiente programaticamente em tempo de execução.

Montar o segredo como um volume

Para montar um segredo como um volume:

  1. Crie um ficheiro que contenha o seu segredo.

  2. Escolha um diretório não usado e não pertencente ao sistema, como /mnt/secrets, como o caminho de montagem do seu segredo. Todos os ficheiros ou subdiretórios pré-existentes nesse diretório, exceto o seu segredo e as respetivas versões, ficam inacessíveis assim que o segredo for montado.

  3. Torne o segredo acessível à sua função como um volume montado.

  4. Em tempo de execução, leia programaticamente o conteúdo do ficheiro para aceder ao valor secreto.

Por exemplo, se o segredo tiver sido montado em /mnt/secrets/secret1, a função tem de ler este ficheiro. Segue-se um exemplo de como pode ler o ficheiro de forma síncrona através do Node.js:

fs.readFileSync('/mnt/secrets/secret1')

Tornar um segredo acessível a uma função

Para referenciar um segredo a partir de uma função, primeiro tem de tornar o segredo acessível à função. Pode tornar um segredo acessível a funções novas ou existentes através da Google Cloud consola ou da Google Cloud CLI:

Consola

Para tornar um segredo acessível a uma função:

  1. Aceda à página de funções do Cloud Run na Google Cloud consola:
    Aceda à página de funções do Cloud Run

  2. Clique no nome da função que quer poder aceder a um segredo.

  3. Clique em Edit.

  4. Clique em Tempo de execução, compilação… para expandir as opções de configuração avançadas.

  5. Clique em Segurança e repositório de imagens para abrir o separador.

  6. Clique em Adicionar uma referência secreta para definir um segredo para a função.

  7. Selecione o segredo a tornar acessível. Se precisar, crie um segredo.

    • Para fazer referência a um segredo no mesmo projeto que a sua função:

      1. Selecione o segredo na lista pendente.
    • Para fazer referência a um segredo de outro projeto:

      1. Confirme que a conta de serviço do seu projeto tem acesso concedido ao segredo.

      2. Selecione Introduzir Secret manualmente.

      3. Introduza o ID do recurso do Secret no seguinte formato:

        projects/PROJECT_ID/secrets/SECRET_NAME

        Substitua o seguinte:

        • PROJECT_ID: o ID do projeto onde o segredo reside.

        • SECRET_NAME: o nome do segredo no Secret Manager.

  8. Selecione o método de referência para o segredo. Pode montar o segredo como um volume ou expor o segredo como uma variável de ambiente.

    • Para montar o segredo como um volume:

      1. Selecione Montado como volume.

      2. No campo Caminho de montagem, introduza o caminho de montagem para este segredo. Este é o diretório onde todas as versões do seu segredo são colocadas.

      3. No campo Path1, introduza o nome do ficheiro a montar. Este nome é concatenado com o caminho de montagem do passo anterior para formar o caminho de montagem completo onde o seu segredo está montado.

      4. No menu pendente Version1, selecione a versão do segredo a que quer fazer referência.

      5. Pode montar versões adicionais deste segredo clicando em +Adicionar para definir caminhos adicionais e as versões deste segredo a montar neles.

    • Para expor o segredo como uma variável de ambiente:

      1. Selecione Exposto como variável de ambiente.

      2. No campo Name1, introduza o nome da variável de ambiente.

      3. No menu pendente Version1, selecione a versão do segredo a que quer fazer referência.

      4. Pode expor versões adicionais deste segredo à sua função clicando em +Adicionar para definir variáveis de ambiente adicionais e as versões deste segredo a armazenar nas mesmas.

  9. Clique em Concluído.

  10. Clicar em Seguinte.

  11. Clique em Implementar.

O código da sua função já pode fazer referência ao segredo.

gcloud

Para tornar um segredo acessível a uma função, introduza um dos seguintes comandos.

  • Para montar o segredo como um volume, introduza o seguinte comando:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --set-secrets 'SECRET_FILE_PATH=SECRET:VERSION'
    

    Substitua o seguinte:

    • FUNCTION_NAME: o nome da sua função.

    • RUNTIME: o tempo de execução em que executar a função.

    • SECRET_FILE_PATH: o caminho completo do segredo. Por exemplo, /mnt/secrets/primary/latest, em que /mnt/secrets/primary/ é o caminho de montagem e latest é o caminho secreto. Também pode especificar os caminhos de montagem e secretos separadamente:

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

    • SECRET: o nome do segredo no Secret Manager.

    • VERSION: a versão do secret a usar. Por exemplo, 1 ou latest.

    A flag --set-secrets substitui todos os segredos existentes. Para manter os segredos existentes da função, use a flag --update-secrets em alternativa.

  • Para expor o segredo como uma variável de ambiente, introduza o seguinte comando:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --set-secrets 'ENV_VAR_NAME=SECRET:VERSION'
    

    Substitua o seguinte:

    • FUNCTION_NAME: o nome da sua função.

    • RUNTIME: o tempo de execução em que executar a função.

    • ENV_VAR_NAME: o nome da variável de ambiente.

    • SECRET: o nome do segredo no Secret Manager.

    • VERSION: a versão do secret a usar. Por exemplo, 1 ou latest.

    A flag --set-secrets substitui todos os segredos existentes. Para manter os segredos existentes da função, use a flag --update-secrets em alternativa.

  • Pode fazer referência a um segredo de outro projeto se tiver sido concedido acesso ao segredo à conta de serviço da função. Para fazer referência a um segredo de outro projeto, use o caminho do recurso do segredo:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --update-secrets 'SECRET_FILE_PATH=SECRET_RESOURCE_PATH:VERSION'
    

    Substitua o seguinte:

    • FUNCTION_NAME: o nome da sua função.

    • SECRET_RESOURCE_PATH: o caminho do recurso para o segredo que reside noutro projeto. O caminho do recurso usa o seguinte formato:

      projects/PROJECT_ID/secrets/SECRET_NAME

      Substitua o seguinte:

      • PROJECT_ID: o ID do projeto onde o segredo reside.

      • SECRET_NAME: o nome do segredo no Secret Manager.

    • RUNTIME: o tempo de execução em que executar a função.

    • SECRET_FILE_PATH: o caminho completo do segredo. Por exemplo, /mnt/secrets/primary/latest, em que /mnt/secrets/primary/ é o caminho de montagem e latest é o caminho secreto. Também pode especificar os caminhos de montagem e secretos separadamente:

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

    • SECRET: o nome do segredo no Secret Manager.

    • VERSION: a versão do secret a usar. Por exemplo, 1 ou latest.

  • Pode atualizar vários segredos em simultâneo. Separe as opções de configuração para cada segredo com uma vírgula. O comando seguinte atualiza um segredo montado como um volume e outro segredo exposto como uma variável de ambiente.

    Para atualizar segredos existentes, introduza o seguinte comando:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --update-secrets 'ENV_VAR_NAME=SECRET:VERSION, \
    SECRET_FILE_PATH=SECRET:VERSION'
    

    Substitua o seguinte:

    • FUNCTION_NAME: o nome da sua função.

    • RUNTIME: o tempo de execução em que executar a função.

    • ENV_VAR_NAME: o nome da variável de ambiente.

    • SECRET: o nome do segredo no Secret Manager.

    • VERSION: a versão do secret a usar. Por exemplo, 1 ou latest.

    • SECRET_FILE_PATH: o caminho completo do segredo. Por exemplo, /mnt/secrets/primary/latest, em que /mnt/secrets/primary/ é o caminho de montagem e latest é o caminho secreto. Também pode especificar os caminhos de montagem e secretos separadamente:

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

Remover segredos de uma função

Pode remover segredos de uma função através da Google Cloud consola ou da CLI gcloud:

Consola

  1. Aceda à página de funções do Cloud Run na Google Cloud consola:
    Aceda à página de funções do Cloud Run

  2. Clique no nome da função para remover um dos respetivos segredos.

  3. Clique em Edit.

  4. Clique em Definições de tempo de execução, compilação e ligações para expandir as opções de configuração avançadas.

  5. Clique em Segurança e repositório de imagens para abrir o separador Segurança.

  6. Mantenha o ponteiro sobre o segredo que quer remover e, de seguida, clique em Eliminar.

  7. Clicar em Seguinte.

  8. Clique em Implementar.

gcloud

Pode remover todos os segredos de uma função ou especificar um ou mais segredos a remover:

  • Para remover todos os segredos, execute o seguinte comando:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --clear-secrets
    

    Substitua o seguinte:

    • FUNCTION_NAME: o nome da sua função.

    • RUNTIME: o tempo de execução em que executar a função.

    Todos os segredos são removidos da função.

  • Para especificar uma lista de segredos a remover, use a flag --remove-secrets. O comando seguinte remove um segredo montado como um volume e outro segredo exposto como uma variável de ambiente:

    gcloud functions deploy FUNCTION_NAME \
    --no-gen2 \
    --runtime RUNTIME \
    --remove-secrets='ENV_VAR_NAME,SECRET_FILE_PATH, ...'
    

    Substitua o seguinte:

    • FUNCTION_NAME: o nome da sua função.

    • RUNTIME: o tempo de execução em que executar a função.

    • ENV_VAR_NAME: o nome da variável de ambiente.

    • SECRET_FILE_PATH: o caminho completo do segredo. Por exemplo, /mnt/secrets/primary/latest, em que /mnt/secrets/primary/ é o caminho de montagem e latest é o caminho secreto. Também pode especificar os caminhos de montagem e secretos separadamente:

      --set-secrets 'MOUNT_PATH:SECRET_PATH=SECRET:VERSION'

    Os segredos especificados são removidos da função.

Ver os segredos acessíveis da sua função

Pode ver os segredos aos quais a sua função pode aceder através da Google Cloud consola ou da CLI gcloud:

Consola

  1. Aceda à página de funções do Cloud Run na Google Cloud consola:
    Aceda à página de funções do Cloud Run

  2. Clique no nome da função para ver os respetivos segredos disponíveis.

  3. Clique em Edit.

  4. Clique em Definições de tempo de execução, compilação e ligações para expandir as opções de configuração avançadas.

  5. Clique em Segurança para abrir o separador Segurança.

O separador Segurança apresenta os segredos acessíveis à sua função.

gcloud

Para ver que segredos estão disponíveis para a sua função, use o comando gcloud functions describe:

gcloud functions describe FUNCTION_NAME

Substitua FUNCTION_NAME pelo nome da sua função.

O que se segue?