Audit Logging

Nesta página, explicamos como usar o registro de auditoria nos clusters do Google Kubernetes Engine (GKE).

Visão geral

Todos os clusters com a tecnologia do Kubernetes têm o Kubernetes Audit Logging, que mantém um registro cronológico das chamadas que foram feitas ao servidor da API Kubernetes. As entradas de registro de auditoria do Kubernetes são úteis para investigar solicitações de API suspeitas, coletar estatísticas ou criar alertas de monitoramento para chamadas de API indesejadas.

Os clusters do GKE integram o Kubernetes Audit Logging com os registros do Cloud Audit e o Stackdriver Logging. Você pode ver as entradas de registro de auditoria do Kubernetes no seu projeto do Google Cloud.

Além das entradas escritas pelo Kubernetes, os registros de auditoria do seu projeto têm entradas escritas pelo Kubernetes Engine.

O registro de auditoria do GA está disponível no GKE 1.11.4 e posterior.

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

Defina as configurações padrão da gcloud usando um dos métodos a seguir:

  • Use gcloud init se quiser orientações para definir os padrões.
  • Use gcloud config para definir individualmente a região, a zona e o ID do projeto.

Como usar o gcloud init

Se você receber o erro One of [--zone, --region] must be supplied: Please specify location, preencha esta seção.

  1. Execute gcloud init e siga as instruções:

    gcloud init

    Se você estiver usando SSH em um servidor remoto, utilize a sinalização --console-only para impedir que o comando inicie um navegador:

    gcloud init --console-only
  2. Siga as instruções para autorizar a gcloud a usar sua conta do Google Cloud.
  3. Crie uma nova configuração ou selecione uma atual.
  4. Escolha um projeto do Google Cloud.
  5. Escolha uma zona padrão do Compute Engine.

Como usar o gcloud config

  • Defina o ID do projeto padrão:
    gcloud config set project project-id
  • Se você estiver trabalhando com clusters zonais, defina a zona do Compute padrão:
    gcloud config set compute/zone compute-zone
  • Se você estiver trabalhando com clusters regionais, defina a região do Compute padrão:
    gcloud config set compute/region compute-region
  • Atualize gcloud para a versão mais recente:
    gcloud components update

Você precisa ter um cluster do Kubernetes Engine no seu projeto. Você pode usar um cluster existente ou criar um novo para os exercícios deste tópico. Se você optar por usar um cluster existente, verifique se ele teve alguma atividade recente. Por exemplo, se você não criou uma implantação recentemente, poderá criar uma agora inserindo este comando:

kubectl run log-exercise --image nginx

Leia sobre o Kubernetes Audit Logging.

Registros de auditoria no seu projeto

Seu projeto do Cloud tem estes registros de auditoria:

  • Registro de atividades do administrador
  • Registro de acesso a dados

O registro de atividades do administrador é ativado por padrão e não tem custo extra.

O registro de acesso a dados está desativado por padrão, e ativá-lo pode resultar em cobrança extra. Para saber mais sobre como ativar o registro de acesso a dados e os custos associados, consulte Como configurar registros do acesso a dados.

O Kubernetes Engine não é compatível com o registro de transparência no acesso.

Vários serviços do Google Cloud Platform gravam entradas nos registros do seu projeto. O serviço Kubernetes também grava entradas nos registros de auditoria do seu projeto. Para os clusters do Kubernetes Engine, as entradas de registro gravadas por esses serviços são as mais relevantes:

Serviço Nome de exibição
k8s.io Kubernetes
container.googleapis.com Kubernetes Engine

Como visualizar o registro de atividade do administrador do seu projeto

Console

  1. No Console do Cloud, acesse a página Registros no menu Geração de registros.

    Acessar a página Registros

  2. Perto do topo da página, localize o menu suspenso para selecionar um tipo de recurso. No menu suspenso, selecione Cluster do Kubernetes.

  3. Opcionalmente, especifique o Local ou escolha Todos os locais. Se você escolher um local, é possível selecionar um cluster específico nele.

  4. O próximo menu à direita é para selecionar um registro. No menu suspenso, selecione atividade e clique em OK.

  5. A tela mostra todos os níveis de registro por padrão. Para especificar um nível de registro, como Aviso, selecione-o no menu suspenso que representa os níveis de registro.

  6. A exibição pode mostrar apenas entradas de registro da última hora. Se não aparecerem entradas de registro da última hora, clique em Carregar registros mais antigos.

  7. Na caixa Filtrar por rótulo ou pesquisa de texto, logo acima dos menus suspensos discutidos anteriormente, clique na seta para baixo para abrir o menu suspenso. No menu, escolha Converter para filtro avançado.

  8. A caixa de texto exibe um filtro semelhante a este:

    resource.type="k8s_cluster"
    logName="projects/my-project/logs/cloudaudit.googleapis.com%2Factivity"
    
  9. Abra uma das entradas de registro clicando na seta no início da linha. O campo logName da entrada tem o valor projects/project-id/logs/cloudaudit.googleapis.com%2Factivity.

