
Cloudsplainingは、最小権限の違反を特定し、リスク優先順位付けされたレポートを生成するAWS IAMセキュリティ評価ツールです。
Cloudsplainingは、AWS IAMの最小権限の違反を特定し、リスク優先度でソートされたHTMLレポートを生成するAWS IAMセキュリティ評価ツールです。
完全なドキュメントについては、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はこれらのケースの特定を容易にします。いくつかの例についてはサンプルレポートをご覧ください。
また、カスタム除外ファイルを指定して、様々な理由で誤検出となる結果をフィルタリングすることもできます。例えば、ユーザーポリシーは設計上寛容であるのに対し、システムロールは一般的により制限的です。また、組織のマルチアカウント戦略やAWSアプリケーションアーキテクチャに固有の除外設定もあるでしょう。
Policy Sentryは、最小権限に従ってIAMポリシーをスケーラブルに作成できることを明らかにしました。Policy Sentryがリリースされる前は、リソース制約を欠いたIAMポリシードキュメントを見つけることはあまりにも簡単でした。以下のポリシーを考えてみてください。これはIAMプリンシパル(ロールまたはユーザー)がAWSアカウント内の任意のS3バケットに対してs3:PutObjectを実行することを許可しています。```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 ポリシーのバックログが非常に多い可能性があります。何百もの 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のdownloadコマンドを実行します:```bash
cloudsplaining download
* 環境変数の代わりに `~/.aws/credentials` ファイルを使用したい場合は、プロファイル名を指定できます:```bash
cloudsplaining download --profile myprofile
現在のディレクトリに、アカウントの認可詳細情報を含むJSONファイルがダウンロードされます。
Cloudsplainingツールは、AWSアカウント内のすべての背景をプログラムで理解しようとはしません。ポリシーがインスタンスプロファイルに適用されているか、ポリシーがアタッチされているか、インラインIAMポリシーが使用されているか、AWS管理ポリシーが使用されているかなど、一部の背景はプログラムで理解することが可能です。AWSインフラストラクチャとIAM戦略の設計の背景を理解しているのはあなただけです。
そのため、コンテキストに依存する誤検出を排除することが重要です。これは除外ファイルを使用して行うことができます。必要な形式を覚えなくてもよいように、除外ファイルを生成するコマンドを用意しています。
除外テンプレートは以下のコマンドで作成できます:```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レポートを作成します。
> 
また、生の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 Credentialsプロファイルにあります。
* そのユーザーは、先ほど作成した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
Note that if you run the above without the
--profileflag, it will execute in the standard AWS Credentials order of precedence (i.e., Environment variables, credentials profiles, ECS container credentials, then finally EC2 Instance Profile credentials).
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 で修正されました。