Analise segredos regionais com o Cloud Asset Inventory

Esta página explica como usar o Cloud Asset Inventory para monitorizar os seus segredos, exportar dados para análise e executar consultas avançadas para obter as estatísticas de que precisa.

Vista geral

O Cloud Asset Inventory analisa o seu Google Cloud ambiente e regista quaisquer alterações aos seus recursos na nuvem, como máquinas virtuais, bases de dados, contentores de armazenamento e, neste contexto, os segredos do Secret Manager. A integração entre o Secret Manager e o Cloud Asset Inventory ajuda a fazer o seguinte:

  • Executar consultas: pesquise segredos específicos ou identifique padrões nos seus segredos.

  • Configurar alertas: configure o Cloud Asset Inventory para enviar notificações para o Pub/Sub quando ocorrem eventos específicos, como quando os segredos são criados, modificados ou eliminados.

  • Exporte dados: exporte o seu inventário secreto para o BigQuery para uma análise detalhada e relatórios.

  • Faça a gestão e analise os seus segredos: veja todos os seus segredos num único local (em todos os projetos e em toda a sua organização) e identifique segredos que possam estar configurados incorretamente ou violar as políticas de segurança da sua organização. Por exemplo, pode encontrar segredos que não são rodados regularmente ou que não têm controlos de acesso adequados.

Esta é uma tarefa avançada para utilizadores do Secret Manager. Antes de ler esta página, recomendamos que leia o seguinte:

Consultar o Secret Manager

Para analisar os seus segredos com consultas de tipo SQL, recomendamos que exporte o segredo e as versões do segredo para o BigQuery. O Secret Manager não está integrado com a Pesquisa de recursos nem com o Policy Analyzer. Estas consultas usam a CLI Google Cloud e o BigQuery para pesquisar os seus recursos.

Limitações

A utilização do Cloud Asset Inventory para analisar os recursos do Secret Manager tem a seguinte limitação:

  • O Cloud Asset Inventory suporta a exportação e a listagem de capturas de ecrã apenas das últimas cinco semanas.

Monitorize alterações de recursos

O Cloud Asset Inventory monitoriza as atualizações em tempo real e suporta a monitorização destas alterações. Pode configurar feeds para enviar notificações a um conjunto de tópicos do Pub/Sub configurados sempre que houver uma modificação nos seus recursos. Além disso, o Cloud Asset Inventory suporta a configuração de condições nos seus feeds, para que possa monitorizar alterações específicas para determinados tipos de recursos. Para saber como acionar fluxos de trabalho em alterações de recursos, consulte a documentação do Pub/Sub.

Exporte recursos para o BigQuery

A exportação dos seus segredos e versões de segredos para o BigQuery permite-lhe executar consultas semelhantes a SQL em grandes quantidades de dados e produzir estatísticas significativas sobre os seus recursos. Antes de exportar os recursos, certifique-se de que o conjunto de dados e as contas de serviço estão configurados corretamente.

Para exportar os seus recursos, execute o seguinte comando:

gcloud

Antes de usar qualquer um dos dados de comandos abaixo, faça as seguintes substituições:

  • CONTENT_TYPE: o tipo de conteúdo do recurso (RESOURCE).
  • PROJECT_ID: o ID do projeto que contém os segredos a serem analisados.
  • SNAPSHOT_TIME: a hora em que os recursos devem ser capturados. Este valor pode estar entre a hora atual e 5 semanas no passado.
  • BIGQUERY_PROJECT_ID: o ID do projeto em que a tabela do BigQuery se encontra.
  • DATASET_ID: o ID do conjunto de dados do BigQuery.
  • TABLE_NAME: a tabela para a qual está a exportar os metadados. Se não existir, é criado.

Execute o seguinte comando:

Linux, macOS ou Cloud Shell

gcloud asset export \
  --content-type=CONTENT_TYPE \
  --project=PROJECT_ID \
  --snapshot-time=SNAPSHOT_TIME \
  --bigquery-table=projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME \
  --output-bigquery-force

Windows (PowerShell)

