S3 で WORM を使ったランサムウェア対策をやってみる (Object Lock)

# はじめに

世界中の企業や組織が、ランサムウェア攻撃にさらされています。ランサムウェアは、システムやデータに不正にアクセスし、そのデータを暗号化して正規ユーザーのアクセスを遮断するように設計された悪質なコードです。海外の例ですが、海運大手の会社がマルウェア攻撃を受けて、3億ドルほどの損失が被害報告されています。この報告で印象的なのが、ウイルス対策とパッチ管理を行っているのにもかかわらず、こういった被害を受けている点です。次の URL から引用しています。
https://digitalguardian.com/blog/cost-malware-infection-maersk-300-million



AWS 上で動かしているシステムでこういった攻撃を防ぐためにどういった対策が考えられるでしょうか。AWS が公開している e-book 「Securing your AWS Cloud environment from ransomware」が参考になります。
https://aws.amazon.com/jp/blogs/news/securing-aws-cloud-environment-ransomware-new-ebook/



この e-book の中には、次のような対策が書かれています。

- Amazon VPC でセキュリティグループやネットワーク ACL を使って環境を分離する
- IAM で割り当てる権限を必要最低限に抑える
- AWS Backup を使ったバックアップや、AWS Elastic Disaster Recovery を使った復元
- 脆弱性管理のための Amazon Inspector や、パッチ適用のための AWS Systems Manager Path Manager の利用
- インシデントの早期発見である Amazon GuardDuty



また、上記に書かれている「データのバックアップを取得する」ことに加えて、バックアップデータそのものを保護する点も重要だと書かれています。バックアップデータを S3 に格納したときに、データを保護するための WORM の考え方と実現方法を紹介していきます。

念のため補足ですが、S3 側の対策だけではなく、上記で挙げられているような包括的なセキュリティ対策も加えることで、よりセキュアな環境が実現できます。



# S3 で WORM を実現

ランサムウェアによって、S3 に格納したバックアップデータの暗号化や削除を防ぐために、WORM(Write Once Read Many) という考え方を取り入れることができます。名前の通り、書き込みは1回限りで、それ以降は読み込み専用にすることで、ランサムウェアによる悪意のある操作を防ぐものです。大切なデータを読み取り専用の形で保管出来るため、書き込み操作による暗号化のリスクを無くして、いつでも復元できるような状態にできます。

S3 で WORM を実現するために、オブジェクトロックという機能が利用できます。S3 バケット上で新たなファイル作成した後、そのファイルに対する更新や削除を禁止する機能です。ランサムウェアが S3 上のバックアップデータを暗号化しようと思っても、その操作を防いでくれるため、大事なデータをしっかり守ることが出来ます。

オブジェクトロック機能には、Governance モードや Compliance モードがあります。

- Governance モード : 特定の権限を持っているユーザは削除できるモード
- Compliance モード : Root ユーザー含めて、だれも削除できないモード

Compliance モードは、一度アップロードしたら誰も削除・更新が出来なくなるモードとなっており、本番環境で厳密に管理したいときに使いやすいと思います。



それでは、オブジェクトロックの設定方法を、ざっと見ていきましょう。



# S3 バケットで オブジェクトロックを有効化

S3 バケットを新規作成するときに、オブジェクトロックを有効化できます。Create bucket を押します。

![image-20220611151335461.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/488bca38-74c7-7959-1636-0a4ea88afc36.png)



適当にバケット名を入れます

![image-20220611151407885.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/5d020823-100f-36ac-b980-965f34fa78fc.png)



Advanced settings からオブジェクトロックの有効化が可能です。「本当に Object Lock を有効化するか？」と確認のメッセージが表示されています。

![image-20220611151750335.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/aeb274af-a640-4000-4b8c-5213c212409c.png)



S3 バケット作成後、バケットの詳細画面を開き、Properties を見に行きます。

![image-20220611154121891.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/89e082dd-f66e-a4c6-4143-773d9e80b242.png)



Object Lock の欄があります。Default retention が Disabled なので、有効化していきます。Edit を押します。

![image-20220611154203345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c9da2bb5-243d-2836-9ece-1ecc0dda80e2.png)



S3 バケットで新規ファイルを作成する際の、デフォルトのオブジェクトロックの挙動を指定できます。2つのモードが選べます。

- Governance モード : 特定の権限を持っているユーザは削除できるモード
- Compliance モード : Root ユーザー含めて、だれも削除できないモード

機能検証なので Governance モードを選びます。Compliance モードは非常に強力で、だれも削除できないモードで安心できますが、一方、本当に誰も削除できないので慎重に触るのをおすすめします。

![image-20220611154257346.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/90ec58b3-a1f0-b9ab-6028-04066242b778.png)



S3 バケットで、オブジェクトロックの設定をしました。これから新規ファイルをアップロードする際に、自動的にオブジェクトロックが有効になります。

