CloudGoat는 Rhino Security Labs의 "의도적으로 취약하게 설계된" AWS 배포 도구입니다.
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
Azure용 구성 - CloudGoat에게 사용할 Azure 구독을 알려주세요.```bash cloudgoat config azure
Azure에 로그인 - CloudGoat는 활성 `az` 계정을 사용합니다.```bash
az login
허용 목록 구성```bash cloudgoat config whitelist --auto
Now, at your command, CloudGoat can `create` an instance of a scenario in the cloud. When the environment is ready, a new folder will be created in the project base directory named after the scenario and with a unique scenario ID appended. Inside this folder will be a file called `start.txt`, which will contain all of the resources you'll need to begin the scenario, though these are also printed to your console when the `create` command completes. Sometimes an SSH keypair named `cloudgoat`/`cloudgoat.pub` will be created as well.
> **참고:** 시나리오 인스턴스 폴더나 그 안의 파일을 삭제하거나 수정하지 마세요. 그렇게 하면 CloudGoat가 시나리오 리소스를 관리하지 못할 수 있습니다.
시나리오를 진행하는 동안 방향이 필요하면 시나리오의 readme를 참조하세요. 막히는 경우 각 경로의 워크스루 하단에 치트 시트 링크가 있습니다.
시나리오가 끝나면 직접 생성한 리소스를 삭제하고(기억하세요: CloudGoat는 자신이 생성한 리소스만 관리할 수 있습니다) `destroy` 명령을 실행하세요. 이후 웹 콘솔을 잠시 살펴보는 것이 좋습니다. 혹시 삭제되지 않은 것이 있을 수 있으니까요.
You can read the full documentation for CloudGoat's commands [here in the Usage Guide section](#usage-guide).
## 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
경고: 이 명령을 실행하면 Docker 컨테이너가 시작될 때 로컬 AWS 구성 파일이 컨테이너에 마운트됩니다. 이는 컨테이너에 접근 권한이 있는 모든 사용자가 호스트 컴퓨터의 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/master/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/master/cloudgoat/scenarios/aws/data_secrets/README.md)
Tyler Ramsbey 제공
---
### beanstalk_secrets (쉬움)
`cloudgoat create beanstalk_secrets`
이 시나리오에서는 Elastic Beanstalk에 대한 제한된 액세스 권한을 부여하는 낮은 권한의 AWS 자격 증명이 제공됩니다. Elastic Beanstalk 환경을 열거하고 잘못 구성된 환경 변수에서 보조 자격 증명을 발견해야 합니다. 이 보조 자격 증명을 사용하여 IAM 권한을 열거하고 관리자 사용자의 액세스 키를 생성할 수 있습니다. 이러한 관리자 권한으로 AWS Secrets Manager에 저장된 최종 플래그를 검색합니다.
[시나리오 페이지 방문](https://github.com/rhinosecuritylabs/cloudgoat/blob/master/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/master/cloudgoat/scenarios/aws/sns_secrets/README.md)
Tyler Ramsbey 제공
---
### iam_privesc_by_key_rotation (쉬움)
`cloudgoat create iam_privesc_by_key_rotation`
안전하지 않은 IAM 권한을 악용하여 액세스 권한을 상승시킵니다. 다른 사용자의 자격 증명을 관리하는 역할로 시작하여 설정에서 약점을 찾아 "admin" 역할에 액세스합니다. 관리자 역할을 사용하여 Secrets Manager에서 플래그를 검색합니다.
[시나리오 페이지 방문](https://github.com/rhinosecuritylabs/cloudgoat/blob/master/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/master/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/master/cloudgoat/scenarios/aws/lambda_privesc/README.md)
---
### sqs_flag_shop (쉬움)
`cloudgoat create sqs_flag_shop`
먼저 FLAG를 구매할 수 있는 SHOP 페이지로 시작합니다. 웹사이트에는 여러 페이지가 있으며 소스 코드가 노출되어 있음을 확인할 수 있습니다. 공격자는 코드를 분석하여 취약점을 찾고 자신의 권한을 사용하여 FLAG를 구매합니다.
[시나리오 페이지 방문](https://github.com/rhinosecuritylabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/sqs_flag_shop/README.md)
</details>
<details>
<summary><strong>중간</strong></summary>
### static (중간)
`cloudgoat create static`
이 시나리오에서는 기업 포털을 방문하는 외부 공격자 역할을 합니다. 웹 애플리케이션을 분석하여 공용 S3 버킷에서 중요한 JavaScript 라이브러리를 로드한다는 것을 식별합니다. 버킷 권한의 잘못된 구성을 발견하고, 악성 코드로 라이브러리를 덮어쓰는 "공급망 공격"을 수행한 후, 내부 관리자 봇이 로그인하기를 기다려야 합니다. 목표는 봇의 자격 증명을 캡처하여 다시 버킷으로 빼내는 것입니다.
[시나리오 페이지 방문](https://github.com/rhinosecuritylabs/cloudgoat/blob/master/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/master/cloudgoat/scenarios/aws/vulnerable_cognito/README.md)
TrustOnCloud 제공
---
### vulnerable_lambda (중간)
`cloudgoat create vulnerable_lambda`
이 시나리오에서는 'bilbo' 사용자로 시작합니다. 더 높은 권한을 가진 역할을 수임하고, 사용자에게 정책을 적용하는 Lambda 함수를 발견한 후, 함수의 취약점을 악용하여 bilbo 사용자의 권한을 상승시켜 시크릿을 검색합니다.
[시나리오 페이지 방문](https://github.com/rhinosecuritylabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/vulnerable_lambda/README.md)
---
### cloud_breach_s3 (중간)
`cloudgoat create cloud_breach_s3`
익명의 외부인(액세스 권한이나 권한 없음)으로 시작하여, 잘못 구성된 리버스 프록시 서버를 악용해 EC2 메타데이터 서비스를 쿼리하고 인스턴스 프로파일 키를 획득합니다. 그런 다음 해당 키를 사용하여 S3 버킷에서 민감한 데이터를 발견, 액세스 및 유출합니다.
[시나리오 페이지 방문](https://github.com/rhinosecuritylabs/cloudgoat/blob/master/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/master/cloudgoat/scenarios/aws/iam_privesc_by_attachment/README.md)
---
### ec2_ssrf (중간)
`cloudgoat create ec2_ssrf`
IAM 사용자 Solus로 시작하여, 공격자는 Lambda 함수에 대한 ReadOnly 권한을 발견하고, 하드코딩된 시크릿을 통해 서버 측 요청 위조(SSRF)에 취약한 웹 애플리케이션을 실행하는 EC2 인스턴스로 이어집니다. 취약한 앱을 악용하고 EC2 메타데이터 서비스에서 키를 획득한 후, 개인 S3 버킷에 액세스하여 Lambda 함수를 호출하고 시나리오를 완료할 수 있는 키 세트를 얻습니다.
[시나리오 페이지 방문](https://github.com/rhinosecuritylabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/ec2_ssrf/README.md)
---
### ecs_takeover (중간)
`cloudgoat create ecs_takeover`
외부 웹사이트에 액세스하여 시작하는 공격자는 원격 코드 실행 취약점을 찾아야 합니다. RCE를 사용하여 웹사이트 컨테이너에서 사용 가능한 리소스에 액세스할 수 있습니다. 여러 ECS 잘못된 구성을 악용하여 공격자는 대상 컨테이너를 손상된 인스턴스에 재스케줄링하도록 ECS에 강제할 수 있는 IAM 권한을 얻습니다.
[시나리오 페이지 방문](https://github.com/rhinosecuritylabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/ecs_takeover/README.md)
---
### rds_snapshot (중간)
`cloudgoat create rds_snapshot`
이 시나리오에서는 'David' 사용자로 시작합니다. David를 통해 권한을 활용하여 자격 증명을 탈취할 수 있습니다. 탈취한 자격 증명을 사용하여 RDS 취약점을 악용하여 DB에 액세스하고 플래그를 검색할 수 있습니다.
> **참고:** 이 시나리오는 일부 AWS 리소스를 생성해야 할 수 있으며, CloudGoat는 자신이 생성한 리소스만 관리할 수 있으므로 `./cloudgoat destroy`를 실행하기 전에 해당 리소스를 수동으로 제거해야 합니다.
[시나리오 페이지 방문](https://github.com/rhinosecuritylabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/rds_snapshot/README.md)
---
### glue_privesc (중간)
`cloudgoat create glue_privesc`
이 시나리오는 CSV 파일을 업로드하고 Glue 서비스를 통해 데이터 시각화를 수행하는 웹 페이지로 시작합니다.
공격자는 SQL 인젝션 공격을 통해 웹페이지에 있는 자격 증명을 탈취하고, 리버스 셸을 업로드하여 Glue Job을 생성해 시크릿 문자열을 획득합니다.
> **참고:** 이 시나리오는 일부 AWS 리소스를 생성해야 할 수 있으며, CloudGoat는 자신이 생성한 리소스만 관리할 수 있으므로 `./cloudgoat destroy`를 실행하기 전에 해당 리소스를 수동으로 제거해야 합니다.
[시나리오 페이지 방문](https://github.com/rhinosecuritylabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/glue_privesc/README.md)
---
### agentcore_identity_confusion (중간)
`cloudgoat create agentcore_identity_confusion`
이 시나리오에서는 bedrock agentcore 코드 인터프리터를 관리할 수 있는 AWS 자격 증명이 제공됩니다. 이를 활용하여 다른 agentcore 런타임 에이전트가 사용하는 민감한 데이터에 액세스해야 합니다. bedrock knowledgebase에 저장된 플래그에 액세스하는 방법을 알아내야 합니다.
> **참고:** 이 시나리오는 일부 AWS 리소스를 생성해야 할 수 있으며, CloudGoat는 자신이 생성한 리소스만 관리할 수 있으므로 `./cloudgoat destroy`를 실행하기 전에 해당 리소스를 수동으로 제거해야 합니다.
[시나리오 페이지 방문](https://github.com/rhinosecuritylabs/cloudgoat/blob/master/cloudgoat/scenarios/aws/agentcore_identity_confusion/README.md)
Sonrai Security 제공
---
### bedrock_agent_hijacking (중간)
`cloudgoat create bedrock_agent_hijacking`
이 시나리오에서는 Bedrock Agent를 호출하고 Lambda 함수를 업데이트할 수 있는 AWS 자격 증명이 제공됩니다. 에이전트를 분석하고 실시간 정보에 어떻게 액세스하는지 이해해야 합니다. 이 흐름을 활용하여 S3에 저장된 플래그를 찾고 추출합니다.
[시나리오 페이지 방문](https://github.com/rhinosecuritylabs/cloudgoat/blob/master/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로 시작하여, 공격자는 로드 밸런서와 S3 버킷을 탐색하여 취약점에 대한 단서를 찾고, 취약한 웹 앱에서 RCE 공격을 수행하여 기밀 파일을 노출시키고 최종적으로 시나리오 목표인 고도로 보안된 RDS 데이터베이스 인스턴스에 액세스합니다.
또는 공격자는 IAM 사용자 McDuck으로 시작하여 S3 버킷을 열거하고, 결과적으로 SSH 키를 찾아 EC2 서버와 그 너머의 데이터베이스에 직접 액세스할 수 있습니다.
[시나리오 페이지 방문](https://github.com/rhinosecuritylabs/cloudgoat/blob/master/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/master/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/master/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/master/cloudgoat/scenarios/aws/ecs_efs_attack/README.md)
---
### ecs_privesc_evade_protection (중간)
`cloudgoat create ecs_privesc_evade_protection`
사용자는 EC2 내부의 컨테이너에 대한 작동 중인 웹 서비스에 액세스하는 것으로 시작합니다. 공격자는 웹 서비스 취약점을 악용하여 EC2의 메타데이터 API에서 자격 증명을 얻거나 컨테이너를 제어할 수 있습니다. 이 자격 증명을 통해 공격자는 특정 역할을 가진 새 컨테이너를 시작하고 이를 제어할 수 있습니다. 이 작업을 기반으로 권한 상승을 수행하고 S3에서 FLAG를 읽습니다.
> **참고:** 이 시나리오는 배포 중 컨테이너 이미지를 빌드하고 ECR에 푸시하므로 Docker가 로컬에 설치되어 있어야 합니다.
[시나리오 페이지 방문](https://github.com/rhinosecuritylabs/cloudgoat/blob/master/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/master/cloudgoat/scenarios/aws/secrets_in_the_cloud/README.md)
</details>
## 사용 가이드
CloudGoat 명령의 기본 구조는 다음과 같습니다:
> `cloudgoat [ 명령어 ] [ 하위 명령어 ] [ --인수-이름 ] [ 인수-값 ]`
CloudGoat의 다섯 가지 주요 명령어는 아래에 요약되어 있습니다:
### create
`create [ 시나리오-이름 ]`은 선택한 AWS 계정에 시나리오를 배포합니다. 기존 시나리오에 대해 `create`를 실행할 수도 있습니다. CloudGoat는 해당 시나리오를 파괴하고 다시 생성합니다.
> **팁:** 이름에 `/scenarios`를 사용할 수 있어 bash의 기본 탭 완성을 사용할 수 있습니다.
안전을 위해 `--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`를 통한 탭 완성을 관리할 수 있습니다. 각 하위 명령어가 무엇을 하는지 간략히 설명하는 것이 좋습니다.
#### whitelist
CloudGoat는 잠재적으로 취약한 리소스가 클라우드에 배포될 때 허용되어야 하는 IP 주소를 알아야 하며, 이러한 IP는 기본 프로젝트 디렉토리의 `./whitelist.txt` 파일에 추적됩니다. 허용 목록에 추가할 IP 주소는 CIDR 형식일 필요는 없지만, CloudGoat는 제공된 모든 IP에 `/32`를 추가합니다. 선택적으로 `--auto` 인수를 추가하면 CloudGoat가 curl을 사용하여 ifconfig.co에 네트워크 요청을 자동으로 보내 IP 주소를 찾고 결과로 허용 목록 파일을 생성합니다.
#### aws
CloudGoat는 시스템의 "기본" AWS CLI 프로파일이나 환경 변수를 통해 기본값으로 지정된 프로파일을 사용하지 않지만, `config aws` 명령을 사용하여 특정 AWS 프로파일을 이름으로 사용하도록 지시할 수 있습니다. 이 명령은 기본 프로젝트 디렉토리의 `config.yml` 파일에 프로파일 이름을 저장하도록 요청합니다. 해당 파일이 존재하는 한 CloudGoat는 create 및 destroy 명령에 대해 `--profile` 플래그 대신 파일에 나열된 프로파일 이름을 사용합니다. `config aws` 명령은 언제든지 실행하여 CloudGoat 기본 프로파일의 이름을 확인하고 `config.yml`의 형식을 검증할 수 있습니다. 원하는 경우 올바른 형식을 사용하여 `config.yml`을 수동으로 생성할 수도 있습니다.
#### azure
Terraform용 Azure 공급자의 최신 버전은 리소스를 적용하기 위해 구독 ID가 필요합니다. CloudGoat는 `az` 유틸과 동일한 자격 증명 구성을 사용하지만, 배포할 구독을 명시적으로 지정해야 합니다. 구성은 `cloudgoat config azure`로 수행되며, 구독은 aws 구성과 함께 `config.yml`에 저장됩니다. 원하는 경우 올바른 형식을 사용하여 `config.yml`을 수동으로 생성할 수도 있습니다.
#### argcomplete
CloudGoat에 기본 탭 완성 기능을 제공하고 싶었지만, REPL 외부에서는 다소 어려운 것으로 나타났습니다. Linux 사용자에게는 합리적으로 잘 작동해야 하며, bash 버전을 4.2+로 업그레이드할 용기가 있는 OSX 사용자에게도 작동할 것입니다. CloudGoat는 [python 라이브러리 "argcomplete"](https://github.com/kislyuk/argcomplete)를 포함하고 지원합니다. argcomplete 설치 방법에 대한 간략한 요약이 아래에 제공되지만, 더 자세한 단계는 공식 문서를 참조해야 합니다.
1. CloudGoat의 requirements.txt 파일을 사용하여 argcomplete Python 패키지를 설치합니다: `$ pip3 install -r core/python/requirements.txt`
2. bash에서 argcomplete 패키지에서 제공하는 전역 Python 인수 완성 스크립트를 실행합니다: `$ activate-global-python-argcomplete`
3. 이전 활성화 명령에서 출력된 위치의 완성 스크립트를 소싱하거나 셸 세션을 다시 시작합니다: `$ source [ /path/to/the/completion/script ]`
argcomplete를 구성할 수 없거나 원하지 않는 사용자를 위해 CloudGoat는 디렉토리 경로를 시나리오 이름으로 사용하는 것도 지원하므로 시나리오 이름에 대해 탭 완성이 작동합니다. `/scenario/[ 시나리오-이름 ]` 또는 `./[ 시나리오-인스턴스-이름 ]`을 사용하면 셸이 나머지를 처리합니다.
### help
`help`는 명령어에 대한 상황별 도움말을 제공합니다. `help`는 해당 명령어 앞이나 뒤에 올 수 있으므로 필요할 때 항상 사용할 수 있습니다. 아래는 몇 가지 예시입니다:* `cloudgoat create help`
* `cloudgoat destroy help`
* `cloudgoat list help`
* `cloudgoat config help`
주목할 만한 다른 용도로, `cloudgoat [ 시나리오-이름 ] help`를 사용하면 시나리오 작성자가 정의한 시나리오의 간략한 요약을 콘솔에 출력할 수 있습니다.
## 기능 요청 및 버그 신고
기능 요청이나 버그를 신고하려면 [여기에 제출해 주세요](https://github.com/RhinoSecurityLabs/cloudgoat/issues/new).
버그의 경우, 발견한 버그를 재현할 수 있는 설명(추적 및 재현 단계 포함)을 반드시 포함하고, 새 버그 보고서를 작성하기 전에 동일한 버그에 대한 다른 보고서가 있는지 확인하십시오.
기능의 경우에도 마찬가지입니다! 요청을 구체적으로 작성하고, 다른 사람이 이미 동일한 기능을 요청하지 않았는지 확인하십시오.
## 기여 가이드라인
CloudGoat에 대한 기여는 크게 환영합니다. 프로젝트를 개선하는 데 도움을 주고 싶다면 계속 읽어 주세요.
1. **새 시나리오 만들기**:
- 빠르게 시작할 수 있도록 시나리오 템플릿을 제공합니다. 이 템플릿에는 CloudGoat 시나리오의 기본 구조와 필수 파일이 포함되어 있습니다. 시나리오 템플릿은 [여기](https://github.com/rhinosecuritylabs/cloudgoat/blob/master/scenarios/scenario_template)에서 찾을 수 있습니다.
- **새 시나리오를 만드는 단계**:
- **템플릿 복사**: 시나리오 템플릿의 내용을 시나리오 이름을 딴 새 디렉터리로 복사합니다.
- **템플릿 수정**: 템플릿의 자리 표시자 내용을 새 시나리오의 세부 사항으로 교체합니다.
- **시나리오 테스트**: 시나리오를 철저히 테스트하여 예상대로 작동하는지 확인합니다.
2. **코딩 표준**:
- **코드 스타일**: 프로젝트의 기존 코드 스타일을 따릅니다. 일관성이 중요합니다.
- **주석**: 복잡한 논리나 중요한 결정을 설명해야 하는 경우 코드에 주석을 추가합니다.
- **문서화**: README.md 및 기타 관련 문서를 업데이트하여 새 시나리오나 변경 사항에 대한 세부 정보를 포함시킵니다.
3. **허용 목록(Whitelisting)**:
- 시나리오를 만들거나 수정할 때 다음 사항을 염두에 두십시오:
- **허용 목록**: 보안 그룹 규칙 및 기타 액세스 제어가 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를 사용함으로써 발생하는 모든 결과에 대한 전적인 책임은 사용자에게 있습니다.