
Cloudsplaining은 최소 권한 위반을 식별하고 위험 우선 순위가 지정된 보고서를 생성하는 AWS IAM 보안 평가 도구입니다.
Cloudsplaining은 AWS IAM 보안 평가 도구로, 최소 권한 위반을 식별하고 위험 우선순위가 매겨진 HTML 보고서를 생성합니다.
전체 문서는 ReadTheDocs의 프로젝트를 방문하세요.
Cloudsplaining은 AWS IAM 정책에서 최소 권한 위반을 식별하고 예쁜 HTML 보고서를 생성합니다. AWS 계정의 모든 정책, 여러 AWS 계정에 걸쳐 스캔하거나 단일 정책 파일을 스캔할 수 있습니다.
리소스 제약 조건을 활용하지 않는 IAM 작업을 식별하는 데 도움이 됩니다. 또한 제한 없이 해당 AWS 계정에 다음과 같은 위험을 제시하는 IAM 정책을 플래그 지정하여 수정 프로세스의 우선순위를 정하는 데 도움을 줍니다.
s3:GetObject, ssm:GetParameter, secretsmanager:GetSecretValue)Cloudsplaining은 또한 AWS 컴퓨팅 서비스(예: EC2, ECS, EKS 또는 Lambda)가 수임할 수 있는 IAM 역할을 식별합니다. 이러한 역할은 사용자 정의 역할보다 더 큰 위험을 제시할 수 있기 때문입니다. 특히 AWS 컴퓨팅 서비스가 직간접적으로 인터넷에 노출된 인스턴스에 있는 경우 더욱 그렇습니다. 이러한 역할을 플래그 지정하는 것은 특정 시나리오에서 침투 테스터(또는 공격자)에게 특히 유용합니다. 예를 들어, 공격자가 ssm:SendCommand를 실행할 권한을 얻고 SSM 에이전트가 설치된 권한 있는 EC2 인스턴스가 있는 경우, 효과적으로 해당 EC2 인스턴스의 권한을 가질 수 있습니다. AWS Systems Manager Agent를 통한 원격 코드 실행은 이미 알려진 승격/악용 경로였으나, Cloudsplaining은 이러한 사례를 식별하는 과정을 더 쉽게 만들 수 있습니다. 몇 가지 예는 샘플 보고서를 참조하세요.
또한 다양한 이유로 오탐(False Positive) 결과를 필터링하기 위해 사용자 정의 제외 파일을 지정할 수 있습니다. 예를 들어, 사용자 정책은 설계상 허용적인 반면 시스템 역할은 일반적으로 더 제한적입니다. 조직의 다중 계정 전략이나 AWS 애플리케이션 아키텍처에 특화된 제외 사항이 있을 수도 있습니다.```json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "*" } ] }
이것은 좋지 않습니다. 이상적으로는, 액세스가 리소스 ARN에 따라 제한되어야 합니다. 다음과 같이:```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
Policy Sentry는 이 작업을 정말 쉽게 해줍니다. Infrastructure as Code 개발자나 AWS 관리자가 이 도구(사용하기 매우 쉬운)에 익숙해지면, 채택이 매우 빠르게 시작된다는 것을 확인했습니다. 하지만, AWS를 사용해 왔다면 개선이 필요한 IAM 정책들이 아마도 매우 많이 backlog으로 쌓여 있을 것입니다. 수백 개의 AWS 계정에 각각 수십 개의 정책이 있다면, 어떻게 프로그램 방식으로 수정해야 할 정책을 식별하여 해당 AWS 계정을 잠글 수 있을까요?
그래서 우리는 Cloudsplaining을 만들었습니다.
Cloudsplaining은 AWS IAM 정책에서 최소 권한 위반을 식별하고 예쁜 HTML 보고서를 생성합니다. AWS 계정 내의 모든 정책, 여러 AWS 계정에 걸친 정책, 또는 단일 정책 파일을 스캔할 수 있습니다.
brew tap salesforce/cloudsplaining https://github.com/salesforce/cloudsplaining brew install cloudsplaining
#### Pip3```bash
pip3 install --user cloudsplaining
cloudsplaining --help를 실행하여 명령줄에서 cloudsplaining을 실행할 수 있습니다.Bash 자동 완성을 활성화하려면 .bashrc에 다음을 추가하십시오:```bash
eval "$(_CLOUDSPLAINING_COMPLETE=bash_source cloudsplaining)"
ZSH 완성을 활성화하려면, .zshrc에 다음을 추가하세요:```bash
eval "$(_CLOUDSPLAINING_COMPLETE=zsh_source cloudsplaining)"
전체 계정 대신 단일 정책 파일을 스캔하여 위험을 식별할 수도 있습니다.```bash cloudsplaining scan-policy-file --input-file examples/policies/explicit-actions.json
출력에는 조사 설명과 리소스 제약 조건을 활용하지 않는 IAM 작업 목록이 포함됩니다.
출력은 다음과 유사합니다:```console
Issue found: Data Exfiltration
Actions: s3:GetObject
Issue found: Resource Exposure
Actions: ecr:DeleteRepositoryPolicy, ecr:SetRepositoryPolicy, s3:BypassGovernanceRetention, s3:DeleteAccessPointPolicy, s3:DeleteBucketPolicy, s3:ObjectOwnerOverrideToBucketOwner, s3:PutAccessPointPolicy, s3:PutAccountPublicAccessBlock, s3:PutBucketAcl, s3:PutBucketPolicy, s3:PutBucketPublicAccessBlock, s3:PutObjectAcl, s3:PutObjectVersionAcl
Issue found: Unrestricted Infrastructure Modification
Actions: ecr:BatchDeleteImage, ecr:CompleteLayerUpload, ecr:CreateRepository, ecr:DeleteLifecyclePolicy, ecr:DeleteRepository, ecr:DeleteRepositoryPolicy, ecr:InitiateLayerUpload, ecr:PutImage, ecr:PutImageScanningConfiguration, ecr:PutImageTagMutability, ecr:PutLifecyclePolicy, ecr:SetRepositoryPolicy, ecr:StartImageScan, ecr:StartLifecyclePolicyPreview, ecr:TagResource, ecr:UntagResource, ecr:UploadLayerPart, s3:AbortMultipartUpload, s3:BypassGovernanceRetention, s3:CreateAccessPoint, s3:CreateBucket, s3:DeleteAccessPoint, s3:DeleteAccessPointPolicy, s3:DeleteBucket, s3:DeleteBucketPolicy, s3:DeleteBucketWebsite, s3:DeleteObject, s3:DeleteObjectTagging, s3:DeleteObjectVersion, s3:DeleteObjectVersionTagging, s3:GetObject, s3:ObjectOwnerOverrideToBucketOwner, s3:PutAccelerateConfiguration, s3:PutAccessPointPolicy, s3:PutAnalyticsConfiguration, s3:PutBucketAcl, s3:PutBucketCORS, s3:PutBucketLogging, s3:PutBucketNotification, s3:PutBucketObjectLockConfiguration, s3:PutBucketPolicy, s3:PutBucketPublicAccessBlock, s3:PutBucketRequestPayment, s3:PutBucketTagging, s3:PutBucketVersioning, s3:PutBucketWebsite, s3:PutEncryptionConfiguration, s3:PutInventoryConfiguration, s3:PutLifecycleConfiguration, s3:PutMetricsConfiguration, s3:PutObject, s3:PutObjectAcl, s3:PutObjectLegalHold, s3:PutObjectRetention, s3:PutObjectTagging, s3:PutObjectVersionAcl, s3:PutObjectVersionTagging, s3:PutReplicationConfiguration, s3:ReplicateDelete, s3:ReplicateObject, s3:ReplicateTags, s3:RestoreObject, s3:UpdateJobPriority, s3:UpdateJobStatus
전체 AWS 계정을 스캔하고 보고서를 생성할 수 있습니다. 이를 위해 AWS IAM get-account-authorization-details API 호출을 활용하며, 이 호출은 계정의 모든 IAM 세부 정보가 포함된 대용량 JSON 파일(계정당 약 100KB)을 다운로드합니다. 여기에는 사용자, 그룹, 역할, 고객 관리형 정책 및 AWS 관리형 정책에 대한 데이터가 포함됩니다.
CLI에서 사용할 수 있는 AWS 자격 증명이 구성되어 있어야 합니다.
iam:GetAccountAuthorizationDetails를 실행할 수 있는 권한이 있어야 합니다. arn:aws:iam::aws:policy/SecurityAudit 정책에 이 권한이 포함되어 있으며, IAM 서비스에 대한 읽기 액세스를 허용하는 다른 많은 정책에도 포함되어 있습니다.
계정 인증 세부 정보를 다운로드하려면 AWS에 인증되었는지 확인한 다음 cloudsplaining's download 명령을 실행합니다:```bash
cloudsplaining download
* 환경 변수 대신 `~/.aws/credentials` 파일을 사용하려면 프로필 이름을 지정할 수 있습니다:```bash
cloudsplaining download --profile myprofile
현재 디렉토리에 계정 권한 부여 세부 정보가 포함된 JSON 파일을 다운로드합니다.
Cloudsplaining 도구는 AWS 계정의 모든 것에 대한 컨텍스트를 이해하려고 시도하지 않습니다. 이러한 항목 중 일부는 프로그래밍 방식으로 컨텍스트를 이해할 수 있습니다. 정책이 인스턴스 프로필에 적용되었는지, 정책이 연결되었는지, 인라인 IAM 정책이 사용 중인지, AWS 관리형 정책이 사용 중인지 등입니다. AWS 인프라 및 IAM 전략 설계의 컨텍스트를 아는 것은 오직 여러분뿐입니다.
따라서 컨텍스트에 따라 달라지는 오탐(False Positive)을 제거하는 것이 중요합니다. 제외 파일을 사용하여 이를 수행할 수 있습니다. 필요한 형식을 기억할 필요 없이 제외 파일을 생성해 주는 명령어를 포함시켰습니다.
다음 명령어를 통해 제외 템플릿을 생성할 수 있습니다:```bash cloudsplaining create-exclusions-file
이렇게 하면 현재 디렉토리에 `exclusions.yml` 파일이 생성됩니다.
이제 `scan` 명령을 실행할 때, 다음과 같이 제외 파일을 사용할 수 있습니다:```bash
cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/
제외 파일 구조에 대한 자세한 내용은 오탐 필터링을 참조하십시오.
이제 계정 권한 부여 파일을 다운로드했으므로 cloudsplaining을 사용하여 모든 AWS IAM 정책을 스캔할 수 있습니다.
다음 명령을 실행하십시오:```bash cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/
다음과 같은 HTML 보고서를 생성합니다: [this](https://opensource.salesforce.com/cloudsplaining/)
> 
또한 원시 JSON 데이터 파일을 생성합니다:
* `default-iam-results.json`: 이 파일은 보고서의 원시 JSON 출력을 포함합니다. 이 데이터 파일을 사용하여 다양한 목적으로 스캔 결과를 처리할 수 있습니다. 예를 들어, 이 데이터를 파싱하여 자동화된 JIRA 이슈나 Salesforce Work Items를 생성하는 Python 스크립트를 작성할 수 있습니다. 예시 항목은 아래에 표시됩니다. 전체 예시는 [examples/files/iam-results-example.json](https://github.com/salesforce/cloudsplaining/blob/master/examples/files/iam-results-example.json)에서 확인할 수 있습니다.```json
{
"example-authz-details": [
{
"AccountID": "012345678901",
"ManagedBy": "Customer",
"PolicyName": "InsecureUserPolicy",
"Arn": "arn:aws:iam::012345678901:user/userwithlotsofpermissions",
"ActionsCount": 2,
"ServicesCount": 1,
"Actions": [
"s3:PutObject",
"s3:PutObjectAcl"
],
"Services": [
"s3"
]
}
]
}
examples/files 폴더에서 샘플 출력을 확인하세요.
리소스 제한은 모범 사례입니다. 특히 시스템 역할/인스턴스 프로필의 경우 더욱 그렇지만, 때로는 설계상 의도된 경우도 있습니다. 예를 들어, Terraform을 프로비저닝하는 EC2 인스턴스의 인스턴스 프로필에 사용자 지정 IAM 정책이 사용되는 상황을 생각해 보세요. 이 경우, 광범위한 권한은 설계 요구 사항이므로 이러한 결과를 포함하고 싶지 않습니다.
다음 명령을 통해 제외 템플릿을 만들 수 있습니다:```bash cloudsplaining create-exclusions-file
이 명령은 현재 디렉토리에 `exclusions.yml`이라는 파일을 생성합니다.
기본 제외 파일은 다음과 같습니다:```yaml
# Policy names to exclude from evaluation
# Suggestion: Add policies here that are known to be overly permissive by design, after you run the initial report.
policies:
- "AWSServiceRoleFor*"
- "*ServiceRolePolicy"
- "*ServiceLinkedRolePolicy"
- "AdministratorAccess" # Otherwise, this will take a long time
- "service-role*"
- "aws-service-role*"
# Don't evaluate these roles, users, or groups as part of the evaluation
roles:
- "service-role*"
- "aws-service-role*"
users:
- ""
groups:
- ""
# Read-only actions to include in the results, such as s3:GetObject
# By default, it includes Actions that could lead to Data Exfiltration
include-actions:
- "s3:GetObject"
- "ssm:GetParameter"
- "ssm:GetParameters"
- "ssm:GetParametersByPath"
- "secretsmanager:GetSecretValue"
# Write actions to include from the results, such as kms:Decrypt
exclude-actions:
- ""
policies 아래에서 제외하려는 정책 이름의 경로를 나열하십시오.MyRole이라는 역할을 제외하려면 roles 목록에 MyRole 또는 MyR*를 나열하십시오.users 및 groups 목록에도 동일한 방법을 적용할 수 있습니다.이제 scan 명령을 실행할 때 제외 파일을 다음과 같이 사용할 수 있습니다:```bash
cloudsplaining scan --exclusions-file exclusions.yml --input-file examples/files/example.json --output examples/files/
### 여러 AWS 계정 스캔
IAM 사용자 또는 IAM 역할이 여러 AWS 계정에 걸쳐 공통 IAM 역할에 대해 `sts:AssumeRole` 권한을 가지고 있다면, `scan-multi-account` 명령을 사용할 수 있습니다.
다음 다이어그램은 프로세스의 작동 방식을 보여줍니다:

> 참고: 계정 간 액세스 설정이 처음이라면 [IAM 역할을 사용한 AWS 계정 간 액세스 위임에 관한 공식 AWS 튜토리얼](https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_cross-account-with-roles.html)을 확인하세요. 위 아키텍처를 설정하는 데 도움이 됩니다.
* 먼저, 다중 계정 구성 파일을 생성해야 합니다. 다음 명령을 실행하세요:```bash
cloudsplaining create-multi-account-config-file \
-o multi-account-config.yml
multi-account-config.yml 파일을 생성하며, 내용은 다음과 같습니다:```yaml
accounts:
default_account: 123456789012
prod: 123456789013
test: 123456789014> 참고: 위 파일의 형식에 `account_name: accountID`가 포함되어 있는 것을 확인하세요. 원하는 계정 이름과 계정 ID에 맞게 파일 내용을 편집하세요. 원하는 만큼 많은 계정 ID를 포함시킬 수 있습니다.
다음 단계를 위해 다음과 같이 가정해 보겠습니다.
* 대상 계정에 `CommonSecurityRole`이라는 역할이 있다고 가정합니다.
* IAM 사용자의 자격 증명은 `scanning-user`라는 AWS 자격 증명 프로필 아래에 있습니다.
* 해당 사용자는 이전에 생성한 YAML 파일에 지정된 모든 대상 계정에서 `CommonSecurityRole`을 수임할 수 있는 `sts:AssumeRole` 권한을 가지고 있습니다.
* 출력을 `my-results-bucket`이라는 S3 버킷에 저장하려고 합니다.
위 데이터를 사용하여 다음 명령을 실행할 수 있습니다:```bash
cloudsplaining scan-multi-account \
-c multi-account-config.yml \
--profile scanning-user \
--role-name CommonSecurityRole \
--output-bucket my-results-bucket
위 명령을
--profile플래그 없이 실행하면 표준 AWS 자격 증명 우선 순위 (즉, 환경 변수, 자격 증명 프로필, ECS 컨테이너 자격 증명, 마지막으로 EC2 인스턴스 프로필 자격 증명)에 따라 실행됩니다.
Cloudsplaining은 HTML 보고서의 지침 및 부록 섹션을 사용자 정의하여 조직별 보안 권장 사항과 문서를 포함할 수 있도록 지원합니다.
프로젝트 루트 디렉터리에 HTML 파일을 배치하세요:
custom-guidance.html - 사용자 정의 보안 지침 콘텐츠custom-appendices.html - 사용자 정의 부록 콘텐츠echo '
Follow these organization-specific steps:
echo '
Additional company resources:
' > custom-appendices.html ``` # 사용자 정의 콘텐츠로 보고서 생성 cloudsplaining scan --input-file account-data.json --output reports/cloudsplaining download
cloudsplaining download --profile someprofile
cloudsplaining scan --input-file default.json
cloudsplaining scan --input-file default.json --exclusions-file exclusions.yml
cloudsplaining scan-policy-file --input-file examples/policies/wildcards.json cloudsplaining scan-policy-file --input-file examples/policies/wildcards.json --exclusions-file examples/example-exclusions.yml
cloudsplaining create-multi-account-config-file -o accounts.yml cloudsplaining scan-multi-account -c accounts.yml -r TargetRole --output-directory ./
## FAQ
**기본적으로 모든 정책을 스캔하나요?**
아니요, IAM 보안 주체에 연결된 정책만 스캔합니다.
**다운로드 명령어는 모든 정책 버전을 다운로드하나요?**
기본적으로는 그렇지 않습니다. 이 기능을 사용하려면 `--include-non-default-policy-versions` 플래그를 지정하세요. 참고로 `scan` 도구는 현재 기본이 아닌 버전에서는 작동하지 않습니다.
**설치 지침을 따랐지만 명령줄에서 프로그램을 전혀 실행할 수 없습니다. 어떻게 해야 하나요?**
이는 PATH 문제일 가능성이 높습니다. PATH 환경 변수가 `pip3`로 설치된 바이너리 패키지를 고려하지 않고 있습니다. Mac의 경우, 설치된 버전에 따라 아래 명령어를 입력하여 문제를 해결할 수 있습니다. 결과는 다를 수 있습니다.```bash
export PATH=$HOME/Library/Python/3.7/bin/:$PATH
설치 지침을 따랐지만 ModuleNotFoundError가 발생하며 No module named policy_sentry.analysis.expand라고 표시됩니다. 어떻게 해야 하나요?
최신 버전의 Cloudsplaining으로 업그레이드해 보세요. 이 오류는 버전 0.0.10에서 수정되었습니다.