Questa pagina descrive come proteggere gli audit log dall'ambiente appliance air-gapped di Google Distributed Cloud (GDC) nei bucket di backup remoti per conservare e ripristinare i dati quando necessario. La procedura include i passaggi per installare e configurare i componenti necessari per recuperare gli audit log storici da questi backup.
I backup assicurano che i log di controllo vengano conservati anche se i dati originali vengono persi o danneggiati, contribuendo a soddisfare i requisiti e consentendoti di recuperare le informazioni in caso di guasti del sistema o eliminazioni accidentali. I log di controllo ripristinati forniscono l'accesso ai dati storici, consentendo l'analisi di eventi passati, incidenti di sicurezza attività utenteti.
L'implementazione di un processo di backup e ripristino per i log di controllo è utile per mantenere l'integrità dei dati, garantire la conformità e consentire l'analisi storica.
Prima di iniziare
Assicurati di avere accesso alle seguenti risorse:
- Un bucket remoto per i backup con un endpoint, una chiave di accesso segreta e un ID chiave di accesso.
- Un certificato dell'autorità di certificazione (CA) per il sistema di archiviazione.
- Un cluster Kubernetes funzionante.
Per ottenere le autorizzazioni necessarie per gestire i backup, chiedi all'amministratore IAM del progetto di concederti uno dei seguenti ruoli nello spazio dei nomi del progetto:
- Audit Logs Platform Restore Bucket Creator
- Audit Logs Platform Bucket Viewer
A seconda del livello di accesso e delle autorizzazioni di cui hai bisogno, potresti ottenere ruoli di creator o visualizzatore per le risorse del bucket di backup nello spazio dei nomi del progetto. Per saperne di più su questi ruoli, consulta Preparare le autorizzazioni IAM.
Imposta le variabili di ambiente: imposta le seguenti variabili di ambiente per eseguire i comandi di questa pagina:
* 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
```
Proteggere i log di controllo in un backup
Questa sezione contiene i passaggi per creare un backup degli audit log in un bucket remoto.
Imposta le credenziali del bucket
Devi impostare le credenziali di accesso per i seguenti bucket:
- Bucket di origine: il bucket GDC locale che contiene gli audit log originali che vuoi proteggere.
- Bucket di destinazione: il bucket remoto in cui vuoi creare il backup per i log di controllo.
Imposta le credenziali per entrambi i bucket:
Bucket di origine
Elenca i bucket nello spazio dei nomi del progetto dal server dell'API Management:
kubectl --kubeconfig=${KUBECONFIG} get bucket -n ${PROJECT_NAMESPACE}
Il campo
DESCRIPTION
nell'output indica i bucket che contengono i log di controllo. Seleziona il bucket che contiene i log che vuoi proteggere.In base alle informazioni dell'output, imposta le seguenti variabili di ambiente:
SRC_BUCKET= BUCKET_NAME SRC_ENDPOINT = ENDPOINT SRC_PATH= FULLY_QUALIFIED_BUCKET_NAME
Sostituisci quanto segue:
BUCKET_NAME
: il valoreBUCKET NAME
dell'output.ENDPOINT
: il valoreENDPOINT
dell'output.FULLY_QUALIFIED_BUCKET_NAME
: il valoreFULLY-QUALIFIED-BUCKET-NAME
dell'output.
Recupera il nome del secret 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'
Imposta la variabile delle credenziali:
SRC_CREDENTIALS="PROJECT_NAMESPACE/SECRET_NAME"
Sostituisci
SECRET_NAME
con il nome del secret che hai ottenuto.Crea il secret del certificato CA:
kubectl create secret generic -n PROJECT_NAMESPACE audit-log-loki-ca \ --from-literal=ca.crt=CERTIFICATE
Sostituisci
CERTIFICATE
con il certificato CA del sistema di archiviazione.Imposta la variabile del certificato CA:
SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-ca
Bucket di destinazione
Imposta le seguenti variabili di ambiente per il bucket di destinazione remoto:
DST_ACCESS_KEY_ID= ACCESS_KEY DST_SECRET_ACCESS_KEY= ACCESS_SECRET DST_ENDPOINT= REMOTE_ENDPOINT DST_PATH= REMOTE_BUCKET_NAME
Sostituisci quanto segue:
ACCESS_KEY
: la chiave di accesso del bucket.ACCESS_SECRET
: il secret di accesso del bucket.REMOTE_ENDPOINT
: l'endpoint del bucket.REMOTE_BUCKET_NAME
: il nome del bucket.
Crea un secret del 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
Sostituisci
PROJECT_NAMESPACE
con lo spazio dei nomi del tuo progetto.Imposta la variabile delle credenziali:
DST_CREDENTIALS=PROJECT_NAMESPACE/s3-bucket-credentials
Se necessario, crea un secret con il certificato CA del bucket e imposta la variabile del certificato CA:
kubectl create secret generic -n PROJECT_NAMESPACE s3-bucket-ca \ --from-literal=ca.crt=REMOTE_CERTIFICATE
Sostituisci
REMOTE_CERTIFICATE
con il certificato CA del bucket di destinazione.Imposta la variabile del certificato CA:
DST_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-bucket-ca
Trasferire i log di controllo
L'operatore dell'infrastruttura (IO) deve creare un job di trasferimento per esportare
i log di controllo dal bucket di origine al bucket di destinazione per il backup. L'IO utilizza l'account di servizio audit-log-pa-backup-restore-sa
preconfigurato per configurare il servizio di trasferimento per i bucket predefiniti di audit log della piattaforma.
Utilizza il seguente job per trasferire gli audit log:
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.
Monitora il trasferimento dei dati
utilizzando il nome del job (audit-log-transfer-job
) e lo spazio dei nomi del progetto.
Il job termina quando tutti i dati vengono trasferiti nel bucket di destinazione.
Ripristinare i log di controllo da un backup
Questa sezione contiene i passaggi per ripristinare gli audit log da un backup in un bucket remoto.
Crea un bucket per i log ripristinati
Crea un bucket per archiviare i log di controllo ripristinati:
Crea il bucket di ripristino:
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
Sostituisci
PROJECT_NAMESPACE
con lo spazio dei nomi del tuo progetto.Visualizza il bucket:
kubectl get bucket audit-logs-loki-restore-pa -n PROJECT_NAMESPACE
La creazione del bucket potrebbe richiedere alcuni minuti.
In base alle informazioni dell'output, imposta le seguenti variabili di ambiente:
DST_BUCKET= RESTORE_BUCKET_NAME DST_ENDPOINT = RESTORE_ENDPOINT DST_PATH= RESTORE_FULLY_QUALIFIED_BUCKET_NAME
Sostituisci quanto segue:
RESTORE_BUCKET_NAME
: il valoreBUCKET NAME
dell'output.RESTORE_ENDPOINT
: il valoreENDPOINT
dell'output.RESTORE_FULLY_QUALIFIED_BUCKET_NAME
: il valoreFULLY-QUALIFIED-BUCKET-NAME
dell'output.
Recupera il nome del secret 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'
Imposta le variabili delle credenziali:
DST_SECRET_NAME=RESTORE_SECRET_NAME DST_CREDENTIALS="PROJECT_NAMESPACE/RESTORE_SECRET_NAME"
Sostituisci
RESTORE_SECRET_NAME
con il nome del secret che hai ottenuto.Crea il secret del certificato CA:
kubectl create secret generic -n PROJECT_NAMESPACE audit-log-loki-restore-ca \ --from-literal=ca.crt=CERTIFICATE
Sostituisci
CERTIFICATE
con il certificato CA del sistema di archiviazione.Imposta la variabile del certificato CA:
DST_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-restore-ca
Impostare le credenziali del bucket di origine
Imposta le credenziali del bucket che contiene il backup per gli audit log:
Imposta le seguenti variabili di ambiente:
SRC_ACCESS_KEY_ID= ACCESS_KEY SRC_SECRET_ACCESS_KEY= ACCESS_SECRET SRC_ENDPOINT= REMOTE_ENDPOINT SRC_PATH= REMOTE_BUCKET_NAME
Sostituisci quanto segue:
ACCESS_KEY
: la chiave di accesso del bucket di backup.ACCESS_SECRET
: il secret di accesso del bucket di backup.REMOTE_ENDPOINT
: l'endpoint del bucket di backup.REMOTE_BUCKET_NAME
: il nome del bucket di backup.
Crea un secret del bucket di 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
Imposta la variabile delle credenziali:
SRC_CREDENTIALS=PROJECT_NAMESPACE/s3-backup-bucket-credentials
Crea un secret con il certificato CA del bucket:
kubectl create secret generic -n PROJECT_NAMESPACE s3-backup-bucket-ca \ --from-literal=ca.crt=BACKUP_CERTIFICATE
Sostituisci
BACKUP_CERTIFICATE
con il certificato CA del bucket di backup.Imposta la variabile del certificato CA:
SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-backup-bucket-ca
Trasferire i log di controllo ripristinati
Il tuo operatore dell'infrastruttura (IO) deve creare un job di trasferimento per consentirti di ripristinare
i log di controllo dal bucket di backup al bucket di ripristino. L'IO utilizza l'account di servizio audit-log-pa-backup-restore-sa
preconfigurato per configurare il servizio di trasferimento per i bucket predefiniti di audit log della piattaforma.
Utilizza il seguente job per trasferire gli audit log:
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.
Monitora il trasferimento dei dati
utilizzando il nome del job (audit-log-restore-job
) e lo spazio dei nomi del progetto.
Il job termina quando tutti i dati vengono trasferiti nel bucket di ripristino.
Log di accesso ripristinato
Esegui il deployment di un'istanza Loki per accedere ai log ripristinati utilizzando i manifest di configurazione e deployment forniti:
Crea un oggetto
ConfigMap
per la configurazione dell'istanza.Di seguito è riportato un esempio di oggetto
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
Esegui il deployment dell'istanza come oggetto
StatefulSet
con unService
per accedere ai log.Di seguito è riportato un esempio di oggetti
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
Visualizzare i log ripristinati
Configura Grafana per visualizzare gli audit log ripristinati dall'istanza Loki:
- Apri l'endpoint Grafana del tuo progetto. Per maggiori informazioni, vedi Esecuzione di query e visualizzazione dei log.
- Nel menu di navigazione dell'interfaccia utente, fai clic su Amministrazione > Origini dati.
- Fai clic su Aggiungi nuova origine dati.
- Nella pagina Aggiungi origine dati, seleziona Loki.
- Nella pagina Impostazioni, inserisci
Audit Logs - Restore
nel campo Nome. Nella sezione HTTP, inserisci il seguente valore nel campo URL:
http://audit-logs-loki-restore-pa.PROJECT_NAMESPACE.svc:3100
Nella sezione Intestazioni HTTP personalizzate, inserisci i seguenti valori nei campi corrispondenti:
- Header:
X-Scope-OrgID
- Valore:
infra-obs
- Header:
Nella figura 1, Loki viene visualizzato come opzione nella pagina Aggiungi origine dati.
Figura 1. La pagina Aggiungi origine dati nell'interfaccia utente dell'istanza di monitoraggio.
Figura 2. La pagina Impostazioni nell'interfaccia utente dell'istanza di monitoraggio.
L'opzione Audit Logs - Restore
è ora disponibile come origine dati in Esplora log.