gcloud asset export `
  --content-type=CONTENT_TYPE `
  --project=PROJECT_ID `
  --snapshot-time=SNAPSHOT_TIME `
  --bigquery-table=projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME `
  --output-bigquery-force

Windows (cmd.exe)

gcloud asset export ^
  --content-type=CONTENT_TYPE ^
  --project=PROJECT_ID ^
  --snapshot-time=SNAPSHOT_TIME ^
  --bigquery-table=projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME ^
  --output-bigquery-force

Para mais informações, consulte o artigo Exportar para o BigQuery.

Consultas de exemplo

Use estas consultas de exemplo para encontrar segredos e versões de segredos com propriedades específicas.

Segredos regionais criados nas últimas duas semanas

Encontre segredos (e respetivas propriedades) que foram adicionados à sua organização nas últimas duas semanas.

BigQuery

  SELECT name, FROM BIGQUERY_TABLE
  WHERE asset_type='secretmanager.googleapis.com/Secret' AND
    resource.location <> "global" AND
    DATE(JSON_VALUE(resource.data, '$.createTime')) > DATE_SUB(CURRENT_DATE(), INTERVAL 2 WEEK);
  

Substitua BIGQUERY_TABLE pelo caminho completo para a tabela do BigQuery para a qual exportou todos os recursos na secção Exporte recursos para o BigQuery deste documento.

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/Secret' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="resource.location != global AND resource.data.createTime>-P2W"
  

Substitua PROJECT_ID pelo ID do projeto que contém os segredos a serem analisados.

Segredos regionais numa localização específica

Encontre todos os segredos armazenados numa localização específica, como us-central1.

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret' AND
      resource.location = "us-central1";
  

Substitua BIGQUERY_TABLE pelo caminho completo para a tabela do BigQuery para a qual exportou todos os recursos na secção Exporte recursos para o BigQuery deste documento.

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
       --asset-types='secretmanager.googleapis.com/Secret' \
       --snapshot-time=$NOW \
       --content-type='resource' \
       --filter="resource.location = LOCATION AND resource.data.createTime>-P2W"
  

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto que contém os segredos a serem analisados
  • LOCATION: a Google Cloud localização dos segredos

Versões do segredo regional criadas há mais de 180 dias

Apresenta todas as versões do Secret criadas há mais de 180 dias.

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/SecretVersion'
      resource.location <> "global" AND
      DATE(JSON_VALUE(resource.data, '$.createTime')) < DATE_SUB(CURRENT_DATE(), INTERVAL 180 DAY) AND
      JSON_VALUE(resource.data, '$.state') = "ENABLED";
  

Substitua BIGQUERY_TABLE pelo caminho completo para a tabela do BigQuery para a qual exportou todos os recursos na secção Exporte recursos para o BigQuery deste documento.

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/SecretVersion' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="resource.location != global AND resource.data.createTime < P6M AND resource.data.state = ENABLED"
  

Substitua PROJECT_ID pelo ID do projeto que contém os segredos a serem analisados.

Segredos regionais sem CMEK configurada

Liste todos os segredos que não estão encriptados com chaves de encriptação geridas do cliente (CMEK):

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret'
      resource.location <> "global" AND
      JSON_VALUE(resource.data, "$.customerManagedEncryption.kmsKeyName") IS NOT NULL;
  

Substitua BIGQUERY_TABLE pelo caminho completo para a tabela do BigQuery para a qual exportou todos os recursos na secção Exporte recursos para o BigQuery deste documento.

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/SecretVersion' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="(resource.location != global AND resource.data.customerManagedEncryption.kmsKeyVersionName = NULL) AND resource.data.state=ENABLED"
  

Substitua PROJECT_ID pelo ID do projeto que contém os segredos a serem analisados.

Secrets regionais com CMEK configurado

Liste todos os segredos encriptados com CMEK.

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret'
      resource.location <> "global" AND
      JSON_VALUE(resource.data, "$.customerManagedEncryption.kmsKeyName") IS NOT NULL;
  

Substitua BIGQUERY_TABLE pelo caminho completo para a tabela do BigQuery para a qual exportou todos os recursos na secção Exporte recursos para o BigQuery deste documento.

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/Secret' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="resource.location != global AND resource.data.customerManagedEncryption != NULL"
  

Substitua PROJECT_ID pelo ID do projeto que contém os segredos a serem analisados.

Segredos regionais encriptados com uma CMEK específica

Encontre segredos encriptados com uma CMEK específica.

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret'
      resource.location <> "global" AND
      JSON_VALUE(resource.data, "$.customerManagedEncryption.kmsKeyName") = KMS_KEY_NAME;
  

Substitua o seguinte:

  • BIGQUERY_TABLE: o caminho completo para a tabela do BigQuery para a qual exportou todos os recursos na secção Exporte recursos para o BigQuery deste documento.

  • KMS_KEY_NAME: o ID da chave ou o identificador totalmente qualificado da chave

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud beta asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/Secret' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="resource.location != global AND resource.data.customerManagedEncryption.kmsKeyName=KMS_KEY_NAME"
  

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto que contém os segredos a serem analisados
  • KMS_KEY_NAME: o ID da chave ou o identificador totalmente qualificado da chave

Versões do Secret regionais sem CMEK configurada

Encontre todas as versões do Secret ativadas que não estão encriptadas com CMEK.

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/SecretVersion'
      resource.location <> "global" AND
      JSON_VALUE(resource.data, "$.customerManagedEncryption.kmsKeyVersionName") IS NULL AND
      JSON_VALUE(resource.data, "$.state") = "ENABLED";
  

Substitua BIGQUERY_TABLE pelo caminho completo para a tabela do BigQuery para a qual exportou todos os recursos na secção Exporte recursos para o BigQuery deste documento.

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/SecretVersion' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="(resource.location != global AND resource.data.customerManagedEncryption.kmsKeyVersionName = NULL) AND resource.data.state=ENABLED"
  

Substitua PROJECT_ID pelo ID do projeto que contém os segredos a serem analisados.

Versões de segredos regionais encriptadas com uma CMEK específica

Liste todas as versões secretas ativadas encriptadas com uma versão CMEK específica.

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/SecretVersion'
      resource.location <> "global" AND
      JSON_VALUE(resource.data, "$.customerManagedEncryption.kmsKeyVersionName") = KMS_KEY_VERSION_NAME AND
      JSON_VALUE(resource.data, "$.state") = "ENABLED";
  

Substitua o seguinte:

  • BIGQUERY_TABLE: o caminho completo para a tabela do BigQuery para a qual exportou todos os recursos na secção Exporte recursos para o BigQuery deste documento.

  • KMS_KEY_VERSION_NAME: o número da versão da chave do Cloud Key Management Service

gcloud

    NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
    gcloud asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/SecretVersion' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="(resource.location != global AND resource.data.customerManagedEncryption.kmsKeyVersionName = KMS_KEY_VERSION_NAME) AND resource.data.state=ENABLED"
  

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto que contém os segredos a serem analisados
  • KMS_KEY_VERSION_NAME: o ID da versão da chave

Segredos regionais sem rotação configurada

Encontre todos os segredos que não têm um horário de rotação.

BigQuery

    SELECT name FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret' AND
      resource.location <> "global" AND
      JSON_EXTRACT(resource.data, '$.rotation') IS NULL;
  

Substitua BIGQUERY_TABLE pelo caminho completo para a tabela do BigQuery para a qual exportou todos os recursos na secção Exporte recursos para o BigQuery deste documento.

gcloud

  NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
  gcloud asset list --project=PROJECT_ID \
      --asset-types='secretmanager.googleapis.com/Secret' \
      --snapshot-time=$NOW \
      --content-type='resource' \
      --filter="resource.location != global AND resource.data.rotation = NULL"
  

Substitua PROJECT_ID pelo ID do projeto que contém os segredos a serem analisados.

Segredos regionais com um período de rotação específico

Encontre todos os segredos agendados para rotação com uma frequência inferior a cada 90 dias:

BigQuery

    SELECT *
    FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret' AND
      resource.location <> "global" AND
      CAST(
        TRIM(
          JSON_VALUE(JSON_EXTRACT(resource.data, "$.rotation.rotationPeriod")),"s")
        AS INT64)
    < 86400 * 90 #Rotation period in seconds (86400s in 1 day * 90 days)
  

Substitua BIGQUERY_TABLE pelo caminho completo para a tabela do BigQuery para a qual exportou todos os recursos na secção Exporte recursos para o BigQuery deste documento.

gcloud

  NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
  ROTATION_PERIOD_SECONDS=$((90 * 24 * 60 * 60))
  gcloud asset list --project=PROJECT_ID \
      --asset-types='secretmanager.googleapis.com/Secret' \
      --snapshot-time=$NOW \
      --content-type='resource' \
      --filter="resource.location != global AND resource.data.rotation != null AND resource.data.rotation.rotationPeriod <= ${ROTATION_PERIOD_SECONDS}s"
  

Substitua PROJECT_ID pelo ID do projeto que contém os segredos a serem analisados.

Segredos regionais que expiram nos próximos 30 dias

Liste os segredos que expiram nos próximos 30 dias.

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret' AND
      resource.location <> "global" AND
      DATE(JSON_VALUE(resource.data, '$.expireTime')) < DATE_ADD(CURRENT_DATE(), INTERVAL 30 DAY);
  

Substitua BIGQUERY_TABLE pelo caminho completo para a tabela do BigQuery para a qual exportou todos os recursos na secção Exporte recursos para o BigQuery deste documento.

gcloud

  NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
  gcloud asset list --project=PROJECT_ID \
      --asset-types='secretmanager.googleapis.com/Secret' \
      --snapshot-time=$NOW \
      --content-type='resource' \
      --filter="resource.location != global AND resource.data.expireTime < PD30"
  

Substitua PROJECT_ID pelo ID do projeto que contém os segredos a serem analisados.

Segredos regionais com um tópico do Pub/Sub configurado

Liste todos os segredos que têm, pelo menos, um tópico do Pub/Sub configurado.

BigQuery

    SELECT name, ARRAY_LENGTH(JSON_EXTRACT_ARRAY(resource.data, '$.topics')) AS topics_count,
    FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret' AND
      resource.location <> "global" AND
      ARRAY_LENGTH(JSON_EXTRACT_ARRAY(resource.data, '$.topics')) > 0
  

Substitua BIGQUERY_TABLE pelo caminho completo para a tabela do BigQuery para a qual exportou todos os recursos na secção Exporte recursos para o BigQuery deste documento.

gcloud

  NOW=$(TZ=GMT date +"%Y-%m-%dT%H:%M:%SZ")
  gcloud asset list --project=PROJECT_ID \
      --asset-types='secretmanager.googleapis.com/Secret' \
      --snapshot-time=$NOW \
      --content-type='resource' \
      --filter="resource.location != global AND resource.data.topics != NULL"
  

Substitua PROJECT_ID pelo ID do projeto que contém os segredos a serem analisados.

O que se segue?