이 페이지에서는 필요한 경우 데이터를 보존하고 복원하기 위해 원격 백업 버킷에서 Google Distributed Cloud (GDC) 오프라인 어플라이언스 환경의 감사 로그를 보호하는 방법을 설명합니다. 이 프로세스에는 이러한 백업에서 이전 감사 로그를 복구하는 데 필요한 구성요소를 설치하고 구성하는 단계가 포함됩니다.
백업을 사용하면 원본 데이터가 손실되거나 손상된 경우에도 감사 로그가 보존되므로 요구사항을 충족하고 시스템 장애 또는 실수로 인한 삭제 시 정보를 복구할 수 있습니다. 복원된 감사 로그는 과거 데이터에 대한 액세스를 제공하여 과거 이벤트, 보안 사고, 사용자 활동을 분석할 수 있도록 지원합니다.
감사 로그의 백업 및 복원 프로세스를 구현하면 데이터 무결성을 유지하고, 규정을 준수하며, 이전 분석을 실행할 수 있습니다.
시작하기 전에
다음 리소스에 액세스할 수 있는지 확인합니다.
- 엔드포인트, 보안 비밀 액세스 키, 액세스 키 ID가 있는 백업용 원격 버킷입니다.
- 스토리지 시스템의 인증 기관 (CA) 인증서입니다.
- 작동하는 Kubernetes 클러스터
백업을 관리하는 데 필요한 권한을 얻으려면 프로젝트 IAM 관리자에게 프로젝트 네임스페이스에서 다음 역할 중 하나를 부여해 달라고 요청하세요.
- 감사 로그 플랫폼 복원 버킷 생성자
- 감사 로그 플랫폼 버킷 뷰어
필요한 액세스 수준 및 권한에 따라 프로젝트 네임스페이스에서 백업 버킷 리소스에 대한 생성자 또는 뷰어 역할을 획득할 수 있습니다. 이러한 역할에 대한 자세한 내용은 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 버킷입니다.
- 대상 버킷: 감사 로그의 백업을 만들려는 원격 버킷입니다.
두 버킷의 사용자 인증 정보를 설정합니다.
소스 버킷
관리 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값입니다.
버킷 보안 비밀 이름을 가져옵니다.
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=CERTIFICATECERTIFICATE을 스토리지 시스템의 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: 버킷의 이름입니다.
원격 버킷 보안 비밀을 만듭니다.
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_KEYPROJECT_NAMESPACE을 프로젝트 네임스페이스로 바꿉니다.사용자 인증 정보 변수를 설정합니다.
DST_CREDENTIALS=PROJECT_NAMESPACE/s3-bucket-credentials필요한 경우 버킷의 CA 인증서로 보안 비밀을 만들고 CA 인증서 변수를 설정합니다.
kubectl create secret generic -n PROJECT_NAMESPACE s3-bucket-ca \ --from-literal=ca.crt=REMOTE_CERTIFICATEREMOTE_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: StandardPROJECT_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값입니다.
버킷 보안 비밀 이름을 가져옵니다.
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=CERTIFICATECERTIFICATE을 스토리지 시스템의 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: 백업 버킷의 이름입니다.
백업 버킷 보안 비밀을 만듭니다.
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 인증서로 보안 비밀을 만듭니다.
kubectl create secret generic -n PROJECT_NAMESPACE s3-backup-bucket-ca \ --from-literal=ca.crt=BACKUP_CERTIFICATEBACKUP_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로그 액세스를 위한
Service이 있는StatefulSet객체로 인스턴스를 배포합니다.다음은
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
복원된 로그 보기
Loki 인스턴스에서 복원된 감사 로그를 볼 수 있도록 Grafana를 구성합니다.
- 프로젝트의 Grafana 엔드포인트를 엽니다. 자세한 내용은 로그 쿼리 및 보기를 참고하세요.
- 사용자 인터페이스의 탐색 메뉴에서 관리 > 데이터 소스를 클릭합니다.
- 새 데이터 소스 추가를 클릭합니다.
- 데이터 소스 추가 페이지에서 Loki를 선택합니다.
- 설정 페이지의 이름 필드에
Audit Logs - Restore를 입력합니다. HTTP 섹션의 URL 필드에 다음 값을 입력합니다.
http://audit-logs-loki-restore-pa.PROJECT_NAMESPACE.svc:3100맞춤 HTTP 헤더 섹션의 해당 필드에 다음 값을 입력합니다.
- 헤더:
X-Scope-OrgID - 값:
infra-obs
- 헤더:
그림 1에서 Loki가 데이터 소스 추가 페이지의 옵션으로 표시됩니다.

그림 1. 모니터링 인스턴스의 UI에 있는 데이터 소스 추가 페이지

그림 2. 모니터링 인스턴스의 UI에 있는 설정 페이지
이제 Audit Logs - Restore 옵션을 로그 탐색기에서 데이터 소스로 사용할 수 있습니다.