gcloud

Liste as duas primeiras entradas de registro no registro de atividades do administrador do seu projeto:

gcloud logging read \
    'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"' \
    --limit 2 \
    --freshness 300d

em que project-id é o ID do projeto.

A saída mostra duas entradas de registro. Observe que, para cada entrada de registro, o campo logName tem o valor projects/project-id/logs/cloudaudit.googleapis.com%2Factivity.

insertId: 18yao5jem14og
labels:
  cluster_version: 1.8.8-gke.0
logName: projects/project-id/logs/cloudaudit.googleapis.com%2Factivity
...

Interfaces de filtro básica e avançada

No Console do Cloud, a página Registros tem duas interfaces de filtragem: básica e avançada. Para mais informações sobre as duas interfaces de filtro, consulte Interfaces de filtro do visualizador de registros.

Como exibir serviços que gravam no seu registro de atividades do administrador

Console

  1. No Console do Cloud, acesse a página Registros no menu Geração de registros.

    Acessar a página Registros

  2. Se a página Registros ainda não estiver no modo avançado, mude para o modo avançado. Na caixa de filtro, clique na seta para baixo à direita e selecione Converter para filtro avançado.

  3. Na caixa de filtro, exclua qualquer texto existente e insira este filtro:

    logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
    protoPayload.serviceName="k8s.io"
    

    em que project-id é o ID do projeto.

    Clique em Enviar filtro.

    A exibição lista todas as entradas no registro de atividades do administrador que foram gravadas pelo serviço k8s.io, ou seja, as entradas gravadas pelo painel de controle do Kubernetes.

  4. Procure entradas de registro que foram gravadas por outros serviços k8s.io. Na caixa de filtro, altere serviceName="k8s.io" para serviceName!="k8s.io". Clique em Enviar filtro.

    O display lista entradas de registro no registro de atividades do administrador que não foram gravadas pelo serviço k8s.io.

  5. Abra uma das entradas de registro e expanda o campo protoPayload. Observe o valor de serviceName para ver qual serviço gravou a entrada de registro.

  6. Procure entradas de registro gravadas pelo serviço container.googleapis.com, ou seja, as entradas gravadas pelo painel de controle do Kubernetes Engine: Na caixa de filtro, altere serviceName!="k8s.io" para serviceName="container.googleapis.com". Clique em Enviar filtro.

gcloud

  1. Liste as duas primeiras entradas no registro de atividades do administrador do projeto que foram gravadas pelo serviço k8s.io, ou seja, as entradas gravadas pelo plano de controle do Kubernetes.

    gcloud logging read \
       'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
           AND protoPayload.serviceName="k8s.io"' \
       --limit 2 \
       --freshness 300d
    

    em que project-id é o ID do projeto.

    Na saída, é possível ver que protoPayload:serviceName tem o valor k8s.io:

    protoPayload:
     ...
     serviceName: k8s.io
    
  2. Procure entradas de registro que foram gravadas por outros serviços k8s.io:

    gcloud logging read \
       'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
           AND protoPayload.serviceName!="k8s.io"' \
       --limit 2 \
       --freshness 300d
    

    A saída lista no registro de atividades do administrador as entradas de registro que não foram gravadas pelo serviço k8s.io.

    logName: projects/project-id/logs/cloudaudit.googleapis.com%2Factivity
    ...
    protoPayload:
     ...
     serviceName: compute.googleapis.com
    ...
    
  3. Em uma das entradas de registro, observe o valor de protoPayload.serviceName para ver qual serviço gravou a entrada de registro.

  4. Procure entradas de registro gravadas pelo serviço container.googleapis.com, ou seja, as entradas gravadas pelo painel de controle do Kubernetes Engine:

    gcloud logging read \
       'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
           AND protoPayload.serviceName="container.googleapis.com"' \
       --limit 2 \
       --freshness 300d
    

    em que project-id é o ID do projeto.

Como filtrar o registro de atividades do administrador por tipo de recurso

Cada entrada de registro no seu registro de atividades do administrador se aplica a um determinado tipo de recurso. Estes são os tipos de recursos mais relevantes para os clusters do Kubernetes:

Tipo de recurso Nome de exibição
k8s_cluster Cluster do Kubernetes
gke_cluster Operações de cluster do GKE

As entradas de registro gravadas pelo servidor da API Kubernetes são aplicáveis ao tipo de recurso k8s_cluster. Essas entradas de registro descrevem as operações nos recursos do Kubernetes no seu cluster, por exemplo, pods, implantações e secrets.

