Revisión de registros de servicio, de servidor de API y de nodo trabajador
Con los registros de auditoría, puede comprender mejor las operaciones iniciadas por los usuarios del clúster, lo que puede ayudarle a resolver problemas o a notificar la conformidad con los estándares internos y del sector.
Registros de auditoría del servidor de API de Kubernetes
Para supervisar la actividad administrativa de Kubernetes iniciada por el usuario que tiene lugar en el clúster, puede recopilar y reenviar sucesos de auditoría que se pasan a través del servidor de API de Kubernetes a IBM Cloud Logs o a un servidor externo.
Consideraciones y requisitos previos
Antes de configurar una configuración de auditoría de API de Kubernetes, revise la información siguiente.
Los registros de auditoría utilizan las siguientes políticas en el repositorioGitHub' IBM-Cloud/kube-samples
. A partir de la versión 1.30,
las políticas se actualizaron para seguir de cerca las utilizadas por Red Hat para OpenShift. Ambos conjuntos de políticas pueden consultarse a continuación.
No puede modificar la política predeterminada ni aplicar su propia política personalizada.
- Para obtener registros de auditoría y verbosidad de Kubernetes, consulte la documentación de Kubernetes.
- Solo se puede crear un webhook de auditoría en un clúster.
- Debe tener el rol de acceso de plataforma Administrador IBM Cloud IAM para el clúster IBM Cloud Kubernetes Service.
Para empezar, siga las instrucciones para enviar registros de auditoría de API de Kubernetes a un recurso de la red privada de IBM Cloud o a un servidor externo.
Reenvío de registros de auditoría de API de Kubernetes a Cloud Logs
Para reenviar registros de auditoría a IBM Cloud Logs, puede crear un sistema de auditoría de Kubernetes utilizando la imagen y el despliegue proporcionados.
El siguiente ejemplo utiliza la imagen icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs
para reenviar registros a IBM Cloud Logs. Esta imagen es solo para fines de demostración. Para una solución de producción, configure y mantenga
su propia imagen de reenvío de registro.
Anteriormente, se utilizaba icr.io/ibm/ibmcloud-kube-audit-to-logdna
para reenviar registros. Esta imagen está obsoleta y el soporte finaliza pronto. Actualice la configuración de reenvío de registro para utilizar icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs
en su lugar.
El sistema de auditoría de Kubernetes en el clúster consta de un webhook de auditoría, un servicio de recopilación de registros, una aplicación de servidor web y un agente de registro. El webhook recopila los sucesos del servidor de API de
Kubernetes del nodo maestro del clúster. El servicio de recopilación de registros es un servicio ClusterIP
de Kubernetes que se crea an partir de una imagen del registro público de IBM Cloud. Este servicio expone una aplicación
de servidor web de node.js
HTTP simple que solo está expuesta en la red privada. La aplicación de servidor web analiza los datos de registro del webhook de auditoría y crea cada registro como una línea JSON exclusiva. Por último,
el agente de registro reenvía los registros de la aplicación del servidor web a IBM Cloud Logs, donde puede ver los registros.
Antes de comenzar: Asegúrese de que ha revisado las consideraciones y los requisitos previos y de que tiene el rol de acceso a la plataforma IAM de Administrador IBM Cloud para IBM Cloud Logs.
-
Elija como destino el registro de contenedores global para las imágenes públicas de IBM Cloud.
ibmcloud cr region-set global
-
Opcional: Para obtener más información sobre la imagen de la marca registrada (
kube-audit
), visiteicr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs
.ibmcloud cr image-inspect icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs
-
Cree un archivo de configuración denominado
ibmcloud-kube-audit.yaml
. Este archivo de configuración crea un servicio de recopilación de registros y un despliegue que extrae la imagenicr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs
para crear un contenedor de recopilación de registros.apiVersion: v1 kind: List metadata: name: ibmcloud-kube-audit items: - apiVersion: v1 kind: Namespace metadata: name: ibm-kube-audit labels: pod-security.kubernetes.io/enforce: restricted pod-security.kubernetes.io/enforce-version: latest pod-security.kubernetes.io/audit: restricted pod-security.kubernetes.io/audit-version: latest pod-security.kubernetes.io/warn: restricted pod-security.kubernetes.io/warn-version: latest - apiVersion: apps/v1 kind: Deployment metadata: name: ibmcloud-kube-audit namespace: ibm-kube-audit labels: app: ibmcloud-kube-audit spec: replicas: 1 selector: matchLabels: app: ibmcloud-kube-audit template: metadata: labels: app: ibmcloud-kube-audit spec: containers: - name: ibmcloud-kube-audit image: 'icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs:latest' imagePullPolicy: Always ports: - containerPort: 3000 securityContext: allowPrivilegeEscalation: false runAsNonRoot: true capabilities: drop: - ALL seccompProfile: type: RuntimeDefault - apiVersion: v1 kind: Service metadata: name: ibmcloud-kube-audit-service namespace: ibm-kube-audit labels: app: ibmcloud-kube-audit spec: selector: app: ibmcloud-kube-audit ports: - protocol: TCP port: 80 targetPort: 3000 type: ClusterIP - kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: ibmcloud-kube-audit namespace: ibm-kube-audit spec: podSelector: matchLabels: app: ibmcloud-kube-audit policyTypes: - Ingress ingress: - ports: - protocol: TCP port: 3000 from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: konnectivity-agent
-
Cree la implementación en el espacio de nombres
ibm-kube-audit
de su clúster.kubectl create -f ibmcloud-kube-audit.yaml
-
Verifique que el pod
ibmcloud-kube-audit-service
tenga el STATUSRunning
.kubectl get pods -n ibm-kube-audit -l app=ibmcloud-kube-audit
Salida de ejemplo
NAME READY STATUS RESTARTS AGE ibmcloud-kube-audit-c75cb84c5-qtzqd 1/1 Running 0 21s
-
Verifique que el servicio
ibmcloud-kube-audit-service
esté desplegado en el clúster.kubectl get svc -n ibm-kube-audit -l app=ibmcloud-kube-audit
Salida de ejemplo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ibmcloud-kube-audit-service ClusterIP 172.21.xxx.xxx <none> 80/TCP 1m
-
Inicie una sesión en la cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster. Asegúrese de especificar la opción
--admin
para descargar los archivosclient-certificate
yclient-key
en su equipo local. Estos archivos se utilizan más tarde para configurar el webhook de auditoría.ibmcloud ks cluster config --cluster <cluster> --admin
-
Consulta el
certificate-authority
del clúster y guárdalo en un archivo.ibmcloud ks cluster ca get -c <cluster> --output json | jq -r .caCert | base64 -D > <certificate-authority>
-
Visualice la configuración actual ejecutando el mandato
kubectl config view
y revise la salida declient-certificate
yclient-key
.kubectl config view --minify
Salida de ejemplo
clusters: - cluster: ... ... client-certificate: /Users/user/.bluemix/plugins/container-service/clusters/cluster-name-a111a11a11aa1aa11a11-admin/admin.pem client-key: /Users/user/.bluemix/plugins/container-service/clusters/cluster-name-a111a11a11aa1aa11a11-admin/admin-key.pem
-
Configure el webhook de auditoría y especifique
certificate-authority
,client-certificate
yclient-key
.certificate-authority
se ha recuperado en el paso 8, yclient-certificate
yclient-key
se han recuperado en el paso anterior.
ibmcloud ks cluster master audit-webhook set --cluster CLUSTER --remote-server https://127.0.0.1:2040/api/v1/namespaces/ibm-kube-audit/services/ibmcloud-kube-audit-service/proxy/post --ca-cert CERTIFICATE-AUTHORITY --client-cert CLIENT-CERT --client-key CLIENT-KEY [--policy default|verbose]
- Verifique que el webhook de auditoría se ha creado en el clúster.
ibmcloud ks cluster master audit-webhook get --cluster <cluster_name_or_ID>
Salida de ejemplo
Server: https://127.0.0.1:2040/api/v1/namespaces/ibm-kube-audit/services/ibmcloud-kube-audit-service/proxy/post
Policy: default
- Aplique el webhook a su servidor de API de Kubernetes renovando el nodo maestro del clúster. El nodo maestro puede tardar unos minutos en renovarse.
ibmcloud ks cluster master refresh --cluster <cluster_name_or_ID>
-
Mientras se renueva el nodo maestro, suministre una instancia de IBM Cloud Logs y despliegue un agente de registro en cada nodo trabajador del clúster. El agente de registro se necesita para reenviar registros internos del clúster al servicio IBM Cloud Logs. Si ya ha configurado agentes de registro en el clúster, puede saltarse este paso.
-
Cuando finalice la renovación del nodo maestro y los agentes de registro se ejecuten en los nodos trabajadores, puede ver los registros de auditoría de API de Kubernetes en IBM Cloud Logs.
Después de configurar el webhook de auditoría en su clúster, puede supervisar las actualizaciones de versión de la imagen kube-audit-to-logdna
ejecutando ibmcloud cr image-list --include-ibm | grep ibmcloud-kube-audit-to-ibm-cloud-logs
.
Para ver la versión de la imagen que se ejecuta actualmente en el clúster, ejecute kubectl get pods | grep ibmcloud-kube-audit-to-ibm-cloud-logs
para buscar el nombre del pod de auditoría y ejecute kubectl describe pod <pod_name>
para ver la versión de la imagen.
Reenvío de registros de auditoría de API de Kubernetes a un recurso de la red privada de IBM Cloud
Reenvíe registros de auditoría a un recurso distinto de IBM Cloud Logs que está fuera de su clúster y accesible en la red privada de IBM Cloud.
El ejemplo siguiente utiliza la imagen haproxytech/haproxy-alpine:2.6
para reenviar registros. Esta imagen es sólo para fines de demostración y no debe utilizarse en entornos de producción. Para una solución de producción, configure
y mantenga su propia imagen de reenvío de registro.
Antes de empezar, asegúrese de revisar las consideraciones y los requisitos previos.
-
Cree un nuevo directorio
kube-audit-forwarder
y cree un archivohaproxy.cfg
en él con el contenido siguiente. No olvide sustituir<REMOTE-IP>:<REMOTE-PORT>
en el archivo por la dirección IP y el puerto del consumidor de registro remoto.global log stdout format raw local0 info defaults mode http timeout client 10s timeout connect 5s timeout server 10s timeout http-request 10s log global frontend myfrontend bind :3000 default_backend remotelogstash # Use remote log consumer IP and port here backend remotelogstash server s1 <REMOTE-IP>:<REMOTE-PORT> check
Si el servidor de consumidor de registros está aplicando una conexión segura (TLS), puede añadir los archivos de certificado a este directorio y cambiar la sección de programa de fondo en
haproxy.cfg
para utilizar estos archivos. Para obtener más información, consulte la documentación deHAProxy. -
Cree un configmap a partir del contenido del directorio
kube-audit-forwarder
.kubectl create namespace ibm-kube-audit; kubectl create configmap -n ibm-kube-audit kube-audit-forwarder-cm --from-file=kube-audit-forwarder
-
Cree un archivo de configuración que se llame
kube-audit-forwarder-remote-private-ip.yaml
. Este archivo de configuración crea un despliegue y un servicio que reenvía registros de auditoría del clúster a la dirección IP del recurso remoto a través de la red privada IBM Cloud.kind: Deployment apiVersion: apps/v1 metadata: labels: app: kube-audit-forwarder name: kube-audit-forwarder namespace: ibm-kube-audit spec: revisionHistoryLimit: 2 selector: matchLabels: app: kube-audit-forwarder strategy: rollingUpdate: maxUnavailable: 1 type: RollingUpdate template: metadata: labels: app: kube-audit-forwarder spec: containers: - image: haproxytech/haproxy-alpine:2.6 imagePullPolicy: IfNotPresent name: haproxy volumeMounts: - name: config-volume mountPath: /usr/local/etc/haproxy/haproxy.cfg subPath: haproxy.cfg volumes: - name: config-volume configMap: name: kube-audit-forwarder-cm --- apiVersion: v1 kind: Service metadata: name: kube-audit-forwarder namespace: ibm-kube-audit spec: selector: app: kube-audit-forwarder ports: - protocol: TCP port: 80 targetPort: 3000 --- kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: kube-audit-forwarder namespace: ibm-kube-audit spec: podSelector: matchLabels: app: kube-audit-forwarder policyTypes: - Ingress ingress: - ports: - protocol: TCP port: 3000 from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: k8s-app: konnectivity-agent - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: app: konnectivity-agent - namespaceSelector: matchLabels: kubernetes.io/metadata.name: kube-system podSelector: matchLabels: app: vpn
Si ha añadido archivos de certificado a
kube-audit-forwarder
en el paso anterior, no olvide listar estos archivos en la secciónvolumeMounts
comosubPath
. -
Crear la implementación y el servicio.
kubectl create -f kube-audit-forwarder-remote-private-ip.yaml
-
Verifique que la implementación y el servicio de
kube-audit-forwarder
estén implementados en su clúster.kubectl get svc -n ibm-kube-audit
Salida de ejemplo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ... kube-audit-forwarder ClusterIP 10.xxx.xx.xxx <none> 80/TCP 1m
kubectl get deployment -n ibm-kube-audit
Salida de ejemplo
NAME READY UP-TO-DATE AVAILABLE AGE ... kube-audit-forwarder 1/1 1 1 6m27s
-
Inicie una sesión en la cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster. Asegúrese de especificar la opción
--admin
para descargar los archivosclient-certificate
yclient-key
en su equipo local. Estos archivos se utilizan más tarde para configurar el webhook de auditoría.ibmcloud ks cluster config --cluster <cluster> --admin
-
Consulta el
certificate-authority
del clúster y guárdalo en un archivo.ibmcloud ks cluster ca get -c <cluster> --output json | jq -r .caCert | base64 -D > <certificate-authority>
-
Visualice la configuración actual ejecutando el mandato
kubectl config view
y revise la salida declient-certificate
yclient-key
.kubectl config view --minify
Salida de ejemplo
clusters: - cluster: ... ... client-certificate: /Users/user/.bluemix/plugins/container-service/clusters/cluster-name-a111a11a11aa1aa11a11-admin/admin.pem client-key: /Users/user/.bluemix/plugins/container-service/clusters/cluster-name-a111a11a11aa1aa11a11-admin/admin-key.pem
-
Configure el webhook de auditoría y especifique los
certificate-authority
,client-certificate
yclient-key
que ha recuperado en los pasos 5-7.ibmcloud ks cluster master audit-webhook set --cluster <cluster> --remote-server https://127.0.0.1:2040/api/v1/namespaces/ibm-kube-audit/services/kube-audit-forwarder/proxy/post --ca-cert <certificate-authority> --client-cert <client-certificate> --client-key <client-key> [--policy default|verbose]
-
Verifique que el webhook de auditoría se ha creado en el clúster.
ibmcloud ks cluster master audit-webhook get --cluster <cluster_name_or_ID>
Salida de ejemplo
OK
Server: https://127.0.0.1:2040/api/v1/namespaces/ibm-kube-audit/services/kube-audit-forwarder/proxy/post
Policy: default
- Aplique el webhook a su servidor de API de Kubernetes renovando el nodo maestro del clúster. El maestro puede tardar varios minutos en renovarse.
ibmcloud ks cluster master refresh --cluster <cluster_name_or_ID>
Una vez finalizada la renovación del maestro, los registros se envían a la dirección IP privada del recurso de registro.
Reenvío de registros de auditoría de API de Kubernetes a un servidor externo en Internet público
Para auditar los sucesos que se pasan a través del servidor de API de Kubernetes, puede crear una configuración que utilice Fluentd para reenviar sucesos a un servidor externo.
Antes de empezar, asegúrese de revisar las consideraciones y los requisitos previos. Tenga en cuenta que los filtros de registro no están soportados.
-
Configure el webhook. Si no proporciona ninguna información en las opciones, se utilizará una configuración predeterminada.
ibmcloud ks cluster master audit-webhook set --cluster <cluster_name_or_ID> --remote-server <server_URL_or_IP> --ca-cert <CA_cert_path> --client-cert <client_cert_path> --client-key <client_key_path> [--policy default|verbose]
Descripción de los componentes de este mandato Opción Descripción <cluster_name_or_ID>
El nombre o ID del clúster. <server_URL>
Un URL accesible públicamente o una dirección IP para el servicio de registro remoto al que desea enviar registros. Los certificados se ignoran si se proporciona un URL de servidor no seguro. <CA_cert_path>
La vía de acceso de archivo del certificado de CA que se utiliza para verificar el servicio de registro remoto. <client_cert_path>
La vía de acceso de archivo del certificado de cliente que se utiliza para autenticarse en el servicio de registro remoto. <client_key_path>
La vía de acceso de archivo de la clave de cliente correspondiente que se utiliza para conectarse al servicio de registro remoto. -
Verifique que el reenvío de registros se ha habilitado consultando el URL del servicio de registro remoto.
ibmcloud ks cluster master audit-webhook get --cluster <cluster_name_or_ID>
Salida de ejemplo
OK Server: https://8.8.8.8
-
Aplique la actualización de configuración reiniciando el maestro de Kubernetes.
ibmcloud ks cluster master refresh --cluster <cluster_name_or_ID>
-
Opcional: si desea detener el reenvío de registros de auditoría, puede inhabilitar su configuración.
-
Para el clúster del que desea dejar de recopilar registros de auditoría de servidor de API: inicie sesión en la cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster.
-
Inhabilite la configuración del programa de fondo del webhook para el servidor de API del clúster.
ibmcloud ks cluster master audit-webhook unset --cluster <cluster_name_or_ID>
-
Aplique la actualización de configuración reiniciando el maestro de Kubernetes.
ibmcloud ks cluster master refresh --cluster <cluster_name_or_ID>
-
Gestión del reenvío de registros del servidor de API
Consulte Verificación, actualización y supresión del reenvío de registros.
Si observa errores al recuperar los registros de auditoría cuando han estado funcionando previamente, puede deberse a que la autoridad de certificación utilizada para los registros de auditoría haya caducado o rotado. Repita los pasos anteriores
para configurar un webhook y renovar el certificado. Además, puedes buscar la métrica Kubernetes llamada apiserver_audit_error_total{plugin="webhook"}
que indica si tu certificado webhook ha caducado.
Registros de auditoría de servicio
De forma predeterminada, IBM Cloud Kubernetes Service genera y envía sucesos a IBM Cloud Logs. Para ver estos sucesos, debe crear una instancia de IBM Cloud Logs. Para obtener más información, consulte Sucesos de IBM Cloud Logs.