本页面介绍了如何保护远程备份存储分区中来自 Google Distributed Cloud (GDC) 气隙式设备环境的审核日志,以便在必要时保留和恢复数据。该流程包含安装和配置必要组件的步骤,以便从这些备份中恢复历史审核日志。
备份可确保即使原始数据丢失或损坏,审核日志也能得以保留,从而帮助您满足相关要求,并在发生系统故障或意外删除时恢复信息。恢复的审核日志可提供对历史数据的访问权限,从而能够分析过往事件、安全事件和用户活动。
为审核日志实现备份和恢复流程有助于维护数据完整性、确保合规性并实现历史分析。
准备工作
确保您有权访问以下资源:
- 用于备份的远程存储桶,包含端点、私有访问密钥和访问密钥 ID。
- 存储系统的证书授权机构 (CA) 证书。
- 一个可正常运行的 Kubernetes 集群。
如需获得管理备份所需的权限,请让项目 IAM 管理员向您授予项目命名空间中的以下角色之一:
- Audit Logs Platform Restore Bucket Creator
- Audit Logs Platform Bucket Viewer
根据您需要的访问权限级别,您可以在项目命名空间中获取备份存储桶资源的创建者或查看者角色。如需详细了解这些角色,请参阅准备 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
```
在备份中保护审核日志
本部分包含在远程存储桶中为审核日志创建备份的步骤。
设置存储桶凭据
您必须为以下存储分区设置访问凭据:
- 源存储桶:包含您要保护的原始审核日志的本地 GDC 存储桶。
- 目标存储桶:您要在其中创建审核日志备份的远程存储桶。
为两个存储分区设置凭据:
来源存储桶
从 Management API 服务器列出项目命名空间中的存储分区:
kubectl --kubeconfig=${KUBECONFIG} get bucket -n ${PROJECT_NAMESPACE}
输出中的
DESCRIPTION
字段表示哪些存储分区包含审核日志。选择包含要保护的日志的存储桶。根据输出中的信息,设置以下环境变量:
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
值。
获取存储桶 Secret 名称:
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
替换为您获得的 Secret 名称。创建 CA 证书 Secret:
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
目标存储桶
为远程目标存储桶设置以下环境变量:
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
:相应存储桶的名称。
创建远程存储桶 Secret:
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
如有必要,请使用存储桶的 CA 证书创建 Secret,并设置 CA 证书变量:
kubectl create secret generic -n PROJECT_NAMESPACE s3-bucket-ca \ --from-literal=ca.crt=REMOTE_CERTIFICATE
将
REMOTE_CERTIFICATE
替换为目标存储桶的 CA 证书。设置 CA 证书变量:
DST_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-bucket-ca
转移审核日志
您的基础设施运维人员 (IO) 必须为您创建一个转移作业,以便将审核日志从源存储桶导出到目标存储桶以进行备份。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
) 和项目命名空间监控数据传输。
当所有数据都转移到目标存储桶后,作业即会结束。
从备份中恢复审核日志
本部分包含从远程存储桶中的备份恢复审核日志的步骤。
创建用于存储已恢复日志的存储桶
创建一个存储桶来存储恢复的审核日志:
创建恢复存储桶:
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
替换为您的项目命名空间。查看存储桶:
kubectl get bucket audit-logs-loki-restore-pa -n PROJECT_NAMESPACE
创建存储桶可能需要几分钟的时间。
根据输出中的信息,设置以下环境变量:
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
值。
获取存储桶 Secret 名称:
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
替换为您获得的 Secret 名称。创建 CA 证书 Secret:
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
设置源存储桶凭据
设置包含审核日志备份的存储桶的凭据:
设置以下环境变量:
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
:备份存储桶的访问密钥。REMOTE_ENDPOINT
:备份存储桶的端点。REMOTE_BUCKET_NAME
:备份存储桶的名称。
创建备份存储桶 Secret:
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
创建包含相应存储桶的 CA 证书的 Secret:
kubectl create secret generic -n PROJECT_NAMESPACE s3-backup-bucket-ca \ --from-literal=ca.crt=BACKUP_CERTIFICATE
将
BACKUP_CERTIFICATE
替换为备份存储桶的 CA 证书。设置 CA 证书变量:
SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-backup-bucket-ca
转移已恢复的审核日志
您的基础设施运维人员 (IO) 必须为您创建一个转移作业,以便将审核日志从备份存储桶恢复到恢复存储桶。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
) 和项目命名空间监控数据传输。
当所有数据都转移到恢复存储桶后,作业即会结束。
访问权限恢复日志
部署 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 部分,在 网址 字段中输入以下值:
http://audit-logs-loki-restore-pa.PROJECT_NAMESPACE.svc:3100
在自定义 HTTP 标头部分,在相应字段中输入以下值:
- Header:
X-Scope-OrgID
- 值:
infra-obs
- Header:
在图 1 中,Loki 显示为添加数据源页面上的一个选项。
图 1. 监控实例界面上的添加数据源页面。
图 2. 监控实例界面上的设置页面。
Audit Logs - Restore
选项现在可在日志浏览器中用作数据源。