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

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

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

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

    SRC_CREDENTIALS="PROJECT_NAMESPACE/SECRET_NAME"
    

    Reemplaza SECRET_NAME por el nombre del secreto que obtuviste.

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

  6. Establece la variable del certificado de CA:

    SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-ca
    

Bucket de destino

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

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

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

  2. Visualiza el bucket:

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

    La creación del bucket puede tardar unos minutos.

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

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

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

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

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

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

  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
    

Cómo ver los registros restablecidos

Configura Grafana para ver los registros de auditoría restablecidos desde la instancia de Loki:

  1. Abre el extremo de Grafana de tu proyecto. Para obtener más información, consulta Cómo consultar y ver registros.
  2. En el menú de navegación de la interfaz de usuario, haz clic en Administración > Fuentes de datos.
  3. Haz clic en Agregar una fuente de datos nueva.
  4. En la página Agregar fuente de datos, selecciona Loki.
  5. En la página Configuración, ingresa Audit Logs - Restore en el campo Nombre.
  6. En la sección HTTP, ingresa el siguiente valor en el campo URL:

    http://audit-logs-loki-restore-pa.PROJECT_NAMESPACE.svc:3100
    
  7. En la sección Encabezados HTTP personalizados, ingresa los siguientes valores en los campos correspondientes:

    • Header: X-Scope-OrgID
    • Valor: infra-obs

En la figura 1, Loki se muestra como una opción en la página Agregar fuente de datos.

La opción Loki se muestra como una fuente de datos en la página Agregar fuente de datos de la IU.

Figura 1. La página Agregar fuente de datos en la IU de la instancia de supervisión.

En la página Configuración, se muestran los campos pertinentes para configurar Loki como fuente de datos.

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.