🪣

AWS CLI で Malware Protection for S3 のクォータに該当するファイルを取得する

に公開

Amazon GuardDuty の Malware Protection for S3 は、S3バケットにアップロードされるオブジェクトを自動でスキャンしてくれる非常に強力なセキュリティ機能です🪣しかし、有効化する前に知っておくべき重要な「クォータ(上限)」が存在します。

もしクォータを超えるファイルがバケットに存在する場合、そのファイルはスキャンされずに見逃されてしまいます🙈

本記事では、クォータに該当する可能性のあるファイルをAWS CLIを使って事前に確認する方法を紹介します🚀

STEP 0: まずはクォータを理解する

Amazon GuardDutyの公式ドキュメントによると、注意すべきクォータは主に以下の3つです。

  • オブジェクトサイズ: スキャンされるS3オブジェクトの最大サイズは 5GB です。
  • アーカイブ内のファイル数: 1つのアーカイブ(.zipなど)から抽出されるファイルの最大数は 1,000個 です。
  • アーカイブの展開後サイズ: 抽出されるデータの最大合計サイズは 5GB です。

これらのクォータは、「Zip爆弾」のような特殊なファイルによる過剰なリソース消費を防ぎ、サービス全体を安定稼働させるために設けられています。

STEP 1: 5GBを超える巨大なファイルを特定する

最初のチェックとして、単体で5GBを超えるオブジェクトがバケットに存在しないかを確認します。

確認コマンド

# <YOUR_BUCKET_NAME> はご自身の環境に合わせてください
aws s3 ls s3://<YOUR_BUCKET_NAME> --recursive | awk '$3 > 5368709120'

また、条件に合うファイルを10件見つけたら自動で処理を停止するようにするコマンドは下記になります。「5GBを超えるファイルがあるかをとりあえず確認したい‼️」という時につかえます。

aws s3 ls s3://<YOUR_BUCKET_NAME> --recursive | awk '$3 > 5368709120 {print; i++; if (i >= 10) exit}'

コマンド解説

  • aws s3 ls ... --recursive: バケット内の全オブジェクトをリストアップします。
  • |: パイプ。左のコマンドの出力を右のコマンドへ渡します。
  • awk '$3 > 5368709120 {print; i++; if (i >= 10) exit}':
    • aws s3 ls の出力(YYYY-MM-DD HH:MM:SS SIZE FILENAME)を受け取ります。
    • $3 > 5368709120: 3番目のフィールド(サイズ)が5GB(5,368,709,120バイト)より大きい行を対象とします。
    • {print; i++; if (i >= 10) exit}: 条件に一致した行を表示し、カウンターを1増やします。カウンターが10に達したら、プロセスを終了します。

補足: Broken pipe エラーについて

条件に合うファイルを10件のみ出力するコマンドを実行すると、結果表示後に Broken pipe というエラーが出ることがあります。

これは、awkが10件見つけて処理を終えた後も、前段のaws s3 lsがデータを送り続けようとして「送信先がなくなった」ために発生するものです。コマンドの目的は達成できており、無駄な処理も停止しています。

もしこのエラー表示が気になる場合は、以下のようにawsコマンドのエラー出力だけを非表示にできます。

# awsコマンドを( )で囲み、エラー出力(2)を/dev/null(ゴミ箱)に捨てる
(aws s3 ls s3://<YOUR_BUCKET_NAME> --recursive) 2>/dev/null | awk '$3 > 5368709120 {print; i++; if (i >= 10) exit}'

STEP 2: クォータ超過の可能性があるアーカイブファイルを特定する

次に、ZIPファイルなどのアーカイブファイルがクォータ(ファイル数1,000個 or 展開後5GB)を超えていないかを確認します。これには2段階のアプローチが必要です。

1. 怪しいアーカイブファイルをサイズの大きい順にリストアップする

まずは、バケット内に存在するZIPファイルを、サイズの大きい順に並べて当たりをつけます。

aws s3 ls s3://<YOUR_BUCKET_NAME>/ --recursive | grep '\.zip$' | sort -k 3 -n -r

コマンド解説

  • grep '\.zip$': aws s3 ls の出力から、末尾が .zip で終わる行だけを抽出します。
  • sort -k 3 -n -r:
    • -k 3: 3番目のフィールド(サイズ)を基準にソートします。
    • -n: 文字列ではなく数値としてソートします。
    • -r: 降順(大きい順)でソートします。

2. 個別のアーカイブをダウンロードして中身を調査する

リストアップしたファイルの中で、サイズが大きいものや、多数のファイルを含んでいそうなものをローカルにダウンロードして、中身を詳しく調査します。

  1. ファイルをダウンロード

    aws s3 cp s3://<YOUR_BUCKET_NAME>/<KEY_TO_YOUR_ZIP_FILE> .
    
  2. 中身を確認

    • ファイル数を確認する(解凍なし)

      unzip -l <YOUR_ZIP_FILE.zip> | wc -l
      

      表示された行数が1,000に近い、あるいは超える場合はクォータ違反の可能性があります。

    • 展開後のサイズを確認する(ディスク容量に注意)

      # 安全のため一時ディレクトリを作成
      mkdir ./temp_unzip_dir
      
      # 展開して合計サイズを確認
      unzip <YOUR_ZIP_FILE.zip> -d ./temp_unzip_dir && du -sh ./temp_unzip_dir
      
      # 確認後は忘れずに削除
      rm -rf ./temp_unzip_dir
      

      du -sh で表示されたサイズが5GBに近い、あるいは超える場合はクォータ違反となります。

STEP 3: クォータ超過ファイルへの対応

もしクォータを超えるファイルが見つかった場合は、開発チームや関係者と相談し、以下のような対応を検討しましょう👀

  • そのファイルは現在も必要か? 不要であれば削除する。
  • 巨大なファイルの場合、分割してアップロードできないか?
  • 多数のファイルを含むアーカイブの場合、分割できないか?
  • そもそも、そのファイルはマルウェアスキャンの対象とすべきか? スキャン対象外のバケットに移動させることは可能か?

まとめ

Amazon GuardDuty の Malware Protection for S3は非常に有用ですが、その能力を最大限に活かすためには、スキャン対象がクォータの範囲内である必要があります。

今回ご紹介した方法で事前にバケット内を確認し、クォータを超えるファイルを特定・対処しておきましょう✨

以上、この記事がどなたかの参考になれば幸いです。えみり〜でした🐱

Discussion