本頁面說明如何保護 Google Distributed Cloud (GDC) 氣隙式設備環境中的稽核記錄,將其備份至遠端備份值區,以便在必要時保留及還原資料。這個程序包含安裝及設定必要元件的步驟,以便從備份檔還原歷來稽核記錄。
備份可確保稽核記錄不會因原始資料遺失或損毀而消失,有助於滿足相關規定,並在系統故障或誤刪資料時復原資訊。還原的稽核記錄可提供歷來資料的存取權,方便您分析過往事件、安全性事件和使用者活動。
實作稽核記錄的備份與還原程序,有助於維護資料完整性、確保法規遵循,以及進行歷史記錄分析。
事前準備
確認您有權存取下列資源:
- 備份用的遠端值區,其中包含端點、私密存取金鑰和存取金鑰 ID。
- 儲存系統的憑證授權單位 (CA) 憑證。
- 運作中的 Kubernetes 叢集。
如要取得管理備份所需的權限,請要求專案 IAM 管理員在專案命名空間中授予您下列其中一個角色:
- 稽核記錄平台還原值區建立者
- 稽核記錄平台 Bucket 檢視者
視您需要的存取層級和權限而定,您可能會在專案命名空間中取得備份值區資源的建立者或檢視者角色。如要進一步瞭解這些角色,請參閱「準備 IAM 權限」。
設定環境變數:設定下列環境變數,以便執行本頁的指令:
* 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
```
備份中的安全稽核記錄
本節說明如何為遠端值區中的稽核記錄建立備份。
設定值區憑證
您必須為下列 bucket 設定存取憑證:
- 來源 bucket:包含要保護的原始稽核記錄的本機 GDC bucket。
- 目標 bucket:您要在其中建立稽核記錄備份的遠端 bucket。
設定兩個 bucket 的憑證:
來源 bucket
從 Management API 伺服器列出專案命名空間中的 bucket:
kubectl --kubeconfig=${KUBECONFIG} get bucket -n ${PROJECT_NAMESPACE}
輸出內容中的
DESCRIPTION
欄位會指出哪些 buckets 含有稽核記錄。選取要保護記錄檔的值區。根據輸出內容中的資訊,設定下列環境變數:
SRC_BUCKET= BUCKET_NAME SRC_ENDPOINT = ENDPOINT SRC_PATH= FULLY_QUALIFIED_BUCKET_NAME
更改下列內容:
BUCKET_NAME
:輸出內容的BUCKET NAME
值。ENDPOINT
:輸出的ENDPOINT
值。FULLY_QUALIFIED_BUCKET_NAME
:輸出的FULLY-QUALIFIED-BUCKET-NAME
值。
取得 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'
設定憑證變數:
SRC_CREDENTIALS="PROJECT_NAMESPACE/SECRET_NAME"
將
SECRET_NAME
替換為您取得的密鑰名稱。建立 CA 憑證密鑰:
kubectl create secret generic -n PROJECT_NAMESPACE audit-log-loki-ca \ --from-literal=ca.crt=CERTIFICATE
將
CERTIFICATE
替換為儲存系統的 CA 憑證。設定 CA 憑證變數:
SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-ca
目的地值區
為遠端目的地 bucket 設定下列環境變數:
DST_ACCESS_KEY_ID= ACCESS_KEY DST_SECRET_ACCESS_KEY= ACCESS_SECRET DST_ENDPOINT= REMOTE_ENDPOINT DST_PATH= REMOTE_BUCKET_NAME
更改下列內容:
ACCESS_KEY
:值區的存取金鑰。ACCESS_SECRET
:值區的存取密鑰。REMOTE_ENDPOINT
:值區的端點。REMOTE_BUCKET_NAME
:值區名稱。
建立遠端 bucket 密鑰:
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
將
PROJECT_NAMESPACE
替換為專案命名空間。設定憑證變數:
DST_CREDENTIALS=PROJECT_NAMESPACE/s3-bucket-credentials
如有需要,請使用 bucket 的 CA 憑證建立密鑰,並設定 CA 憑證變數:
kubectl create secret generic -n PROJECT_NAMESPACE s3-bucket-ca \ --from-literal=ca.crt=REMOTE_CERTIFICATE
將
REMOTE_CERTIFICATE
替換為目的地 bucket 的 CA 憑證。設定 CA 憑證變數:
DST_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-bucket-ca
轉移稽核記錄
基礎架構營運商 (IO) 必須為您建立轉移工作,才能將稽核記錄從來源 bucket 匯出至目的地 bucket,以進行備份。IO 會使用預先設定的 audit-log-pa-backup-restore-sa
服務帳戶,為平台稽核記錄的預先定義儲存空間設定轉移服務。
請使用下列工作轉移稽核記錄:
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.
使用工作名稱 (audit-log-transfer-job
) 和專案命名空間,監控資料轉移作業。
所有資料都轉移至目的地 bucket 後,這項工作就會結束。
從備份還原稽核記錄
本節說明如何從遠端值區中的備份還原稽核記錄。
建立用於儲存還原記錄的 bucket
建立 bucket 來儲存還原的稽核記錄:
建立還原 bucket:
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
將
PROJECT_NAMESPACE
替換為專案命名空間。查看 bucket:
kubectl get bucket audit-logs-loki-restore-pa -n PROJECT_NAMESPACE
建立 bucket 可能需要幾分鐘的時間。
根據輸出內容中的資訊,設定下列環境變數:
DST_BUCKET= RESTORE_BUCKET_NAME DST_ENDPOINT = RESTORE_ENDPOINT DST_PATH= RESTORE_FULLY_QUALIFIED_BUCKET_NAME
更改下列內容:
RESTORE_BUCKET_NAME
:輸出內容的BUCKET NAME
值。RESTORE_ENDPOINT
:輸出內容的ENDPOINT
值。RESTORE_FULLY_QUALIFIED_BUCKET_NAME
:輸出的FULLY-QUALIFIED-BUCKET-NAME
值。
取得 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'
設定憑證變數:
DST_SECRET_NAME=RESTORE_SECRET_NAME DST_CREDENTIALS="PROJECT_NAMESPACE/RESTORE_SECRET_NAME"
將
RESTORE_SECRET_NAME
替換為您取得的密鑰名稱。建立 CA 憑證密鑰:
kubectl create secret generic -n PROJECT_NAMESPACE audit-log-loki-restore-ca \ --from-literal=ca.crt=CERTIFICATE
將
CERTIFICATE
替換為儲存系統的 CA 憑證。設定 CA 憑證變數:
DST_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-restore-ca
設定來源 bucket 憑證
設定包含稽核記錄備份的 bucket 憑證:
設定下列環境變數:
SRC_ACCESS_KEY_ID= ACCESS_KEY SRC_SECRET_ACCESS_KEY= ACCESS_SECRET SRC_ENDPOINT= REMOTE_ENDPOINT SRC_PATH= REMOTE_BUCKET_NAME
更改下列內容:
ACCESS_KEY
:備份值區的存取金鑰。ACCESS_SECRET
:備份 bucket 的存取密碼。REMOTE_ENDPOINT
:備份值區的端點。REMOTE_BUCKET_NAME
:備份 bucket 的名稱。
建立備份 bucket 密鑰:
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
設定憑證變數:
SRC_CREDENTIALS=PROJECT_NAMESPACE/s3-backup-bucket-credentials
使用 bucket 的 CA 憑證建立密鑰:
kubectl create secret generic -n PROJECT_NAMESPACE s3-backup-bucket-ca \ --from-literal=ca.crt=BACKUP_CERTIFICATE
將
BACKUP_CERTIFICATE
替換為備份 bucket 的 CA 憑證。設定 CA 憑證變數:
SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-backup-bucket-ca
轉移還原的稽核記錄
基礎架構營運商 (IO) 必須為您建立轉移工作,才能將備份 bucket 中的稽核記錄還原至還原 bucket。IO 會使用預先設定的 audit-log-pa-backup-restore-sa
服務帳戶,為平台稽核記錄的預先定義儲存空間設定轉移服務。
請使用下列工作轉移稽核記錄:
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.
使用工作名稱 (audit-log-restore-job
) 和專案命名空間,監控資料轉移作業。
所有資料都轉移到還原 bucket 後,工作就會結束。
存取已還原的記錄
部署 Loki 執行個體,即可使用提供的設定和部署資訊清單存取還原的記錄:
為執行個體設定建立
ConfigMap
物件。以下是
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
將執行個體部署為
StatefulSet
物件,並使用Service
存取記錄。以下是
StatefulSet
和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
查看還原的記錄
設定 Grafana,從 Loki 執行個體查看還原的稽核記錄:
- 開啟專案的 Grafana 端點。詳情請參閱「查詢及查看記錄」。
- 在使用者介面的導覽選單中,依序點選「管理」>「資料來源」。
- 按一下 「新增資料來源」。
- 在「新增資料來源」頁面中,選取「Loki」。
- 在「設定」頁面的「名稱」欄位中輸入
Audit Logs - Restore
。 在「HTTP」區段的「URL」欄位中,輸入下列值:
http://audit-logs-loki-restore-pa.PROJECT_NAMESPACE.svc:3100
在「自訂 HTTP 標頭」部分,在對應欄位中輸入下列值:
- Header:
X-Scope-OrgID
- Value:
infra-obs
- Header:
如圖 1 所示,「Loki」會顯示在「新增資料來源」頁面中。
圖 1. 監控執行個體 UI 的「新增資料來源」頁面。
圖 2:監控執行個體的使用者介面「設定」頁面。
「記錄探索器」現在提供 Audit Logs - Restore
選項做為資料來源。