Crear registros de auditoría de copias de seguridad y restauraciones

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

  1. 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.

  2. 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 valor BUCKET NAME de la salida.
    • ENDPOINT: el valor ENDPOINT de la salida.
    • FULLY_QUALIFIED_BUCKET_NAME: el valor FULLY-QUALIFIED-BUCKET-NAME de la salida.
  3. 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'
    
  4. Define la variable de credenciales:

    SRC_CREDENTIALS="PROJECT_NAMESPACE/SECRET_NAME"
    

    Sustituye SECRET_NAME por el nombre del secreto que has obtenido.

  5. 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.

  6. Define la variable del certificado de CA:

    SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-ca
    

Segmento de destino

  1. 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.
  2. 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.

  3. Define la variable de credenciales:

    DST_CREDENTIALS=PROJECT_NAMESPACE/s3-bucket-credentials
    
  4. 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:

  1. 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.

  2. Ver el segmento:

    kubectl get bucket audit-logs-loki-restore-pa -n PROJECT_NAMESPACE
    

    La creación del contenedor puede tardar unos minutos.

  3. 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 valor BUCKET NAME de la salida.
    • RESTORE_ENDPOINT: el valor ENDPOINT de la salida.
    • RESTORE_FULLY_QUALIFIED_BUCKET_NAME: el valor FULLY-QUALIFIED-BUCKET-NAME de la salida.
  4. 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'
    
  5. 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.

  6. 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.

  7. 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:

  1. 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.
  2. 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
    
  3. Define la variable de credenciales:

    SRC_CREDENTIALS=PROJECT_NAMESPACE/s3-backup-bucket-credentials
    
  4. 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.

  5. 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:

  1. 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
    
  2. Implementa la instancia como un objeto StatefulSet con un Service para acceder a los registros.

    A continuación, se muestra un ejemplo de objetos StatefulSet y Service:

    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:

  1. Abre el endpoint de Grafana de tu proyecto. Para obtener más información, consulta Consultar y ver registros.
  2. En el menú de navegación de la interfaz de usuario, haga clic en Administración > Fuentes de datos.
  3. Haz clic en Añadir nueva fuente de datos.
  4. En la página Añadir fuente de datos, seleccione Loki.
  5. En la página Configuración, introduce Audit Logs - Restore en el campo Nombre.
  6. En la sección HTTP, introduce el siguiente valor en el campo URL:

    http://audit-logs-loki-restore-pa.PROJECT_NAMESPACE.svc:3100
    
  7. 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

En la imagen 1, Loki se muestra como una opción en la página Añadir fuente de datos.

La opción Loki se muestra como fuente de datos en la página Añadir fuente de datos de la interfaz de usuario.

Imagen 1. La página Añadir fuente de datos de la interfaz de usuario de la instancia de monitorización.

Los campos relevantes para configurar Loki como fuente de datos se muestran en la página Configuració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.