En esta página se describe cómo proteger los registros de auditoría de tu entorno de dispositivo aislado de Google Distributed Cloud (GDC) en cubos de copia de seguridad remotos para conservar y restaurar datos cuando sea necesario. El proceso incluye los pasos para instalar y configurar los componentes necesarios para recuperar los registros de auditoría históricos de esas copias de seguridad.
Las copias de seguridad aseguran que los registros de auditoría se conserven aunque los datos originales se pierdan o se dañen, lo que te ayuda a cumplir los requisitos y te permite recuperar información en caso de fallos del sistema o eliminaciones accidentales. Los registros de auditoría restaurados proporcionan acceso a datos históricos, lo que permite analizar eventos pasados, incidentes de seguridad y actividad de los usuarios.
Implementar un proceso de copia de seguridad y restauración de los registros de auditoría es beneficioso para mantener la integridad de los datos, asegurar el cumplimiento de las normativas y permitir el análisis histórico.
Antes de empezar
Asegúrate de que tienes acceso a los siguientes recursos:
- Un segmento remoto para copias de seguridad con un endpoint, una clave de acceso secreta y un ID de clave de acceso.
- Un certificado de autoridad de certificación (CA) para el sistema de almacenamiento.
- Un clúster de Kubernetes operativo.
Para obtener los permisos que necesitas para gestionar las copias de seguridad, pide al administrador de gestión de identidades y accesos de tu proyecto que te conceda uno de los siguientes roles en el espacio de nombres de tu proyecto:
- Creador de segmentos de restauración de la plataforma de registros de auditoría
- Lector de segmentos de plataforma de registros de auditoría
En función del nivel de acceso y de los permisos que necesites, puedes obtener roles de creador o de lector para los recursos de segmentos de copia de seguridad en el espacio de nombres de tu proyecto. Para obtener más información sobre estos roles, consulta Preparar permisos de gestión de identidades y accesos.
Definir variables de entorno: define las siguientes variables de entorno para ejecutar los comandos de esta página:
* The path of the kubeconfig file:
```sh
export KUBECONFIG=KUBECONFIG_PATH
```
Replace `KUBECONFIG_PATH` with the path to the
kubeconfig file for the Management API server.
* Your project namespace:
```sh
export PROJECT_NAMESPACE=PROJECT_NAMESPACE
```
Proteger los registros de auditoría en una copia de seguridad
En esta sección se indican los pasos para crear una copia de seguridad de los registros de auditoría en un cubo remoto.
Definir las credenciales del segmento
Debe definir las credenciales de acceso de los siguientes contenedores:
- Segmento de origen: el segmento de GDC local que contiene los registros de auditoría originales que quieres proteger.
- Contenedor de destino: el contenedor remoto en el que quieres crear la copia de seguridad de los registros de auditoría.
Define las credenciales de ambos:
Segmento de origen
Lista los segmentos de tu espacio de nombres de proyecto desde el servidor de la API Management:
kubectl --kubeconfig=${KUBECONFIG} get bucket -n ${PROJECT_NAMESPACE}
El campo
DESCRIPTION
de la salida indica qué cubos contienen registros de auditoría. Selecciona el segmento que contiene los registros que quieres proteger.Según la información de la salida, define las siguientes variables de entorno:
SRC_BUCKET= BUCKET_NAME SRC_ENDPOINT = ENDPOINT SRC_PATH= FULLY_QUALIFIED_BUCKET_NAME
Haz los cambios siguientes:
BUCKET_NAME
: el valorBUCKET NAME
de la salida.ENDPOINT
: el valorENDPOINT
de la salida.FULLY_QUALIFIED_BUCKET_NAME
: el valorFULLY-QUALIFIED-BUCKET-NAME
de la salida.
Obtén el nombre del secreto del segmento:
kubectl get secret -n PROJECT_NAMESPACE -o json| jq --arg jq_src $SRC_BUCKET '.items[].metadata|select(.annotations."object.gdc.goog/subject"==$jq_src)|.name'
Define la variable de credenciales:
SRC_CREDENTIALS="PROJECT_NAMESPACE/SECRET_NAME"
Sustituye
SECRET_NAME
por el nombre del secreto que has obtenido.Crea el secreto del certificado de la AC:
kubectl create secret generic -n PROJECT_NAMESPACE audit-log-loki-ca \ --from-literal=ca.crt=CERTIFICATE
Sustituye
CERTIFICATE
por el certificado de la AC del sistema de almacenamiento.Define la variable del certificado de CA:
SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-ca
Segmento de destino
Define las siguientes variables de entorno para el segmento de destino remoto:
DST_ACCESS_KEY_ID= ACCESS_KEY DST_SECRET_ACCESS_KEY= ACCESS_SECRET DST_ENDPOINT= REMOTE_ENDPOINT DST_PATH= REMOTE_BUCKET_NAME
Haz los cambios siguientes:
ACCESS_KEY
: la clave de acceso del segmento.ACCESS_SECRET
: el secreto de acceso del segmento.REMOTE_ENDPOINT
: el endpoint del bucket.REMOTE_BUCKET_NAME
: el nombre del segmento.
Crea un secreto de segmento remoto:
kubectl create secret generic -n PROJECT_NAMESPACE s3-bucket-credentials \ --from-literal=access-key-id=$DST_ACCESS_KEY_ID \ --from-literal=secret-access-key=$DST_SECRET_ACCESS_KEY
Sustituye
PROJECT_NAMESPACE
por el espacio de nombres de tu proyecto.Define la variable de credenciales:
DST_CREDENTIALS=PROJECT_NAMESPACE/s3-bucket-credentials
Si es necesario, crea un secreto con el certificado de la CA del bucket y define la variable del certificado de la CA:
kubectl create secret generic -n PROJECT_NAMESPACE s3-bucket-ca \ --from-literal=ca.crt=REMOTE_CERTIFICATE
Sustituye
REMOTE_CERTIFICATE
por el certificado de CA del bucket de destino.Define la variable del certificado de CA:
DST_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-bucket-ca
Registros de auditoría de transferencias
Tu operador de infraestructura debe crear una tarea de transferencia para que puedas exportar los registros de auditoría del segmento de origen al de destino para crear la copia de seguridad. La IO usa la cuenta de servicio audit-log-pa-backup-restore-sa
preconfigurada para configurar el servicio de transferencia de los segmentos predefinidos de registros de auditoría de la plataforma.
Usa el siguiente trabajo para transferir registros de auditoría:
apiVersion: batch/v1
kind: Job
metadata:
name: audit-log-transfer-job
namespace: PROJECT_NAMESPACE
spec:
template:
spec:
serviceAccountName: audit-log-pa-backup-restore-sa
containers:
- name: storage-transfer-pod
image: gcr.io/private-cloud-staging/storage-transfer:latest
imagePullPolicy: Always
command:
- /storage-transfer
args:
- '--src_endpoint=$SRC_ENDPOINT
- '--dst_endpoint=$DST_ENDPOINT
- '--src_path=\$SRC_PATH
- '--dst_path=\$DST_PATH
- '--src_credentials=$SRC_CREDENTIALS
- '--dst_credentials=$DST_CREDENTIALS
- '--dst_ca_certificate_reference=$DST_CA_CERTIFICATE # Optional. Based on destination type.
- '--src_ca_certificate_reference=$SRC_CA_CERTIFICATE
- '--src_type=s3'
- '--dst_type=s3'
- '--bandwidth_limit=100M' # Optional of the form '10K', '100M', '1G' bytes per second
restartPolicy: OnFailure # Will restart on failure.
Monitoriza la transferencia de datos
con el nombre del trabajo (audit-log-transfer-job
) y el espacio de nombres de tu proyecto.
La tarea finaliza cuando se transfieren todos los datos al bucket de destino.
Restaurar registros de auditoría a partir de una copia de seguridad
En esta sección se indican los pasos para restaurar registros de auditoría a partir de una copia de seguridad en un segmento remoto.
Crear un segmento para los registros restaurados
Crea un segmento para almacenar los registros de auditoría restaurados:
Crea el segmento de restauración:
apiVersion: object.gdc.goog/v1 kind: Bucket metadata: annotations: object.gdc.goog/audit-logs: PA labels: logging.private.gdch.goog/loggingpipeline-name: default name: audit-logs-loki-restore-pa namespace: PROJECT_NAMESPACE spec: bucketPolicy: lockingPolicy: defaultObjectRetentionDays: 1 description: Bucket for storing audit-logs-loki logs restore storageClass: Standard
Sustituye
PROJECT_NAMESPACE
por el espacio de nombres de tu proyecto.Ver el segmento:
kubectl get bucket audit-logs-loki-restore-pa -n PROJECT_NAMESPACE
La creación del contenedor puede tardar unos minutos.
Según la información de la salida, define las siguientes variables de entorno:
DST_BUCKET= RESTORE_BUCKET_NAME DST_ENDPOINT = RESTORE_ENDPOINT DST_PATH= RESTORE_FULLY_QUALIFIED_BUCKET_NAME
Haz los cambios siguientes:
RESTORE_BUCKET_NAME
: el valorBUCKET NAME
de la salida.RESTORE_ENDPOINT
: el valorENDPOINT
de la salida.RESTORE_FULLY_QUALIFIED_BUCKET_NAME
: el valorFULLY-QUALIFIED-BUCKET-NAME
de la salida.
Obtén el nombre del secreto del segmento:
kubectl get secret -n PROJECT_NAMESPACE -o json| jq --arg jq_src $DST_BUCKET '.items[].metadata|select(.annotations."object.gdc.goog/subject"==$jq_src)|.name'
Define las variables de credenciales:
DST_SECRET_NAME=RESTORE_SECRET_NAME DST_CREDENTIALS="PROJECT_NAMESPACE/RESTORE_SECRET_NAME"
Sustituye
RESTORE_SECRET_NAME
por el nombre del secreto que has obtenido.Crea el secreto del certificado de la AC:
kubectl create secret generic -n PROJECT_NAMESPACE audit-log-loki-restore-ca \ --from-literal=ca.crt=CERTIFICATE
Sustituye
CERTIFICATE
por el certificado de AC del sistema de almacenamiento.Define la variable del certificado de CA:
DST_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-restore-ca
Definir las credenciales del segmento de origen
Define las credenciales del segmento que contiene la copia de seguridad de los registros de auditoría:
Define las siguientes variables de entorno:
SRC_ACCESS_KEY_ID= ACCESS_KEY SRC_SECRET_ACCESS_KEY= ACCESS_SECRET SRC_ENDPOINT= REMOTE_ENDPOINT SRC_PATH= REMOTE_BUCKET_NAME
Haz los cambios siguientes:
ACCESS_KEY
: la clave de acceso del segmento de copia de seguridad.ACCESS_SECRET
: el secreto de acceso del cubo de copia de seguridad.REMOTE_ENDPOINT
: el endpoint del contenedor de copia de seguridad.REMOTE_BUCKET_NAME
: el nombre del segmento de copia de seguridad.
Crea un secreto de segmento de copia de seguridad:
kubectl create secret generic -n PROJECT_NAMESPACE s3-backup-bucket-credentials \ --from-literal=access-key-id=$SRC_ACCESS_KEY_ID \ --from-literal=secret-access-key=$SRC_SECRET_ACCESS_KEY
Define la variable de credenciales:
SRC_CREDENTIALS=PROJECT_NAMESPACE/s3-backup-bucket-credentials
Crea un secreto con el certificado de CA del segmento:
kubectl create secret generic -n PROJECT_NAMESPACE s3-backup-bucket-ca \ --from-literal=ca.crt=BACKUP_CERTIFICATE
Sustituye
BACKUP_CERTIFICATE
por el certificado de CA del cubo de copia de seguridad.Define la variable del certificado de CA:
SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-backup-bucket-ca
Transferir registros de auditoría restaurados
Tu operador de infraestructura debe crear un trabajo de transferencia para que puedas restaurar los registros de auditoría del bucket de copia de seguridad en el bucket de restauración. La IO usa la cuenta de servicio audit-log-pa-backup-restore-sa
preconfigurada para configurar el servicio de transferencia de los segmentos predefinidos de registros de auditoría de la plataforma.
Usa el siguiente trabajo para transferir registros de auditoría:
apiVersion: batch/v1
kind: Job
metadata:
name: audit-log-restore-job
namespace: PROJECT_NAMESPACE
spec:
template:
spec:
serviceAccountName: audit-log-pa-backup-restore-sa
containers:
- name: storage-transfer-pod
image: gcr.io/private-cloud-staging/storage-transfer:latest
imagePullPolicy: Always
command:
- /storage-transfer
args:
- '--src_endpoint=$SRC_ENDPOINT
- '--dst_endpoint=$DST_ENDPOINT
- '--src_path=\$SRC_PATH
- '--dst_path=\$DST_PATH
- '--src_credentials=$SRC_CREDENTIALS
- '--dst_credentials=$DST_CREDENTIALS
- '--dst_ca_certificate_reference=$DST_CA_CERTIFICATE
- '--src_ca_certificate_reference=$SRC_CA_CERTIFICATE # Optional. Based on destination type
- '--src_type=s3'
- '--dst_type=s3'
- '--bandwidth_limit=100M' # Optional of the form '10K', '100M', '1G' bytes per second
restartPolicy: OnFailure # Will restart on failure.
Monitoriza la transferencia de datos
con el nombre del trabajo (audit-log-restore-job
) y el espacio de nombres de tu proyecto.
La tarea finaliza cuando se transfieren todos los datos al contenedor de restauración.
Registros de acceso restaurado
Despliega una instancia de Loki para acceder a los registros restaurados mediante los archivos de manifiesto de configuración y de despliegue proporcionados:
Crea un objeto
ConfigMap
para la configuración de la instancia.A continuación, se muestra un ejemplo de un objeto
ConfigMap
:apiVersion: v1 kind: ConfigMap metadata: name: audit-logs-loki-restore-pa namespace: PROJECT_NAMESPACE data: loki.yaml: |- auth_enabled: true common: ring: kvstore: store: inmemory chunk_store_config: max_look_back_period: 0s compactor: shared_store: s3 working_directory: /data/loki/boltdb-shipper-compactor compaction_interval: 10m retention_enabled: true retention_delete_delay: 2h retention_delete_worker_count: 150 ingester: chunk_target_size: 1572864 chunk_encoding: snappy max_chunk_age: 2h chunk_idle_period: 90m chunk_retain_period: 30s autoforget_unhealthy: true lifecycler: ring: kvstore: store: inmemory replication_factor: 1 heartbeat_timeout: 10m max_transfer_retries: 0 wal: enabled: true flush_on_shutdown: true dir: /wal checkpoint_duration: 1m replay_memory_ceiling: 20GB limits_config: retention_period: 48h enforce_metric_name: false reject_old_samples: false ingestion_rate_mb: 256 ingestion_burst_size_mb: 256 max_streams_per_user: 20000 max_global_streams_per_user: 20000 per_stream_rate_limit: 256MB per_stream_rate_limit_burst: 256MB shard_streams: enabled: false desired_rate: 3MB schema_config: configs: - from: "2020-10-24" index: period: 24h prefix: index_ object_store: s3 schema: v11 store: boltdb-shipper server: http_listen_port: 3100 grpc_server_max_recv_msg_size: 104857600 grpc_server_max_send_msg_size: 104857600 analytics: reporting_enabled: false storage_config: boltdb_shipper: active_index_directory: /data/loki/boltdb-shipper-active cache_location: /data/loki/boltdb-shipper-cache cache_ttl: 24h shared_store: s3 aws: endpoint: $DST_ENDPOINT bucketnames: $DST_PATH access_key_id: ${S3_ACCESS_KEY_ID} secret_access_key: ${S3_SECRET_ACCESS_KEY} s3forcepathstyle: true
Implementa la instancia como un objeto
StatefulSet
con unService
para acceder a los registros.A continuación, se muestra un ejemplo de objetos
StatefulSet
yService
:apiVersion: apps/v1 kind: StatefulSet metadata: labels: app: audit-logs-loki-restore-pa logging.private.gdch.goog/loggingpipeline-name: default name: audit-logs-loki-restore-pa namespace: PROJECT_NAMESPACE spec: persistentVolumeClaimRetentionPolicy: whenDeleted: Retain whenScaled: Retain podManagementPolicy: OrderedReady replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: audit-logs-loki-restore-pa serviceName: audit-logs-loki-restore-pa template: metadata: labels: app: audit-logs-loki-restore-pa app.kubernetes.io/part-of: audit-logs-loki-restore-pa egress.networking.gke.io/enabled: "true" istio.io/rev: default logging.private.gdch.goog/log-type: audit spec: affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - preference: matchExpressions: - key: node-role.kubernetes.io/control-plane operator: DoesNotExist - key: node-role.kubernetes.io/master operator: DoesNotExist weight: 1 podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - audit-logs-loki-restore-pa topologyKey: kubernetes.io/hostname weight: 100 containers: - args: - -config.file=/etc/loki/loki.yaml - -config.expand-env=true - -target=all env: - name: S3_ACCESS_KEY_ID valueFrom: secretKeyRef: key: access-key-id name: $DST_SECRET_NAME optional: false - name: S3_SECRET_ACCESS_KEY valueFrom: secretKeyRef: key: secret-access-key name: $DST_SECRET_NAME optional: false image: gcr.io/private-cloud-staging/loki:v2.8.4-gke.2 imagePullPolicy: Always livenessProbe: failureThreshold: 3 httpGet: path: /ready port: http-metrics scheme: HTTP initialDelaySeconds: 330 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 name: audit-logs-loki-restore-pa ports: - containerPort: 3100 name: http-metrics protocol: TCP - containerPort: 7946 name: gossip-ring protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /ready port: http-metrics scheme: HTTP initialDelaySeconds: 45 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 resources: limits: ephemeral-storage: 2000Mi memory: 8000Mi requests: cpu: 300m ephemeral-storage: 2000Mi memory: 1000Mi securityContext: readOnlyRootFilesystem: true terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /etc/loki name: config - mountPath: /data name: loki-storage - mountPath: /tmp name: temp - mountPath: /tmp/loki/rules-temp name: tmprulepath - mountPath: /etc/ssl/certs/storage-cert.crt name: storage-cert subPath: ca.crt - mountPath: /wal name: loki-storage dnsPolicy: ClusterFirst priorityClassName: audit-logs-loki-priority restartPolicy: Always schedulerName: default-scheduler securityContext: fsGroup: 10001 runAsGroup: 10001 runAsUser: 10001 serviceAccount: audit-log-pa-backup-restore-sa serviceAccountName: audit-log-pa-backup-restore-sa terminationGracePeriodSeconds: 4800 volumes: - emptyDir: {} name: temp - configMap: defaultMode: 420 name: audit-logs-loki-restore-pa name: config - emptyDir: {} name: tmprulepath - name: storage-cert secret: defaultMode: 420 secretName: web-tls updateStrategy: type: RollingUpdate volumeClaimTemplates: - apiVersion: v1 kind: PersistentVolumeClaim metadata: creationTimestamp: null name: loki-storage spec: accessModes: - ReadWriteOnce resources: requests: storage: 50Gi storageClassName: standard-rwo volumeMode: Filesystem --- apiVersion: v1 kind: Service metadata: name: audit-logs-loki-restore-pa namespace: PROJECT_NAMESPACE spec: internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - name: http-metrics port: 3100 protocol: TCP targetPort: http-metrics selector: app: audit-logs-loki-restore-pa sessionAffinity: None type: ClusterIP
Ver registros restaurados
Configura Grafana para ver los registros de auditoría restaurados de la instancia de Loki:
- Abre el endpoint de Grafana de tu proyecto. Para obtener más información, consulta Consultar y ver registros.
- En el menú de navegación de la interfaz de usuario, haga clic en Administración > Fuentes de datos.
- Haz clic en Añadir nueva fuente de datos.
- En la página Añadir fuente de datos, seleccione Loki.
- En la página Configuración, introduce
Audit Logs - Restore
en el campo Nombre. En la sección HTTP, introduce el siguiente valor en el campo URL:
http://audit-logs-loki-restore-pa.PROJECT_NAMESPACE.svc:3100
En la sección Custom HTTP Headers (Encabezados HTTP personalizados), introduce los siguientes valores en los campos correspondientes:
- Header:
X-Scope-OrgID
- Valor:
infra-obs
- Header:
En la imagen 1, Loki se muestra como una opción en la página Añadir fuente de datos.
Imagen 1. La página Añadir fuente de datos de la interfaz de usuario de la instancia de monitorización.
Imagen 2. La página Configuración de la interfaz de usuario de la instancia de monitorización.
La opción Audit Logs - Restore
ahora está disponible como fuente de datos en el explorador de registros.