Prowler を使ってアカウントのセキュリティ状態についてチェックしてみた。

記事タイトルとURLをコピーする

今回は、OSS のクラウドセキュリティツール Prowler を使って AWS アカウントのセキュリティスキャンを試してみました。
「自分のアカウントのセキュリティ設定、大丈夫かな?」と気になったことがある方の参考になれば幸いです。

Prowler とは

Prowler は AWS、Azure、GCP、Kubernetes に対応した OSS のセキュリティスキャンツールです。
CSPM(Cloud Security Posture Management)に分類されるツールで、CIS Benchmark や PCI-DSS、GDPR などのコンプライアンスフレームワークに基づいたチェックを実行してくれます。 なお、Prowler は AWS のマネージドサービスではなく、サードパーティ製の OSS ツールです。
GitHub で公開されているソリューションは AWS サポートでのサポート対象外となる点にご留意が必要です。

https://docs.prowler.com github.com

Security Hub との違い

Security Hub をすでに利用されている方は「Prowler は不要では?」と思われるかもしれません。
両者は競合ではなく補完関係にあります。

観点 Security Hub Prowler
提供元 AWS マネージド OSS / サードパーティ
料金 チェック数に応じて課金 OSS版は無料
常時監視 ○(自動・継続的) ×(実行時のみ)
マルチクラウド サードパーティ統合で他クラウドの findings 受信は可能 ネイティブで AWS / Azure / GCP / K8s をスキャン

Prowler は Security Hub のチェック項目を補完できるため、併用されることが多いようです。
例えば今回のスキャンでは、以下のような Security Hub の標準コントロールにはないチェックが実行されていました。

  • 権限昇格パスの検出: iam:PassRole + ec2:RunInstances のように、単体では問題なくても組み合わせで権限昇格が可能になるパターンを検出

また、Prowler の findings を Security Hub に送信して一元管理することも可能です。
Security Hub 側で Prowler の統合を有効化すれば、Prowler のスキャン結果を他の AWS セキュリティサービス(GuardDuty、Inspector 等)の findings と同じダッシュボードで横断的に確認できます。

やってみた

環境情報

項目 バージョン
Docker 29.4.3
Prowler 5.32.0(Docker イメージ: toniblyx/prowler:latest)

Python の互換性問題について

当初は pip install prowler でのインストールを試みましたが、手元の Python が 3.14.4 であったため最新版がインストールできませんでした。

Prowler の最新版は Requires-Python: >=3.10, <3.14 と宣言されているため、pip が Python バージョンに合致するパッケージのみをインストール候補として評価した結果、Python バージョン制約が緩い(>=3.9, <4.0)古い v3.11.3 のみがインストールされました。
しかし v3.11.3 は実行時に Pydantic の互換性問題でクラッシュするため、実質的に動作しません。

$ prowler --version
pydantic.errors.ConfigError: unable to infer type for attribute "Compliance"

このため、ローカル環境を汚さない Docker での実行を選択しました。

Docker イメージの取得

Docker Hub から Prowler のイメージを取得します。

$ docker pull toniblyx/prowler:latest

イメージサイズは約 3 GB でした。

Docker で Prowler を実行する

SSO プロファイルをコンテナ内から直接参照するとパスの不整合が起きるため、一時認証情報を環境変数で渡す方式を採用しました。

一時認証情報の取得

$ eval $(aws configure export-credentials --profile myprofile --format env)

スキャン実行(IAM サービスのみ)

全サービスのスキャンは時間がかかるため、まず IAM に絞って実行しました。

$ mkdir -p ~/Project/prowler-output
$ docker run --rm \
  -e AWS_ACCESS_KEY_ID \
  -e AWS_SECRET_ACCESS_KEY \
  -e AWS_SESSION_TOKEN \
  -v ~/Project/prowler-output:/home/prowler/output \
  toniblyx/prowler:latest \
  aws --region ap-northeast-1 --service iam

ポイント: - -e AWS_ACCESS_KEY_ID 等で環境変数をコンテナに引き渡し - -v ~/Project/prowler-output:/home/prowler/output で結果をホスト側に出力 - --service iam で IAM チェックのみに限定

実行結果

