Proteger e armazenar dados sensíveis usando o conector do Secret Manager

O Secret Manager é um sistema de armazenamento prático e seguro para chaves de APIs, senhas, certificados e outros dados sensíveis. O Secret Manager oferece um local centralizado e uma única fonte de verdade para gerenciar, acessar e fazer auditoria de secrets no Google Cloud Google Cloud.

Você pode usar o conector do Workflows' para a API Secret Manager para acessar o Secret Manager em um fluxo de trabalho. Isso simplifica a integração, porque o conector processa a formatação das solicitações e fornece métodos e argumentos para que você não precise conhecer os detalhes da API Secret Manager. O conector também tem um comportamento integrado para processar novas tentativas e operações de longa duração. Para saber mais sobre como usar os conectores do Workflows, consulte Noções básicas sobre conectores.

Conceder acesso à conta de serviço do Workflows ao Secret Manager

O Secret Manager usa o Identity and Access Management (IAM, na sigla em inglês) para controle de acesso. Para criar, gerenciar, listar ou acessar um secret, as permissões do IAM adequadas precisam ser concedidas no nível do projeto e no nível do recurso individual. Para mais informações, consulte Controle de acesso com o IAM.

O Workflows usa contas de serviço para conceder acesso a Google Cloud recursos. Para acessar uma versão do secret, conceda o papel de acessador de secret do Secret Manager (roles/secretmanager.secretAccessor) no secret, projeto, pasta ou organização à conta de serviço. Saiba mais sobre como implantar um fluxo de trabalho com uma conta serviço gerenciado pelo usuário.

Ative as APIs

Antes de usar o conector do Workflows para a API Secret Manager, ative as APIs Secret Manager e Workflows.

Console

Ativar as APIs

gcloud

  gcloud services enable secretmanager.googleapis.com workflows.googleapis.com

Invocar uma chamada de conector

Assim como invocar um endpoint HTTP, uma chamada de conector exige os campos call e args. Para mais informações, consulte Invocar uma chamada de conector.

Além de usar uma etapa de chamada, você pode chamar os métodos auxiliares em uma expressão como esta:

${googleapis.secretmanager.v1.projects.secrets.versions.accessString(secret_id, version, project_id)}

Por exemplo, use o método auxiliar accessString para recuperar os dados do secret como uma string. Isso é mais simples do que usar a API access, porque os dados do secret são decodificados automaticamente para um formato de string.

Você também pode usar o método auxiliar addVersionString para adicionar um novo valor de secret a um secret atual. Isso é mais simples do que usar a API addVersion, porque os dados do secret são codificados automaticamente em uma string base64, que é exigida por addVersion.

Recuperar um secret usando o conector do Secret Manager

O fluxo de trabalho a seguir demonstra como usar o conector do Secret Manager para recuperar um secret.

YAML

# This workflow demonstrates how to use the Secret Manager connector:
# Retrieve a secret using three different methods
# Expected output: the secret data (thrice)
- init:
    assign:
      - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
      - secret_id: "test-secret"  # Make sure you have this secret and it has a version of 1.
      - version: "1"
# Add data to an existing secret without base-64 encoding
- add_version_string:
    call: googleapis.secretmanager.v1.projects.secrets.addVersionString
    args:
      secret_id: ${secret_id}
      project_id: ${project_id}
      data: "a new secret"
# Retrieve the secret in string format without base-64 decoding and assume
# that the secret data is a valid UTF-8 string; if not, raise an error
- access_string_secret:
    call: googleapis.secretmanager.v1.projects.secrets.versions.accessString
    args:
      secret_id: ${secret_id}
      version: ${version}  # if not set, "latest" is used
      project_id: ${project_id}
    result: str_secret
# Retrieve the secret in string format without base-64 decoding
- access_secret:
    call: googleapis.secretmanager.v1.projects.secrets.versions.access
    args:
      name: ${"projects/" + project_id + "/secrets/" + secret_id + "/versions/" + version}
    result: base64_encoded_secret
# Retrieve the secret using positional arguments in an expression
- expression:
    assign:
      - secret_str_from_exp: ${googleapis.secretmanager.v1.projects.secrets.versions.accessString(secret_id, version, project_id)}
- the_end:
    return:
      - ${str_secret}
      - ${text.decode(base64.decode(base64_encoded_secret.payload.data))}
      - ${secret_str_from_exp}

JSON

[
  {
    "init": {
      "assign": [
        {
          "project_id": "${sys.get_env(\"GOOGLE_CLOUD_PROJECT_ID\")}"
        },
        {
          "secret_id": "test-secret"
        },
        {
          "version": "1"
        }
      ]
    }
  },
  {
    "add_version_string": {
      "call": "googleapis.secretmanager.v1.projects.secrets.addVersionString",
      "args": {
        "secret_id": "${secret_id}",
        "project_id": "${project_id}",
        "data": "a new secret"
      }
    }
  },
  {
    "access_string_secret": {
      "call": "googleapis.secretmanager.v1.projects.secrets.versions.accessString",
      "args": {
        "secret_id": "${secret_id}",
        "version": "${version}",
        "project_id": "${project_id}"
      },
      "result": "str_secret"
    }
  },
  {
    "access_secret": {
      "call": "googleapis.secretmanager.v1.projects.secrets.versions.access",
      "args": {
        "name": "${\"projects/\" + project_id + \"/secrets/\" + secret_id + \"/versions/\" + version}"
      },
      "result": "base64_encoded_secret"
    }
  },
  {
    "expression": {
      "assign": [
        {
          "secret_str_from_exp": "${googleapis.secretmanager.v1.projects.secrets.versions.accessString(secret_id, version, project_id)}"
        }
      ]
    }
  },
  {
    "the_end": {
      "return": [
        "${str_secret}",
        "${text.decode(base64.decode(base64_encoded_secret.payload.data))}",
        "${secret_str_from_exp}"
      ]
    }
  }
]

A seguir