Analise secrets com o Inventário de recursos do Cloud

Nesta página, explicamos como usar o Inventário de recursos do Cloud para monitorar seus secrets, exportar dados para análise e executar consultas avançadas para receber os insights necessários.

Visão geral

O Inventário de recursos do Cloud analisa seu ambiente Google Cloud e registra todas as mudanças nos recursos da nuvem, como máquinas virtuais, bancos de dados, buckets de armazenamento e, neste contexto, os secrets do Secret Manager. A integração entre o Secret Manager e o Inventário de recursos do Cloud ajuda você a fazer o seguinte:

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

  • Configurar alertas: configure o Inventário de recursos do Cloud para enviar notificações ao Pub/Sub quando eventos específicos ocorrerem, como quando segredos forem criados, modificados ou excluídos.

  • Exportar dados: exporte seu inventário de secrets para o BigQuery e faça análises e relatórios detalhados.

  • Gerenciar e analisar seus secrets: veja todos os seus secrets em um só lugar (em todos os projetos e em toda a organização) e identifique aqueles que podem estar mal configurados ou violar as políticas de segurança da organização. Por exemplo, é possível encontrar segredos que não são trocados regularmente ou que não têm controles de acesso adequados.

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

Consultar o Secret Manager

Para analisar seus secrets com consultas semelhantes a SQL, recomendamos que você exporte as versões do secret e do secret para o BigQuery. O Secret Manager não é integrado à Busca de recursos ou à Análise de políticas. Essas consultas usam a Google Cloud CLI e o BigQuery para pesquisar seus recursos.

Limitações

O uso do Inventário de recursos do Cloud para analisar recursos do Secret Manager tem a seguinte limitação:

  • O Inventário de recursos do Cloud só é compatível com exportação e listagem de snapshots das últimas cinco semanas.

Monitorar mudanças de recurso

O Inventário de recursos do Cloud rastreia atualizações em tempo real e é compatível com o monitoramento dessas mudanças. É possível 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 Inventário de recursos do Cloud é compatível com a configuração de condições nos seus feeds para que você possa monitorar mudanças específicas em determinados tipos de recursos. Para saber como acionar fluxos de trabalho em mudanças de recursos, consulte a documentação do Pub/Sub.

Exportar recursos para o BigQuery

A exportação de secrets e versões de secrets para o BigQuery permite executar consultas semelhantes a SQL em grandes quantidades de dados e produzir insights significativos sobre seus recursos. Antes de exportar seus recursos, verifique se o conjunto de dados e as contas de serviço estão configurados corretamente.

Para exportar seus recursos, execute o seguinte comando:

gcloud

Antes de usar os dados do comando abaixo, faça estas 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: o horário em que os recursos serão capturados. Isso pode ser feito entre o momento atual e cinco semanas atrás.
  • BIGQUERY_PROJECT_ID: o ID do projeto em que a tabela do BigQuery está.
  • DATASET_ID: o ID do conjunto de dados do BigQuery.
  • TABLE_NAME: a tabela para a qual você está exportando os metadados. Se ele não existir, será 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 Como exportar para o BigQuery.

Amostras de consultas

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

Secrets criados nas últimas duas semanas

Encontre os secrets (e as propriedades deles) 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 da tabela do BigQuery para onde você exportou todos os recursos na seção Exportar 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.

Secrets replicados automaticamente

Encontre todos os secrets 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 da tabela do BigQuery para onde você exportou todos os recursos na seção Exportar 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.

Secrets replicados para um local específico

Encontre todos os segredos armazenados em um local específico, 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 da tabela do BigQuery para onde você exportou todos os recursos na seção Exportar 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:

  • PROJECT_ID: o ID do projeto que contém os segredos a serem analisados
  • LOCATION: o Google Cloud local do secret

Versões de secrets criadas há mais de 180 dias

Liste todas as versões secretas que foram 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 da tabela do BigQuery para onde você exportou todos os recursos na seção Exportar 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 sem CMEK configurada

Liste todos os secrets que não são criptografados com chaves de criptografia gerenciadas pelo 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 da tabela do BigQuery para onde você exportou todos os recursos na seção Exportar 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 configurada

Liste todos os secrets criptografados 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 da tabela do BigQuery para onde você exportou todos os recursos na seção Exportar 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 criptografados com uma CMEK específica

Encontre secrets criptografados 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:

  • BIGQUERY_TABLE: o caminho completo para a tabela do BigQuery em que você exportou todos os recursos na seção Exportar recursos para o BigQuery deste documento.

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

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:

  • 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 dela.

Versões de secret sem a CMEK configurada

Encontre todas as versões secretas ativadas que não estão criptografadas 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 da tabela do BigQuery para onde você exportou todos os recursos na seção Exportar 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 de secret criptografadas com uma CMEK específica

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

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:

  • BIGQUERY_TABLE: o caminho completo para a tabela do BigQuery em que você exportou todos os recursos na seção Exportar 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:

  • 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.

Secrets sem rotação configurada

Encontre todos os secrets que não têm uma programação 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 da tabela do BigQuery para onde você exportou todos os recursos na seção Exportar 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.

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

Encontre todos os secrets programados a serem alterados menos de uma vez 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 da tabela do BigQuery para onde você exportou todos os recursos na seção Exportar 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.

Chaves que expiram nos próximos 30 dias

Liste as chaves secretas que expirarão 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 da tabela do BigQuery para onde você exportou todos os recursos na seção Exportar 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 do Pub/Sub configurado

Liste todos os secrets que tenham 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 da tabela do BigQuery para onde você exportou todos os recursos na seção Exportar 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.

A seguir