建立備份和還原稽核記錄

本頁面說明如何保護 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

  1. 從 Management API 伺服器列出專案命名空間中的 bucket:

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

    輸出內容中的 DESCRIPTION 欄位會指出哪些 buckets 含有稽核記錄。選取要保護記錄檔的值區。

  2. 根據輸出內容中的資訊,設定下列環境變數:

    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 值。
  3. 取得 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'
    
  4. 設定憑證變數:

    SRC_CREDENTIALS="PROJECT_NAMESPACE/SECRET_NAME"
    

    SECRET_NAME 替換為您取得的密鑰名稱。

  5. 建立 CA 憑證密鑰:

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

    CERTIFICATE 替換為儲存系統的 CA 憑證。

  6. 設定 CA 憑證變數:

    SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-ca
    

目的地值區

  1. 為遠端目的地 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:值區名稱。
  2. 建立遠端 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 替換為專案命名空間。

  3. 設定憑證變數:

    DST_CREDENTIALS=PROJECT_NAMESPACE/s3-bucket-credentials
    
  4. 如有需要,請使用 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 來儲存還原的稽核記錄:

  1. 建立還原 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 替換為專案命名空間。

  2. 查看 bucket:

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

    建立 bucket 可能需要幾分鐘的時間。

  3. 根據輸出內容中的資訊,設定下列環境變數:

    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 值。
  4. 取得 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'
    
  5. 設定憑證變數:

    DST_SECRET_NAME=RESTORE_SECRET_NAME
    DST_CREDENTIALS="PROJECT_NAMESPACE/RESTORE_SECRET_NAME"
    

    RESTORE_SECRET_NAME 替換為您取得的密鑰名稱。

  6. 建立 CA 憑證密鑰:

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

    CERTIFICATE 替換為儲存系統的 CA 憑證。

  7. 設定 CA 憑證變數:

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

設定來源 bucket 憑證

設定包含稽核記錄備份的 bucket 憑證:

  1. 設定下列環境變數:

    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 的名稱。
  2. 建立備份 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
    
  3. 設定憑證變數:

    SRC_CREDENTIALS=PROJECT_NAMESPACE/s3-backup-bucket-credentials
    
  4. 使用 bucket 的 CA 憑證建立密鑰:

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

    BACKUP_CERTIFICATE 替換為備份 bucket 的 CA 憑證。

  5. 設定 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 執行個體,即可使用提供的設定和部署資訊清單存取還原的記錄:

  1. 為執行個體設定建立 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
    
  2. 將執行個體部署為 StatefulSet 物件,並使用 Service 存取記錄。

    以下是 StatefulSetService 物件的範例:

    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 執行個體查看還原的稽核記錄:

  1. 開啟專案的 Grafana 端點。詳情請參閱「查詢及查看記錄」。
  2. 在使用者介面的導覽選單中,依序點選「管理」>「資料來源」
  3. 按一下 「新增資料來源」
  4. 在「新增資料來源」頁面中,選取「Loki」
  5. 在「設定」頁面的「名稱」欄位中輸入 Audit Logs - Restore
  6. 在「HTTP」區段的「URL」欄位中,輸入下列值:

    http://audit-logs-loki-restore-pa.PROJECT_NAMESPACE.svc:3100
    
  7. 在「自訂 HTTP 標頭」部分,在對應欄位中輸入下列值:

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

如圖 1 所示,「Loki」會顯示在「新增資料來源」頁面中。

在 UI 的「新增資料來源」頁面中,Loki 選項會顯示為資料來源。

圖 1. 監控執行個體 UI 的「新增資料來源」頁面。

設定頁面會顯示相關欄位,方便您將 Loki 設定為資料來源

圖 2:監控執行個體的使用者介面「設定」頁面。

「記錄探索器」現在提供 Audit Logs - Restore 選項做為資料來源。