Audit Logging

Nesta página, explicamos como usar o Audit Logging 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 os registros do Cloud Audit e o Stackdriver Logging. É possível 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

Execute as etapas a seguir para se preparar para a tarefa:

  • 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 padrão do Compute:
    gcloud config set compute/zone [COMPUTE_ZONE]
  • Se você estiver trabalhando com clusters regionais, defina a região padrão do Compute:
    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 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 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 GCP, a página Registros tem duas interfaces de filtro: 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 GCP, 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 foram gravadas pelo plano de controle do Kubernetes.

  4. Agora procure entradas de registro que foram gravadas por 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. Agora procure 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 no registro de atividades do administrador do projeto que foram gravadas pelo serviço k8s.io. 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 ID do projeto.

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

protoPayload:
  ...
  serviceName: k8s.io

Agora procure entradas de registro que foram gravadas por outros serviços além 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 entradas de registro no registro de atividades do administrador que não foram gravadas pelo serviço k8s.io.

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 gravou a entrada de registro.

Agora procure 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:

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 GCP, 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. Agora, no menu suspenso, selecione Operações de cluster do GKE. Este é o 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 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 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

Em seguida, liste as duas primeiras entradas de registro no registro de Atividade 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 para testar no Console do GCP. Em cada caso, 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

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 ID 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 adicione ao seu objeto auditConfigs atual para 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.

Salve o 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 ID do projeto.

Como visualizar o registro de acesso a dados do projeto

Console

  1. No Console do GCP, 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 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 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, 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

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

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

Enviar comentários sobre…

Documentação do Kubernetes Engine