Coletar registros do Forseti Open Source

Compatível com:

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

  1. Acesse o Console do Google Cloud.
  2. Selecione seu projeto ou crie um novo.
  3. No menu de navegação, acesse Cloud Storage > Buckets.
  4. Clique em Criar bucket.
  5. 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
  6. 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.

  1. Conecte-se à VM do servidor do Forseti usando SSH:

    gcloud compute ssh forseti-server-vm --project=YOUR_PROJECT_ID --zone=YOUR_ZONE
    

    Substitua YOUR_PROJECT_ID e YOUR_ZONE pelos valores da sua implantação do Forseti.

  2. Abra o arquivo de configuração do servidor Forseti para edição:

    sudo nano /home/ubuntu/forseti-security/configs/forseti_conf_server.yaml
    

    Se 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.yaml
    
  3. Navegue até a seção notifier e localize a subseção resources.

  4. 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 incluem iam_policy_violations, firewall_rule_violations, cloudsql_acl_violations, bucket_acl_violations, config_validator_violations, groups_settings_violations e outros.
    • should_notify: defina como true para ativar as notificações desse tipo de recurso.
    • data_format: o formato dos dados exportados. Os valores válidos são csv ou json. O padrão é csv.
    • gcs_path: o caminho do Cloud Storage em que as violações serão exportadas. O caminho precisa começar com gs:// e incluir uma barra no final.
  5. Salve o arquivo de configuração.

  6. 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.yaml
    
  7. Atualize a configuração do servidor do Forseti:

    forseti server configuration reload
    
  8. Verifique 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

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo feed.
  3. Clique em Configurar um único feed.
  4. No campo Nome do feed, insira um nome para o feed (por exemplo, Forseti Violations).
  5. Selecione Google Cloud Storage V2 como o Tipo de origem.
  6. Selecione Forseti Open Source como o Tipo de registro.

  7. Clique em Receber conta de serviço.

  8. Um e-mail exclusivo da conta de serviço será exibido, por exemplo:

    chronicle-12345678@chronicle-gcp-prod.iam.gserviceaccount.com
    
  9. Copie o endereço de e-mail. Você vai usá-la na próxima etapa.

  10. Clique em Próxima.

  11. 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.
  12. Clique em Próxima.

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

  1. Acesse Cloud Storage > Buckets.
  2. Clique no nome do bucket.
  3. Acesse a guia Permissões.
  4. Clique em Conceder acesso.
  5. 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.
  6. 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.