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 buckets de copias de seguridad remotos para conservar y restablecer los datos cuando sea necesario. El proceso incluye 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 garantizan que los registros de auditoría se conserven incluso si los datos originales se pierden o dañan, lo que ayuda a cumplir con los requisitos y te permite recuperar información en caso de fallas del sistema o eliminaciones accidentales. Los registros de auditoría restablecidos proporcionan acceso a datos históricos, lo que permite analizar eventos pasados, incidentes de seguridad y actividad del usuario.
Implementar un proceso de copia de seguridad y restablecimiento para los registros de auditoría es beneficioso para mantener la integridad de los datos, garantizar el cumplimiento y permitir el análisis histórico.
Antes de comenzar
Asegúrate de tener acceso a los siguientes recursos:
- Es un bucket remoto para copias de seguridad con un extremo, una clave de acceso secreta y un ID de clave de acceso.
- Certificado de autoridad certificadora (CA) para el sistema de almacenamiento.
- Un clúster de Kubernetes en funcionamiento
Para obtener los permisos que necesitas para administrar copias de seguridad, pídele al administrador de IAM del proyecto que te otorgue uno de los siguientes roles en el espacio de nombres del proyecto:
- Creador de buckets de restauración de la plataforma de registros de auditoría
- Visualizador de buckets de la plataforma de registros de auditoría
Según el nivel de acceso y los permisos que necesites, es posible que obtengas roles de creador o visualizador para los recursos del bucket de copia de seguridad en el espacio de nombres de tu proyecto. Para obtener más información sobre estos roles, consulta Prepara los permisos de IAM.
Configura las variables de entorno: Establece 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
```
Registros de auditoría seguros en una copia de seguridad
En esta sección, se incluyen los pasos para crear una copia de seguridad de los registros de auditoría en un bucket remoto.
Configura las credenciales del bucket
Debes establecer las credenciales de acceso para los siguientes buckets:
- Bucket de origen: Es el bucket de GDC local que contiene los registros de auditoría originales que deseas proteger.
- Bucket de destino: Es el bucket remoto en el que deseas crear la copia de seguridad de los registros de auditoría.
Establece las credenciales para ambos buckets:
Bucket de origen
Enumera los buckets en el espacio de nombres de tu proyecto desde el servidor de la API de Management:
kubectl --kubeconfig=${KUBECONFIG} get bucket -n ${PROJECT_NAMESPACE}
El campo
DESCRIPTION
en el resultado indica qué buckets contienen registros de auditoría. Selecciona el bucket que contiene los registros que deseas proteger.Según la información del resultado, configura las siguientes variables de entorno:
SRC_BUCKET= BUCKET_NAME SRC_ENDPOINT = ENDPOINT SRC_PATH= FULLY_QUALIFIED_BUCKET_NAME
Reemplaza lo siguiente:
BUCKET_NAME
: Es el valor deBUCKET NAME
del resultado.ENDPOINT
: Es el valor deENDPOINT
del resultado.FULLY_QUALIFIED_BUCKET_NAME
: Es el valor deFULLY-QUALIFIED-BUCKET-NAME
del resultado.
Obtén el nombre del secreto del bucket:
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'
Configura la variable de credenciales:
SRC_CREDENTIALS="PROJECT_NAMESPACE/SECRET_NAME"
Reemplaza
SECRET_NAME
por el nombre del secreto que obtuviste.Crea el secreto del certificado de la CA:
kubectl create secret generic -n PROJECT_NAMESPACE audit-log-loki-ca \ --from-literal=ca.crt=CERTIFICATE
Reemplaza
CERTIFICATE
por el certificado de CA del sistema de almacenamiento.Establece la variable del certificado de CA:
SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-ca
Bucket de destino
Configura las siguientes variables de entorno para el bucket de destino remoto:
DST_ACCESS_KEY_ID= ACCESS_KEY DST_SECRET_ACCESS_KEY= ACCESS_SECRET DST_ENDPOINT= REMOTE_ENDPOINT DST_PATH= REMOTE_BUCKET_NAME
Reemplaza lo siguiente:
ACCESS_KEY
: Es la clave de acceso del bucket.ACCESS_SECRET
: Es el secreto de acceso del bucket.REMOTE_ENDPOINT
: Es el extremo del bucket.REMOTE_BUCKET_NAME
: el nombre del bucket.
Crea un secreto de bucket 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
Reemplaza
PROJECT_NAMESPACE
por el espacio de nombres de tu proyecto.Configura 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 configura la variable del certificado de la CA:
kubectl create secret generic -n PROJECT_NAMESPACE s3-bucket-ca \ --from-literal=ca.crt=REMOTE_CERTIFICATE
Reemplaza
REMOTE_CERTIFICATE
por el certificado de CA del bucket de destino.Establece la variable del certificado de CA:
DST_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-bucket-ca
Registros de auditoría de transferencia
Tu operador de infraestructura (IO) debe crear un trabajo de transferencia para que puedas exportar los registros de auditoría del bucket de origen al bucket de destino para la copia de seguridad. El IO usa la cuenta de servicio audit-log-pa-backup-restore-sa
preconfigurada para configurar el servicio de transferencia para los buckets 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.
Supervisa la transferencia de datos con el nombre del trabajo (audit-log-transfer-job
) y el espacio de nombres de tu proyecto.
El trabajo finaliza cuando todos los datos se transfieren al bucket de destino.
Restablece los registros de auditoría a partir de una copia de seguridad
En esta sección, se incluyen los pasos para restablecer los registros de auditoría desde una copia de seguridad en un bucket remoto.
Crea un bucket para los registros restablecidos
Crea un bucket para almacenar los registros de auditoría restablecidos:
Crea el bucket de restablecimiento:
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
Reemplaza
PROJECT_NAMESPACE
por el espacio de nombres de tu proyecto.Visualiza el bucket:
kubectl get bucket audit-logs-loki-restore-pa -n PROJECT_NAMESPACE
La creación del bucket puede tardar unos minutos.
Según la información del resultado, configura las siguientes variables de entorno:
DST_BUCKET= RESTORE_BUCKET_NAME DST_ENDPOINT = RESTORE_ENDPOINT DST_PATH= RESTORE_FULLY_QUALIFIED_BUCKET_NAME
Reemplaza lo siguiente:
RESTORE_BUCKET_NAME
: Es el valor deBUCKET NAME
del resultado.RESTORE_ENDPOINT
: Es el valor deENDPOINT
del resultado.RESTORE_FULLY_QUALIFIED_BUCKET_NAME
: Es el valor deFULLY-QUALIFIED-BUCKET-NAME
del resultado.
Obtén el nombre del secreto del bucket:
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'
Establece las variables de credenciales:
DST_SECRET_NAME=RESTORE_SECRET_NAME DST_CREDENTIALS="PROJECT_NAMESPACE/RESTORE_SECRET_NAME"
Reemplaza
RESTORE_SECRET_NAME
por el nombre del secreto que obtuviste.Crea el secreto del certificado de la CA:
kubectl create secret generic -n PROJECT_NAMESPACE audit-log-loki-restore-ca \ --from-literal=ca.crt=CERTIFICATE
Reemplaza
CERTIFICATE
por el certificado de CA del sistema de almacenamiento.Establece la variable del certificado de CA:
DST_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-restore-ca
Cómo configurar las credenciales del bucket de origen
Establece las credenciales del bucket que contiene la copia de seguridad de los registros de auditoría:
Configura 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
Reemplaza lo siguiente:
ACCESS_KEY
: Es la clave de acceso del bucket de copia de seguridad.ACCESS_SECRET
: Es el secreto de acceso del bucket de copia de seguridad.REMOTE_ENDPOINT
: Es el extremo del bucket de copia de seguridad.REMOTE_BUCKET_NAME
: Es el nombre del bucket de copia de seguridad.
Crea un secreto del bucket 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
Configura la variable de credenciales:
SRC_CREDENTIALS=PROJECT_NAMESPACE/s3-backup-bucket-credentials
Crea un secreto con el certificado de la CA del bucket:
kubectl create secret generic -n PROJECT_NAMESPACE s3-backup-bucket-ca \ --from-literal=ca.crt=BACKUP_CERTIFICATE
Reemplaza
BACKUP_CERTIFICATE
por el certificado de CA del bucket de copia de seguridad.Establece la variable del certificado de CA:
SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-backup-bucket-ca
Transfiere los registros de auditoría restaurados
Tu operador de infraestructura (IO) debe crear un trabajo de transferencia para que puedas restablecer los registros de auditoría del bucket de copia de seguridad al bucket de restablecimiento. El IO usa la cuenta de servicio audit-log-pa-backup-restore-sa
preconfigurada para configurar el servicio de transferencia para los buckets 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.
Supervisa la transferencia de datos con el nombre del trabajo (audit-log-restore-job
) y el espacio de nombres de tu proyecto.
El trabajo finaliza cuando se transfieren todos los datos al bucket de restauración.
Registros de acceso restaurado
Implementa una instancia de Loki para acceder a los registros restablecidos con los manifiestos de configuración y de implementación 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
Cómo ver los registros restablecidos
Configura Grafana para ver los registros de auditoría restablecidos desde la instancia de Loki:
- Abre el extremo de Grafana de tu proyecto. Para obtener más información, consulta Cómo consultar y ver registros.
- En el menú de navegación de la interfaz de usuario, haz clic en Administración > Fuentes de datos.
- Haz clic en Agregar una fuente de datos nueva.
- En la página Agregar fuente de datos, selecciona Loki.
- En la página Configuración, ingresa
Audit Logs - Restore
en el campo Nombre. En la sección HTTP, ingresa el siguiente valor en el campo URL:
http://audit-logs-loki-restore-pa.PROJECT_NAMESPACE.svc:3100
En la sección Encabezados HTTP personalizados, ingresa los siguientes valores en los campos correspondientes:
- Header:
X-Scope-OrgID
- Valor:
infra-obs
- Header:
En la figura 1, Loki se muestra como una opción en la página Agregar fuente de datos.
Figura 1. La página Agregar fuente de datos en la IU de la instancia de supervisión.
Figura 2. La página Configuración en la IU de la instancia de supervisión
La opción Audit Logs - Restore
ahora está disponible como fuente de datos en el Explorador de registros.