Esta página descreve como proteger os registros de auditoria do seu ambiente de dispositivo isolado do Google Distributed Cloud (GDC) em buckets de backup remotos para preservar e restaurar dados quando necessário. O processo inclui etapas para instalar e configurar os componentes necessários para recuperar registros de auditoria históricos desses backups.
Os backups garantem que os registros de auditoria sejam preservados mesmo que os dados originais sejam perdidos ou corrompidos, ajudando a atender aos requisitos e permitindo que você recupere informações em caso de falhas no sistema ou exclusões acidentais. Os registros de auditoria restaurados dão acesso a dados históricos, permitindo a análise de eventos passados, incidentes de segurança e atividade do usuário.
Implementar um processo de backup e restauração para registros de auditoria é benéfico para manter a integridade dos dados, garantir a conformidade e permitir a análise histórica.
Antes de começar
Confira se você tem acesso aos seguintes recursos:
- Um bucket remoto para backups com um endpoint, uma chave de acesso secreta e um ID da chave de acesso.
- Um certificado de autoridade de certificação (CA) para o sistema de armazenamento.
- Um cluster do Kubernetes em funcionamento.
Para receber as permissões necessárias para gerenciar backups, peça ao administrador do IAM do projeto para conceder a você um dos seguintes papéis no namespace do projeto:
- Criador de bucket de restauração da plataforma de registros de auditoria
- Leitor do bucket da plataforma de registros de auditoria
Dependendo do nível de acesso e das permissões necessárias, você pode receber funções de criador ou leitor para recursos de bucket de backup no namespace do projeto. Para mais informações sobre esses papéis, consulte Preparar permissões do 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
```
Proteger registros de auditoria em um backup
Esta seção contém as etapas para criar um backup dos registros de auditoria em um bucket remoto.
Definir credenciais do bucket
É necessário definir as credenciais de acesso para os seguintes buckets:
- Bucket de origem: o bucket local do GDC que contém os registros de auditoria originais que você quer proteger.
- Bucket de destino: o bucket remoto em que você quer criar o backup dos registros de auditoria.
Defina as credenciais para os dois buckets:
Bucket de origem
Liste os buckets no namespace do projeto no servidor da API Management:
kubectl --kubeconfig=${KUBECONFIG} get bucket -n ${PROJECT_NAMESPACE}
O campo
DESCRIPTION
na saída indica quais buckets contêm registros de auditoria. Selecione o bucket que contém os registros que você quer proteger.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:
BUCKET_NAME
: o valorBUCKET NAME
da saída.ENDPOINT
: o valorENDPOINT
da saída.FULLY_QUALIFIED_BUCKET_NAME
: o valorFULLY-QUALIFIED-BUCKET-NAME
da saída.
Consiga o nome do secret do 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'
Defina a variável de credenciais:
SRC_CREDENTIALS="PROJECT_NAMESPACE/SECRET_NAME"
Substitua
SECRET_NAME
pelo nome do secret que você recebeu.Crie o secret do certificado da CA:
kubectl create secret generic -n PROJECT_NAMESPACE audit-log-loki-ca \ --from-literal=ca.crt=CERTIFICATE
Substitua
CERTIFICATE
pelo certificado da CA do sistema de armazenamento.Defina a variável de certificado da CA:
SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-ca
Bucket de destino
Defina as seguintes variáveis de ambiente para o 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
Substitua:
ACCESS_KEY
: a chave de acesso do bucket.ACCESS_SECRET
: o secret de acesso do bucket.REMOTE_ENDPOINT
: o endpoint do bucket.REMOTE_BUCKET_NAME
: o nome do bucket
Crie um secret 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
Substitua
PROJECT_NAMESPACE
pelo namespace do projeto.Defina a variável de credenciais:
DST_CREDENTIALS=PROJECT_NAMESPACE/s3-bucket-credentials
Se necessário, crie um secret com o certificado de CA do bucket e defina a variável do certificado de CA:
kubectl create secret generic -n PROJECT_NAMESPACE s3-bucket-ca \ --from-literal=ca.crt=REMOTE_CERTIFICATE
Substitua
REMOTE_CERTIFICATE
pelo certificado da CA do bucket de destino.Defina a variável de certificado da CA:
DST_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-bucket-ca
Transferir registros de auditoria
O operador de infraestrutura (IO) precisa criar um job de transferência para que você exporte
registros de auditoria do bucket de origem para o bucket de destino do backup. 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 buckets predefinidos de registros de auditoria da plataforma.
Use o seguinte job para transferir registros 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.
Monitore a transferência de dados
usando o nome do job (audit-log-transfer-job
) e o namespace do projeto.
O job termina quando todos os dados são transferidos para o bucket de destino.
Restaurar registros de auditoria de um backup
Esta seção contém as etapas para restaurar registros de auditoria de um backup em um bucket remoto.
Criar um bucket para registros restaurados
Crie um bucket para armazenar os registros de auditoria restaurados:
Crie o bucket de restauração:
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 namespace do projeto.Acessar o bucket:
kubectl get bucket audit-logs-loki-restore-pa -n PROJECT_NAMESPACE
A criação do bucket pode levar alguns minutos.
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:
RESTORE_BUCKET_NAME
: o valorBUCKET NAME
da saída.RESTORE_ENDPOINT
: o valorENDPOINT
da saída.RESTORE_FULLY_QUALIFIED_BUCKET_NAME
: o valorFULLY-QUALIFIED-BUCKET-NAME
da saída.
Consiga o nome do secret do 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'
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 secret que você recebeu.Crie o secret do certificado da CA:
kubectl create secret generic -n PROJECT_NAMESPACE audit-log-loki-restore-ca \ --from-literal=ca.crt=CERTIFICATE
Substitua
CERTIFICATE
pelo certificado da CA do sistema de armazenamento.Defina a variável de certificado da CA:
DST_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-restore-ca
Definir credenciais do bucket de origem
Defina as credenciais do bucket que contém o backup dos registros de auditoria:
Configure as variáveis de ambiente a seguir:
SRC_ACCESS_KEY_ID= ACCESS_KEY SRC_SECRET_ACCESS_KEY= ACCESS_SECRET SRC_ENDPOINT= REMOTE_ENDPOINT SRC_PATH= REMOTE_BUCKET_NAME
Substitua:
ACCESS_KEY
: a chave de acesso do bucket de backup.ACCESS_SECRET
: o secret de acesso do bucket de backup.REMOTE_ENDPOINT
: o endpoint do bucket de backup.REMOTE_BUCKET_NAME
: o nome do bucket de backup.
Crie um secret de bucket de backup:
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
Defina a variável de credenciais:
SRC_CREDENTIALS=PROJECT_NAMESPACE/s3-backup-bucket-credentials
Crie um secret com o certificado da CA do bucket:
kubectl create secret generic -n PROJECT_NAMESPACE s3-backup-bucket-ca \ --from-literal=ca.crt=BACKUP_CERTIFICATE
Substitua
BACKUP_CERTIFICATE
pelo certificado da CA do bucket de backup.Defina a variável de certificado da CA:
SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-backup-bucket-ca
Transferir registros de auditoria restaurados
O operador de infraestrutura (IO) precisa criar um job de transferência para que você restaure
os registros de auditoria do bucket de backup para o de restauração. 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 buckets predefinidos de registros de auditoria da plataforma.
Use o seguinte job para transferir registros 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.
Monitore a transferência de dados
usando o nome do job (audit-log-restore-job
) e o namespace do projeto.
O job termina quando todos os dados são transferidos para o bucket de restauração.
Acessar registros restaurados
Implante uma instância do Loki para acessar os registros restaurados usando a configuração e os manifestos de implantação fornecidos:
Crie um objeto
ConfigMap
para a configuração da instância.Confira um exemplo de 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
Implante a instância como um objeto
StatefulSet
com umService
para acessar registros.Confira um exemplo de objetos
StatefulSet
eService
: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
Configure o Grafana para ver os registros de auditoria restaurados da instância do Loki:
- Abra o endpoint do Grafana do seu projeto. Para mais informações, consulte Consultar e visualizar registros.
- No menu de navegação da interface do usuário, clique em Administração > Origens de dados.
- Clique em Adicionar nova fonte de dados.
- Na página Adicionar fonte de dados, selecione Loki.
- Na página Configurações, insira
Audit Logs - Restore
no campo Nome. Na seção HTTP, insira o seguinte valor no campo URL:
http://audit-logs-loki-restore-pa.PROJECT_NAMESPACE.svc:3100
Na seção Cabeçalhos HTTP personalizados, insira os seguintes valores nos campos correspondentes:
- Header:
X-Scope-OrgID
- Valor:
infra-obs
- Header:
Na Figura 1, o Loki aparece como uma opção na página Adicionar fonte de dados.
Figura 1. A página Adicionar fonte de dados na UI da instância de monitoramento.
Figura 2. A página Configurações na UI da instância de monitoramento.
A opção Audit Logs - Restore
agora está disponível como uma fonte de dados no Explorador de registros.