O servidor de API registra cada solicitação e resposta da API do Kubernetes como um log de auditoria. Em clusters registrados — nos quais um cluster Kubernetes externo se conecta ao ACK — os administradores podem encaminhar esses logs para o Alibaba Cloud Log Service e usá-los para responder a perguntas como:
O que aconteceu e quando?
Quem iniciou a solicitação?
Qual recurso foi afetado?
Isso permite rastrear todo o histórico de operações do cluster e investigar incidentes de segurança durante as atividades de operação e manutenção (O&M).
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster registrado com um cluster Kubernetes externo conectado. Para obter instruções de configuração, consulte Crie um cluster registrado no console do ACK
Etapa 1: Configure a política de auditoria nos nós mestres
Faça login em um nó mestre e edite o arquivo /etc/kubernetes/audit-policy.yaml usando o modelo abaixo. Repita esta etapa em todos os outros nós mestres.
O valor de apiVersion depende da sua versão do Kubernetes:
Versões anteriores à 1.24: use
audit.k8s.io/v1beta1Kubernetes 1.24 ou posterior: use
audit.k8s.io/v1
Para mais detalhes, consulte Notas de lançamento do Kubernetes 1.24.
Níveis de auditoria
O modelo de política usa quatro níveis de auditoria. Compreender esses níveis ajuda a decidir se é necessário ajustar as regras para o seu ambiente:
|
Nível |
O que é registrado |
|
|
Nada. Eventos correspondentes a esta regra não são registrados. |
|
|
Apenas metadados da solicitação: usuário, carimbo de data/hora, recurso e verbo. Os corpos da solicitação e da resposta não são registrados. |
|
|
Metadados e corpo da solicitação. O corpo da resposta não é registrado. Não se aplica a solicitações sem recurso. |
|
|
Metadados, corpo da solicitação e corpo da resposta. Não se aplica a solicitações sem recurso. |
Modelo de política de auditoria
apiVersion: audit.k8s.io/v1beta1 # Use audit.k8s.io/v1 for Kubernetes >= 1.24
kind: Policy
# Suppress events in the RequestReceived stage.
omitStages:
- "RequestReceived"
rules:
# High-volume, low-risk requests — not logged.
- level: None
users: ["system:kube-proxy"]
verbs: ["watch"]
resources:
- group: "" # core
resources: ["endpoints", "services"]
- level: None
users: ["system:unsecured"]
namespaces: ["kube-system"]
verbs: ["get"]
resources:
- group: "" # core
resources: ["configmaps"]
- level: None
users: ["kubelet"] # legacy kubelet identity
verbs: ["get"]
resources:
- group: "" # core
resources: ["nodes"]
- level: None
userGroups: ["system:nodes"]
verbs: ["get"]
resources:
- group: "" # core
resources: ["nodes"]
- level: None
users:
- system:kube-controller-manager
- system:kube-scheduler
- system:serviceaccount:kube-system:endpoint-controller
verbs: ["get", "update"]
namespaces: ["kube-system"]
resources:
- group: "" # core
resources: ["endpoints"]
- level: None
users: ["system:apiserver"]
verbs: ["get"]
resources:
- group: "" # core
resources: ["namespaces"]
# Read-only URLs — not logged.
- level: None
nonResourceURLs:
- /healthz*
- /version
- /swagger*
# Events — not logged.
- level: None
resources:
- group: "" # core
resources: ["events"]
# Secrets, ConfigMaps, and TokenReviews contain sensitive or binary data —
# log metadata only.
- level: Metadata
resources:
- group: "" # core
resources: ["secrets", "configmaps"]
- group: authentication.k8s.io
resources: ["tokenreviews"]
# Read requests for known API groups — log request metadata only (responses can be large).
- level: Request
verbs: ["get", "list", "watch"]
resources:
- group: "" # core
- group: "admissionregistration.k8s.io"
- group: "apps"
- group: "authentication.k8s.io"
- group: "authorization.k8s.io"
- group: "autoscaling"
- group: "batch"
- group: "certificates.k8s.io"
- group: "extensions"
- group: "networking.k8s.io"
- group: "policy"
- group: "rbac.authorization.k8s.io"
- group: "settings.k8s.io"
- group: "storage.k8s.io"
# Write requests for known API groups — log full request and response.
- level: RequestResponse
resources:
- group: "" # core
- group: "admissionregistration.k8s.io"
- group: "apps"
- group: "authentication.k8s.io"
- group: "authorization.k8s.io"
- group: "autoscaling"
- group: "batch"
- group: "certificates.k8s.io"
- group: "extensions"
- group: "networking.k8s.io"
- group: "policy"
- group: "rbac.authorization.k8s.io"
- group: "settings.k8s.io"
- group: "storage.k8s.io"
# All other requests — log metadata only.
- level: Metadata
Etapa 2: Configure o kube-apiserver nos nós mestres
Acesse um nó mestre e edite o arquivo /etc/kubernetes/manifests/kube-apiserver.yaml. Repita este procedimento em todos os demais nós mestres.
A configuração consiste em três partes: sinalizadores de linha de comando, variáveis de ambiente para coleta de logs e montagens de volume.
Adicionar sinalizadores de log de auditoria
Inclua os seguintes sinalizadores na seção command:
spec:
containers:
- command:
- kube-apiserver
- --audit-log-maxbackup=10
- --audit-log-maxsize=100
- --audit-log-path=/var/log/kubernetes/kubernetes.audit
- --audit-log-maxage=30
- --audit-policy-file=/etc/kubernetes/audit-policy.yaml
Cada sinalizador controla um aspecto específico da rotação de logs e da política:
|
Sinalizador |
Descrição |
|
|
Caminho onde o backend de log grava os eventos de auditoria. A ausência deste sinalizador desativa completamente o backend de log. |
|
|
Tamanho máximo do arquivo de log em megabytes antes da rotação. Defina como |
|
|
Quantidade máxima de arquivos de log rotacionados a serem retidos. Defina como |
|
|
Número máximo de dias para reter arquivos de log antigos. Defina como |
|
|
Caminho para o arquivo de política de auditoria configurado na Etapa 1. |
Adicionar variáveis de ambiente para coleta de logs
Acrescente as variáveis abaixo na seção env. Substitua {cluster_id} pelo ID real do seu cluster nos quatro nomes de variáveis. Para localizar o ID do cluster, consulte Visualize informações do cluster.
env:
- name: aliyun_logs_audit-${cluster_id}
value: /var/log/kubernetes/kubernetes.audit
- name: aliyun_logs_audit-${cluster_id}_tags
value: audit=apiserver
- name: aliyun_logs_audit-${cluster_id}_product
value: k8s-audit
- name: aliyun_logs_audit-${cluster_id}_jsonfile
value: "true"
image: registry-vpc.cn-shenzhen.aliyuncs.com/acs/kube-apiserver:v1.20.4-aliyun.1
|
Variável |
Descrição |
|
|
Caminho do arquivo de log de auditoria coletado pelo Logtail. |
|
|
Rótulo adicionado a cada entrada de log para identificar o servidor de API como source. |
|
|
Identificador de tipo de log usado pelo backend de log. |
|
|
Instrui o Logtail a analisar o arquivo de log como JSON. |
Montar o arquivo de política de auditoria e o diretório de logs
Adicione entradas de volumeMounts à especificação do contêiner:
volumeMounts:
- mountPath: /var/log/kubernetes
name: k8s-audit
- mountPath: /etc/kubernetes/audit-policy.yaml
name: audit-policy
readOnly: true
Em seguida, adicione as entradas correspondentes de volumes no nível de especificação do pod:
volumes:
- hostPath:
path: /var/log/kubernetes
type: DirectoryOrCreate
name: k8s-audit
- hostPath:
path: /etc/kubernetes/audit-policy.yaml
type: FileOrCreate
name: audit-policy
Etapa 3: Instale o componente logtail-ds
Instale o componente logtail-ds para ative a coleta de logs dos nós mestres. Para obter as etapas de instalação, consulte Etapa 2: Instale o logtail-ds.
Próximos passos
Após concluir a configuração, visualize e analise seus logs de auditoria no console do ACK. Consulte Trabalhar com auditoria de cluster.