拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Prowler + AWS SSO:用 Bash 脚本自动化 SSO 登录并以临时凭证在 Docker 中运行 Prowler 安全扫描

Prowler AWS SSO用 Bash 脚本自动化 SSO 登录并以临时凭证在 Docker 中运行 Prowler 安全扫描【免费下载链接】prowlerProwler is the world’s most widely used open-source cloud security platform that automates security and compliance across any cloud environment.项目地址: https://gitcode.com/GitHub_Trending/pr/prowler本篇指南基于 Prowler 仓库中的 AWS SSO 自动化脚本说明 及其配套脚本 run_prowler_sso.sh讲解如何通过一个 Bash 脚本打通「AWS SSO 浏览器登录 → 提取临时凭证 → 注入 Docker 容器 → 运行 Prowler 生成 HTML/CSV/OCSF 报告」的完整链路并结合 Prowler 源码说明凭证在容器内如何被消费。读完后你可以在仅开通 SSO无长期 Access Key的环境中一键完成 AWS 安全基线评估并掌握脚本每一步的原理、故障排查方法与定制方式。1. 方案概述为什么需要这个脚本在企业 AWS 环境中管理员通常只能获得 AWS IAM Identity Center原 AWS SSO身份没有静态的 Access Key。而 Prowler 官方推荐通过 Docker 镜像运行容器内部没有浏览器、也无法完成 SSO 的 OAuth 交互因此需要一段桥接逻辑主机侧执行aws sso login完成浏览器认证让 AWS CLI 在本地缓存中保存有效的accessToken凭证交换脚本从 SSO 缓存文件中解析accessToken调用aws sso get-role-credentials换取一组短期有效的临时凭证AccessKeyId/SecretAccessKey/SessionToken容器侧将三个凭证以-e环境变量的方式传入toniblyx/prowler镜像运行Prowler 依据 AWS 标准的凭证解析链环境变量建立 Boto3 会话开始扫描结果消费报告写入挂载卷脚本自动打开 HTML 报告并启动本地 HTTP 服务浏览完整仪表盘。整个流程由 contrib/aws/aws-sso-docker/run_prowler_sso.sh 一个脚本完成脚本开头通过set -e保证任何一步失败立即退出。2. 前置条件在开始之前确保系统已安装并配置好以下四样工具以下安装命令继承自 readme依赖用途说明AWS CLI v2SSO 登录与凭证交换SSO 支持从 AWS CLI 2 开始提供需用aws --version确认主版本号为 2jq解析 JSON用于从 SSO 缓存文件和get-role-credentials响应中提取字段Docker运行 Prowler 容器需保证 Docker 守护进程正在运行AWS SSO Profile已配置的 CLI profile通过aws configure sso完成是脚本工作的前提安装示例readme 原文提供的命令# macOS (Homebrew) 安装 jq brew install jq # Ubuntu/Debian 安装 jq sudo apt-get update sudo apt-get install -y jq验证 AWS CLI 版本来自 readme 的 Troubleshooting 一节aws --version # 期望输出示例 # aws-cli/2.11.10 Python/3.9.12 Darwin/20.3.0 exe/x86_64 prompt/off3. 配置 AWS SSO Profile脚本默认使用的 profile 名为twodragon对应脚本第 5 行的PROFILEtwodragon可在定制时修改需要先用 AWS CLI 的交互式向导完成配置aws configure sso --profile twodragon配置向导的关键提示项与示例应答readme 原文示例SSO session name (Recommended): [twodragon] SSO start URL [None]: https://twodragon.awsapps.com/start SSO region [None]: ap-northeast-2 SSO account ID [None]: 123456789012 SSO role name [None]: ReadOnlyAccess CLI default client region [None]: ap-northeast-2 CLI default output format [None]: json CLI profile name [twodragon]: twodragon这些字段中sso_account_id与sso_role_name会被脚本后续用aws configure get读取作为调用get-role-credentials的输入sso_start_url与sso_region决定浏览器认证入口。配置完成后可用以下命令逐项核对Troubleshooting 第 2 节aws configure list-profiles # 应能看到 default 与 twodragon aws configure get sso_start_url --profile twodragon aws configure get sso_region --profile twodragon aws configure get sso_account_id --profile twodragon aws configure get sso_role_name --profile twodragon4. 脚本逐段解析从 SSO 登录到 Prowler 扫描本节对照 run_prowler_sso.sh 的真实源码逐步拆解 readme 中「Script Overview」描述的四个动作及其实现细节。4.1 初始化输出目录与端口脚本开头定义三个关键变量set -e # 任何命令失败立即退出 PROFILEtwodragon # AWS CLI 的 SSO profile 名 OUTPUT_DIR~/prowler-output # Prowler 报告落盘目录 mkdir -p $OUTPUT_DIR WEB_SERVER_PORT8000 # 本地报告 HTTP 服务端口OUTPUT_DIR稍后会以卷挂载方式进入容器使扫描结束后报告直接出现在本机无需再从容器里拷贝。4.2 AWS SSO 登录aws sso login# run_prowler_sso.sh L54-L56 echo Logging into AWS SSO... aws sso login --profile $PROFILE该命令会在默认浏览器中打开 SSO 授权页完成用户认证。认证成功后AWS CLI 会把 OAuth 凭据写入本地缓存~/.aws/sso/cache/下的 JSON 文件。脚本随后取修改时间最新的缓存文件作为凭证来源# L62-L68定位最新缓存文件找不到则退出 CACHE_FILE$(ls -t ~/.aws/sso/cache/*.json 2/dev/null | head -n 1) echo Cache File: $CACHE_FILE if [ -z $CACHE_FILE ]; then echo SSO cache file not found. Please ensure AWS SSO login was successful. exit 1 fi4.3 用 jq 提取 accessToken缓存文件内容形如readme Troubleshooting 第 3 节给出的示例{ accessToken: eyJz93a...k4laUWw, expiresAt: 2024-12-22T14:07:55Z, clientId: example-client-id, clientSecret: example-client-secret, startUrl: https://twodragon.awsapps.com/start# }脚本用jq取出accessToken并对空值和字面量null做了双重防护# L71-L77 ACCESS_TOKEN$(jq -r .accessToken $CACHE_FILE) echo Access Token: $ACCESS_TOKEN if [ -z $ACCESS_TOKEN ] || [ $ACCESS_TOKEN null ]; then echo Unable to extract accessToken. Please check your SSO login and cache file. exit 1 fi注意jq -r在字段缺失时输出字符串null而不是空串因此需要[ $ACCESS_TOKEN null ]这个额外判断——这也是 readme 强调若accessToken为null或缺失请重试aws sso login --profile twodragon的原因。4.4 从 CLI 配置读取角色与账号 IDaccessToken本身不能直接换成 AWS 凭证还需要要扮演哪个账号的哪个角色。脚本从 profile 配置中读取# L80-L88 ROLE_NAME$(aws configure get sso_role_name --profile $PROFILE) ACCOUNT_ID$(aws configure get sso_account_id --profile $PROFILE) echo Role Name: $ROLE_NAME echo Account ID: $ACCOUNT_ID if [ -z $ROLE_NAME ] || [ -z $ACCOUNT_ID ]; then echo Unable to extract sso_role_name or sso_account_id. Please check your profile configuration. exit 1 fi这正是第 3 节中aws configure sso向导所写入的字段二者一一对应。4.5 换取临时 AWS 凭证# L91-L95用 accessToken 向 SSO 后端换取临时凭证 TEMP_CREDS$(aws sso get-role-credentials \ --role-name $ROLE_NAME \ --account-id $ACCOUNT_ID \ --access-token $ACCESS_TOKEN \ --profile $PROFILE) # L100-L108解析 roleCredentials 并做完整性校验 AWS_ACCESS_KEY_ID$(echo $TEMP_CREDS | jq -r .roleCredentials.accessKeyId) AWS_SECRET_ACCESS_KEY$(echo $TEMP_CREDS | jq -r .roleCredentials.secretAccessKey) AWS_SESSION_TOKEN$(echo $TEMP_CREDS | jq -r .roleCredentials.sessionToken) if [ -z $AWS_ACCESS_KEY_ID ] || [ -z $AWS_SECRET_ACCESS_KEY ] || [ -z $AWS_SESSION_TOKEN ]; then echo Unable to extract temporary credentials. exit 1 figet-role-credentials返回的roleCredentials是一组有expiresAt的短期凭证。脚本随后将其导出为环境变量# L111-L113 export AWS_ACCESS_KEY_ID export AWS_SECRET_ACCESS_KEY export AWS_SESSION_TOKEN选择环境变量而非临时凭证文件是因为它们恰好是 AWS SDKBoto3标准凭证解析链的一环——从 Prowler 源码的 AwsProvider 初始化文档 可以看到官方支持的认证方式之一正是- export AWS_ACCESS_KEY_IDASXXXXXXX export AWS_SECRET_ACCESS_KEYXXXXXXXXX export AWS_SESSION_TOKENXXXXXXXXX - aws AwsProvider() - aws AwsProvider(aws_access_key_id..., aws_secret_access_key..., aws_session_token...)也就是说容器内的 Prowler 无需任何额外配置Boto3 会自动发现这三个环境变量包括SessionToken临时凭证必须携带否则 STS 校验会失败建立会话。4.6 启动 Prowler 容器# L120-L125 docker run --platform linux/amd64 \ -e AWS_ACCESS_KEY_ID$AWS_ACCESS_KEY_ID \ -e AWS_SECRET_ACCESS_KEY$AWS_SECRET_ACCESS_KEY \ -e AWS_SESSION_TOKEN$AWS_SESSION_TOKEN \ -v $OUTPUT_DIR:/home/prowler/output \ toniblyx/prowler -M html -M csv -M json-ocsf --output-directory /home/prowler/output --output-filename prowler-output各参数含义--platform linux/amd64强制 amd64 平台保证 ARM 等宿主架构上也能拉取到该镜像三个-e把第 4.5 节换来的临时凭证注入容器环境这是容器获得 AWS 身份的唯一途径-v $OUTPUT_DIR:/home/prowler/output把宿主机~/prowler-output挂到容器内/home/prowler/output。这个路径并非随意——从 Prowler 官方 Dockerfile 看容器内USER prowler、WORKDIR /home/prowler镜像入口为ENTRYPOINT [/home/prowler/.venv/bin/prowler]因此挂载点天然落在运行用户可写的 home 目录下末尾是传给 Prowler 的 CLI 参数-M html -M csv -M json-ocsf指定三种输出格式--output-directory指定容器内输出目录--output-filename统一报告前缀。关于-M的默认行为从 CLI 参数定义 parser.py 可见--output-formats别名-Mnargs在未指定时默认即为csv、json-ocsf、html--output-filename别名-F若不指定则使用prowler-output-ACCOUNT_NUM-OUTPUT_DATE.format命名。本脚本显式指定前缀prowler-output因此扫描完成后 HTML 报告即为OUTPUT_DIR/prowler-output.html——这与脚本下一段读取报告路径的逻辑严格一致。4.7 报告自动打开与本地 HTTP 服务脚本最后还有 readme「Run Prowler」步骤之外的两项增强# L129-L132按操作系统打开 HTML 报告 open_report $REPORT_PATH # macOS 用 openLinux 用 xdg-openMSYS 用 start # L134-L147在输出目录启动 python3 -m http.server 8000 前台托管报告open_report通过$OSTYPE分发到open/xdg-open/start不支持的系统会提示手动打开start_web_server则cd到输出目录后运行python3 -m http.server让prowler-output.html及其关联的静态资源图标、CSS 等可通过http://localhost:8000完整访问。需要说明这要求宿主机装有 Python 3因为它运行在容器外若希望后台运行 web server脚本注释中说明在命令末尾追加即可。5. 运行脚本完整使用流程继承自 readme 的 Usage 一节# 1. 确保脚本有执行权限 chmod x run_prowler_sso.sh # 2. 运行脚本触发 AWS SSO 登录流程 ./run_prowler_sso.sh执行后浏览器窗口弹出提示你通过 AWS SSO 完成认证认证成功后脚本自动提取临时凭证、启动 Prowler 容器扫描结果直接输出到终端与~/prowler-output目录最后打开 HTML 报告并挂起本地 web serverCtrlC 停止。6. 故障排查以下六步排查法全部来自 readme 的 Troubleshooting 章节可直接照做6.1 确认 AWS CLI 为 2.xaws --version主版本号必须为 2否则按官方文档升级SSO 特性在 CLI v1 中不可用。6.2 核对 SSO profile 配置aws configure list-profiles # 期望输出 # default # twodragon再逐项检查sso_start_url、sso_region、sso_account_id、sso_role_name均返回正确值命令见第 3 节。6.3 检查 SSO 缓存文件cat ~/.aws/sso/cache/*.json确认目标文件含有效accessToken且非null。若缺失或过期重新登录aws sso login --profile twodragon6.4 验证 jq 可用jq --version # 期望输出类似jq-1.6未安装则按第 2 节的平台命令安装。6.5 验证 Docker 环境变量注入在不跑完整扫描的情况下用镜像自带的 shell 验证凭证确实进入了容器docker run --platform linux/amd64 \ -e AWS_ACCESS_KEY_ID$AWS_ACCESS_KEY_ID \ -e AWS_SECRET_ACCESS_KEY$AWS_SECRET_ACCESS_KEY \ -e AWS_SESSION_TOKEN$AWS_SESSION_TOKEN \ toniblyx/prowler /bin/bash -c echo $AWS_ACCESS_KEY_ID; echo $AWS_SECRET_ACCESS_KEY; echo $AWS_SESSION_TOKEN# 期望输出三行均非空Access Key 前缀通常为 ASIA ASIA... wJalrFEMI/K7MDENG/bPxRfiCY... IQoJb3JpZ2luX2VjEHwaCXVz...注意镜像ENTRYPOINT固定为 prowler 可执行文件但toniblyx/prowler镜像会把入口参数透传给 Prowler 运行时readme 中即以/bin/bash -c ...的方式直接验证环境变量说明该镜像支持这种调试用法。若三个值有任何一个为空问题出在脚本 4.5 节的解析环节。6.6 开启脚本级调试在脚本头部加上set -x获得逐条命令的追踪输出#!/bin/bash set -e set -x # ... rest of the script ...重新执行./run_prowler_sso.sh在输出中定位第一个非零退出码或异常变量值即可判断失败发生在登录、缓存解析、凭证交换还是 docker 运行阶段。7. 定制脚本readme 的 Customization 一节给出两个最常见的定制点均可在 run_prowler_sso.sh 中直接修改1) 更换 AWS profile修改脚本顶部的变量即可无需改动后续逻辑PROFILEyour-profile-name2) 追加 Prowler 扫描选项修改 docker 命令尾部的 Prowler 参数例如只运行指定 check 并以 JSON 输出docker run --platform linux/amd64 \ -e AWS_ACCESS_KEY_ID$AWS_ACCESS_KEY_ID \ -e AWS_SECRET_ACCESS_KEY$AWS_SECRET_ACCESS_KEY \ -e AWS_SESSION_TOKEN$AWS_SESSION_TOKEN \ toniblyx/prowler -c check123 -M json结合第 4.6 节的源码说明-M可接受任意多个输出格式html、csv、json、json-ocsf等默认三件套为csv/json-ocsf/html此外还可按需追加-c指定 check、-f配置文件、--profile、region 过滤等 Prowler 参数由于参数会透传给容器内的 Prowler CLI行为与本地直接运行prowler命令一致。8. 安全注意事项readme 的 Security Considerations 一节与脚本实现共同强调了三条原则凭证最小暴露临时凭证不要写入日志、文档或版本库。注意脚本会把Access Token和TEMP_CREDS回显到终端echo Access Token: ...、echo TEMP_CREDS: ...在共享屏幕或 CI 日志场景下应删除这些回显另外~/.aws/sso/cache/*.json中同时存有accessToken与clientSecret该目录本身也应保持属主独占权限。脚本权限收紧限制脚本仅属主可读写执行防止被他人篡改后窃取凭证chmod 700 run_prowler_sso.sh警惕环境变量泄露以环境变量传递凭证意味着同机ps e、shell 历史记录、子进程继承都可能看到明文。readme 建议如有需要考虑更安全的凭证管理方式从源码看 Prowler 的 AwsProvider 也支持通过aws_access_key_id/aws_secret_access_key/aws_session_token参数或 AWS CLI profile 等途径显式注入按需选用。9. 小结与延伸阅读该方案的核心价值在于用 SSO 浏览器登录换取一次性临时凭证再以环境变量注入 Docker 容器从而让只有 SSO 身份的环境也能复用 Prowler 官方镜像做安全基线扫描且全程不落地长期 Access Key。仓库内相关文件索引便于继续深入方案文档contrib/aws/aws-sso-docker/readme.md自动化脚本contrib/aws/aws-sso-docker/run_prowler_sso.sh容器内凭证消费方prowler/providers/aws/aws_provider.py输出参数定义prowler/lib/cli/parser.py镜像构建WORKDIR/USER/ENTRYPOINTDockerfile项目许可证LICENSEreadme 声明该 contrib 项目采用 MIT License仓库根 LICENSE 即 MIT适用前提与限制脚本面向交互式终端依赖浏览器完成 SSO 认证不适合无头环境临时凭证与accessToken均有时效SSO 会话过期后需重新aws sso loginls -t取最新缓存文件的策略在多 profile 并发登录时可能取错文件多账号场景建议串行执行或为每个 profile 单独处理缓存。【免费下载链接】prowlerProwler is the world’s most widely used open-source cloud security platform that automates security and compliance across any cloud environment.项目地址: https://gitcode.com/GitHub_Trending/pr/prowler创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门