クラウドインテグレーション事業部 セキュリティセクションの日下です。
今回は、Amazon Inspector でEC2インスタンスのスキャンした結果を
csv形式のレポートで出力する方法について、簡単ではありますが記載していきます。
そもそもAmazon Inspectorとは?
まず、Amazon Inspectorについてですが、ざっくりいうとAWSが提供する脆弱性管理サービスのことで、
クラウド環境におけるセキュリティリスクを特定し、修正を支援してくれるサービスです。
EC2インスタンスやコンテナ(ECS、EKS)、Lambdaに対して、自動で脆弱性のスキャンを実行し
既知の脆弱性(CVE)やソフトウェアの不備を検出してくれます。
検出した結果について
出力された脆弱性は、AWSコンソール上で確認することができます。
脆弱性ごとに、修正の可否、影響を受けるパッケージ、修正済みバージョン、
重大性、CVSSスコアなどをはじめ、詳しく内容が記載されています。
一方で、スキャン対象となるインスタンスやコンテナ、Lambda関数が多いほど
脆弱性の数や種類が増える可能性が高くなり、
これらを一つずつコンソールで確認すると、結構な手間がかかります。
検出結果レポートのエクスポートについて
そこでAmazon Inspectorには、検出した脆弱性の結果を
JSON形式かCSV形式のレポートで出力することができます。
この機能によって、1つのファイルで検出された脆弱性をまとめて管理することができます。
また、今回はデフォルト通りに検出結果の全てをエクスポートしますが
フィルターの適用によって、重大性、修正が可能な脆弱性、AMIID、イメージID、関数名などを絞って出力することも可能です。
レポートの出力に必要な設定について
実際にレポートを出力するにあたって必要な設定は下記になります。
- AWS KMS key の作成or設定
- S3バケットの作成or 設定
今回は検出結果用のAWS KMS key とS3バケットを作成しましたので、その内容をこれから記載していきます。
1.AWS KMS key の設定について
ファイルをS3バケットにアップするにあたり
Amazon Inspector のレポートを暗号化が必須であることから、 AWS KMS key の作成をしました。
作成の流れとしては、AWSコンソールで Key Management Service → キーの作成 より作っていきます。
レポートを出力することにおいては、キーの設定は以下の内容で進めていきます。
- キーのタイプ:対象
- キーの使用法:暗号化および復号化
- キーマテリアルオリジン:KMS – 推奨
- リージョンごと:単一リージョンキー
あとは、エイリアス(キーの名前にあたるもの)や説明、キーの管理アクセス許可を設定していきます。
※キーの管理アクセス許可の定義や使用法アクセス許可の定義は
レポートの出力においては指定がなくても特段問題はありません。
そしてキーポリシーは以下のように設定しました。
{
“Version”: “2012-10-17”,
“Id”: “key-consolepolicy-3”,
“Statement”: [
{
“Sid”: “Enable IAM User Permissions”,
“Effect”: “Allow”,
“Principal”: {
“AWS”: “arn:※※※※※※※※※”
},
“Action”: “kms:*”,
“Resource”: “*”
},
{
“Sid”: “AllowInspectorService”,
“Effect”: “Allow”,
“Principal”: {
“Service”: “inspector2.amazonaws.com”
},
“Action”: [
“kms:Encrypt”,
“kms:Decrypt”,
“kms:GenerateDataKey”
],
“Resource”: “*”
}
]
}
上記のポリシーは、Amazon Inspectorが検出結果をアップするS3バケットにアクセスし
KMSキーを使用する際に以下の権限を与えたポリシーになります。
kms:Encrypt
指定されたデータを暗号化するための権限です。
Amazon Inspectorで出力された結果をS3バケットにエクスポートする際に
データを暗号化して機密性を保つために権限を与えました。
kms:Decrypt
暗号化されたデータを復号化するための権限です。
キーを使って暗号化したファイルを復号化するために権限を与えました。
kms:GenerateDataKey
データ暗号化用の一時的なキーを生成するための権限です。
生成されたデータキーは、KMSキーで暗号化された形式とプレーンテキストの形式で返されるのですが
このデータを効率的に暗号化/復号化したり、
データキー自体を直接KMSに保存せずに、暗号化された形式で保管することでセキュリティを確保することができる権限です。
これらの設定により、検出結果をエクスポートするためのキーが作成できました!
2.S3バケットの作成or 設定
次に検出結果のエクスポート先のS3バケットの作成と設定を行います。
作成の流れとしては、AWSコンソールで Amazon S3 → バケットの作成 より作っていきます。
バケット名の入力以外の箇所は以下のように設定しました。
- バケットタイプ:汎用
- オブジェクト所有者:ACL無効(推奨)
- パブリックアクセス設定:パブリックアクセスをすべてブロック
- 暗号化タイプ:Amazon S3 マネージドキーを使用したサーバー側の暗号化 (SSE-S3)
- バケットキー:有効にする
そして作成したバケットに対して、以下のバケットポリシーを適用しました。
{
“Version”: “2012-10-17”,
“Statement”: [
{
“Sid”: “allow-inspector”,
“Effect”: “Allow”,
“Principal”: {
“Service”: “inspector2.amazonaws.com”
},
“Action”: [
“s3:PutObject”,
“s3:PutObjectAcl”,
“s3:AbortMultipartUpload”
],
“Resource”: “arn:aws:s3:::inspector2-test/*”,
“Condition”: {
“StringEquals”: {
“aws:SourceAccount”: “※※※※※※※※※”
}
}
}
]
}
上記のポリシーは、検出結果をアップロードするS3 バケットに対して
Amazon Inspector から以下の権限を与えたポリシーになります。
s3:PutObject
指定されたS3バケットにオブジェクト(ファイル)をアップロードする権限を与える権限です。
これを許可することで、Inspector 2は指定されたS3バケットにファイルをアップロードすることができます。
s3:PutObjectAcl
アップロードしたオブジェクトのアクセス制御リスト(ACL)を設定する権限です。
オブジェクトのアクセス権限を管理するために使用し、
誰がそのオブジェクトを読み取ることができるか、または書き込むことができるかを制御することができます。
s3:AbortMultipartUpload
マルチパートアップロードを中止する権限です。
仮にレポートのファイルが大きくなった場合、アップロードが途中で失敗したり中断されたりすることがあります。
この権限があることで、途中で失敗したアップロードをクリーンに中止し、リソースが無駄にならないようにします。
反対にこのアクションが必要なければ、アップロードが途中で中断された場合に、
途中のパートが残ったり、ストレージリソースが無駄に消費される可能性があります。
これらの設定により、検出結果をエクスポートするためのキーが作成できました!
検出結果のエクスポート
KMSキーとアップロード先のバケットの作成が完了したら
- :JSON か CSV を選択します。(今回はCSV形式で出力します。)
- S3 URI:「S3を参照」より作成したバケットを選択します。
- KMSキー:作成したKMSキーを選択します。
すると画面上部に問題なくエクスポートされた旨のメッセージが出力されるので「View report」よりバケットへ移動します。
検出されたCSVファイルについて
実際にアップされたファイルは以下になります。
そして気になる中身ですが、一部を抜粋して以下に添付します。
基本的にデフォルトでは英語表示されますが、検出された脆弱性ごとに
以下の項目が1つのファイルでまとまって管理することができます!
レポートに記録される項目一覧※該当しない項目は空白で表示されます。
- AWS Account Id: AWSアカウントID
- Severity: 重大度
- Fix Available: 修正の有無
- Finding Type: 発見タイプ
- Title: タイトル
- Description: 説明
- Finding ARN: 発見のARN
- First Seen: 初めて検出された日時
- Last Seen: 最後に検出された日時
- Last Updated: 最後に更新された日時
- Resource ID: リソースID
- Container Image Tags: コンテナイメージタグ
- Region: リージョン
- Platform: プラットフォーム
- Resource Tags: リソースタグ
- Affected Packages: 影響を受けたパッケージ
- Package Installed Version: インストール済みのパッケージバージョン
- Fixed in Version: 修正バージョン
- Package Remediation: パッケージ修正方法
- File Path: ファイルパス
- Network Paths: ネットワークパス
- Age (Days): 経過日数
- Remediation: 修正方法
- Inspector Score: インスペクターのスコア
- Inspector Score Vector: インスペクターのスコアベクトル
- Status: ステータス
- Vulnerability Id: 脆弱性ID
- Vendor: ベンダー
- Vendor Severity: ベンダーの重大度
- Vendor Advisory: ベンダーアドバイザリ
- Vendor Advisory Published: ベンダーアドバイザリの公開日時
- NVD CVSS3 Score: NVD CVSS3スコア
- NVD CVSS3 Vector: NVD CVSS3ベクトル
- NVD CVSS2 Score: NVD CVSS2スコア
- NVD CVSS2 Vector: NVD CVSS2ベクトル
- Vendor CVSS3 Score: ベンダーCVSS3スコア
- Vendor CVSS3 Vector: ベンダーCVSS3ベクトル
- Vendor CVSS2 Score: ベンダーCVSS2スコア
- Vendor CVSS2 Vector: ベンダーCVSS2ベクトル
- Resource Type: リソースタイプ
- Ami: AMI
- Resource Public Ipv4: リソースのパブリックIPv4
- Resource Private Ipv4: リソースのプライベートIPv4
- Resource Ipv6: リソースのIPv6
- Resource Vpc: リソースVPC
- Port Range: ポート範囲
- Exploit Available: 攻撃可能な状態
- Last Exploited At: 最後に悪用された日時
- Lambda Layers: Lambdaレイヤー
- Lambda Package Type: Lambdaパッケージタイプ
- Lambda Last Updated At: Lambdaの最終更新日時
- Reference Urls: 参照URL
検出結果の項目についての公式ドキュメントはこちら です。
1つの脆弱性に対して、かなり細かい内容がファイルで出力されるだけでなく
「脆弱性の内容」や「何をすればいいか」が1つのファイルでまとまっているので、非常に便利でした!
まとめ
今回はAmazon Inspectorで検出された脆弱性をCSV形式で1つのファイルで出力してみましたが
やはり1つのファイルにまとまっていると管理も確認も楽になるなーと思いました!
今後もこのようなブログを沢山書いていけるように頑張っていきます!