Coletar registros do Forseti Open Source
Este documento explica como ingerir registros do Forseti Open Source no Google Security Operations usando o Google Cloud Storage V2.
O Forseti Security é uma coleção de ferramentas de código aberto voltada para a comunidade que melhora a segurança de ambientes do Google Cloud Platform. O Forseti faz snapshots do inventário dos recursos do GCP em uma cadência recorrente, verifica os recursos para garantir que os controles de acesso estejam definidos conforme o esperado e oferece visibilidade das políticas do Cloud IAM.
Antes de começar
Verifique se você atende os seguintes pré-requisitos:
- Instância do Google SecOps.
- Projeto do GCP com a API Cloud Storage ativada.
- Permissões para criar e gerenciar buckets do GCS.
- Permissões para gerenciar políticas do IAM em buckets do GCS.
- Uma implantação do Forseti Security (por exemplo, implantada usando o módulo Forseti Terraform no Google Compute Engine).
- Acesso ao arquivo de configuração do servidor Forseti (
forseti_conf_server.yaml).
Criar um bucket do Google Cloud Storage
Usando o console do Google Cloud
- Acesse o Console do Google Cloud.
- Selecione seu projeto ou crie um novo.
- No menu de navegação, acesse Cloud Storage > Buckets.
- Clique em Criar bucket.
Informe os seguintes detalhes de configuração:
Configuração Valor Nomeie seu bucket Insira um nome exclusivo globalmente, por exemplo, forseti-violations-export.Tipo de local Escolha com base nas suas necessidades (região, birregional, multirregional) Local Selecione o local (por exemplo, us-central1).Classe de armazenamento Padrão (recomendado para registros acessados com frequência) Controle de acesso Uniforme (recomendado) Ferramentas de proteção Opcional: ativar o controle de versões de objetos ou a política de retenção Clique em Criar.
Como usar a ferramenta de linha de comando gcloud
Como alternativa, crie um bucket usando o comando gcloud:
gcloud storage buckets create gs://forseti-violations-export \
--location=us-central1 \
--default-storage-class=STANDARD
Substitua:
forseti-violations-export: o nome de bucket desejado (globalmente exclusivo).us-central1: sua região preferida (por exemplo,us-central1,europe-west1).
Configurar o Forseti Security para exportar violações para o GCS
O Forseti Security usa uma configuração de notificador no arquivo forseti_conf_server.yaml para exportar violações do scanner para o Google Cloud Storage.
Conecte-se à VM do servidor do Forseti usando SSH:
gcloud compute ssh forseti-server-vm --project=YOUR_PROJECT_ID --zone=YOUR_ZONESubstitua
YOUR_PROJECT_IDeYOUR_ZONEpelos valores da sua implantação do Forseti.Abra o arquivo de configuração do servidor Forseti para edição:
sudo nano /home/ubuntu/forseti-security/configs/forseti_conf_server.yamlSe a implantação do Forseti usar uma configuração baseada no GCS, faça o download do arquivo no bucket do servidor do Forseti:
gsutil cp gs://YOUR_FORSETI_SERVER_BUCKET/configs/forseti_conf_server.yaml ~/forseti_conf_server.yamlNavegue até a seção
notifiere localize a subseçãoresources.Para cada tipo de recurso de violação que você quer exportar, configure o notificador
gcs_violations. Adicione ou atualize a configuração da seguinte maneira:notifier: resources: - resource: iam_policy_violations should_notify: true notifiers: - name: gcs_violations configuration: data_format: csv gcs_path: gs://forseti-violations-export/violations/ - resource: firewall_rule_violations should_notify: true notifiers: - name: gcs_violations configuration: data_format: csv gcs_path: gs://forseti-violations-export/violations/ - resource: cloudsql_acl_violations should_notify: true notifiers: - name: gcs_violations configuration: data_format: csv gcs_path: gs://forseti-violations-export/violations/ - resource: bucket_acl_violations should_notify: true notifiers: - name: gcs_violations configuration: data_format: csv gcs_path: gs://forseti-violations-export/violations/ - resource: config_validator_violations should_notify: true notifiers: - name: gcs_violations configuration: data_format: csv gcs_path: gs://forseti-violations-export/violations/Substitua:
forseti-violations-export: o nome do bucket do GCS criado na etapa anterior.violations/: caminho de prefixo opcional para organizar arquivos de violação.
Parâmetros de configuração:
resource: o tipo de recurso de violação. Os tipos de recursos disponíveis dependem de quais verificadores do Forseti estão ativados na sua implantação. Os tipos comuns incluemiam_policy_violations,firewall_rule_violations,cloudsql_acl_violations,bucket_acl_violations,config_validator_violations,groups_settings_violationse outros.should_notify: defina comotruepara ativar as notificações desse tipo de recurso.data_format: o formato dos dados exportados. Os valores válidos sãocsvoujson. O padrão écsv.gcs_path: o caminho do Cloud Storage em que as violações serão exportadas. O caminho precisa começar comgs://e incluir uma barra no final.
Salve o arquivo de configuração.
Se você baixou a configuração do GCS, faça upload do arquivo atualizado de volta para o bucket do servidor do Forseti:
gsutil cp ~/forseti_conf_server.yaml gs://YOUR_FORSETI_SERVER_BUCKET/configs/forseti_conf_server.yamlAtualize a configuração do servidor do Forseti:
forseti server configuration reloadVerifique se a configuração foi carregada corretamente:
forseti server configuration get | grep gcs_violations
Recuperar a conta de serviço do Google SecOps
O Google SecOps usa uma conta de serviço exclusiva para ler dados do seu bucket do GCS. Você precisa conceder a essa conta de serviço acesso ao seu bucket.
Configurar um feed no Google SecOps para ingerir registros do Forseti Open Source
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Clique em Configurar um único feed.
- No campo Nome do feed, insira um nome para o feed (por exemplo,
Forseti Violations). - Selecione Google Cloud Storage V2 como o Tipo de origem.
Selecione Forseti Open Source como o Tipo de registro.
Clique em Receber conta de serviço.
Um e-mail exclusivo da conta de serviço será exibido, por exemplo:
chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.comCopie o endereço de e-mail. Você vai usá-la na próxima etapa.
Clique em Próxima.
Especifique valores para os seguintes parâmetros de entrada:
- URL do bucket de armazenamento: insira o URI do bucket do GCS com o caminho do prefixo:
gs://forseti-violations-export/violations/- Substitua:
forseti-violations-export: o nome do bucket do GCS.violations/: prefixo/caminho da pasta opcional onde os registros são armazenados (deixe em branco para a raiz).
Opção de exclusão da fonte: selecione a opção de exclusão de acordo com sua preferência:
- Nunca: nunca exclui arquivos após as transferências (recomendado para testes).
- Excluir arquivos transferidos: exclui os arquivos após a transferência bem-sucedida.
- Excluir arquivos transferidos e diretórios vazios: exclui arquivos e diretórios vazios após a transferência bem-sucedida.
- Idade máxima do arquivo: inclui arquivos modificados no último número de dias. O padrão é de 180 dias.
- Namespace do recurso: o namespace do recurso.
- Rótulos de ingestão: o rótulo a ser aplicado aos eventos deste feed.
Clique em Próxima.
Revise a nova configuração do feed na tela Finalizar e clique em Enviar.
Conceder permissões do IAM à conta de serviço do Google SecOps
A conta de serviço do Google SecOps precisa do papel de Leitor de objetos do Storage no seu bucket do GCS.
Usando o console do Google Cloud
- Acesse Cloud Storage > Buckets.
- Clique no nome do bucket.
- Acesse a guia Permissões.
- Clique em Conceder acesso.
- Informe os seguintes detalhes de configuração:
- Adicionar participantes: cole o e-mail da conta de serviço do Google SecOps.
- Atribuir papéis: selecione Leitor de objetos do Storage.
- Clique em Salvar.
Como usar a ferramenta de linha de comando gcloud
Outra opção é conceder permissões usando o comando gcloud:
gcloud storage buckets add-iam-policy-binding gs://forseti-violations-export \
--member="serviceAccount:chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com" \
--role="roles/storage.objectViewer"
Substitua:
forseti-violations-export: o nome do bucket.chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com: o e-mail da conta de serviço do Google SecOps.
Como usar a ferramenta de linha de comando gsutil (legado)
gsutil iam ch serviceAccount:chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com:objectViewer \
gs://forseti-violations-export
Verifique as permissões
Para verificar se as permissões foram concedidas corretamente:
gcloud storage buckets get-iam-policy gs://forseti-violations-export \
--flatten="bindings[].members" \
--filter="bindings.role:roles/storage.objectViewer"
O e-mail da conta de serviço do Google SecOps vai aparecer na saída.
Tabela de mapeamento do UDM
| Campo de registro | Mapeamento do UDM | Lógica |
|---|---|---|
| data.resource_data.instanceGroupUrls | sobre | Mesclado da matriz de instanceGroupUrls |
| data.resource_data.nodePools.*.statusMessage | metadata.description | Valor de nodePool.statusMessage |
| data.resource_type | metadata.event_type | Definido como RESOURCE_PERMISSIONS_CHANGE para kms_cryptokey/serviceaccount_key, RESOURCE_DELETION para firewall, STATUS_HEARTBEAT para kubernetes_cluster ou GENERIC_EVENT |
| data.scanner_index_id | metadata.product_log_id | Valor copiado diretamente, convertido em string |
| metadata.product_name | Definido como "FORSETI SECURITY" | |
| metadata.vendor_name | Definido como "FORSETI" | |
| data.resource_data.direction | network.direction | Defina como INBOUND se a direção for INGRESS |
| data.resource_data.endpoint | principal.ip | Valor copiado diretamente |
| data.resource_data.nodeConfig.oauthScopes.0 | principal.url | Valor copiado diretamente |
| data.full_name, serviceAccount | principal.user.userid | Extraído de data.full_name usando grok ou definido como serviceAccount se não estiver vazio. |
| data.violation_data.protection_level, data.violation_data.purpose, data.violation_data.project_id, data.violation_data.node_pool_name, data.violation_data.violation_reason | security_result.detection_fields | Combinados de vários pares de chave-valor |
| data.violation_type | security_result.category | Definido como POLICY_VIOLATION se FIREWALL_BLACKLIST_VIOLATION, UNKNOWN_CATEGORY se KE_VERSION_VIOLATION, caso contrário, ACL_VIOLATION |
| data.rule_name | security_result.rule_name | Valor copiado diretamente |
| data.violation_type | security_result.summary | Valor copiado diretamente |
| data.resource_data.zone | target.asset.attribute.cloud.availability_zone | Valor copiado diretamente |
| target.asset.attribute.cloud.environment | Defina como "GOOGLE_CLOUD_PLATFORM" | |
| data.full_name | target.asset.attribute.cloud.project.id | Extraído de data.full_name usando grok |
| data.resource_data.subnetwork | target.asset.attribute.cloud.vpc.name | Valor copiado diretamente |
| data.resource_data.nodeConfig.machineType | target.asset.hardware | Unido de "machineType" e plataforma de CPU constante |
| data.resource_data.privateClusterConfig.privateEndpoint | target.ip | Valor copiado diretamente |
| data.resource_data.versionTemplate.algorithm, data.resource_data.key_algorithm | target.labels | Par de chave-valor mesclado para o algoritmo, se presente |
| data.resource_data.location | target.location.name | Valor copiado diretamente |
| data.resource_name | target.resource.name | Valor copiado diretamente |
| data.resource_id | target.resource.product_object_id | Valor copiado diretamente se for diferente de "resource_name" |
| data.resource_type | target.resource.resource_subtype | Definido como "gke" se resource_type for kubernetes_cluster |
| data.resource_type | target.resource.resource_type | Mapeado para um tipo específico com base no resource_type original |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.