はじめに
Prowler を利用した クラウドセキュリティ設定診断 を紹介します。(※ 本記事はAWSが対象)
先日は別の診断ツールである「CloudSploit」を活用したクラウドセキュリティ診断を紹介しましたが、 Prowler は 『Compliance(規格) に特化 』しているようで新しい体験がありましたので紹介します。
blog.motikan2010.com
Prowler には「Prowler SaaS」と「Prowler Open Source」があり、 SaaS のほうは「検査環境を自分で用意する必要がない」かつ「検査結果の UI がリッチ」という良い面はありますが、検査対象が増えていくと有償となります。
「Prowler Open Source」を利用することで手軽に無償でクラウド環境(本記事ではAWS)のセキュリティ設定診断を実施することが可能となるため、その手順を本記事では説明します。
Prowler のソースコード: prowler-cloud / prowler
検証環境
本検証では EC2 で診断しています。
(未検証ですが Python が動作すれば良さそうです)
- イメージ: Ubuntu Server 22.04 LTS
以下公式情報:
Overview - Prowler Open Source Documentation
診断の流れ
診断用 IAM ユーザを追加
IAM ユーザを作成
診断に利用する IAMユーザ「prowler-user」を作成します。
引き続き、作成したユーザに4つのポリシーを付与します。
2つの『インラインポリシー』を追加
検査を実施するためには AWSの各サービスの読込権限が必要であるため、ポリシーの作成を行います。
設定内容は以下の AWS CloudFormation を参考にしています。
prowler-cloud/prowler-permissions-templates-public
- ポリシー名:ProwlerAdditionalViewPrivileges
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "account:Get*", "appstream:Describe*", "appstream:List*", "backup:List*", "cloudtrail:GetInsightSelectors", "codeartifact:List*", "codebuild:BatchGet*", "dlm:Get*", "drs:Describe*", "ds:Get*", "ds:Describe*", "ds:List*", "ec2:GetEbsEncryptionByDefault", "ecr:Describe*", "ecr:GetRegistryScanningConfiguration", "elasticfilesystem:DescribeBackupPolicy", "glue:GetConnections", "glue:GetSecurityConfiguration*", "glue:SearchTables", "lambda:GetFunction*", "logs:FilterLogEvents", "macie2:GetMacieSession", "s3:GetAccountPublicAccessBlock", "shield:DescribeProtection", "shield:GetSubscriptionState", "securityhub:BatchImportFindings", "securityhub:GetFindings", "ssm:GetDocument", "ssm-incidents:List*", "support:Describe*", "tag:GetTagKeys", "wellarchitected:List*" ], "Resource": "*", "Effect": "Allow" } ] }
- ポリシー名:ProwlerApiGatewayViewPrivileges
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "apigateway:GET" ], "Resource": [ "arn:aws:apigateway:*::/restapis/*", "arn:aws:apigateway:*::/apis/*" ], "Effect": "Allow" } ] }
2つの『AWS管理ポリシー』を追加
作成したユーザに2つのAWS管理ポリシーを付与します。
- SecurityAudit
- ViewOnlyAccess
最終的には下画像のように4つのポリシーが付与されたユーザになります。
アクセスキー の発行
Prowler から作成したユーザを利用するためにアクセスキーを発行します。
アクセスキーを発行することで診断に必要な以下の2つの文字列が発行されます。
- アクセスキー
- シークレットキー
Prowler 実行環境の構築
root@ip-172-31-19-66:~# python3 -V Python 3.10.12
pip コマンドのインストール
Prowler をインストールするために必要な pip コマンドをインストールします。
# pip Command 'pip' not found, but can be installed with: apt install python3-pip # apt install python3-pip # pip -V pip 22.0.2 from /usr/lib/python3/dist-packages/pip (python 3.10)
Prowler のインストール
本記事はバージョンを指定してインストールしています。(2024/10 時点の最新版)
# pip install prowler==4.4.0
環境によっては「AttributeError: module 'lib' has no attribute 'X509_V_FLAG_NOTIFY_POLICY'.」エラーが発生します。
# prowler (...省略...) File "/usr/lib/python3/dist-packages/urllib3/contrib/pyopenssl.py", line 50, in <module> import OpenSSL.SSL File "/usr/lib/python3/dist-packages/OpenSSL/__init__.py", line 8, in <module> from OpenSSL import crypto, SSL File "/usr/lib/python3/dist-packages/OpenSSL/crypto.py", line 1579, in <module> class X509StoreFlags(object): File "/usr/lib/python3/dist-packages/OpenSSL/crypto.py", line 1598, in X509StoreFlags NOTIFY_POLICY = _lib.X509_V_FLAG_NOTIFY_POLICY AttributeError: module 'lib' has no attribute 'X509_V_FLAG_NOTIFY_POLICY'. Did you mean: 'X509_V_FLAG_EXPLICIT_POLICY'?
以下の GitHub Issue にエラーの解決策がありました。
AttributeError: module 'lib' has no attribute 'X509_V_FLAG_NOTIFY_POLICY'. Did you mean: 'X509_V_FLAG_EXPLICIT_POLICY'? · Issue #13619 · conda/conda
pyopenssl >= 23.2.0
can fix the problem.
エラー解決のためにPythonライブラリ「pyOpenSSL」をインストールします。
# pip freeze | grep pyOpenSSL pyOpenSSL==21.0.0
pyOpenSSL がインストールされたことを確認します。
# pip install pyOpenSSL==24.2.1 # pip freeze | grep pyOpenSSL pyOpenSSL==24.2.1
再度 Prowler をインストールを試してみると成功しました。
# pip install prowler==4.4.0 -------------------------------------------------- # prowler _ _ __ _ __ _____ _| | ___ _ __ | '_ \| '__/ _ \ \ /\ / / |/ _ \ '__| | |_) | | | (_) \ V V /| | __/ | | .__/|_| \___/ \_/\_/ |_|\___|_|v4.4.0 |_| the handy multi-cloud security tool Date: 2024-10-18 04:48:12 2024-10-18 04:48:13,958 [File: aws_provider.py:943] [Module: aws_provider] CRITICAL: NoCredentialsError[934]: Unable to locate credentials 2024-10-18 04:48:13,958 [File: provider.py:228] [Module: provider] CRITICAL: NoCredentialsError[175]: Unable to locate credentials
AWS 認証情報の設定
Prowaler は「~/.aws/credentials
」から認証情報を参照しているので、認証情報を記載します。
(※ AWS CLI の導入は必要なし)
# mkdir ~/.aws/ # vim ~/.aws/credentials [prowler-user] aws_access_key_id = ASI(...snip...)2ZF aws_secret_access_key = 4F(...snip...)HD/
prowler で診断を実行
先ほど設定したプロファイルを引数に指定( --profile prowler-user
)して prowler を実行します。
# prowler aws --profile prowler-user
コンプライアンス(規格)を指定していないため全ての検査項目を実行しますが約5分で完了します。
検査結果は以下のようにターミナルに出力されます。
検査の出力:
(...省略...) 👇 進捗状況が表示されます! Executing 457 checks, please wait... -> Scan completed! |▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉| 457/457 [100%] in 5:26.6 Overview Results: ╭─────────────────────┬─────────────────────┬────────────────╮ │ 38.35% (400) Failed │ 61.27% (639) Passed │ 0.0% (0) Muted │ ╰─────────────────────┴─────────────────────┴────────────────╯ 👇 各AWSサービスの結果が表示されます! Account 3(...省略...)9 Scan Results (severity columns are for fails only): ╭────────────┬───────────────────┬───────────┬────────────┬────────┬──────────┬───────┬─────────╮ │ Provider │ Service │ Status │ Critical │ High │ Medium │ Low │ Muted │ ├────────────┼───────────────────┼───────────┼────────────┼────────┼──────────┼───────┼─────────┤ │ aws │ accessanalyzer │ FAIL (17) │ 0 │ 0 │ 0 │ 17 │ 0 │ ├────────────┼───────────────────┼───────────┼────────────┼────────┼──────────┼───────┼─────────┤ │ aws │ account │ FAIL (1) │ 0 │ 0 │ 1 │ 0 │ 0 │ ├────────────┼───────────────────┼───────────┼────────────┼────────┼──────────┼───────┼─────────┤ │ aws │ apigateway │ FAIL (6) │ 0 │ 0 │ 6 │ 0 │ 0 │ ├────────────┼───────────────────┼───────────┼────────────┼────────┼──────────┼───────┼─────────┤ (...省略...) ├────────────┼───────────────────┼───────────┼────────────┼────────┼──────────┼───────┼─────────┤ │ aws │ vpc │ FAIL (1) │ 0 │ 0 │ 1 │ 0 │ 0 │ ├────────────┼───────────────────┼───────────┼────────────┼────────┼──────────┼───────┼─────────┤ │ aws │ ec2 │ FAIL (1) │ 0 │ 0 │ 1 │ 0 │ 0 │ ├────────────┼───────────────────┼───────────┼────────────┼────────┼──────────┼───────┼─────────┤ │ aws │ vpc │ FAIL (3) │ 0 │ 0 │ 3 │ 0 │ 0 │ ╰────────────┴───────────────────┴───────────┴────────────┴────────┴──────────┴───────┴─────────╯ 👇 各コンプラインス(規格)に沿った簡易結果が表示されます! (...省略...) Compliance Status of AWS_ACCOUNT_SECURITY_ONBOARDING_AWS Framework: ╭───────────────────┬─────────────────┬────────────────╮ │ 11.22% (117) FAIL │ 6.62% (69) PASS │ 0.0% (0) MUTED │ ╰───────────────────┴─────────────────┴────────────────╯ (...省略...) Compliance Status of CIS_2.0_AWS Framework: ╭───────────────────┬─────────────────┬────────────────╮ │ 12.46% (130) FAIL │ 8.15% (85) PASS │ 0.0% (0) MUTED │ ╰───────────────────┴─────────────────┴────────────────╯ Compliance Status of CIS_3.0_AWS Framework: ╭───────────────────┬─────────────────┬────────────────╮ │ 12.37% (129) FAIL │ 8.05% (84) PASS │ 0.0% (0) MUTED │ ╰───────────────────┴─────────────────┴────────────────╯ Compliance Status of CISA_AWS Framework: ╭───────────────────┬───────────────────┬────────────────╮ │ 11.41% (119) FAIL │ 12.85% (134) PASS │ 0.0% (0) MUTED │ ╰───────────────────┴───────────────────┴────────────────╯ (...省略...) 👇 詳細結果の保存先! Detailed compliance results are in /root/output/compliance/
実際のターミナル上では下画像のように色付けされて検査結果が表示されます。
コンプライアンス(規格)別にも検査されるので、基準としている規格がある場合には参考にできそうです。
ブラウザ上で検査結果の確認
検査コマンド実行時に結果が表示されますが、詳細な検査結果は「<カレントディレクトリ>/output/
」に出力されています。
以下のコマンドを実行することでブラウザ上で検査結果を確認することが可能です。
# HOST=0.0.0.0 prowler dashboard
Webダッシュボード(http://<検査環境のIPアドレス>:11666/
)にアクセスすることで検査結果を確認することができます。
「Compliance(規格)」を指定することカバレッジを確認することが可能です。
まとめ
クラウドセキュリティ設定診断はコンプライアンス(規格)を基準に提供されていることが多いので、Prowlerを活用してみるのも良さそうです。
不明点などがあれば @motikan2010 にメッセージください。
メモ書き
コンプライアンスに準拠するに当たって、ちょっとした疑問がありましたのでSlack上で質問したところ・・・。
3,4日で解決されたので、現状サポート面では不安にならなさそうです。
(サポートなくともOSSなので修正できるところは良い)
fix(iam): update AWS Support policy by sergargar · Pull Request #5399 · prowler-cloud/prowler