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:
-
Vista geral do Secret Manager para compreender os principais conceitos e funcionalidades do Secret Manager
-
Vista geral do Cloud Asset Inventory para compreender o Cloud Asset Inventory e ver as respetivas funcionalidades abrangentes de gestão de recursos
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?
- Saiba mais acerca das práticas recomendadas.