Crie registos de auditoria de cópias de segurança e restauro

Esta página descreve como proteger os registos de auditoria do seu ambiente de dispositivo isolado do Google Distributed Cloud (GDC) em contentores de cópias de segurança remotas para preservar e restaurar dados quando necessário. O processo inclui passos para instalar e configurar os componentes necessários para recuperar os registos de auditoria do histórico dessas cópias de segurança.

As cópias de segurança garantem que os registos de auditoria são preservados, mesmo que os dados originais sejam perdidos ou danificados, o que ajuda a cumprir os requisitos e permite recuperar informações em caso de falhas do sistema ou eliminações acidentais. Os registos de auditoria restaurados oferecem acesso a dados do histórico, o que permite a análise de eventos passados, incidentes de segurança e atividade do utilizador.

A implementação de um processo de cópia de segurança e restauro para registos de auditoria é benéfica para manter a integridade dos dados, garantir a conformidade e permitir a análise do histórico.

Antes de começar

Certifique-se de que tem acesso aos seguintes recursos:

  • Um contentor remoto para cópias de segurança com um ponto final, uma chave de acesso secreta e um ID da chave de acesso.
  • Um certificado de autoridade de certificação (AC) para o sistema de armazenamento.
  • Um cluster do Kubernetes funcional.

Para receber as autorizações de que precisa para gerir cópias de segurança, peça ao administrador da IAM do projeto que lhe conceda uma das seguintes funções no espaço de nomes do projeto:

  • Audit Logs Platform Restore Bucket Creator
  • Visualizador de contentor da plataforma de registos de auditoria

Consoante o nível de acesso e as autorizações de que precisa, pode obter funções de criador ou visitante para recursos de contentores de cópias de segurança no espaço de nomes do seu projeto. Para mais informações sobre estas funções, consulte o artigo Prepare as autorizações de IAM.