As entradas de registro gravadas pelo servidor de API Kubernetes Engine são aplicáveis ao recurso gke_cluster. Essas entradas de registro descrevem operações como criação e exclusão de cluster.

Console

  1. No Console do Cloud, acesse a página Registros no menu Geração de registros.

    Acessar a página Registros

  2. Se a página Registros ainda não estiver no modo básico, mude para ele. Na caixa de filtro, clique na seta para baixo à direita e selecione Limpar os filtros e retornar ao modo básico.

  3. No menu suspenso, para selecionar um tipo de recurso, selecione Kubernetes Cluster. Este é o nome de exibição do tipo de recurso k8s_cluster.

  4. No menu suspenso para selecionar um registro, selecione atividade e clique em OK.

    A exibição lista todas as entradas de registro no registro de atividades do administrador que se aplicam ao tipo de recurso k8s_cluster.

  5. Abra uma das entradas de registro e expanda o campo resource. Verifique se o campo type tem o valor k8s_cluster.

  6. No menu suspenso, selecione Operações de cluster do GKE. Esse é o nome de exibição do tipo de recurso gke_cluster. No menu suspenso de seleção do registro, selecione a atividade e clique em OK.

    A exibição lista todas as entradas de registro no registro de atividades do administrador que se aplicam ao tipo de recurso gke_cluster.

gcloud

  1. Liste as duas primeiras entradas no registro de atividade do administrador do projeto que se aplicam ao tipo de recurso k8s_cluster:

    gcloud logging read \
       'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
           AND resource.type="k8s_cluster"' \
       --limit 2 \
       --freshness 300d
    

    em que project-id é o ID do projeto.

    Na saída, é possível ver que o campo resource:type tem o valor k8s_cluster:

    resource:
     ...
     type: k8s_cluster
    
  2. Liste as duas primeiras entradas no registro de atividades do administrador do projeto que se aplicam ao tipo de recurso gke_cluster:

    gcloud logging read \
       'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
           AND resource.type="gke_cluster"' \
       --limit 2 \
       --freshness 300d
    

    Na saída, é possível ver que o campo resource:type tem o valor gke_cluster:

    resource:
     ...
     type: gke_cluster
    

Exemplos de filtros do seu registro de atividades do administrador

Veja alguns exemplos de filtros que você pode testar no Console do Cloud. Em cada um deles, substitua project-id pelo ID do projeto.

Encontre alterações no controle de acesso baseado em papéis, exceto alterações automatizadas do sistema.

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.authorization.rbac.v1"
NOT protoPayload.authenticationInfo.principalEmail:"system"
logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.authorization.rbac.v1.roles"
NOT protoPayload.authenticationInfo.principalEmail:"system"
logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.authorization.rbac.v1.rolebindings"
NOT protoPayload.authenticationInfo.principalEmail:"system"

Use consultas semelhantes para encontrar alterações em clusterroles e clusterrolebindings.

Encontre solicitações de assinatura de certificado.

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.resourceName:"certificates.k8s.io/v1beta1/certificatesigningrequests"

Encontre solicitações da Web não autenticadas.

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail:"system:anonymous"

Encontre chamadas de identidade de inicialização do kubelet.

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail:"kubelet"

Encontre solicitações autenticadas de nó.

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail:"system:node"

Encontre chamadas fora de um intervalo de IP.

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.requestMetadata.callerIp!="127.0.0.1"
protoPayload.requestMetadata.callerIp!="::1"
NOT protoPayload.requestMetadata.callerIp:"ip-prefix"

Localize entradas no registro de atividades do administrador que se aplicam ao tipo de recurso k8s_cluster e descreva a criação de uma implantação.

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"deployments.create"

Encontre entradas no registro de atividades do administrador que se aplicam ao tipo de recurso k8s_cluster e que tenham um valor principalEmail de system:anonymous. Essas entradas provavelmente representam tentativas malsucedidas de autenticação.

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.authenticationInfo.principalEmail="system:anonymous"

Localize entradas no registro de atividades do administrador que se aplicam ao tipo de recurso gke_cluster e descrevem a criação do cluster:

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="gke_cluster"
protoPayload.methodName="google.container.v1.ClusterManager.CreateCluster"

Localize as entradas no registro Atividade do administrador que se aplicam ao tipo de recurso gke_cluster e que tenham valor severity de ERROR:

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="gke_cluster"
severity="ERROR"

Localize entradas no registro de atividades do administrador que se aplicam ao tipo de recurso k8s_cluster e descrevem uma solicitação de gravação para um secret:

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.core.v1.secrets"
NOT protoPayload.methodName:"get"
NOT protoPayload.methodName:"list"
NOT protoPayload.methodName:"watch"

