백업 및 복원 감사 로그 만들기

이 페이지에는 백업을 만드는 데 필요한 구성요소를 설치하고 구성하는 단계가 나와 있습니다. 또한 백업에서 이전 감사 로그에 대한 액세스 권한을 복원하고 복구하는 방법도 설명합니다.

원격 버킷에 백업 설정

이 섹션에는 S3 호환 버킷에 감사 로그 백업을 만드는 단계가 포함되어 있습니다.

시작하기 전에

감사 로그의 백업을 만들려면 다음 리소스에 액세스할 수 있어야 합니다.

  • 엔드포인트, 보안 비밀 액세스 키, 액세스 키 ID가 있는 원격 S3 버킷
  • 스토리지 시스템의 인증 기관 (CA) 인증서입니다.
  • 작업 클러스터

소스 버킷에 액세스할 사용자 인증 정보 가져오기

다음 단계를 따라 감사 로그가 포함된 버킷의 사용자 인증 정보를 찾습니다.

  1. 루트 관리자 클러스터에서 프로젝트 네임스페이스의 버킷을 나열합니다.

    kubectl get bucket -n PROJECT_NAMESPACE
    

    출력은 감사 로깅 버킷에 이름과 엔드포인트가 표시되는 다음 예시와 같아야 합니다.

    NAME                          BUCKET NAME                   DESCRIPTION                                                         STORAGE CLASS   FULLY-QUALIFIED-BUCKET-NAME         ENDPOINT                                       REGION   BUCKETREADY   REASON                    MESSAGE
    audit-logs-loki-all           audit-logs-loki-all           Bucket for storing audit-logs-loki-all logs                         Standard        wwq2y-audit-logs-loki-all           https://appliance-objectstorage.zone1.google.gdch.test   zone1    True          BucketCreationSucceeded   Bucket successfully created.
    cortex-metrics-alertmanager   cortex-metrics-alertmanager   storage bucket for cortex metrics alertmanager configuration data   Standard        wwq2y-cortex-metrics-alertmanager   https://appliance-objectstorage.zone1.google.gdch.test   zone1    True          BucketCreationSucceeded   Bucket successfully created.
    cortex-metrics-blocks         cortex-metrics-blocks         storage bucket for cortex metrics data                              Standard        wwq2y-cortex-metrics-blocks         https://appliance-objectstorage.zone1.google.gdch.test   zone1    True          BucketCreationSucceeded   Bucket successfully created.
    cortex-metrics-ruler          cortex-metrics-ruler          storage bucket for cortex metrics rules data                        Standard        wwq2y-cortex-metrics-ruler          https://appliance-objectstorage.zone1.google.gdch.test   zone1    True          BucketCreationSucceeded   Bucket successfully created.
    ops-logs-loki-all             ops-logs-loki-all             Bucket for storing ops-logs-loki-all logs                           Standard        wwq2y-ops-logs-loki-all             https://appliance-objectstorage.zone1.google.gdch.test```
    
  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. 이전 단계에서 선택한 버킷의 비밀을 가져옵니다.

    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'
    

    출력은 다음 예시와 같이 버킷의 보안 비밀 이름이 표시되어야 합니다.

    "object-storage-key-sysstd-sa-olxv4dnwrwul4bshu37ikebgovrnvl773owaw3arx225rfi56swa"
    
  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. 다음 환경 변수를 설정합니다.

    SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/audit-log-loki-ca
    

원격 버킷에 액세스할 사용자 인증 정보 가져오기

다음 단계를 따라 백업을 만들려는 버킷의 사용자 인증 정보를 찾습니다.

  1. 다음 환경 변수를 설정합니다.

    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. 원격 버킷의 보안 비밀을 만듭니다.

    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
    
  3. 다음 환경 변수를 비밀 위치로 설정합니다.

    DST_CREDENTIALS=PROJECT_NAMESPACE/s3-bucket-credentials
    
  4. 대상 버킷에 CA 인증서를 설정해야 하는 경우 버킷의 CA 인증서로 보안 비밀을 만듭니다.

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

    REMOTE_CERTIFICATE을 대상 원격 버킷의 CA 인증서로 바꿉니다.

  5. 인증서 위치를 사용하여 다음 환경 변수를 설정합니다.

    DST_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-bucket-ca
    