-> Using the AWS credentials below:
  · AWS-CLI Profile: default
  · AWS Regions: ap-northeast-1
  · AWS Account: xxxxxxxxxxxx
  · User Id: AROAXXXXXXXXXXXXX:user@example.com
  · Caller Identity ARN: arn:aws:sts::xxxxxxxxxxxx:assumed-role/AWSReservedSSO_AdministratorAccess_xxxxxxxxxxxxxxxx/user@example.com

Executing 48 checks, please wait...
-> Scan completed! |▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| 48/48 [100%] in 3:32.7

Overview Results:
╭───────────────────┬────────────────────┬────────────────╮
│ 14.1% (74) Failed │ 85.9% (451) Passed │ 0.0% (0) Muted │
╰───────────────────┴────────────────────┴────────────────╯

Account xxxxxxxxxxxx Scan Results (severity columns are for fails only):
╭────────────┬───────────┬───────────┬────────────┬────────┬──────────┬───────┬─────────╮
│ Provider   │ Service   │ Status    │   Critical │   High │   Medium │   Low │   Muted │
├────────────┼───────────┼───────────┼────────────┼────────┼──────────┼───────┼─────────┤
│ aws        │ iam       │ FAIL (74) │          3 │     54 │       15 │     2 │       0 │
╰────────────┴───────────┴───────────┴────────────┴────────┴──────────┴───────┴─────────╯

48 のチェック項目を約 3 分半で実行し、74 件の Failed が検出されました。

出力ファイル

スキャン完了後、以下の 3 ファイルが出力されました。

ファイル 用途
.html ブラウザで閲覧しやすいレポート
.csv Excel 等でのフィルタリング・分析用
.ocsf.json プログラム処理用(OCSF 形式)
$ ls ~/Project/prowler-output/
prowler-output-xxxxxxxxxxxx-20260628033710.csv
prowler-output-xxxxxxxxxxxx-20260628033710.html
prowler-output-xxxxxxxxxxxx-20260628033710.ocsf.json

検出された主な findings

Critical(3件)

チェック項目 検出内容
AWS 管理ポリシーに *:* 権限がないこと AdministratorAccess ポリシーがアタッチされている
インラインポリシーに *:* 権限がないこと OrganizationAccountAccessRole に管理者権限のインラインポリシー
IAM ユーザーに AdministratorAccess がないこと IAM User administrator に AdministratorAccess がアタッチ

High(54件)の主な内容

チェック項目 検出内容
権限昇格リスクのあるポリシー 複数のロール・ポリシーで iam:PassRole + ec2:RunInstances 等の組み合わせが検出
Confused Deputy 対策 多数のサービスロールで aws:SourceArn / aws:SourceAccount 条件キーが未設定
クロスアカウント ReadOnly アクセス 外部アカウントへの ReadOnlyAccess 付与

Medium(15件)の主な内容

チェック項目 検出内容
Bedrock 権限の未使用 複数のロールで Bedrock 権限が付与されているが一度も利用されていない
Marketplace Subscribe 権限 全リソースに対する aws-marketplace:Subscribe 許可

ハマりポイントまとめ

今回の検証で遭遇した問題点を整理しておきます。

問題 原因 対処
pip install prowler で古いバージョンが入る Python 3.14 に対応した Prowler がない Docker で実行
--profile myprofile がコンテナ内で認識されない SSO トークンキャッシュのパス不整合 環境変数で一時認証情報を渡す

おわりに

Docker で Prowler を実行すれば、ローカル環境を汚さず、数分でアカウントのセキュリティ態勢を確認できました。
定期的なスポットチェックに利用するなど、運用への組み込み方を検討してみるのも良いかもしれません。
今回はシングルアカウントの手動実行でしたが、AWS Organizations 配下の複数アカウントを横断スキャンし、統合レポートを作成したい場合は、以下の AWS ドキュメントが参考になります。
EC2 インスタンス上に Prowler をデプロイし、CloudFormation StackSets で全アカウントに IAM ロールを展開、並列スキャン → S3 に集約 → SNS 通知という本格的な構成が紹介されています。

本記事がどなたかの参考になれば幸いです。

docs.aws.amazon.com

参考リンク

設樂 勲史 (記事一覧)