Halaman ini menjelaskan cara mengamankan log audit dari lingkungan appliance air gap Google Distributed Cloud (GDC) di bucket cadangan jarak jauh untuk mempertahankan dan memulihkan data jika diperlukan. Proses ini mencakup langkah-langkah untuk menginstal dan mengonfigurasi komponen yang diperlukan untuk memulihkan log audit historis dari cadangan tersebut.
Pencadangan memastikan bahwa log audit dipertahankan meskipun data asli hilang atau rusak, sehingga membantu memenuhi persyaratan dan memungkinkan Anda memulihkan informasi jika terjadi kegagalan sistem atau penghapusan yang tidak disengaja. Log audit yang dipulihkan memberikan akses ke data historis, sehingga memungkinkan analisis peristiwa masa lalu, insiden keamanan, dan aktivitas pengguna.
Menerapkan proses pencadangan dan pemulihan untuk log audit bermanfaat untuk mempertahankan integritas data, memastikan kepatuhan, dan memungkinkan analisis historis.
Sebelum memulai
Pastikan Anda memiliki akses ke resource berikut:
- Bucket jarak jauh untuk cadangan dengan endpoint, kunci akses rahasia, dan ID kunci akses.
- Sertifikat certificate authority (CA) untuk sistem penyimpanan.
- Cluster Kubernetes yang berfungsi.
Untuk mendapatkan izin yang Anda perlukan untuk mengelola pencadangan, minta Admin IAM Project Anda untuk memberi Anda salah satu peran berikut di namespace project Anda:
- Pembuat Bucket Pemulihan Platform Log Audit
- Pelihat Bucket Platform Log Audit
Bergantung pada tingkat akses dan izin yang Anda butuhkan, Anda mungkin mendapatkan peran pembuat atau pelihat untuk resource bucket cadangan di namespace project Anda. Untuk mengetahui informasi selengkapnya tentang peran ini, lihat Siapkan izin IAM.
Tetapkan variabel lingkungan: Tetapkan variabel lingkungan berikut untuk menjalankan perintah dari halaman ini:
* 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
```
Mengamankan log audit dalam cadangan
Bagian ini berisi langkah-langkah untuk membuat cadangan log audit di bucket jarak jauh.
Menetapkan kredensial bucket
Anda harus menetapkan kredensial akses untuk bucket berikut:
- Bucket sumber: bucket GDC lokal yang berisi log audit asli yang ingin Anda amankan.
- Bucket tujuan: bucket jarak jauh tempat Anda ingin membuat cadangan untuk log audit.
Tetapkan kredensial untuk kedua bucket:
Bucket sumber
Mencantumkan bucket di namespace project Anda dari server Management API:
kubectl --kubeconfig=${KUBECONFIG} get bucket -n ${PROJECT_NAMESPACE}
Kolom
DESCRIPTION
pada output menunjukkan bucket mana yang berisi log audit. Pilih bucket yang berisi log yang ingin Anda amankan.Berdasarkan informasi dari output, tetapkan variabel lingkungan berikut:
SRC_BUCKET= BUCKET_NAME SRC_ENDPOINT = ENDPOINT SRC_PATH= FULLY_QUALIFIED_BUCKET_NAME
Ganti kode berikut:
BUCKET_NAME
: nilaiBUCKET NAME
dari output.ENDPOINT
: nilaiENDPOINT
output.FULLY_QUALIFIED_BUCKET_NAME
: nilaiFULLY-QUALIFIED-BUCKET-NAME
output.
Dapatkan nama rahasia 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'
Tetapkan variabel kredensial:
SRC_CREDENTIALS="PROJECT_NAMESPACE/SECRET_NAME"
Ganti
SECRET_NAME
dengan nama secret yang Anda dapatkan.Buat rahasia sertifikat CA:
kubectl create secret generic -n PROJECT_NAMESPACE audit-log-loki-ca \ --from-literal=ca.crt=CERTIFICATE
Ganti
CERTIFICATE
dengan sertifikat CA dari sistem penyimpanan.Tetapkan variabel sertifikat CA:
SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-ca
Bucket tujuan
Tetapkan variabel lingkungan berikut untuk bucket tujuan jarak jauh:
DST_ACCESS_KEY_ID= ACCESS_KEY DST_SECRET_ACCESS_KEY= ACCESS_SECRET DST_ENDPOINT= REMOTE_ENDPOINT DST_PATH= REMOTE_BUCKET_NAME
Ganti kode berikut:
ACCESS_KEY
: kunci akses bucket.ACCESS_SECRET
: secret akses bucket.REMOTE_ENDPOINT
: endpoint bucket.REMOTE_BUCKET_NAME
: nama bucket.
Buat rahasia bucket jarak jauh:
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
Ganti
PROJECT_NAMESPACE
dengan namespace project Anda.Tetapkan variabel kredensial:
DST_CREDENTIALS=PROJECT_NAMESPACE/s3-bucket-credentials
Jika diperlukan, buat secret dengan sertifikat CA bucket dan tetapkan variabel sertifikat CA:
kubectl create secret generic -n PROJECT_NAMESPACE s3-bucket-ca \ --from-literal=ca.crt=REMOTE_CERTIFICATE
Ganti
REMOTE_CERTIFICATE
dengan sertifikat CA bucket tujuan.Tetapkan variabel sertifikat CA:
DST_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-bucket-ca
Mentransfer log audit
Operator Infrastruktur (IO) Anda harus membuat tugas transfer agar Anda dapat mengekspor log audit dari bucket sumber ke bucket tujuan untuk pencadangan. IO menggunakan akun layanan audit-log-pa-backup-restore-sa
yang telah dikonfigurasi sebelumnya untuk mengonfigurasi layanan transfer bagi bucket log audit platform yang telah ditentukan sebelumnya.
Gunakan tugas berikut untuk mentransfer log audit:
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.
Pantau transfer data
menggunakan nama tugas (audit-log-transfer-job
) dan namespace project Anda.
Tugas berakhir saat semua data ditransfer ke bucket tujuan.
Memulihkan log audit dari cadangan
Bagian ini berisi langkah-langkah untuk memulihkan log audit dari cadangan di bucket jarak jauh.
Membuat bucket untuk log yang dipulihkan
Buat bucket untuk menyimpan log audit yang dipulihkan:
Buat bucket pemulihan:
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
Ganti
PROJECT_NAMESPACE
dengan namespace project Anda.Lihat bucket:
kubectl get bucket audit-logs-loki-restore-pa -n PROJECT_NAMESPACE
Pembuatan bucket mungkin memerlukan waktu beberapa menit.
Berdasarkan informasi dari output, tetapkan variabel lingkungan berikut:
DST_BUCKET= RESTORE_BUCKET_NAME DST_ENDPOINT = RESTORE_ENDPOINT DST_PATH= RESTORE_FULLY_QUALIFIED_BUCKET_NAME
Ganti kode berikut:
RESTORE_BUCKET_NAME
: nilaiBUCKET NAME
dari output.RESTORE_ENDPOINT
: nilaiENDPOINT
dari output.RESTORE_FULLY_QUALIFIED_BUCKET_NAME
: nilaiFULLY-QUALIFIED-BUCKET-NAME
output.
Dapatkan nama rahasia 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'
Tetapkan variabel kredensial:
DST_SECRET_NAME=RESTORE_SECRET_NAME DST_CREDENTIALS="PROJECT_NAMESPACE/RESTORE_SECRET_NAME"
Ganti
RESTORE_SECRET_NAME
dengan nama secret yang Anda dapatkan.Buat rahasia sertifikat CA:
kubectl create secret generic -n PROJECT_NAMESPACE audit-log-loki-restore-ca \ --from-literal=ca.crt=CERTIFICATE
Ganti
CERTIFICATE
dengan sertifikat CA sistem penyimpanan.Tetapkan variabel sertifikat CA:
DST_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-restore-ca
Menetapkan kredensial bucket sumber
Tetapkan kredensial bucket yang berisi cadangan untuk log audit:
Tetapkan variabel lingkungan berikut:
SRC_ACCESS_KEY_ID= ACCESS_KEY SRC_SECRET_ACCESS_KEY= ACCESS_SECRET SRC_ENDPOINT= REMOTE_ENDPOINT SRC_PATH= REMOTE_BUCKET_NAME
Ganti kode berikut:
ACCESS_KEY
: kunci akses bucket cadangan.ACCESS_SECRET
: secret akses bucket pencadangan.REMOTE_ENDPOINT
: endpoint bucket cadangan.REMOTE_BUCKET_NAME
: nama bucket cadangan.
Buat rahasia bucket cadangan:
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
Tetapkan variabel kredensial:
SRC_CREDENTIALS=PROJECT_NAMESPACE/s3-backup-bucket-credentials
Buat secret dengan sertifikat CA bucket:
kubectl create secret generic -n PROJECT_NAMESPACE s3-backup-bucket-ca \ --from-literal=ca.crt=BACKUP_CERTIFICATE
Ganti
BACKUP_CERTIFICATE
dengan sertifikat CA dari bucket cadangan.Tetapkan variabel sertifikat CA:
SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-backup-bucket-ca
Mentransfer log audit yang dipulihkan
Operator Infrastruktur (IO) Anda harus membuat tugas transfer agar Anda dapat memulihkan log audit dari bucket cadangan ke bucket pemulihan. IO menggunakan akun layanan audit-log-pa-backup-restore-sa
yang telah dikonfigurasi sebelumnya untuk mengonfigurasi layanan transfer bagi bucket log audit platform yang telah ditentukan sebelumnya.
Gunakan tugas berikut untuk mentransfer log audit:
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.
Pantau transfer data
menggunakan nama tugas (audit-log-restore-job
) dan namespace project Anda.
Tugas berakhir saat semua data ditransfer ke bucket pemulihan.
Log akses dipulihkan
Deploy instance Loki untuk mengakses log yang dipulihkan menggunakan konfigurasi dan manifes deployment yang disediakan:
Buat objek
ConfigMap
untuk konfigurasi instance.Berikut adalah contoh objek
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
Deploy instance sebagai objek
StatefulSet
denganService
untuk mengakses log.Berikut adalah contoh objek
StatefulSet
danService
: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
Melihat log yang dipulihkan
Konfigurasi Grafana untuk melihat log audit yang dipulihkan dari instance Loki:
- Buka endpoint Grafana project Anda. Untuk mengetahui informasi selengkapnya, lihat Mengkueri dan melihat log.
- Dari menu navigasi antarmuka pengguna, klik Administrasi > Sumber data.
- Klik Tambahkan sumber data baru.
- Di halaman Tambahkan sumber data, pilih Loki.
- Di halaman Setelan, masukkan
Audit Logs - Restore
di kolom Nama. Di bagian HTTP, masukkan nilai berikut di kolom URL:
http://audit-logs-loki-restore-pa.PROJECT_NAMESPACE.svc:3100
Di bagian Custom HTTP Headers, masukkan nilai berikut di kolom yang sesuai:
- Header:
X-Scope-OrgID
- Nilai:
infra-obs
- Header:
Pada gambar 1, Loki ditampilkan sebagai opsi di halaman Tambahkan sumber data.
Gambar 1. Halaman Tambahkan sumber data di UI instance pemantauan.
Gambar 2. Halaman Setelan di UI instance pemantauan.
Opsi Audit Logs - Restore
kini tersedia sebagai sumber data di penjelajah log.