👌

WORM保管(S3 Object Lock)を用いたログ保管によるAWS環境のマルウェア感染時のリスク軽減

に公開

背景

近年、ランサムウェアや高度なマルウェアによる攻撃事例が増加している。これらの攻撃は、システム停止やデータ暗号化だけでなく、監査ログの改ざんや削除を狙うケースも存在しており、ログが削除・改ざんされてしまうと、原因究明や法令対応が困難になり、重大なリスクとなります。
そのため、ログのセキュアな保管と改ざん防止対策に注目集まっている。

ログの保管に対しては、下記対策等が取られることが多いですが改ざん防止まで実施できているとは言い切れない部分があります。

  • 別アカウントへのログ退避
  • クロスリージョン複製
  • SIEM連携によるリアルタイム監視

そこで今回は、S3の機能の一つであるObject Lockを用いたWORM(Write Once Read Many)による改ざん防止対策を検証する。AWSの S3 Object Lock は、保持期間中の削除・上書きを不可能にし、証跡の完全性を担保する機能である。本記事では、このWORM機能に着目し、機能検証を実施する。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/object-lock.html

S3 Object Lockについて

S3 Object Lock は、AWSが提供するS3バケットに対する改ざん防止機能で、WORM(Write Once Read Many)方式を実現する。これにより、指定した保管期間中、オブジェクトの削除や上書きが技術的に不可能になる。
基本的にはガバナンスモードにて設定値を確認し、コンプライアンスモードでログを保護する運用が一般的であると考えられる。

  • リテンションモード
    リテンションモードには二つのモードが存在する。

    • ガバナンスモード
      • 特別なアクセス許可を持たない限り、オブジェクトバージョンの上書きや削除、ロック設定を変更することはできない。
      • s3:BypassGovernanceRetentio権限を持つユーザのみが保持設定を変更したり、オブジェクトを削除したりするアクセス許可を付与することができる。
      • ガバナンスモードを使用して、コンプライアンスモードの保持期間を作成する前に、保持期間の設定のテストを実施することが推奨される。
    • コンプライアンスモード
      • rootユーザを含め、保護されたオブジェクトバージョンの上書き・削除を実施できない。
      • また、オブジェクトをロックすると、そのリテンションモードを変更することはできず、保持期間を短縮することができないため、設定期間には注意が必要である。
      • 公式HPには保持期間が切れる前にオブジェクトを削除するにはアカウント削除を実施するしか方法はないと明記されている。
  • リーガルホールド
    保持期間の設定が存在せず、リーガルホールドの解除権限を持つユーザが明示的に解除するまではオブジェクトの保護が実施される方式。

設計時のポイント

  1. S3設定値の制限
    S3にてWORM保管を実施する際は必ずオブジェクトのバージョニングを有効化する必要がある。
    オブジェクトロックを有効化した場合、オブジェクトロックを無効化することはできない。
  2. 保持期間の決定
    金融業界などでは監査のためにログの保持期間をxx年以上保持する必要がある等、要件が決まっている場合がある。業界・社内ポリシーに沿って保持期間を設定すること。
  3. モードの利用分け
    前述したようにコンプライアンスモードを利用した場合、rootユーザでさえオブジェクトの削除が実施できなくなる。そのため、ガバナンスモードにて設定値の確認・検証が完了後にガバナンスモードの利用を推奨する。
  4. 設定値不備の監視
    Configルールを用いることでObjectLockの設定が有効化されているかを確認できる。

設定方法

  1. バケットに対してオブジェクトロックを有効化する。
    1.1. バケットを新規作成する場合

    aws s3api create-bucket --bucket sample-bucket1 --object-lock-enabled-for-bucket
    

    1.2. 既存バケットに対して有効化する場合

    aws s3api put-object-lock-configuration --bucket sample-bucket1 --object-lock-configuration='{ "ObjectLockEnabled": "Enabled", "Rule": { "DefaultRetention": { "Mode": "COMPLIANCE", "Days": 50 }}}'
    
  2. S3オブジェクトに対してオブジェクトロックの保持期間を設定する。
    ModeおよびRetainUntilDateを変更することで所望の設定を導入することができる。

    aws s3api put-object-retention --bucket amzn-s3-demo-bucket1 --key my-image.fs --retention='{ "Mode": "GOVERNANCE", "RetainUntilDate": "2026-01-01T00:00:00" }'
    

設定漏れ監視

設計時のポイントにも記載したとおり、AWS Configを用いることで、オブジェクトロックの設定漏れを検知することができる。
Configのマネージドルールに「S3_BUCKET_DEFAULT_LOCK_ENABLED」というルールが存在しており、S3バケットにてオブジェクトロックが有効化されているかを確認することができる。

aws configservice put-config-rule --config-rule '{
  "ConfigRuleName": "s3-bucket-default-lock-enabled",
  "Source": {
    "Owner": "AWS",
    "SourceIdentifier": "S3_BUCKET_DEFAULT_LOCK_ENABLED"
  }
}'

まとめ

今回はS3 Object Lockを用いたS3オブジェクトのWORMを設定した。
近年のマルウェア感染等を踏まえて、監査ログや各種操作ログなどはWORMにて保管することが望ましいと感じる。
ただし、セキュリティ水準と運用効率、費用面のバランスを取るために、設計段階で保持期間・モード・監視を明確化し、例外管理を組み込むことが重要だと思った。

Discussion