CloudGoat 是 Rhino Security Labs 的“Vulnerable by Design”云部署工具。
获取帮助的渠道: Rhino Security Labs Discord, 或 Stack Overflow
提交问题的地址: https://github.com/RhinoSecurityLabs/cloudgoat/issues
维护者: CloudGoat 社区
CloudGoat 是 Rhino Security Labs 的“Vulnerable by Design”云部署工具。它允许你通过创建并完成多个“夺旗赛”风格的场景来磨练你的云网络安全技能。每个场景由云资源组合而成,提供了结构化的学习体验。有些场景简单,有些困难,许多场景提供了多种通往胜利的路径。作为攻击者,你的使命是探索环境、识别漏洞并利用它们达到场景的目标。
以下是 CloudGoat 的主要目标:
在继续之前,请注意以下警告!
警告 #1: CloudGoat 会在你的账户中创建故意存在漏洞的资源。请勿在生产环境或任何敏感资源旁边部署 CloudGoat。
警告 #2: CloudGoat 只能管理它创建的资源。如果你在场景中自行创建了任何资源,应在运行
destroy命令之前手动删除它们。
Linux```bash sudo apt install terraform awscli azure-cli jq -y
Mac```bash
brew install terraform awscli azure-cli jq
要安装 CloudGoat,请确保你的系统满足上述要求,然后运行以下命令:```bash pipx install cloudgoat
您可能还想运行一些快速配置命令 - 这样可以节省以后的时间:
为AWS进行配置 - 告诉CloudGoat要使用哪个AWS配置文件。```bash
cloudgoat config aws
Configure for Azure - 告诉 CloudGoat 要使用的 Azure 订阅。```bash cloudgoat config azure
登录到 Azure - CloudGoat 使用当前活动的 `az` 账户。```bash
az login
配置白名单```bash cloudgoat config whitelist --auto
现在,在你的命令行中,CloudGoat 可以 `create` 在云中创建一个场景实例。当环境准备好后,项目基础目录中会创建一个以场景名称命名并附加唯一场景ID的新文件夹。该文件夹内有一个名为 `start.txt` 的文件,其中包含你开始场景所需的所有资源,不过这些资源也会在 `create` 命令完成时打印到你的控制台中。有时还会创建一个名为 `cloudgoat`/`cloudgoat.pub` 的 SSH 密钥对。
> **注意:** 不要删除或修改场景实例文件夹或其中的文件,否则可能导致 CloudGoat 无法管理你的场景资源。
在完成场景的过程中,可以随时参考场景的 readme 文件获取指导。如果遇到困难,每个路线的演练底部都提供了作弊表链接。
当你完成场景后,删除你自己创建的任何资源(记住:CloudGoat 只能管理它自己创建的资源),然后运行 `destroy` 命令。之后,最好快速浏览一下你的 Web 控制台——以防有些资源没有被删除。
你可以在 [使用指南章节](#usage-guide) 中阅读 CloudGoat 命令的完整文档。
## 如何使用 CloudGoat 的 Docker 镜像
[](http://play-with-docker.com?stack=https://raw.githubusercontent.com/RhinoSecurityLabs/cloudgoat/master/docker_stack.yml)
### 选项 1:使用默认入口点运行```console
docker run -it rhinosecuritylabs/cloudgoat:latest
警告:运行此命令会将本地 AWS 配置文件挂载到启动的 Docker 容器中。这意味着任何能够访问该容器的用户都将能够访问您主机上的 AWS 凭据。```console docker run -it -v ~/.aws:/root/.aws/ rhinosecuritylabs/cloudgoat:latest
## 可用场景
(按难度分组)
<details open>
<summary><strong>简单</strong></summary>
---
### iam_enum_basics(简单)
`cloudgoat create iam_enum_basics`
在本场景中,你将获得一个名为 Bob 的低级 IAM 用户的访问密钥。你的任务是使用 AWS CLI 进行全面的 IAM 枚举。通过调查托管策略、内联策略、组成员身份和可代入角色,你将发现五个不同的标志。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/iam_enum_basics/README.md)
贡献者:Tyler Ramsbey
---
### data_secrets(简单)
`cloudgoat create data_secrets`
在本场景中,你将从一个权限有限的 IAM 用户开始。你的任务是识别一个配置错误的 EC2 实例,该实例在其用户数据中泄漏了凭据,从而允许你获得 SSH 访问权限。接下来,你必须通过利用实例元数据服务 (IMDS) 窃取角色、枚举 Lambda 函数以发现隐藏的环境变量,并最终攻破一个有权访问场景目标的用户:存储在 AWS Secrets Manager 中的秘密。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/data_secrets/README.md)
贡献者:Tyler Ramsbey
---
### beanstalk_secrets(简单)
`cloudgoat create beanstalk_secrets`
在本场景中,你将获得一组低权限的 AWS 凭据,这些凭据授予对 Elastic Beanstalk 的有限访问权限。你的任务是枚举 Elastic Beanstalk 环境,并发现包含二级凭据的配置错误的环境变量。使用这些二级凭据,你可以枚举 IAM 权限,最终为管理员用户创建访问密钥。凭借这些管理员权限,你将从 AWS Secrets Manager 中检索最终标志。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/beanstalk_secrets/README.md)
贡献者:Tyler Ramsbey
---
### sns_secrets(简单)
`cloudgoat create sns_secrets`
在本场景中,你从一个 AWS 账户的基本访问权限开始。你需要枚举你的权限,发现一个可以订阅的 SNS 主题,检索一个泄漏的 API 密钥,最后使用该 API 密钥访问 API Gateway 以获取最终标志。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/sns_secrets/README.md)
贡献者:Tyler Ramsbey
---
### iam_privesc_by_key_rotation(简单)
`cloudgoat create iam_privesc_by_key_rotation`
利用不安全的 IAM 权限来提升你的访问权限。从一个管理其他用户凭据的角色开始,在设置中发现弱点以访问“admin”角色。使用 admin 角色从 Secrets Manager 检索标志。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/iam_privesc_by_key_rotation/README.md)
贡献者:Infrasec.sh
---
### iam_privesc_by_rollback(简单)
`cloudgoat create iam_privesc_by_rollback`
从一个权限非常有限的 IAM 用户开始,攻击者能够审查之前的 IAM 策略版本,并恢复一个允许完全管理员权限的版本,从而导致权限提升攻击。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/iam_privesc_by_rollback/README.md)
---
### lambda_privesc(简单)
`cloudgoat create lambda_privesc`
以 IAM 用户 Chris 的身份开始,攻击者发现他们可以代入一个拥有完全 Lambda 访问权限和传递角色权限的角色。然后攻击者可以使用这些新权限执行权限提升,从而获得完全的管理员权限。
> **注意:** 此场景可能需要你创建一些 AWS 资源,由于 CloudGoat 只能管理其创建的资源,你需要在运行 `./cloudgoat destroy` 之前手动删除它们。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/lambda_privesc/README.md)
---
### sqs_flag_shop(简单)
`cloudgoat create sqs_flag_shop`
首先,从一个可以购买 FLAG 的 SHOP 页面开始。该网站有多个页面,并且你可以看到源代码是公开的。攻击者分析代码以发现漏洞,并利用其权限购买 FLAG。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/sqs_flag_shop/README.md)
</details>
<details>
<summary><strong>中等</strong></summary>
### static(中等)
`cloudgoat create static`
在本场景中,你扮演一个访问公司门户网站的外部攻击者。通过分析 web 应用程序,你发现它从一个公共 S3 存储桶加载关键的 JavaScript 库。你必须发现存储桶权限的配置错误,通过使用恶意代码覆盖库执行“供应链攻击”,并等待内部管理员机器人登录。你的目标是捕获机器人的凭据并将其回传至存储桶。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/static/README.md)
### vulnerable_cognito(中等)
`cloudgoat create vulnerable_cognito`
在本场景中,你会看到一个带有注册和登录页面的页面,后端使用 AWS Cognito。你需要绕过限制并利用 Amazon Cognito 的配置错误,以提升权限并获得 Cognito Identity Pool 凭据。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/vulnerable_cognito/README.md)
贡献者:TrustOnCloud
---
### vulnerable_lambda(中等)
`cloudgoat create vulnerable_lambda`
在本场景中,你以“bilbo”用户的身份开始。你将代入一个具有更多权限的角色,发现一个将策略应用于用户的 lambda 函数,并利用该函数中的漏洞来提升 bilbo 用户的权限,以便搜索秘密。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/vulnerable_lambda/README.md)
---
### cloud_breach_s3(中等)
`cloudgoat create cloud_breach_s3`
从一个没有任何访问权限或特权的匿名外部人员开始,利用配置错误的反向代理服务器查询 EC2 元数据服务以获取实例配置文件密钥。然后,使用这些密钥发现、访问并从 S3 存储桶中窃取敏感数据。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/cloud_breach_s3/README.md)
---
### iam_privesc_by_attachment(中等)
`cloudgoat create iam_privesc_by_attachment`
从一个权限非常有限的一组权限开始,攻击者能够利用实例配置文件附加权限创建一个新的 EC2 实例,该实例拥有比攻击者自身高得多的权限。通过访问这个新的 EC2 实例,攻击者在目标账户中获得完全的管理权限,并能够实现场景目标——删除 cg-super-critical-security-server,为进一步的恶意行为铺平道路。
> **注意:** 此场景可能需要你创建一些 AWS 资源,由于 CloudGoat 只能管理其创建的资源,你需要在运行 `./cloudgoat destroy` 之前手动删除它们。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/iam_privesc_by_attachment/README.md)
---
### ec2_ssrf(中等)
`cloudgoat create ec2_ssrf`
以 IAM 用户 Solus 的身份开始,攻击者发现自己对 Lambda 函数拥有只读权限,其中硬编码的秘密将他们引导至一个运行着易受服务端请求伪造(SSRF)攻击的 web 应用程序的 EC2 实例。在利用易受攻击的应用程序并从 EC2 元数据服务获取密钥后,攻击者获得对一个私有 S3 存储桶的访问权限,该存储桶中包含一组允许他们调用 Lambda 函数并完成场景的密钥。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/ec2_ssrf/README.md)
---
### ecs_takeover(中等)
`cloudgoat create ecs_takeover`
从访问外部网站开始,攻击者需要找到一个远程代码执行漏洞。通过利用 RCE,攻击者可以访问网站容器可用的资源。滥用多个 ECS 配置错误,攻击者获得 IAM 权限,从而强制 ECS 将目标容器重新调度到受感染的实例上。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/ecs_takeover/README.md)
---
### rds_snapshot(中等)
`cloudgoat create rds_snapshot`
在本场景中,我们从用户“David”开始。通过 David,你可以利用权限窃取凭据。
使用窃取的凭据,攻击者可以利用 RDS 漏洞访问数据库并检索标志。
> **注意:** 此场景可能需要你创建一些 AWS 资源,由于 CloudGoat 只能管理其创建的资源,你需要在运行 `./cloudgoat destroy` 之前手动删除它们。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/rds_snapshot/README.md)
---
### glue_privesc(中等)
`cloudgoat create glue_privesc`
此场景从一个上传 CSV 文件并通过 Glue 服务进行数据可视化的网页开始。
攻击者通过 SQL 注入攻击窃取网页上存在的凭据,并上传一个反向 Shell 以创建 Glue Job 来获取秘密字符串。
> **注意:** 此场景可能需要你创建一些 AWS 资源,由于 CloudGoat 只能管理其创建的资源,你需要在运行 `./cloudgoat destroy` 之前手动删除它们。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/glue_privesc/README.md)
---
### agentcore_identity_confusion(中等)
`cloudgoat create agentcore_identity_confusion`
在本场景中,你获得一组 AWS 凭据,这些凭据可以管理 bedrock agentcore 代码解释器。你的任务是利用这一点来访问其他 agentcore 运行时代理使用的敏感数据。找出如何获取存储在 bedrock knowledgebase 中的标志。
> **注意:** 此场景可能需要你创建一些 AWS 资源,由于 CloudGoat 只能管理其创建的资源,你需要在运行 `./cloudgoat destroy` 之前手动删除它们。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/agentcore_identity_confusion/README.md)
贡献者:Sonrai Security
---
### bedrock_agent_hijacking(中等)
`cloudgoat create bedrock_agent_hijacking`
在本场景中,你获得一组 AWS 凭据,这些凭据可以调用 Bedrock Agent 并更新 lambda 函数。你的任务是分析代理并理解它如何访问实时信息。利用此流程定位并提取存储在 S3 中的标志。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/bedrock_agent_hijacking/README.md)
贡献者:Sonrai Security
</details>
<details>
<summary><strong>困难</strong></summary>
### rce_web_app(困难)
`cloudgoat create rce_web_app`
以 IAM 用户 Lara 的身份开始,攻击者探索 Load Balancer 和 S3 存储桶以寻找漏洞线索,最终在易受攻击的 web 应用程序上获得 RCE 攻击能力,该攻击暴露了机密文件,并最终能够访问场景目标:一个高度安全的 RDS 数据库实例。
或者,攻击者也可以以 IAM 用户 McDuck 的身份开始,枚举 S3 存储桶,最终找到 SSH 密钥,从而直接访问 EC2 服务器及其背后的数据库。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/rce_web_app/README.md)
---
### codebuild_secrets(困难)
`cloudgoat create codebuild_secrets`
以 IAM 用户 Solo 的身份开始,攻击者首先枚举和探索 CodeBuild 项目,在其中发现 IAM 用户 Calrissian 的不安全 IAM 密钥。然后以 Calrissian 的身份行动,攻击者发现一个 RDS 数据库。由于无法直接访问数据库内容,攻击者可以利用 RDS 快照功能巧妙地获取场景目标:一对秘密字符串。
或者,攻击者也可以探索 SSM 参数,找到通往 EC2 实例的 SSH 密钥。利用元数据服务,攻击者可以获取 EC2 实例配置文件的密钥,并深入渗透目标环境,最终通过更迂回的路线获得对原始数据库和场景目标(一对秘密字符串)的访问权限。
> **注意:** 此场景可能需要你创建一些 AWS 资源,由于 CloudGoat 只能管理其创建的资源,你需要在运行 `./cloudgoat destroy` 之前手动删除它们。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/codebuild_secrets/README.md)
---
### detection_evasion(困难)
`cloudgoat create detection_evasion`
此场景的目标是读取两个秘密的值而不被发现。两个秘密都存储在 Secrets Manager 中,其值的格式为(cg-secret-XXXXXX-XXXXXX)。
此场景与其他 CloudGoat 场景有显著不同。在 detection_evasion 中,你的目标将更清晰地列出,挑战在于不触发警报的情况下完成它们。此场景需要更多的设置,并且会花费更长时间(你可能会希望/需要多次游玩)。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/detection_evasion/README.md)
---
### ecs_efs_attack(困难)
`cloudgoat create ecs_efs_attack`
从访问“ruse”EC2 实例开始,用户利用实例配置文件对正在运行的 ECS 容器进行后门攻击。使用后门容器,攻击者可以从容器元数据 API 检索凭据。这些凭据允许攻击者在任何设置了适当标签的 EC2 实例上启动会话。攻击者使用其权限更改 Admin EC2 实例的标签,并启动一个会话。一旦进入 Admin EC2 实例,攻击者将扫描子网以寻找开放的 EFS 进行挂载。挂载后,攻击者可以从弹性文件系统中检索标志。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/ecs_efs_attack/README.md)
---
### ecs_privesc_evade_protection(中等)
`cloudgoat create ecs_privesc_evade_protection`
用户首先访问 EC2 内部容器的工作 Web 服务。攻击者可以利用 Web 服务漏洞从 EC2 中的元数据 API 获取凭据,或控制容器。此凭据允许攻击者启动一个具有特定角色的新容器并控制它。基于此操作,进行权限提升,并读取 S3 中的 FLAG。
> **注意:** 此场景需要在本地安装 Docker,因为在部署期间它会构建容器镜像并推送到 ECR。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/ecs_privesc_evade_protection/README.md)
---
### secrets_in_the_cloud(困难)
`cloudgoat create secrets_in_the_cloud`
作为一个权限有限的 IAM 用户,攻击者通过检查 AWS 资源来寻找线索和隐藏信息。这项调查最终使他们获得一个角色,该角色授予对场景主要目标的访问权限:从 Secrets Manager 检索最终秘密。
[访问场景页面。](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/cloudgoat/scenarios/aws/secrets_in_the_cloud/README.md)
</details>
## 使用指南
CloudGoat 命令的基本结构如下:
> `cloudgoat [ 命令 ] [ 子命令 ] [ --参数名 ] [ 参数值 ]`
CloudGoat 中的五个主要命令概述如下:
### create
`create [ 场景名称 ]` 将场景部署到你选择的 AWS 账户。你也可以对现有场景运行 `create`——CloudGoat 只会销毁并重新创建指定的场景。
> **提示:** 你可以在名称中使用 `/scenarios`,这样可以启用 bash 的原生 Tab 补全。
注意,出于安全原因,必须提供 `--profile`——我们不希望任何人意外地将 CloudGoat 场景部署到生产环境中——并且 CloudGoat 不会使用系统的“默认”AWS CLI 配置文件或通过环境变量指定为默认值的配置文件。但是,你可以通过 `config aws` 设置此项,以避免每次都需要提供它。
### list
`list` 显示关于 `all`(所有)、`undeployed`(未部署)或 `deployed`(已部署)场景的一些信息,甚至可以显示关于已部署的 `[ 场景名称 ]` 的大量信息。你还可以按云平台过滤场景:`list aws` 或 `list azure`。
### destroy
`destroy` 关闭并删除 `[ 场景名称 ]` 的云资源,然后将场景实例文件夹移动到 `./trash`——以防你需要恢复 Terraform 状态文件或其他场景文件。你也可以指定 `all` 而不是场景名称,以销毁所有活动的场景。
> **提示:** CloudGoat 只能管理它创建的资源。如果你在场景过程中自行创建了任何资源,应在运行 `destroy` 命令前手动删除它们。
### config
`config` 允许你管理 CloudGoat 安装的各个方面,特别是 IP `whitelist`、默认 AWS `profile` 以及通过 `argcomplete` 实现的 Tab 补全。有必要简要描述一下每个子命令的作用。
#### whitelist
CloudGoat 需要知道在云端部署潜在易受攻击的资源时应白名单哪些 IP 地址,这些 IP 被记录在项目基础目录下的 `./whitelist.txt` 文件中。你提供的白名单 IP 地址不一定需要采用 CIDR 格式,但 CloudGoat 会为任何裸 IP 添加 `/32`。可选地,你可以添加 `--auto` 参数,CloudGoat 会自动使用 curl 向 ifconfig.co 发起网络请求以查找你的 IP 地址,并根据结果创建白名单文件。
#### aws
虽然 CloudGoat 永远不会使用系统的“默认”AWS CLI 配置文件或通过环境变量指定为默认值的配置文件,但你可以使用 `config aws` 命令指示 CloudGoat 通过名称使用特定的 AWS 配置文件。该命令将提示你输入配置文件的名称,并将其保存在项目基础目录下的 `config.yml` 文件中。只要该文件存在,CloudGoat 在 `create` 和 `destroy` 命令中就会使用其中列出的配置文件名称,而无需每次都提供 `--profile` 标志。你可以随时运行 `config aws` 命令来查看 CloudGoat 默认配置文件的名称,并验证 `config.yml` 的格式。你也可以手动创建 `config.yml`,只要你使用正确的格式。
#### azure
较新版本的 Terraform Azure 提供程序需要订阅 ID 才能应用资源。虽然 CloudGoat 使用与 `az` 工具相同的凭据配置,但必须明确告知 CloudGoat 要部署到哪个订阅。配置通过 `cloudgoat config azure` 完成,订阅信息与 AWS 配置一起存储在 `config.yml` 中。你也可以手动创建 `config.yml`,只要你使用正确的格式。
#### argcomplete
我们非常希望 CloudGoat 拥有原生的 Tab 补全功能,但事实证明在 REPL 之外实现这一点有些困难。它对 Linux 用户应该效果不错,对于有勇气将 bash 版本升级到 4.2+ 的 OSX 用户也是如此。CloudGoat 包含并支持 [python 库 "argcomplete"](https://github.com/kislyuk/argcomplete)。下面提供了安装 argcomplete 的简要步骤,更多详细信息请参考该库 [GitHub 页面](https://github.com/kislyuk/argcomplete) 的官方文档。
1. 使用 CloudGoat 的 requirements.txt 文件安装 argcomplete Python 包:`$ pip3 install -r core/python/requirements.txt`
2. 在 bash 中,运行由 argcomplete 包提供的全局 Python 参数补全脚本:`$ activate-global-python-argcomplete`
3. 执行上一步激活命令所打印的位置处的补全脚本,或重启你的 shell 会话:`$ source [ /path/to/the/completion/script ]`
对于无法或不想配置 argcomplete 的用户,CloudGoat 也支持使用目录路径作为场景名称,这意味着场景名称可以使用 Tab 补全。只需使用 `/scenario/[ 场景名称 ]` 或 `./[ 场景实例名称 ]`,你的 shell 应该能完成剩下的操作。
### help
`help` 提供关于命令的上下文帮助。`help` 可以放在相关命令之前或之后,因此当你需要时它总是在那里。以下是一些示例:* `cloudgoat create help`
* `cloudgoat destroy help`
* `cloudgoat list help`
* `cloudgoat config help`
另一个值得注意的用法:`cloudgoat [ scenario-name ] help` 可用于在控制台打印场景的简要摘要,内容由场景的作者定义。
## 功能请求与错误报告
如果您有功能请求或要报告错误,请[在此提交](https://github.com/RhinoSecurityLabs/cloudgoat/issues/new)。
对于错误,请确保提供足够详细的描述以重现您发现的错误,包括回溯和重现步骤,并在提交新的错误报告前检查是否有其他关于该错误的报告。
对于功能请求,规则类似!请明确说明您的请求,并确保其他人尚未请求相同功能。
## 贡献指南
非常感谢您对 CloudGoat 的贡献。如果您想帮助本项目变得更好,请继续阅读。
1. **创建新场景**:
- 我们提供了一个场景模板,帮助您快速入门。该模板包含 CloudGoat 场景的基本结构和必要文件。您可以在[此处](https://github.com/rhinosecuritylabs/cloudgoat/blob/HEAD/scenarios/scenario_template)找到场景模板。
- **创建新场景的步骤**:
- **复制模板**:将场景模板的内容复制到一个以您的场景命名的新目录中。
- **修改模板**:将模板中的占位内容替换为您新场景的具体内容。
- **测试场景**:通过彻底测试确保您的场景按预期工作。
2. **编码标准**:
- **代码风格**:遵循项目中现有的代码风格。一致性至关重要。
- **注释**:在必要时为代码添加注释,以解释复杂的逻辑或重要决策。
- **文档**:更新 README.md 及其他相关文档,以包含关于您的新场景或更改的详细信息。
3. **白名单设置**:
- 在创建或修改场景时,请牢记以下几点:
- **白名单**:确保安全组规则和其他访问控制配置为仅白名单来自 CloudGoat 配置的 IP。
- **审查**:在贡献前,请双重检查您的配置是否存在任何潜在的漏洞公共资源(即不要创建可被互联网访问的易受攻击的 EC2 实例)。
4. **Python 代码风格**:
- CloudGoat 中的 Python 代码通常应遵循 Python 的风格惯例,优先考虑可读性和可维护性。
- 遵循良好的 Git 实践:使用拉取请求,优先使用功能分支,始终编写清晰的提交信息。
- CloudGoat 使用 `black` 和 `flake8`——Python 语法和风格检查工具。在提交代码前,确保对 `core/python/` 中的所有 Python 文件以及 `cloudgoat.py` 运行了 `flake8` 和 `black`。`black` 的决策优先于 `flake8` 的决策。由于普通用户不需要这些工具,它们都在 `core/python/requirements.txt` 中被注释掉了。
5. **许可协议**:
- CloudGoat 代码应始终使用 BSD 3-Clause 许可证。
最后,感谢您的贡献!
## 变更日志
- **2019年6月24日:** CloudGoat 2.0 发布!
## 免责声明
CloudGoat 是一款软件,不附带任何形式的担保。使用 CloudGoat,您需对由此产生的任何及所有结果承担全部责任。