Membuat log audit pencadangan dan pemulihan

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

  1. 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.

  2. 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: nilai BUCKET NAME dari output.
    • ENDPOINT: nilai ENDPOINT output.
    • FULLY_QUALIFIED_BUCKET_NAME: nilai FULLY-QUALIFIED-BUCKET-NAME output.
  3. 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'
    
  4. Tetapkan variabel kredensial:

    SRC_CREDENTIALS="PROJECT_NAMESPACE/SECRET_NAME"
    

    Ganti SECRET_NAME dengan nama secret yang Anda dapatkan.

  5. 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.

  6. Tetapkan variabel sertifikat CA:

    SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-ca
    

Bucket tujuan

  1. 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.
  2. 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.

  3. Tetapkan variabel kredensial:

    DST_CREDENTIALS=PROJECT_NAMESPACE/s3-bucket-credentials
    
  4. 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:

  1. 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.

  2. Lihat bucket:

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

    Pembuatan bucket mungkin memerlukan waktu beberapa menit.

  3. 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: nilai BUCKET NAME dari output.
    • RESTORE_ENDPOINT: nilai ENDPOINT dari output.
    • RESTORE_FULLY_QUALIFIED_BUCKET_NAME: nilai FULLY-QUALIFIED-BUCKET-NAME output.
  4. 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'
    
  5. 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.

  6. 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.

  7. 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:

  1. 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.
  2. 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
    
  3. Tetapkan variabel kredensial:

    SRC_CREDENTIALS=PROJECT_NAMESPACE/s3-backup-bucket-credentials
    
  4. 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.

  5. 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:

  1. 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
    
  2. Deploy instance sebagai objek StatefulSet dengan Service untuk mengakses log.

    Berikut adalah contoh objek StatefulSet dan 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
    

Melihat log yang dipulihkan

Konfigurasi Grafana untuk melihat log audit yang dipulihkan dari instance Loki:

  1. Buka endpoint Grafana project Anda. Untuk mengetahui informasi selengkapnya, lihat Mengkueri dan melihat log.
  2. Dari menu navigasi antarmuka pengguna, klik Administrasi > Sumber data.
  3. Klik Tambahkan sumber data baru.
  4. Di halaman Tambahkan sumber data, pilih Loki.
  5. Di halaman Setelan, masukkan Audit Logs - Restore di kolom Nama.
  6. Di bagian HTTP, masukkan nilai berikut di kolom URL:

    http://audit-logs-loki-restore-pa.PROJECT_NAMESPACE.svc:3100
    
  7. Di bagian Custom HTTP Headers, masukkan nilai berikut di kolom yang sesuai:

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

Pada gambar 1, Loki ditampilkan sebagai opsi di halaman Tambahkan sumber data.

Opsi Loki ditampilkan sebagai sumber data di halaman Tambahkan sumber data pada UI.

Gambar 1. Halaman Tambahkan sumber data di UI instance pemantauan.

Kolom yang relevan untuk mengonfigurasi Loki sebagai sumber data ditampilkan di halaman Setelan

Gambar 2. Halaman Setelan di UI instance pemantauan.

Opsi Audit Logs - Restore kini tersedia sebagai sumber data di penjelajah log.