Amazon Macie の導入と運用
はじめに
セキュリティ強化の一環で Amazon Macie 導入し、運用体制を整備したので、それまでのプロセスで得た知見やノウハウをまとめます
Amazon Macieとは
機械学習とパターンマッチングを活用してS3バケット内の機密データを自動的に検出・分類するAWSのセキュリティサービスです。個人情報、クレジットカード情報、知的財産などの機密データを継続的に監視し、データプライバシー規制への対応やセキュリティリスクの軽減を支援します。
主な機能として、事前定義されたデータパターンによる自動検出、カスタム識別子による組織固有のデータパターン検出、検出結果の詳細レポート生成、AWS Security Hubとの連携などがあります。
識別子
Macieの機密データ検出は「データ識別子」という仕組みで実現されています。データ識別子は、特定のデータパターンを定義するルールセットで、S3オブジェクトをスキャンする際にこれらのパターンとマッチするデータを検出します。
データ識別子にはAWSが事前定義したマネージド識別子と、独自パターンを設定できるカスタムデータ識別子の2種類があります。
マネージド識別子は、クレジットカード番号、SSN、日本のマイナンバーなど、一般的な機密データパターンが事前に定義されています。詳細は公式ドキュメントをご参照ください。
カスタムデータ識別子は、正規表現によるパターンマッチング、キーワードとの組み合わせ、最大一致距離などの設定項目があり、社員ID、内部システムのユーザー識別子、独自の製品コードなど、組織特有のデータパターンを検出できます。ただし、正規表現やキーワードを適切に設定する必要があり、検出精度は設定内容に大きく左右されます。詳細は公式ドキュメントをご参照ください。
今回は、組織固有のデータパターンに対応するため、以下のようなカスタムデータ識別子を設定しました。
- 正規表現のみで検出可能なもの
- メールアドレス
- 国コード含む電話番号(携帯、市外局番)
- IPアドレス
- パスポート番号
- 正規表現 + キーワード + 最大一致距離が必要なもの
- ユーザーID
- 生年月日
- 氏名
- 国コード含まない電話番号(携帯、市外局番)
- FAX番号
スキャン方式の選択
Macieには、ジョブ型スキャンと自動スキャンの2つのスキャン方式があります。
ジョブ型スキャンは、ユーザーが手動で作成・実行するスキャンです。対象バケット、スキャン頻度、使用する識別子を詳細に設定でき、スキャンのタイミングやコストを予測しやすい利点があります。一回限りの実行や定期スケジュール実行も選択可能です。また、既存のS3オブジェクトを含めてスキャン(フルスキャン)するか、新規追加・変更されたオブジェクトのみをスキャン(差分スキャン)するかも選択できます。
自動スキャンは、Macieが継続的にS3バケットインベントリを評価し、サンプリング技術でオブジェクトを自動選択・分析する方式です。デフォルトでは全てのS3汎用バケットが対象となり、継続的な監視が可能です。
今回の導入では、初回のフルスキャンでコストと検出精度を確認したかったことと、運用開始後もスキャンタイミングとコストを制御したかったことから、ジョブ型スキャンを選択しました。
S3 に関する情報整理
Macieの検出を実行する前に、現状の S3 オブジェクトについて情報整理を実施しました。
まず、各S3バケットに保存されている機密情報の種類を把握するため、開発チームや運用チームへのヒアリングを実施しました。同時に、オブジェクト形式に適した識別子を設定するため、保存されているファイルの拡張子も調査しました。
これらの情報をスプレッドシートで一覧化し、フルスキャン結果との比較に活用しました。
コスト見積り
まずは既存の全オブジェクトに対してフルスキャンを実施する想定であったため、事前にコスト試算を実施しました。
Macieの料金体系(S3バケット数、オブジェクト数、データサイズによる課金)に基づいて計算した結果、当社の場合、フルスキャン1回で約$2,000のコストがかかることが判明しました。料金の詳細は公式ドキュメントをご確認ください。
予算としては許容範囲内でしたが、まずは無料トライアルを実施して、実際のコストとカスタムデータ識別子の精度を確認してみることにしました。
無料トライアルの実施と結果
公式ドキュメントにある通り、無料トライアル中はスキャン容量がアカウントあたり最大で150GBまでになるので注意が必要です。また一度開始すると中断できません。
無料トライアル終了後に、150GBの推定コストから逆算して総容量分のコストを計算し、見積りと大きく乖離していないことが確認できました。
カスタムデータ識別子の精度については、正規表現のみでのマッチングで高い精度で検知できたのはメールアドレスのみでした。またキーワードと最大一致距離を組み合わせたマッチングでは、予想通り、JSON以外のオブジェクトに対しては誤検知が多発することが確認できたため、Json とそれ以外のオブジェクトで適用する識別子を分けて設定することにしました。
フルスキャン結果の分析
無料トライアル後にフルスキャンを実施したところ、数万件レベルで機密情報が検出されました。この中には既知の機密情報に関する検知が含まれているため、以下のフローにより未知の機密情報を見つけて対処することを考えました。
- Macie コンソールでジョブやバケット、検知タイプ別に検出結果を確認する
- 検出結果と既知の機密情報を比較して、未知の機密情報を洗い出す
- 誤検知ではない、もしくは目視では判断できない場合、開発チームに実態調査を依頼する
- 実態を調査して既知であることが確認できたら、既知の機密情報一覧に追記する
- 未知の機密情報である場合、個別対応を実施する
- バケットに対する識別子のチェックが不要であることが確定した場合は、その識別子のチェックをアーカイブする
検出結果の集計や分析に Athena や DuckDB などの DB ツールを活用することも検討しましたが、開発チームのメンバーも参加する可能性があり、ツールの習得難易度を高いと判断し見送りました。代わりに、手動作業が増えてしまいますが、まずは Macie コンソールのフィルタリング機能を活用することにしました。とはいえ、万単位の検出結果にすべて目を通すのは現実的ではないため、各バケット内のオブジェクトは共通のデータ構造を持つと仮定し、サンプリングベースでチェックを実施しました。結果として、未知の機密情報が保存され、恒久的な対応が求められるようなバケットはありませんでした。
現状の運用と今後の課題
フルスキャン後は、追加されたオブジェクトに対して毎月差分スキャンを実施し、スキャン結果を「フルスキャン結果の分析」の章と同様の手順で評価しています。
当面の課題として、現状では誤検知が多く、Security Hubと連携したSlack通知では煩雑すぎるため、現状は検出結果を毎月確認するというルールにしています。誤検知率が許容レベルまで改善されたら、一連の手順を自動化したいと考えています。
Discussion