Encontre entradas no registro de atividades do administrador que se aplicam ao tipo de recurso k8s_cluster e descrevem uma solicitação de pod de um usuário específico:

logName="projects/project-id/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="k8s_cluster"
protoPayload.methodName:"io.k8s.core.v1.pods"
protoPayload.authenticationInfo.principalEmail="dev@example.com"

Para mais informações sobre como construir filtros, consulte Filtros de registro avançados.

Estrutura de uma entrada de registro

Cada entrada de registro é um objeto do tipo LogEntry. Para mais informações, acesse Noções básicas sobre os registros de auditoria.

Como ativar registros de acesso a dados

  1. Receba a política do Cloud Identity and Access Management (Cloud IAM) para seu projeto:

    gcloud projects get-iam-policy project-id > my-policy.yaml
    

    em que project-id é o ID do projeto.

  2. Abra my-policy.yaml para visualizar a política do Cloud IAM. Sua política provavelmente tem um objeto bindings semelhante a este:

    bindings:
    - members:
      - serviceAccount:xxx.gserviceaccount.com
      - serviceAccount:yyy.gserviceaccount.com
      role: roles/container.clusterAdmin
    - members:
      ...
    
  3. Em my-policy.yaml, crie um objeto auditConfigs ou adicione a seu objeto auditConfigs atual de maneira que ADMIN_READ, DATA_WRITE e DATA_READ estejam listados em auditLogConfigs.

    auditConfigs:
    - auditLogConfigs:
      - logType: ADMIN_READ
      - logType: DATA_WRITE
      - logType: DATA_READ
      service: allServices
    

    Não altere o valor de etag.

  4. Salve o arquivo atualizado como my-policy-2.yaml.

  5. Defina a política do Cloud IAM para seu projeto:

    gcloud projects set-iam-policy project-id my-policy-2.yaml
    

    em que project-id é o ID do projeto.

Como visualizar o registro de acesso a dados do projeto

Console

  1. No Console do Cloud, acesse a página Registros no menu Geração de registros.

    Acessar a página Registros

  2. Se a página Registros ainda não estiver no modo básico, mude para ele. Na caixa de filtro, clique na seta para baixo à direita e selecione Limpar os filtros e retornar ao modo básico.

  3. Perto do topo da página, localize o menu suspenso para selecionar um tipo de recurso. No menu suspenso, selecione Cluster do Kubernetes.

  4. No menu para escolha de um registro, selecione data_access e clique em OK .

  5. Na caixa Filtrar por rótulo ou pesquisa de texto, à direita, clique na seta para baixo para abrir o menu suspenso. No menu, escolha Converter para filtro avançado.

  6. A caixa de texto exibe um filtro semelhante a este:

    resource.type="k8s_cluster"
    logName="projects/my-project/logs/cloudaudit.googleapis.com%2Fdata_access"
  7. Abra uma das entradas de registro e observe que o campo logName da entrada tem o valor projects/project-id/logs/cloudaudit.googleapis.com%2Fdata_access.

gcloud

Liste as duas primeiras entradas no registro de acesso a dados do seu projeto:

gcloud logging read \
    'logName="projects/project-id/logs/cloudaudit.googleapis.com%2Fdata_access"' \
    --limit 2 \
    --freshness 30d

em que project-id é o ID do projeto.

A saída mostra duas entradas de registro. Observe que, para cada entrada de registro, o campo logName tem o valor projects/project-id/logs/cloudaudit.googleapis.com%2Fdata_access.

insertId:  "x0vy9eej0j54"
labels: {…}
logName:  "projects/project-id/logs/cloudaudit.googleapis.com%2Fdata_access"
...

Como exportar e armazenar entradas de registro

As entradas do registro ficam no Stackdriver Logging por um tempo limitado, conhecido como período de retenção. Depois disso, as entradas são excluídas.

Se você quiser manter suas entradas de registro por mais tempo, exporte-as para um serviço do Google, como o Cloud Storage, o BigQuery ou o Cloud Pub/Sub.

Como configurar métricas e alertas

Use o Stackdriver Monitoring para configurar métricas com base nas suas entradas de registro. E use as métricas baseadas em registro para configurar gráficos e alertas.

Política de auditoria

A política de auditoria do Kubernetes determina quais entradas de registro são exportadas pelo servidor da API Kubernetes. A política de auditoria do Kubernetes Engine determina quais entradas vão para seu registro de atividades do administrador e quais entradas vão para seu registro de acesso a dados.

Para mais informações sobre políticas de auditoria no Kubernetes Engine, consulte Política de auditoria do Kubernetes Engine.

A seguir