![image-20220611154648304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/0828d379-c1a0-8145-e4e6-c07669f8576a.png)



なお、Compliance モードの場合も、期間を指定できます。

![image-20220611154437201.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/dd443a64-bba9-7b69-12ca-ead483a4d0eb.png)



# ファイルをアップロード

マネージメントコンソールから、ファイルのアップロードを試していきます。

![image-20220611172220444.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/75067baf-2484-e115-c3b9-4cebd8d614a4.png)



アップロードするときに、オブジェクトロックの属性を指定することはできますが、マネージメントコンソールからは出来ません。

![image-20220611172254087.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ba996a84-2a94-1c21-8f8a-9661393680b4.png)



このまま Upload をします

![image-20220611172303795.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/f42cb888-a46b-0833-1d26-804aa94bd240.png)



アップロードしたオブジェクトの詳細画面を開きます。

![image-20220611172428004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b976e164-667f-24a8-d5a7-1c4ae52d5932.png)



Object Lock retention のところに、このファイルのオブジェクトロックの状態が確認できます。**Governance mode となっており、有効期限も表示されています。**

Edit をおしてみましょう。

![image-20220611172715773.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/adbd947f-ce1c-e620-2f43-46ae49ff3c5b.png)



オブジェクト単位で、属性の変更が出来ます。一度、コンプライアンスモードに変更してみます。

- オブジェクトロックの有無
- モードの変更
- 有効期限

![image-20220611172855244.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/ce3af3d8-526c-964d-a258-899dbdc59bbb.png)



ちなみに、Compliance モードから、Governance mode に変更することはできません。

![image-20220611173017250.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/11d4bf13-d416-cb16-5099-50d40e6830ca.png)



# 削除を試す

コンプライアンスモードになっているオブジェクトの削除が失敗するか確認をしていきます。オブジェクトを選択して、Delete を押します。

![image-20220611173117910.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/b5858a19-35db-e32c-7c05-c019a1d25055.png)



delete を押します。

![image-20220611173134957.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/da7b9a60-ec4f-4e62-61e7-590011a4eb98.png)



一見削除できてしまったように見えますが、ここで Show versions を押します。

![image-20220611173208189.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/8c790286-7362-b65a-15fb-1605c8c5ec4b.png)



すると、S3 上でバージョン管理されている前世代のデータが見えます。オブジェクトロック機能は、バージョニング管理されている中で、特定のバージョンのオブジェクトの削除を防ぐ機能になっています。

過去のオブジェクトを選択して、Delete を押します。

![image-20220611173232229.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c865987b-6610-9ab3-33a8-58d152ea2e85.png)



permanently delete 入力して、Delete objects を押します

![image-20220611173249920.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c65bca9c-9196-8099-a5e3-1b61e3659d82.png)



削除できません。これで、一度アップロードしたファイルは、WORM モデルに従って悪意のある暗号化や削除が出来ない状態を確認できました。

![image-20220611173305407.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/3b57c784-d937-6d18-28d1-e9a1915a53f4.png)



なお、Download は問題なくできます

![image-20220611173334679.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/c4e5ada8-9b5a-63bf-eb37-b1f9ac8b9da8.png)



# 検証を通じてわかったこと

- オブジェクトロックを利用すると、バージョニング機能も強制的に有効になる
- S3 Bucket を作成するときに、オブジェクトロックを有効化出来る。後から有効化したいときは、AWS サポートに依頼する必要がある
![image-20220611150848546.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1002774/73cc7906-4293-45ba-db40-1651c4709c8f.png)
- オブジェクトロックには、2つのモードがある。より厳密にデータを保護したい場合は、Compliance モードが良いと思われるが、Administrator も削除できないので注意。
  - Governance モード : 特定の権限を持っているユーザは削除できるモード
  - Compliance モード : Root ユーザー含めて、だれも削除できないモード
- `AmazonS3FullAccess` などの強い権限に対して、ガバナンスモードでの削除・上書き操作を制限したい場合は、 `s3:BypassGovernanceRetention` 権限を Deny にすると良い
  - Deny を定義した IAM Policy を IAM Group や Role などに紐づけると良さそう
- バケット単位で、新規にオブジェクトがアップロードされたときのオブジェクトロックのデフォルト値を指定できる
- オブジェクトロック機能は、バージョニング管理されている中で、特定のバージョンのオブジェクトの削除を防ぐ機能
  - `Show versions` で表示される特定の世代の削除が出来ない
- 同じ名前のオブジェクトをアップロードすると、アップロードが出来る
  - 前の世代のものは、バージョニングにより前世代として管理されている
- リーガルホールド機能は、有効期限が無制限の機能。



# 参考URL

S3オブジェクトのロック（なにをどうやっても改竄削除が不可）がリリースされました！ #reinvent
https://dev.classmethod.jp/articles/s3-object-lock/

S3 オブジェクトロックの使用
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/object-lock.html