Defina variáveis de ambiente: defina as seguintes variáveis de ambiente para executar os comandos desta 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
    ```

Proteja os registos de auditoria numa cópia de segurança

Esta secção contém os passos para criar uma cópia de segurança dos registos de auditoria num contentor remoto.

Defina as credenciais do contentor

Tem de definir as credenciais de acesso para os seguintes contentores:

  • Bucket de origem: o bucket do GDC local que contém os registos de auditoria originais que quer proteger.
  • Bucket de destino: o bucket remoto onde quer criar a cópia de segurança para registos de auditoria.

Defina as credenciais para ambos os contentores:

Segmento de origem

  1. Liste os contentores no espaço de nomes do seu projeto a partir do servidor da API Management:

    kubectl --kubeconfig=${KUBECONFIG} get bucket -n ${PROJECT_NAMESPACE}
    

    O campo DESCRIPTION no resultado indica que contentores contêm registos de auditoria. Selecione o contentor que contém os registos que quer proteger.

  2. De acordo com as informações da saída, defina as seguintes variáveis de ambiente:

    SRC_BUCKET= BUCKET_NAME
    SRC_ENDPOINT = ENDPOINT
    SRC_PATH= FULLY_QUALIFIED_BUCKET_NAME
    

    Substitua o seguinte:

    • BUCKET_NAME: o valor BUCKET NAME da saída.
    • ENDPOINT: o valor ENDPOINT da saída.
    • FULLY_QUALIFIED_BUCKET_NAME: o valor de FULLY-QUALIFIED-BUCKET-NAME da saída.
  3. Obtenha o nome do Secret do contentor:

    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. Defina a variável de credenciais:

    SRC_CREDENTIALS="PROJECT_NAMESPACE/SECRET_NAME"
    

    Substitua SECRET_NAME pelo nome do segredo que obteve.

  5. Crie o segredo do certificado da AC:

    kubectl create secret generic -n PROJECT_NAMESPACE audit-log-loki-ca \
    --from-literal=ca.crt=CERTIFICATE
    

    Substitua CERTIFICATE pelo certificado da AC do sistema de armazenamento.

  6. Defina a variável do certificado da AC:

    SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-ca
    

Segmento de destino

  1. Defina as seguintes variáveis de ambiente para o contentor de destino remoto:

    DST_ACCESS_KEY_ID= ACCESS_KEY
    DST_SECRET_ACCESS_KEY= ACCESS_SECRET
    DST_ENDPOINT= REMOTE_ENDPOINT
    DST_PATH= REMOTE_BUCKET_NAME
    

    Substitua o seguinte:

    • ACCESS_KEY: a chave de acesso do contentor.
    • ACCESS_SECRET: o segredo de acesso do contentor.
    • REMOTE_ENDPOINT: o ponto final do contentor.
    • REMOTE_BUCKET_NAME: o nome do segmento.
  2. Crie um segredo do contentor 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
    

    Substitua PROJECT_NAMESPACE pelo espaço de nomes do seu projeto.

  3. Defina a variável de credenciais:

    DST_CREDENTIALS=PROJECT_NAMESPACE/s3-bucket-credentials
    
  4. Se necessário, crie um segredo com o certificado da AC do contentor e defina a variável do certificado da AC:

    kubectl create secret generic -n PROJECT_NAMESPACE s3-bucket-ca \
    --from-literal=ca.crt=REMOTE_CERTIFICATE
    

    Substitua REMOTE_CERTIFICATE pelo certificado de CA do bucket de destino.

    Defina a variável do certificado da AC:

    DST_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-bucket-ca
    

Transfira registos de auditoria

O operador de infraestrutura (IO) tem de criar uma tarefa de transferência para exportar registos de auditoria do contentor de origem para o contentor de destino da cópia de segurança. O IO usa a conta de serviço audit-log-pa-backup-restore-sa pré-configurada para configurar o serviço de transferência para contentores predefinidos de registos de auditoria da plataforma.

Use a seguinte tarefa para transferir registos de auditoria:

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.

Monitorize a transferência de dados usando o nome da tarefa (audit-log-transfer-job) e o espaço de nomes do projeto.

A tarefa termina quando todos os dados são transferidos para o contentor de destino.

Restaure registos de auditoria a partir de uma cópia de segurança

Esta secção contém os passos para restaurar registos de auditoria a partir de uma cópia de segurança num contentor remoto.

Crie um contentor para registos restaurados

Crie um contentor para armazenar os registos de auditoria restaurados:

  1. Crie o contentor de restauro:

    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
    

    Substitua PROJECT_NAMESPACE pelo espaço de nomes do seu projeto.

  2. Veja o bloco:

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

    A criação do contentor pode demorar alguns minutos.

  3. De acordo com as informações da saída, defina as seguintes variáveis de ambiente:

    DST_BUCKET= RESTORE_BUCKET_NAME
    DST_ENDPOINT = RESTORE_ENDPOINT
    DST_PATH= RESTORE_FULLY_QUALIFIED_BUCKET_NAME
    

    Substitua o seguinte:

    • RESTORE_BUCKET_NAME: o valor BUCKET NAME da saída.
    • RESTORE_ENDPOINT: o valor ENDPOINT da saída.
    • RESTORE_FULLY_QUALIFIED_BUCKET_NAME: o valor de FULLY-QUALIFIED-BUCKET-NAME da saída.
  4. Obtenha o nome do Secret do contentor:

    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. Defina as variáveis de credenciais:

    DST_SECRET_NAME=RESTORE_SECRET_NAME
    DST_CREDENTIALS="PROJECT_NAMESPACE/RESTORE_SECRET_NAME"
    

    Substitua RESTORE_SECRET_NAME pelo nome do segredo que obteve.

  6. Crie o segredo do certificado da AC:

    kubectl create secret generic -n PROJECT_NAMESPACE audit-log-loki-restore-ca \
    --from-literal=ca.crt=CERTIFICATE
    

    Substitua CERTIFICATE pelo certificado da AC do sistema de armazenamento.

  7. Defina a variável do certificado da AC:

    DST_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-restore-ca
    

Defina as credenciais do contentor de origem

Defina as credenciais do contentor que contém a cópia de segurança dos registos de auditoria:

  1. Defina as seguintes variáveis de ambiente:

    SRC_ACCESS_KEY_ID= ACCESS_KEY
    SRC_SECRET_ACCESS_KEY= ACCESS_SECRET
    SRC_ENDPOINT= REMOTE_ENDPOINT
    SRC_PATH= REMOTE_BUCKET_NAME
    

    Substitua o seguinte:

    • ACCESS_KEY: a chave de acesso do contentor de cópia de segurança.
    • ACCESS_SECRET: o segredo de acesso do contentor de cópia de segurança.
    • REMOTE_ENDPOINT: o ponto final do contentor de cópia de segurança.
    • REMOTE_BUCKET_NAME: o nome do contentor de cópia de segurança.
  2. Crie um segredo do contentor de cópias de segurança:

    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. Defina a variável de credenciais:

    SRC_CREDENTIALS=PROJECT_NAMESPACE/s3-backup-bucket-credentials
    
  4. Crie um segredo com o certificado da AC do contentor:

    kubectl create secret generic -n PROJECT_NAMESPACE s3-backup-bucket-ca \
    --from-literal=ca.crt=BACKUP_CERTIFICATE
    

    Substitua BACKUP_CERTIFICATE pelo certificado da AC do contentor de cópia de segurança.

  5. Defina a variável do certificado da AC:

    SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-backup-bucket-ca
    

Transfira registos de auditoria restaurados

O operador de infraestrutura (IO) tem de criar uma tarefa de transferência para restaurar os registos de auditoria do contentor de cópia de segurança para o contentor de restauro. O IO usa a conta de serviço audit-log-pa-backup-restore-sa pré-configurada para configurar o serviço de transferência para contentores predefinidos de registos de auditoria da plataforma.

Use a seguinte tarefa para transferir registos de auditoria:

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.

Monitorize a transferência de dados usando o nome da tarefa (audit-log-restore-job) e o espaço de nomes do projeto.

A tarefa termina quando todos os dados são transferidos para o contentor de restauro.

Registos de acesso restaurados

Implemente uma instância do Loki para aceder aos registos restaurados através dos manifestos de configuração e implementação fornecidos:

  1. Crie um objeto ConfigMap para a configuração da instância.

    Segue-se um exemplo de um 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. Implemente a instância como um objeto StatefulSet com um Service para aceder aos registos.

    Segue-se um exemplo de objetos StatefulSet e 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
    

Veja os registos restaurados

Configure o Grafana para ver os registos de auditoria restaurados da instância do Loki:

  1. Abra o ponto final do Grafana do seu projeto. Para mais informações, consulte o artigo Consulte e veja registos.
  2. No menu de navegação da interface do utilizador, clique em Administração > Origens de dados.
  3. Clique em Adicionar nova origem de dados.
  4. Na página Adicionar origem de dados, selecione Loki.
  5. Na página Definições, introduza Audit Logs - Restore no campo Nome.
  6. Na secção HTTP, introduza o seguinte valor no campo URL:

    http://audit-logs-loki-restore-pa.PROJECT_NAMESPACE.svc:3100
    
  7. Na secção Cabeçalhos HTTP personalizados, introduza os seguintes valores nos campos correspondentes:

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

Na figura 1, o Loki é apresentado como uma opção na página Adicionar origem de dados.

A opção Loki é apresentada como uma origem de dados na página Adicionar origem de dados da IU.

Figura 1. A página Adicionar origem de dados na IU da instância de monitorização.

Os campos relevantes para configurar o Loki como origem de dados são apresentados na página Definições

Figura 2. A página Definições na IU da instância de monitorização.

A opção Audit Logs - Restore está agora disponível como uma origem de dados no explorador de registos.