今回は、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 通知という本格的な構成が紹介されています。
本記事がどなたかの参考になれば幸いです。
参考リンク
設樂 勲史 (記事一覧)