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 Cloud de Confiance by S3NS e registra todas as mudanças nos recursos da nuvem, como máquinas virtuais, bancos de dados, buckets de armazenamento e, neste contexto, seus 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 são criados, modificados ou excluídos.

  • Exportar dados: exporte seu inventário de secrets para o BigQuery para análise e geração de 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 rotacionados 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 Cloud de Confiance by S3NS local do secret

Versões secretas 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 de serviço 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