このページでは、Google Distributed Cloud(GDC)エアギャップ アプライアンス環境の監査ログをリモート バックアップ バケットに安全に保存し、必要に応じてデータを保持して復元する方法について説明します。このプロセスには、これらのバックアップから過去の監査ログを復元するために必要なコンポーネントをインストールして構成する手順が含まれています。
バックアップにより、元のデータが失われたり破損したりした場合でも監査ログが保持されるため、要件を満たし、システム障害や誤って削除した場合に情報を復元できます。復元された監査ログにより、過去のデータにアクセスして、過去のイベント、セキュリティ インシデント、ユーザー アクティビティを分析できます。
監査ログのバックアップと復元プロセスを実装すると、データの完全性の維持、コンプライアンスの確保、履歴分析の有効化に役立ちます。
始める前に
次のリソースにアクセスできることを確認します。
- エンドポイント、シークレット アクセスキー、アクセスキー ID を含むバックアップ用のリモート バケット。
- ストレージ システムの認証局(CA)証明書。
- 動作中の Kubernetes クラスタ。
バックアップの管理に必要な権限を取得するには、プロジェクトの IAM 管理者に、プロジェクトの Namespace で次のいずれかのロールを付与するよう依頼してください。
- 監査ログ プラットフォーム復元バケット作成者
- 監査ログ プラットフォーム バケット閲覧者
必要なアクセスレベルと権限に応じて、プロジェクト Namespace のバックアップ バケット リソースに対する作成者ロールまたは閲覧者ロールを取得できます。これらのロールの詳細については、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 サーバーからプロジェクト Namespace のバケットを一覧表示します。
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
は、取得した 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
: バケットの名前。
リモート バケット シークレットを作成します。
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
は、プロジェクトの 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_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
)とプロジェクト Namespace を使用して、データ転送をモニタリングします。
すべてのデータが宛先バケットに転送されると、ジョブは終了します。
バックアップから監査ログを復元する
このセクションでは、リモート バケットのバックアップから監査ログを復元する手順について説明します。
復元されたログのバケットを作成する
復元された監査ログを保存するバケットを作成します。
復元バケットを作成します。
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
は、プロジェクトの 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
は、取得した 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
: バックアップ バケットの名前。
バックアップ バケットのシークレットを作成します。
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_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
)とプロジェクト Namespace を使用して、データ転送をモニタリングします。
すべてのデータが復元バケットに転送されると、ジョブは終了します。
復元されたログにアクセスする
提供された構成とデプロイ マニフェストを使用して、復元されたログにアクセスする 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
オプションが、ログ エクスプローラのデータソースとして使用できるようになりました。