要旨

データの安全な保持を行おうとした場合、2つの課題が考えられます。

  • 必要とする期間、削除されないことを保証するにはどうしたらいいか?
  • 案件が終了した際に、プロジェクトを削除するにはどうしたらいいか?

Google Cloud では、これらの機能は Retention により担保されています。
また、Google Cloud Project の誤った削除を防ぐため、Liens により保護されています。

Retention を利用すると、指定された期間において編集、更新、削除などからデータが保護されることが保証されます。
このような機能は、一般的に WORM (Write Once Read Many) と呼ばれ、一度だけの書き込みが許可されていつでも読み取ることが出来る機能を指しています。

用途としてはログや証跡の保存に利用されることが多い機能です。

この記事では、最初に Google Cloud Storage (GCS) や Logging Bucket を例に Retention を設定して WORM 特性について確認します。

その後、サービス終了などで証跡が不要となったときに削除するにはどうしたらいいか、 確認します。

Google Cloud で WORM を実現する。

GCS と Logging Bucket に Retention を設定します。

Retention には、『設定』と『ロック』という 2段階の設定が必要となります。
『設定』段階では、オブジェクトの削除などを行うことができなくなりますが、『Retention の設定』を変更することは出来てしまいます。
『ロック』を行うことで、Retention の設定がロックされ、変更不可能となります。
実際の運用では、『設定』だけでなく、『ロック』を忘れずに実施してください。

この章では、GCS で Retention を設定すると、オブジェクト単位に上書きや削除を行おうとした際に、操作が失敗することを確認します。

また、当たり前のことですが、 Retention の2段階の設定を完了すると、設定変更を含めてデータを削除することが出来なくなります。

商用環境や、共用の検証環境で実施する際は、データが削除できなくなるため注意してください。
全ての手順を試す場合には、プロジェクトの削除まで実施するため、検証用に新たに作成したプロジェクトで実施してください。

Google Cloud Storage

Retention の設定

GCS では、Bucket の作成時や既存の Bucket に対して Retention を設定できます。

ここでは、既存の Bucket に対して Retention を設定する方法を解説します。
Google Cloud のドキュメントでは 保持ポリシーの使用とロック に記載があります。

Bucket 詳細の『保持』には、『保持(コンプライアンス用)』というメニューがあります。
ここが、Retention 設定のメニューとなります。

データ削除時の復旧を目的とした『削除 (復旧可能) ポリシー (データ復旧用)』というメニューも有るため、設定箇所に注意してください。

ここで、『保持ポリシーを設定』を選択して、保持期間を設定して保存します。

これで、Retention Policy を有効化することが出来ました。

保持ポリシーの確認

先ほど設定した Retention Policy により WORM 特性をもった Bucket となったことを確認します。

まずは、既に dummy.png が格納された Bucket に再度 dummy.png を上書きで保存してみます。

すると、アップロードオペレーションが失敗したことが確認できました。
アップロード時は失敗の詳細は出ずに、エラーとなりました。

続いて、dummy.png を削除してみます。

すると、削除が失敗して失敗の理由が確認できました。
該当のオブジェクトが Retention Policy に準拠しない削除操作のために失敗したエラーが表示されました。

このように、Retention Policy を利用することで、上書きや削除などの操作からオブジェクトを保護することが可能となります。

設定のロック

現在の状態では、悪意ある管理者が Retention Policy を削除することが可能なため、設定ロックを行ってみます。

設定画面で、ロックを選択します。

確認画面がでるため、ここで『ポリシーをロック』を選択することでロックすることが可能です。

ロック後は、削除が不可となり、編集でも期間を短くする編集は出来なくなっています。

Cloud Logging

Cloud Logging は、デフォルトで 30日間の Retention Policy が適用されています。

その他、カスタム保持期間 を構成することも可能です。

設定のロック

Cloud Logging も バケットをロック することが可能です。
この手順は、gcloud が必要なため、Cloud Shell などでの操作が必要となります。

gcloud logging buckets update BUCKET_ID --location=LOCATION --locked とコマンドを発行して、ロックします。
ロック後は、GCS と同様に保持期間を変更することは出来ません。

$ gcloud logging buckets update shirousa-test-logging --location=global --locked 
WARNING: Locking a bucket cannot be undone.

Do you want to continue (y/N)?  y

設定後は設定変更が失敗するようになり、設定が保持されます。

以上のように、Retention Policy データが消失するような操作から、データを保護することが可能です。

Liens による Project 削除防止と、Liens の削除

Retention Policy を作成したバケットは、通常の操作では消すことはできなくなります。
通常時はこれが正しい操作ですが、案件終了時に消すことが出来ないのは困ります。

Retention Policy を構成していても、『プロジェクトの削除』は可能です。
しかし、設定ロックをしたタイミングでプロジェクトに Liens が書き込まれます。

Liens により、プロジェクトが保護 されています。

Liens の操作には、『オーナー』などの強力なロールが必要となります。
最小権限では、『プロジェクト リーエンの変更』などの権限が必要です。

Liens の操作は Console では提供されておらず、Cloud Shell などでの操作が必要です。

$ gcloud alpha resource-manager liens list
NAME: pXXXXXXXXXXXXX-XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
ORIGIN: storage.googleapis.com
REASON: A lien is put on project deletion because one or more Cloud Storage resources were put under retention.

この Liens がある段階では、Project は削除することが出来ません。

Liens の削除と、プロジェクトの削除

Project が削除出来ない事を確認出来たため、Cloud Shell を用いて Liens を削除します。

$ gcloud alpha resource-manager liens list --format json | \
jq -r '.[] | .name | ltrimstr("liens/") | @sh' | \
xargs -t -I LIENS gcloud alpha resource-manager liens delete LIENS 

これにより、Liens は削除され、Project は削除できるようになります。

先ほどと同様に Project の削除操作を行うと、適切に削除ができることが確認できました。

まとめ

Google Cloud でデータの保全を考えたときに、保持ポリシーはよく聞く機能かと思います。
しかし、機能は聞いたことはあっても、実際のオペレーションは想像が難しい分野の一つであると思います。

実は、PoC として小規模に実施するなら保持ポリシーは実装や終了処理が難しいものではありません。

Google Cloud のデータ保全に関する機能は実際にどのようなものであるか、是非試してみてください。