Neste tópico, aprenda a usar o Inventário de recursos do Cloud para analisar recursos do Secret Manager.
Este é um tópico avançado do Gerenciador de secrets. Antes de ler este guia, recomendamos que você analise o seguinte:
- Visão geral da plataforma para entender o panorama geral do Google Cloud
- Visão geral do Secret Manager para entender o serviço
- Visão geral do Inventário de recursos do Cloud para entender o Inventário de recursos do Cloud e conferir os recursos abrangentes de gerenciamento de recursos.
Visão geral
O Secret Manager é integrado ao Inventário de recursos do Cloud, o sistema de inventário de metadados gerenciados do Google Cloud. Com essa integração, é possível identificar e auditar secrets em toda a organização, pasta ou projeto, bem como descobrir as configurações que não estão em conformidade com os requisitos da organização. Neste guia, você verá o monitoramento dos recursos, a exportação deles para o BigQuery e as amostras das consultas do Inventário de recursos do Cloud nos recursos do Gerenciador de secrets.
Observações
- Todas as consultas têm amostras escritas com a Google Cloud CLI e o BigQuery, mas recomendamos exportar as versões do secret e do secret para o BigQuery. Ao exportar seus recursos para o BigQuery, é possível escrever consultas semelhantes a SQL para produzir e armazenar análises significativas.
- O Secret Manager não é integrado à Busca de recursos ou à ferramenta Análise de políticas. As consultas abaixo aproveitam as propriedades nativas da Google Cloud CLI e do BigQuery para pesquisar recursos.
- 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 alterações. É possível configurar feeds para enviar notificações para 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 alterações específicas em determinados tipos de recursos. Consulte a documentação do Pub/Sub para saber como acionar fluxos de trabalho em alterações de recursos.
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
$ gcloud asset export \ --content-type CONTENT_TYPE \ --project PROJECT_ID \ --snapshot-time SNAPSHOT_TIME \ --bigquery-table BIGQUERY_TABLE \ --output-bigquery-force
em que:
- CONTENT_TYPE: Tipo de conteúdo do recurso (
RESOURCE
) - PROJECT_ID: o ID do projeto que contém os recursos a serem monitorados.
- SNAPSHOT_TIME: horário em que os recursos serão capturados. Isso precisa ser feito entre hoje e cinco semanas atrás.
- BIGQUERY_TABLE: tabela para exportar dados no formato:
projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME
.
Para mais informações, consulte Como exportar para o BigQuery.
Consultas de exemplo
Secret criado nas últimas duas semanas
Descubra os secrets (e as propriedades deles) que foram adicionados à sua organização nas últimas duas semanas:
BigQuery
SELECT name, FROM PROJECT_ID.DATASET_ID.TABLE_NAME WHERE asset_type='secretmanager.googleapis.com/Secret' AND DATE(JSON_VALUE(resource.data, '$.createTime')) > DATE_SUB(CURRENT_DATE(), INTERVAL 2 WEEK);
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"
Chaves secretas replicadas automaticamente
Encontre todos os secrets replicados automaticamente:
BigQuery
SELECT * FROM PROJECT_ID.DATASET_ID.TABLE_NAME WHERE asset_type='secretmanager.googleapis.com/Secret' AND JSON_EXTRACT(resource.data, '$.replication.automatic') IS NOT NULL;
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"
Secret replicado para uma região especificada
Encontre todos os secrets replicados para us-central1
:
BigQuery
SELECT * FROM PROJECT_ID.DATASET_ID.TABLE_NAME 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;
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=us-central1"
Versões secretas ativadas com mais de 180 dias
Liste todas as versões secretas que foram criadas há mais de 180 dias:
BigQuery
SELECT * FROM PROJECT_ID.DATASET_ID.TABLE_NAME 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";
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"
Secret sem CMEK configurado
Liste todos os secrets (automáticos e gerenciados pelo usuário) que não são criptografados com chaves de criptografia do gerente de clientes (CMEK, na sigla em inglês):
BigQuery
SELECT * FROM PROJECT_ID.DATASET_ID.TABLE_NAME 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 );
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"
Secret com CMEK configurada
Liste todos os secrets (automáticos e gerenciados pelo usuário) que são criptografados com CMEK:
BigQuery
SELECT * FROM PROJECT_ID.DATASET_ID.TABLE_NAME 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 );
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"
Secrets criptografados com uma CMEK específica
Encontre secrets que são versões de secret criptografadas com uma determinada CMEK:
BigQuery
SELECT * FROM PROJECT_ID.DATASET_ID.TABLE_NAME 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 );
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"
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 PROJECT_ID.DATASET_ID.TABLE_NAME 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";
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"
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 PROJECT_ID.DATASET_ID.TABLE_NAME 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";
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"
Secrets sem rotação configurada
Encontre todos os secrets que não têm uma programação de rotação:
BigQuery
SELECT name FROM PROJECT_ID.DATASET_ID.TABLE_NAME WHERE asset_type='secretmanager.googleapis.com/Secret' AND JSON_EXTRACT(resource.data, '$.rotation') IS NULL;
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"
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 PROJECT_ID.DATASET_ID.TABLE_NAME 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)
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"
Chaves que expiram nos próximos 30 dias
Liste as chaves secretas que expirarão nos próximos 30 dias:
BigQuery
SELECT * FROM PROJECT_ID.DATASET_ID.TABLE_NAME WHERE asset_type='secretmanager.googleapis.com/Secret' AND DATE(JSON_VALUE(resource.data, '$.expireTime')) < DATE_ADD(CURRENT_DATE(), INTERVAL 30 DAY);
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"
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 PROJECT_ID.DATASET_ID.TABLE_NAME WHERE asset_type='secretmanager.googleapis.com/Secret' AND ARRAY_LENGTH(JSON_EXTRACT_ARRAY(resource.data, '$.topics')) > 0
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"
A seguir
- Saiba mais sobre como usar o Secret Manager com outros produtos.