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.
-
Clusters VPC versiones 4.15 y posteriores: Los registros de auditoría utilizan el perfil de política de auditoría Red Hat OpenShift
default(para predeterminado) yWriteRequestBodies(para detallado). Para obtener más información, consulte la Política de registro de auditoría. -
Todas las demás versiones de clúster: los registros de auditoría utilizan la política
openshift-auditen elkube-samplesrepositorio.
No puede modificar la política predeterminada ni aplicar su propia política personalizada.
- Para conocer los registros de auditoría y la 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 de Administrador IBM Cloud IAM para el clúster Red Hat OpenShift on IBM Cloud.
Para empezar, siga las instrucciones para enviar los registros de auditoría de la API Kubernetes a un recurso de la red privada IBM Cloud.
Reenvío de los registros de auditoría de la API 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 icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs imagen para reenviar registros a IBM Cloud Logs. Si solo necesita una prueba de concepto, puede omitir el paso de configuración segura.
Para obtener una solución más automatizada, configure y mantenga su propia imagen de reenvío de registros.
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 sencilla
aplicación de servidor web HTTP que sólo está expuesta en la red del clúster. 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 de 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 dispone del rol de acceso a la plataforma Administrador IBM Cloud IAM 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 más información sobre la imagen
kube-audit, inspeccioneicr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs.ibmcloud cr image-inspect icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs -
Configure su kubeconfig para acceder a su clúster con
ibmcloud ks cluster config -c <cluster> -
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-logspara 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 security.openshift.io/scc.podSecurityLabelSync: "false" - 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 - containerPort: 4443 securityContext: allowPrivilegeEscalation: false runAsNonRoot: true capabilities: drop: - ALL seccompProfile: type: RuntimeDefault volumeMounts: - mountPath: /certificates name: certificates readOnly: true volumes: - name: certificates secret: secretName: audit-webhook optional: true - 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: - name: http protocol: TCP port: 80 targetPort: 3000 - name: https protocol: TCP port: 443 targetPort: 4443 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 - protocol: TCP port: 4443 from: - 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 -
Cree la implantación en el espacio de nombres
ibm-kube-auditde su clúster.kubectl apply -f ibmcloud-kube-audit.yaml -
Espere a que
ibmcloud-kube-auditla implementación alcance el estado Disponible.kubectl wait --for condition=Available --namespace ibm-kube-audit --timeout 5m deploy/ibmcloud-kube-auditSalida de ejemplo
deployment.apps/ibmcloud-kube-audit condition met -
Verifique que el servicio
ibmcloud-kube-audit-serviceesté desplegado en el clúster.kubectl get svc -n ibm-kube-audit -l app=ibmcloud-kube-auditSalida de ejemplo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ibmcloud-kube-audit-service ClusterIP 172.21.xxx.xxx <none> 80/TCP 1m -
Cifre el tráfico en tránsito con HTTPS. Si solo necesita un reenviador de registros de auditoría de prueba de concepto, omita este paso.
-
Compruebe el estado de la autoridad de certificación. Si sus certificados están a punto de caducar, siga los pasos para rotarlos.
ibmcloud oc cluster ca status -c <cluster> -
Guarde el
certificate-authoritydel clúster en el archivocluster-ca.pem.
ibmcloud oc cluster ca get -c <cluster> --output json | jq -r .caCert | base64 -D > cluster-ca.pem
- Inicie una sesión en la cuenta. If applicable, target the appropriate resource group. Establezca el contexto para el clúster. Prepare un kubeconfig basado en certificados y guárdelo
en
kubeconfig.json. Asegúrese de especificar la--adminopción para descargar los datosclient-certificatey losclient-keydatos a su equipo local. Estos datos se utilizan posteriormente para configurar el webhook de auditoría.
ibmcloud oc cluster config --cluster <cluster> --admin --output json > kubeconfig.json
- Extraiga el certificado de cliente de kubeconfig al archivo
kubeconfig-cert.pem.
jq -r '.users[].user."client-certificate-data"' kubeconfig.json | base64 -D > kubeconfig-cert.pem
- Extraiga la clave de cliente de kubeconfig al archivo
kubeconfig-key.pem.
jq -r '.users[].user."client-key-data"' kubeconfig.json | base64 -D > kubeconfig-key.pem
- Configure el webhook de auditoría y especifique
certificate-authority,client-certificateyclient-key. Elcertificate-authorityse recuperó en el paso 10 y elclient-certificateyclient-keyse recuperaron en los dos pasos anteriores. Opcionalmente, configure elpolicycon un valor diferente.
ibmcloud oc cluster master audit-webhook set \
--cluster CLUSTER \
--remote-server https://127.0.0.1:2040/api/v1/namespaces/ibm-kube-audit/services/http:ibmcloud-kube-audit-service:http/proxy/post \
--ca-cert cluster-ca.pem \
--client-cert kubeconfig-cert.pem \
--client-key kubeconfig-key.pem \
--policy default
Si ha configurado HTTPS en el paso 8, establezca remote-server en su lugar https URL:
https://127.0.0.1:2040/api/v1/namespaces/ibm-kube-audit/services/https:ibmcloud-kube-audit-service:https/proxy/post
- Verifique que el webhook de auditoría se ha creado en el clúster.
ibmcloud oc cluster master audit-webhook get --cluster <cluster>
Salida de ejemplo
Server: https://127.0.0.1:2040/api/v1/namespaces/ibm-kube-audit/services/http:ibmcloud-kube-audit-service:http/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 oc cluster master refresh --cluster <cluster>
-
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.
-
Ver el estado del clúster y esperar a que
Master Stateindiqueupdating, luego esperar al estadodeployed. Puede tardar varios minutos en completarse.
ibmcloud ks cluster get -c <cluster>
Salida de ejemplo
...
Master
Status: Refresh in progress. (2 seconds ago)
State: updating
...
Master
Status: Ready (2 seconds ago)
State: deployed
- 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 ibmcloud-kube-audit-to-ibm-cloud-logs 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 oc 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. Actualiza el pod a la última versión disponible en la etiqueta actual con kubectl rollout restart --namespace ibm-kube-audit deploy/ibmcloud-kube-audit y espera a que los nuevos pods estén disponibles
con kubectl rollout status --timeout 1m --namespace ibm-kube-audit deploy/ibmcloud-kube-audit.
Gestione las actualizaciones, rote los certificados y cifre los datos en tránsito con HTTPS
Algunas cosas importantes que hay que tener en cuenta antes de preparar el reenvío de registros:
- La etiqueta de imagen
icr.io/ibm/ibmcloud-kube-audit-to-ibm-cloud-logs:latestrecibe actualizaciones de vulnerabilidad y corrección de errores. Sin embargo, la implementación debe reiniciarse manualmente para que se apliquen esos cambios. Utilicekubectl rollout restart -n ibm-kube-audit deploy/ibmcloud-kube-auditpara descargar la última imagen y reiniciar correctamente. - Esta implementación se instala y gestiona manualmente. Cambiar de esta implementación a otra puede provocar un tiempo de inactividad en el registro de auditoría.
- El certificado generado a continuación se puede rotar. La rotación requiere pasos manuales para reemplazar el secreto y reiniciar la implementación.
Para asegurar el despliegue con encriptación en tránsito, se requiere una clave privada y un certificado TLS firmado por el kube-apiserver.
- Después de aplicar el archivo YAML en el paso 4, espere a que el recurso de servicio rellene la IP del clúster. Guárdalo en la variable de shell
$cluster_ip.cluster_ip=$( kubectl wait \ --for jsonpath='{.spec.clusterIP}' \ --namespace ibm-kube-audit \ --output jsonpath='{.spec.clusterIP}' \ --timeout 5m \ svc/ibmcloud-kube-audit-service ) - Genera una clave privada y guárdala en
server.keyopenssl genrsa -out server.key 4096 - Genera un archivo de configuración de
server-csr.confsolicitud de firma de certificado. Esto se utiliza para generar el certificado que firmará Kubernetes.cat <<EOF > server-csr.conf [ req ] default_bits = 2048 prompt = no default_md = sha256 req_extensions = req_ext distinguished_name = dn [ dn ] CN = system:node:ibmcloud-kube-audit-service.ibm-kube-audit.svc O = system:nodes [ req_ext ] subjectAltName = @alt_names [ alt_names ] DNS.1 = ibmcloud-kube-audit-service.ibm-kube-audit.svc.cluster.local DNS.2 = ibmcloud-kube-audit-service.ibm-kube-audit.svc IP.1 = ${cluster_ip} EOF - Genere la carga útil de la solicitud de firma de certificado para que Kubernetes la firme.
openssl req -new -config server-csr.conf -key server.key -out server.csr - Inserte la carga útil en un recurso CSR (solicitud de certificado) de KubernetesCertificateSigningRequest
kubectl apply -f - <<EOF apiVersion: certificates.k8s.io/v1 kind: CertificateSigningRequest metadata: name: ibmcloud-kube-audit-service.ibm-kube-audit spec: request: $(base64 < server.csr | tr -d '\n') signerName: kubernetes.io/kubelet-serving usages: - digital signature - key encipherment - server auth EOF - Aprobar la solicitud
kubectl certificate approve ibmcloud-kube-audit-service.ibm-kube-audit - Espere a que se firme el certificado
kubectl wait \ --for jsonpath='{.status.certificate}' \ --output go-template='{{.status.certificate | base64decode}}' \ --timeout 5m \ csr/ibmcloud-kube-audit-service.ibm-kube-audit > server.crt - Crear un secreto a partir del certificado y la clave privada
kubectl create secret tls \ --cert server.crt \ --key server.key \ --namespace ibm-kube-audit \ audit-webhook - Reinicie la implementación para recoger el nuevo secreto.
kubectl rollout restart --namespace ibm-kube-audit deploy/ibmcloud-kube-audit - Espera a que los nuevos pods estén disponibles
kubectl rollout status --timeout 1m --namespace ibm-kube-audit deploy/ibmcloud-kube-audit
- El webhook de auditoría ya está listo para recibir eventos a través de una conexión cifrada. Al configurar el webhook de auditoría en la guía completa anterior, debe utilizar la
httpsversión de--remote-serverURL en su lugar:
https://127.0.0.1:2040/api/v1/namespaces/ibm-kube-audit/services/https:ibmcloud-kube-audit-service:https/proxy/post`
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-forwardery cree un archivohaproxy.cfgen é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> checkSi tu servidor de consumo de logs impone una conexión segura ( TLS ), puedes añadir tus archivos de certificado a este directorio y cambiar la sección backend en
haproxy.cfgpara usar estos archivos. Para más información, consulte la documentación de HAProxy. -
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 llamado
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: vpnSi ha añadido archivos de certificado a
kube-audit-forwarderen el paso anterior, no olvide listar estos archivos en la secciónvolumeMountscomosubPath. -
Cree el despliegue y el servicio.
kubectl create -f kube-audit-forwarder-remote-private-ip.yaml -
Verifique que el despliegue y el servicio
kube-audit-forwarderestán desplegados en su cluster.kubectl get svc -n ibm-kube-auditSalida de ejemplo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ... kube-audit-forwarder ClusterIP 10.xxx.xx.xxx <none> 80/TCP 1mkubectl get deployment -n ibm-kube-auditSalida 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
--adminpara descargar los archivosclient-certificateyclient-keya su máquina local. Estos archivos se utilizan más tarde para configurar el webhook de auditoría.ibmcloud oc cluster config --cluster <cluster> --admin -
Compruebe el estado de la autoridad de certificación. Si sus certificados están a punto de caducar, siga los pasos para rotarlos.
ibmcloud oc cluster ca status -c CLUSTER -
Consulta la
certificate-authoritydel clúster y la guarda en un archivo.ibmcloud oc cluster ca get -c <cluster> --output json | jq -r .caCert | base64 -D > <certificate-authority> -
Visualice la configuración actual ejecutando el mandato
oc config viewy revise la salida declient-certificateyclient-key.oc config view --minifySalida 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-certificateyclient-keyque ha recuperado en los pasos 5-7.
ibmcloud oc 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 oc 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 oc 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.
Registros de auditoría de nodo trabajador
Red Hat OpenShift on IBM Cloud utiliza el componente de Linux Auditing System, auditd, para supervisar y registrar la actividad en los nodos de trabajador. Aunque la auditoría del nodo trabajador está activada por defecto, no se
dispone de datos de auditoría hasta que se configura el reenvío de registros a una instancia de IBM Cloud Logs o a un servidor externo.
Visión general de la configuración de auditoría de nodo trabajador
Los registros se almacenan en el directorio /var/log/audit en los nodos trabajadores. Puede ver los registros en IBM Cloud Logs o en el servidor externo después de configurar el reenvío de registros.
Auditd recopila registros en varios sucesos, incluidos los siguientes:
- Llamadas al sistema Linux (
syscalls) - Denegaciones de SELinux
- Modificaciones de política de SELinux
- Modificaciones de software mediante el instalador del paquete
yum - Operaciones de
Systemd - Modificaciones de grupo y de usuario de Linux
- Modificaciones de cambios de
Netfilter - Inicios de sesión de SSH
Configuración del reenvío de registros para nodos trabajadores
Consulte Reenvío de registros a una instancia de IBM Cloud Logs..
Registros de auditoría de servicio
De forma predeterminada, Red Hat OpenShift on IBM Cloud 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.
Visualización de alertas de AuditWebhookError en clústeres habilitados para auditoría
Red Hat OpenShift on IBM Cloud la versión clusters tiene una alerta AuditWebhookError que se dispara cuando el webhook de auditoría se bloquea o se elimina.
Para ver la alerta:
- En Red Hat OpenShift on IBM Cloud, seleccione la vista Administrador.
- Pulse Observar > Alerta > AuditWebhookError.
- Para crear una notificación para esta alerta, consulte Envío de notificaciones a sistemas externos.