감사 로그 전송 설정

다음 단계에 따라 백업을 위해 소스 버킷에서 대상 버킷으로 감사 로그 전송을 구성합니다.

  1. 감사 로그 전송 작업의 서비스 계정을 만듭니다. 프로젝트 네임스페이스에서 소스 버킷과 비밀을 읽을 수 있도록 서비스 계정에 대한 액세스 권한을 제공해야 합니다.

    kubectl apply -f - <<EOF
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: audit-log-transfer-sa
      namespace: PROJECT_NAMESPACE
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: read-secrets-role
      namespace: PROJECT_NAMESPACE
    rules:
    - apiGroups: [""]
      resources: ["secrets"]
      verbs: ["get", "watch", "list"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: read-secrets-rolebinding
      namespace: PROJECT_NAMESPACE
    subjects:
    - kind: ServiceAccount
      name: audit-log-transfer-sa
      namespace: PROJECT_NAMESPACE
    roleRef:
      kind: Role
      name: read-secrets-role
      apiGroup: rbac.authorization.k8s.io
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: audit-log-read-bucket-role
      namespace: PROJECT_NAMESPACE
    rules:
    - apiGroups:
      - object.gdc.goog
      resourceNames:
      - $SRC_BUCKET # Source bucket name
      resources:
      - buckets
      verbs:
      - read-object
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: audit-log-transfer-role-binding
      namespace: PROJECT_NAMESPACE
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: audit-log-read-bucket-role
    subjects:
    - kind: ServiceAccount
      name: audit-log-transfer-sa
      namespace: PROJECT_NAMESPACE
    ---
    EOF
    
  2. 로그를 원격 버킷으로 내보내는 전송 작업을 만듭니다.

    kubectl apply -f - <<EOF
    ---
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: audit-log-transfer-job
      namespace: PROJECT_NAMESPACE
    spec:
      template:
        spec:
          serviceAccountName: audit-log-transfer-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.
    ---
    EOF
    

작업을 예약한 후 작업 이름을 audit-log-transfer-job로, 프로젝트 네임스페이스를 입력하여 데이터 전송을 모니터링할 수 있습니다.

모든 데이터가 대상 버킷으로 전송되면 작업이 종료됩니다.

백업에서 감사 로그 복원

이 섹션에는 백업에서 감사 로그를 복원하는 단계가 포함되어 있습니다.

시작하기 전에

감사 로그를 복원하려면 다음 리소스에 액세스할 수 있어야 합니다.

  • 엔드포인트, 보안 비밀 액세스 키, 액세스 키 ID가 있는 감사 로그 백업 버킷
  • 스토리지 시스템의 인증 기관 (CA) 인증서입니다.
  • 작업 클러스터

감사 로그를 복원할 버킷 만들기

다음 단계를 따라 복원된 감사 로그를 저장할 버킷을 만듭니다.

  1. 버킷 리소스와 서비스 계정을 만듭니다.

    kubectl apply -f - <<EOF
    ---
    apiVersion: object.gdc.goog/v1
    kind: Bucket
    metadata:
      annotations:
        object.gdc.goog/audit-logs: IO
      labels:
        logging.private.gdch.goog/loggingpipeline-name: default
      name: audit-logs-loki-restore
      namespace: PROJECT_NAMESPACE
    spec:
      bucketPolicy:
        lockingPolicy:
          defaultObjectRetentionDays: 1
      description: Bucket for storing audit-logs-loki logs restore
      storageClass: Standard
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: audit-logs-loki-restore-buckets-role
      namespace: PROJECT_NAMESPACE
    rules:
    - apiGroups:
      - object.gdc.goog
      resourceNames:
      - audit-logs-loki-restore
      resources:
      - buckets
      verbs:
      - read-object
      - write-object
    ---
    apiVersion: v1
    automountServiceAccountToken: false
    kind: ServiceAccount
    metadata:
      labels:
        logging.private.gdch.goog/loggingpipeline-name: default
      name: audit-logs-loki-restore-sa
      namespace: PROJECT_NAMESPACE
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: audit-logs-loki-restore
      namespace: PROJECT_NAMESPACE
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: audit-logs-loki-restore-buckets-role
    subjects:
    - kind: ServiceAccount
      name: audit-logs-loki-restore-sa
      namespace: PROJECT_NAMESPACE
    EOF
    

    버킷과 보안 비밀이 생성됩니다.

  2. 생성된 버킷을 확인합니다.

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

    출력은 다음 예시와 같이 표시되어야 합니다. 버킷을 만드는 데 몇 분 정도 걸릴 수 있습니다.

    NAME                      BUCKET NAME               DESCRIPTION                                       STORAGE CLASS   FULLY-QUALIFIED-BUCKET-NAME     ENDPOINT                                       REGION   BUCKETREADY   REASON                    MESSAGE
    audit-logs-loki-restore   audit-logs-loki-restore   Bucket for storing audit-logs-loki logs restore   Standard        dzbl6-audit-logs-loki-restore   https://objectstorage.zone1.google.gdch.test   zone1    True          BucketCreationSucceeded   Bucket successfully created.
    

    출력에 생성한 버킷이 표시되어야 합니다. 버킷을 만드는 데 몇 분 정도 걸릴 수 있습니다.

  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. 생성된 버킷의 보안 비밀을 가져옵니다.

    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'
    

    출력은 다음 예시와 같이 버킷의 보안 비밀 이름이 표시되어야 합니다.

    "object-storage-key-sysstd-sa-olxv4dnwrwul4bshu37ikebgovrnvl773owaw3arx225rfi56swa"
    
  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. 인증서 위치에 다음 환경 변수를 설정합니다.

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

백업 버킷에 액세스할 사용자 인증 정보 획득

다음 단계를 따라 감사 로그의 백업이 포함된 버킷의 사용자 인증 정보를 찾습니다.

  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: 백업 버킷의 액세스 보안 비밀입니다.
    • REMOTE_ENDPOINT: 백업 버킷의 엔드포인트입니다.
    • REMOTE_BUCKET_NAME: 백업 버킷의 이름입니다.
  2. 백업 버킷의 보안 비밀을 만듭니다.

    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. 버킷의 CA 인증서로 보안 비밀을 만듭니다.

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

    BACKUP_CERTIFICATE을 백업 버킷의 CA 인증서로 바꿉니다.

  5. 인증서 위치를 사용하여 다음 환경 변수를 설정합니다.

    SRC_CA_CERTIFICATE=PROJECT_NAMESPACE/s3-backup-bucket-ca
    

감사 로그 복원 설정

다음 단계를 따라 백업 버킷에서 복원 버킷으로 감사 로그 전송을 구성합니다.

  1. 감사 로그 전송 작업의 서비스 계정을 만듭니다. 프로젝트 네임스페이스의 버킷과 보안 비밀을 읽고 쓸 수 있는 서비스 계정에 대한 액세스 권한을 제공해야 합니다.

    kubectl apply -f - <<EOF
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: audit-log-restore-sa
      namespace: PROJECT_NAMESPACE
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: read-secrets-role
      namespace: PROJECT_NAMESPACE
    rules:
    - apiGroups: [""]
      resources: ["secrets"]
      verbs: ["get", "watch", "list"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: read-secrets-rolebinding-restore
      namespace: PROJECT_NAMESPACE
    subjects:
    - kind: ServiceAccount
      name: audit-log-restore-sa
      namespace: PROJECT_NAMESPACE
    roleRef:
      kind: Role
      name: read-secrets-role
      apiGroup: rbac.authorization.k8s.io
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: audit-log-restore-bucket-role
      namespace: PROJECT_NAMESPACE
    rules:
    - apiGroups:
      - object.gdc.goog
      resourceNames:
      - $DST_BUCKET # Source bucket name
      resources:
      - buckets
      verbs:
      - read-object
      - write-object
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: audit-log-restore-role-binding
      namespace: PROJECT_NAMESPACE
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: audit-log-restore-bucket-role
    subjects:
    - kind: ServiceAccount
      name: audit-log-restore-sa
      namespace: PROJECT_NAMESPACE
    ---
    EOF
    
  2. 원격 백업 버킷에서 로그를 복원하는 전송 작업을 만듭니다.

    kubectl apply -f - <<EOF
    ---
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: audit-log-restore-job
      namespace: PROJECT_NAMESPACE
    spec:
      template:
        spec:
          serviceAccountName: audit-log-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.
    ---
    EOF
    

작업을 예약한 후 작업 이름을 audit-log-restore-job로, 프로젝트 네임스페이스를 입력하여 데이터 전송을 모니터링할 수 있습니다.

모든 데이터가 대상 버킷으로 전송되면 작업이 종료됩니다.

감사 로그 인스턴스를 배포하여 로그에 액세스

복원된 로그에 액세스하려면 감사 로그 인스턴스라고도 하는 Loki 인스턴스를 배포해야 합니다.

감사 로그 인스턴스를 설정하려면 복원 작업을 위해 만든 audit-log-restore-sa 서비스 계정을 사용하세요. 다음 단계를 따라 인스턴스를 배포합니다.

  1. 인스턴스 구성의 ConfigMap 객체를 만듭니다.

    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: audit-logs-loki-restore
      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
    EOF
    
  2. 복원 버킷에서 로그에 액세스하는 서비스로 인스턴스를 배포합니다.

    kubectl apply -f - <<EOF
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      labels:
        app: audit-logs-loki-restore
        logging.private.gdch.goog/loggingpipeline-name: default
      name: audit-logs-loki-restore
      namespace: PROJECT_NAMESPACE
    spec:
      persistentVolumeClaimRetentionPolicy:
        whenDeleted: Retain
        whenScaled: Retain
      podManagementPolicy: OrderedReady
      replicas: 1
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: audit-logs-loki-restore
      serviceName: audit-logs-loki-restore
      template:
        metadata:
          labels:
            app: audit-logs-loki-restore
            app.kubernetes.io/part-of: audit-logs-loki-restore
            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
                  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
            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-logs-loki-restore-sa
          serviceAccountName: audit-logs-loki-restore-sa
          terminationGracePeriodSeconds: 4800
          volumes:
          - emptyDir: {}
            name: temp
          - configMap:
              defaultMode: 420
              name: audit-logs-loki-restore
            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
      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
      sessionAffinity: None
      type: ClusterIP
    ---
    EOF
    

데이터 소스의 로그를 볼 수 있도록 모니터링 인스턴스 구성

다음 단계를 따라 감사 로그 인스턴스에서 복원된 감사 로그를 볼 수 있도록 모니터링 인스턴스라고도 하는 Grafana를 구성합니다.

  1. 프로젝트의 모니터링 인스턴스 엔드포인트로 이동합니다.
  2. 사용자 인터페이스 (UI)의 탐색 메뉴에서 관리 > 데이터 소스를 클릭합니다.
  3. 새 데이터 소스 추가를 클릭합니다.
  4. 데이터 소스 추가 페이지에서 Loki를 선택합니다.
  5. 설정 페이지에서 이름 필드의 값으로 Audit Logs - Restore을 입력합니다.
  6. HTTP 섹션의 URL 필드에 다음 값을 입력합니다.

    http://audit-logs-loki-restore.PROJECT_NAMESPACE.svc:3100
    
  7. 맞춤 HTTP 헤더 섹션의 해당 필드에 다음 값을 입력합니다.

    • 헤더: X-Scope-OrgID
    • 값: infra-obs

그림 1에서 Loki는 모니터링 인스턴스 UI의 데이터 소스 추가 페이지에 옵션으로 표시됩니다. 그림 2의 설정 페이지에는 데이터 소스를 설정하기 위해 작성해야 하는 필드가 표시되어 있습니다.

Loki 옵션이 UI의 데이터 소스 추가 페이지에 데이터 소스로 표시됩니다.

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

Loki를 데이터 소스로 구성하는 데 필요한 필드가 설정 페이지에 표시됩니다.

그림 2. 모니터링 인스턴스의 UI에 있는 설정 페이지

이제 Audit Logs - Restore 옵션을 로그 탐색기에서 데이터 소스로 사용할 수 있습니다.