Analise segredos 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 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
  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.data.createTime>-P2W"
  

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

Segredos replicados automaticamente

Encontre todos os segredos replicados automaticamente.

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret' AND
    JSON_EXTRACT(resource.data, '$.replication.automatic') 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.data.replication.automatic != NULL"
  

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

Segredos replicados para uma localização específica

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

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE
    (
      SELECT * FROM
      UNNEST(JSON_EXTRACT_ARRAY(resource.data, '$.replication.userManaged.replicas')) AS location
      WHERE JSON_VALUE(JSON_EXTRACT(location, '$.location')) = "us-central1"
    )
    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.data.replication.userManaged.replicas.location=LOCATION"
  

Substitua o seguinte:

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

Versões do Secret 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' 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.data.createTime < P6M AND resource.data.state=ENABLED"
  

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

Segredos 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'
      AND (
        JSON_VALUE(resource.data, "$.replication.automatic.customerManagedEncryption.kmsKeyName") IS NULL
        AND JSON_VALUE(resource.data, "$.replication.userManaged.replicas[0].customerManagedEncryption.kmsKeyName") 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/SecretVersion' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="resource.data.createTime < P6M AND resource.data.state=ENABLED"
  

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

Secrets com CMEK configurado

Liste todos os segredos encriptados com CMEK.

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret'
    AND (
      JSON_VALUE(resource.data, "$.replication.automatic.customerManagedEncryption.kmsKeyName") IS NOT NULL
      OR JSON_VALUE(resource.data, "$.replication.userManaged.replicas[0].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.data.replication.userManaged.replicas.customerManagedEncryption != NULL OR resource.data.replication.automatic.customerManagedEncryption!=NULL"
  

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

Secrets 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'
      AND (
        JSON_VALUE(resource.data, "$.replication.automatic.customerManagedEncryption.kmsKeyName") = KMS_KEY_NAME
        OR JSON_VALUE(resource.data, "$.replication.userManaged.replicas[0].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 asset list --project=PROJECT_ID \
        --asset-types='secretmanager.googleapis.com/Secret' \
        --snapshot-time=$NOW \
        --content-type='resource' \
        --filter="resource.data.replication.userManaged.replicas.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 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'
    AND (
      JSON_VALUE(resource.data, "$.replicationStatus.automatic.customerManagedEncryption.kmsKeyVersionName") IS NULL
      AND JSON_VALUE(resource.data, "$.replicationStatus.userManaged.replicas[0].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.data.replicationStatus.userManaged.replicas.customerManagedEncryption = NULL OR resource.data.replicationStatus.automatic.customerManagedEncryption=NULL) AND resource.data.state=ENABLED"
  

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

Versões do Secret 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'
    AND (
      JSON_VALUE(resource.data, "$.replicationStatus.automatic.customerManagedEncryption.kmsKeyVersionName") = KMS_KEY_VERSION_NAME
      OR JSON_VALUE(resource.data, "$.replicationStatus.userManaged.replicas[0].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.data.replicationStatus.userManaged.replicas.customerManagedEncryption.kmsKeyVersionName=$FULL_KMS_KEY_VERSION_RESOURCE_NAME AND resource.data.status=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 sem rotação configurada

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

BigQuery

    SELECT * FROM BIGQUERY_TABLE
    WHERE asset_type='secretmanager.googleapis.com/Secret' 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.data.rotation=NULL"
  

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

Segredos 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
      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.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 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
      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.data.expireTime < PD30"
  

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

Secrets com um tópico 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
      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.data.topics !=NULL"
  

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

O que se segue?