Geração de registros de auditoria

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

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 o Cloud Audit Logging e o Stackdriver Logging. Você pode ver as entradas do registro de auditoria do Kubernetes no seu projeto do Google Cloud Platform.

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

Prepare-se para a tarefa tomando as seguintes medidas:

  • Verifique se você ativou a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Verifique se o SDK do Cloud está instalado.
  • Defina o ID do projeto padrão:
    gcloud config set project [PROJECT_ID]
  • Se você estiver trabalhando com clusters zonais, defina a zona de computação padrão:
    gcloud config set compute/zone [COMPUTE_ZONE]
  • Se você estiver trabalhando com clusters regionais, defina a região de computação padrão:
    gcloud config set compute/region [COMPUTE_REGION]
  • Atualize o 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 GCP tem estes registros de auditoria:

  • Registro de atividade 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 GCP, acesse a página Registros no menu 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 a 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 código 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 GCP, a página Registros tem duas interfaces de filtragem: básica e avançada. Para mais informações sobre as duas interfaces de filtragem, 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 GCP, acesse a página Registros no menu 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 código do projeto.

    Clique em Enviar filtro.

    A exibição lista todas as entradas no seu registro de atividades administrativas que foram gravadas pelo serviço k8s.io. Ou seja, as entradas foram gravadas pelo plano de controle do Kubernetes.

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

    A tela lista as entradas de registro no seu 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. Agora, procure as entradas de registro que foram gravadas pelo serviço container.googleapis.com. Ou seja, as entradas foram gravadas pelo plano de controle do Kubernetes Engine. Na caixa de filtro, altere serviceName!="k8s.io" para serviceName="container.googleapis.com". Clique em Enviar filtro.

gcloud

Liste as duas primeiras entradas de registro que foram gravadas pelo serviço k8s.io no registro de atividade do administrador do seu projeto. Ou seja, as entradas foram escritas 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 código do projeto.

Na saída, você pode ver que protoPayload:serviceName tem o valor k8s.io:

protoPayload:
  ...
  serviceName: k8s.io

Agora, procure as entradas de registro que foram escritas por serviços diferentes de 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 as entradas de registro que não foram gravadas pelo serviço k8s.io no seu registro de atividades do administrador .

logName: projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity
...
protoPayload:
  ...
  serviceName: compute.googleapis.com
...

Em uma das entradas de registro, observe o valor de protoPayload.serviceName para ver qual serviço escreveu a entrada de registro.

Agora, procure as entradas de registro que foram escritas pelo serviço container.googleapis.com. Ou seja, as entradas foram escritas pelo plano 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 código do projeto.

Como filtrar seu 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 escritas pelo servidor da API Kubernetes aplicam-se 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 chaves secretas.

As entradas de registro escritas pelo servidor da API Kubernetes Engine aplicam-se ao recurso gke_cluster. Essas entradas de registro descrevem operações como criação e exclusão de cluster.

Console

  1. No Console do GCP, acesse a página Registros no menu 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. Esse é 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 seu 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. Agora, no menu suspenso, selecione Operações de cluster do GKE. Trata-se do nome de exibição do tipo de recurso gke_cluster. No menu suspenso, para selecionar um registro, selecione atividade e clique em OK.

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

gcloud

Liste as duas primeiras entradas de registro no registro de atividade de administração do seu 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 código do projeto.

Na saída, veja que o campo resource:type tem o valor k8s_cluster:

resource:
  ...
  type: k8s_cluster

Em seguida, liste as duas primeiras entradas de registro no registro de atividade de administração do seu 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, veja 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 GCP. Em cada um deles, substitua [PROJECT_ID] pelo código do seu 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"

É possível usar 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]"

Encontre entradas no seu registro de atividades do administrador que se aplicam ao tipo de recurso k8s_cluster e descrevem 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 seu registro de atividades do administrador que se aplicam ao tipo de recurso k8s_cluster e têm principalEmail com o valor 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"

Encontre entradas no seu 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"

Encontre entradas no seu registro de atividades do administrador que se aplicam ao tipo de recurso gke_cluster e têm severity com o valor ERROR.

logName="projects/[PROJECT_ID]/logs/cloudaudit.googleapis.com%2Factivity"
resource.type="gke_cluster"
severity="ERROR"

Encontre entradas no seu registro de atividades do administrador que se aplicam ao tipo de recurso k8s_cluster e descrevem uma solicitação de gravação para uma chave secreta:

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 seu registro de atividades do administrador que se aplicam ao tipo de recurso k8s_cluster e descrevem uma solicitação de um usuário em particular:

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, consulte Tipos de dados do registro de auditoria.

Como ativar registros de acesso a dados

Chame a política de gerenciamento de identidade e acesso (IAM, na sigla em inglês) do seu projeto:

gcloud projects get-iam-policy [PROJECT_ID] > my-policy.yaml

em que [PROJECT_ID] é o código do projeto.

Abra my-policy.yaml para visualizar sua política de IAM. Sua política provavelmente contém um objeto bindings semelhante a este:

bindings:
- members:
  - serviceAccount:xxx.gserviceaccount.com
  - serviceAccount:yyy.gserviceaccount.com
  role: roles/container.clusterAdmin
- members:
  ...

Em my-policy.yaml, crie um objeto auditConfigs ou inclua no seu objeto auditConfigs existente, para que ADMIN_READ, DATA_WRITE E DATA_READ sejam listados em auditLogConfigs.

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

Não altere o valor de etag.

Salve seu arquivo atualizado como my-policy-2.yaml.

Defina a política de IAM do seu projeto:

gcloud projects set-iam-policy [PROJECT_ID] my-policy-2.yaml

em que [PROJECT_ID] é o código do projeto.

Como visualizar o registro de acesso a dados do seu projeto

Console

  1. No Console do GCP, acesse a página Registros no menu 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 selecionar 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 de registro 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 código 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, poderá exportá-las para um serviço do Google, como o Cloud Storage, o BigQuery ou o Cloud Pub/Sub.

Como configurar métricas e alertas

Você pode usar o Stackdriver Monitoring para configurar métricas com base nas suas entradas de registro. E você pode usar 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.

Próximas etapas

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Documentação do Kubernetes Engine