wan0ri Lab

対象リソース洗い出しに向けたAWS CLIコマンドのテンプレート

TL;DR

  • 既存 AWS 環境のセキュリティ是正では、まず「どのリソースが対象か」を早く洗い出すことが重要でした。
  • 客先環境でブラウザ上のコピペがしづらいなら、AWS CLI で一覧化して --query / --output table を使う運用がかなり相性良いです。
  • この記事では、IAM / KMS / S3 / EC2 / EBS / CloudTrail / Security Hub / GuardDuty などの確認に使えるテンプレートをまとめます。

はじめに

2026年4月から、既存 AWS 環境のセキュリティ是正対応を進める案件に入っています。

この種の作業では、いきなり設定変更に入るより先に、

  • 何が存在しているか
  • どこが対象か
  • どこまでが是正対象で、どこからが対象外か

を先に整理しないと作業全体が進みません。

今回、CLI コマンドを重点的にまとめようと思った理由は、客先の AWS 環境が仮想ブラウザ経由で、ポリシーや設定値を気軽にコピペしづらかったためです。

そのため、

  • まず AWS CLI で一覧化
  • --query で必要な項目に絞る
  • --output tablejson で確認する

という流れに寄せた方が、現場で使いやすいと感じました。

この記事では、対象リソース洗い出しに使いやすい AWS CLI コマンドのテンプレート を用途別にまとめます。


この記事の前提

以下の前提で記載します。

  • リージョンは必要に応じて ap-northeast-1 を付ける
  • 出力は見やすさ優先で table を多用する
  • まずは「洗い出し」が目的なので、変更系コマンドは扱わない

最初に、環境変数を置いておくと少し楽です。

Bash / zsh

export AWS_PROFILE=your-profile
export AWS_REGION=ap-northeast-1

PowerShell

$env:AWS_PROFILE = "your-profile"
$env:AWS_REGION = "ap-northeast-1"

以降のコマンドでは、必要に応じて --profile "$AWS_PROFILE"--region "$AWS_REGION" を付けてください。
PowerShell の場合は "$AWS_PROFILE" ではなく "$env:AWS_PROFILE""$AWS_REGION" ではなく "$env:AWS_REGION" に読み替えてください。

また、CLI のページャが邪魔なら、都度 --no-cli-pager を付けるか、以下で無効化しておくと見やすいです。

Bash / zsh

export AWS_PAGER=""

PowerShell

$env:AWS_PAGER = ""

まず共通で使う形

最初に覚えておくと便利なのは以下です。

一覧系

aws <service> <list-command> \
  --region "$AWS_REGION" \
  --output table
aws <service> <list-command> `
  --region "$env:AWS_REGION" `
  --output table

詳細確認系

aws <service> <describe-or-get-command> \
  --region "$AWS_REGION" \
  --output json
aws <service> <describe-or-get-command> `
  --region "$env:AWS_REGION" `
  --output json

必要項目だけ絞る系

aws <service> <command> \
  --region "$AWS_REGION" \
  --query '...JMESPath...' \
  --output table
aws <service> <command> `
  --region "$env:AWS_REGION" `
  --query '...JMESPath...' `
  --output table

読み替えのコツ

  • aws コマンド本体は Bash でも PowerShell でもほぼ同じです。
  • 違いは主に以下です。
    • 行継続: Bash は \、PowerShell は `
    • 環境変数: Bash は "$AWS_REGION"、PowerShell は "$env:AWS_REGION"
  • そのため、以降の具体例は Bash で記載しつつ、PowerShell では上記のルールでそのまま読み替えるのが実務上いちばん扱いやすいです。

1. IAM の洗い出し

IAM ユーザー一覧

aws iam list-users \
  --query 'Users[].{UserName:UserName,CreateDate:CreateDate,Arn:Arn}' \
  --output table
aws iam list-users `
  --query 'Users[].{UserName:UserName,CreateDate:CreateDate,Arn:Arn}' `
  --output table

IAM ユーザーにアタッチされているマネージドポリシー

aws iam list-users \
  --query 'Users[].UserName' \
  --output text
aws iam list-attached-user-policies \
  --user-name <USER_NAME> \
  --query 'AttachedPolicies[].{PolicyName:PolicyName,PolicyArn:PolicyArn}' \
  --output table

カスタマーマネージドポリシー一覧

aws iam list-policies \
  --scope Local \
  --query 'Policies[].{PolicyName:PolicyName,Arn:Arn,CreateDate:CreateDate}' \
  --output table

ロール一覧

aws iam list-roles \
  --query 'Roles[].{RoleName:RoleName,CreateDate:CreateDate,Arn:Arn}' \
  --output table

ルートユーザー関連の確認でよく使うもの

aws iam get-account-summary --output table

特に AccountMFAEnabledAccountAccessKeysPresent をざっくり確認する入口として使いやすいです。


2. KMS の洗い出し

KMS キー一覧

aws kms list-keys \
  --region "$AWS_REGION" \
  --output table
aws kms list-keys `
  --region "$env:AWS_REGION" `
  --output table

各キーの詳細確認

aws kms describe-key \
  --key-id <KMS_KEY_ID_OR_ARN> \
  --region "$AWS_REGION" \
  --output json

キーローテーション有効確認

aws kms get-key-rotation-status \
  --key-id <KMS_KEY_ID_OR_ARN> \
  --region "$AWS_REGION" \
  --output json

キーポリシー取得

aws kms get-key-policy \
  --key-id <KMS_KEY_ID_OR_ARN> \
  --policy-name default \
  --region "$AWS_REGION" \
  --output text

3. S3 の洗い出し

バケット一覧

aws s3api list-buckets \
  --query 'Buckets[].{Name:Name,CreationDate:CreationDate}' \
  --output table
aws s3api list-buckets `
  --query 'Buckets[].{Name:Name,CreationDate:CreationDate}' `
  --output table

パブリックアクセスブロック確認

aws s3api get-public-access-block \
  --bucket <BUCKET_NAME> \
  --output json

バケット暗号化設定確認

aws s3api get-bucket-encryption \
  --bucket <BUCKET_NAME> \
  --output json

バケットポリシー取得

aws s3api get-bucket-policy \
  --bucket <BUCKET_NAME> \
  --query 'Policy' \
  --output text

バージョニング確認

aws s3api get-bucket-versioning \
  --bucket <BUCKET_NAME> \
  --output json

4. EC2 / EBS の洗い出し

EC2 一覧

aws ec2 describe-instances \
  --region "$AWS_REGION" \
  --query 'Reservations[].Instances[].{InstanceId:InstanceId,State:State.Name,Type:InstanceType,SubnetId:SubnetId,VpcId:VpcId,PrivateIp:PrivateIpAddress}' \
  --output table
aws ec2 describe-instances `
  --region "$env:AWS_REGION" `
  --query 'Reservations[].Instances[].{InstanceId:InstanceId,State:State.Name,Type:InstanceType,SubnetId:SubnetId,VpcId:VpcId,PrivateIp:PrivateIpAddress}' `
  --output table

セキュリティグループ一覧

aws ec2 describe-security-groups \
  --region "$AWS_REGION" \
  --query 'SecurityGroups[].{GroupId:GroupId,GroupName:GroupName,VpcId:VpcId,Description:Description}' \
  --output table

EBS ボリューム一覧

aws ec2 describe-volumes \
  --region "$AWS_REGION" \
  --query 'Volumes[].{VolumeId:VolumeId,Encrypted:Encrypted,KmsKeyId:KmsKeyId,Size:Size,State:State,Type:VolumeType}' \
  --output table

EBS スナップショット一覧

aws ec2 describe-snapshots \
  --owner-ids self \
  --region "$AWS_REGION" \
  --query 'Snapshots[].{SnapshotId:SnapshotId,Encrypted:Encrypted,KmsKeyId:KmsKeyId,StartTime:StartTime}' \
  --output table

5. CloudTrail / Config の洗い出し

CloudTrail 証跡一覧

aws cloudtrail describe-trails \
  --query 'trailList[].{Name:Name,S3BucketName:S3BucketName,HomeRegion:HomeRegion,IsMultiRegionTrail:IsMultiRegionTrail,LogFileValidationEnabled:LogFileValidationEnabled}' \
  --output table

CloudTrail ステータス確認

aws cloudtrail get-trail-status \
  --name <TRAIL_NAME> \
  --output json

AWS Config レコーダー確認

aws configservice describe-configuration-recorders \
  --region "$AWS_REGION" \
  --output table

AWS Config 配信チャネル確認

aws configservice describe-delivery-channels \
  --region "$AWS_REGION" \
  --output table

AWS Config ルール一覧

aws configservice describe-config-rules \
  --region "$AWS_REGION" \
  --query 'ConfigRules[].{ConfigRuleName:ConfigRuleName,SourceOwner:Source.Owner,State:ConfigRuleState}' \
  --output table

6. Security Hub / GuardDuty の洗い出し

Security Hub 有効確認

aws securityhub describe-hub \
  --region "$AWS_REGION" \
  --output json

Security Hub のコントロール検出結果をざっくり見る

aws securityhub get-findings \
  --region "$AWS_REGION" \
  --filters '{"RecordState":[{"Value":"ACTIVE","Comparison":"EQUALS"}],"ComplianceStatus":[{"Value":"FAILED","Comparison":"EQUALS"}]}' \
  --max-results 20 \
  --query 'Findings[].{Title:Title,Severity:Severity.Label,Resource:Resources[0].Id,GeneratorId:GeneratorId}' \
  --output table

特定コントロール ID で絞る例

aws securityhub get-findings \
  --region "$AWS_REGION" \
  --filters '{"ComplianceSecurityControlId":[{"Value":"IAM.1","Comparison":"EQUALS"}]}' \
  --query 'Findings[].{Resource:Resources[0].Id,Status:Compliance.Status,Title:Title}' \
  --output table

GuardDuty Detector 一覧

aws guardduty list-detectors \
  --region "$AWS_REGION" \
  --output table

GuardDuty の Findings 一覧

aws guardduty list-findings \
  --detector-id <DETECTOR_ID> \
  --region "$AWS_REGION"
aws guardduty get-findings \
  --detector-id <DETECTOR_ID> \
  --finding-ids <FINDING_ID_1> <FINDING_ID_2> \
  --region "$AWS_REGION" \
  --output json

7. Lambda / ECR / ELB の洗い出し

Lambda 関数一覧

aws lambda list-functions \
  --region "$AWS_REGION" \
  --query 'Functions[].{FunctionName:FunctionName,Runtime:Runtime,Role:Role,LastModified:LastModified,KMSKeyArn:KMSKeyArn}' \
  --output table

ECR リポジトリ一覧

aws ecr describe-repositories \
  --region "$AWS_REGION" \
  --query 'repositories[].{repositoryName:repositoryName,imageScanningConfiguration:imageScanningConfiguration.scanOnPush,encryptionType:encryptionConfiguration.encryptionType}' \
  --output table

ALB / NLB 一覧

aws elbv2 describe-load-balancers \
  --region "$AWS_REGION" \
  --query 'LoadBalancers[].{Name:LoadBalancerName,Type:Type,Scheme:Scheme,State:State.Code,VpcId:VpcId}' \
  --output table

8. DynamoDB / SQS / SNS の洗い出し

DynamoDB テーブル一覧

aws dynamodb list-tables \
  --region "$AWS_REGION" \
  --output table
aws dynamodb describe-table \
  --table-name <TABLE_NAME> \
  --region "$AWS_REGION" \
  --query 'Table.{TableName:TableName,SSEDescription:SSEDescription,BillingMode:BillingModeSummary.BillingMode}' \
  --output json

SQS キュー一覧

aws sqs list-queues \
  --region "$AWS_REGION" \
  --output table

SNS トピック一覧

aws sns list-topics \
  --region "$AWS_REGION" \
  --output table

実務でよくやった進め方

私が実務でよくやったのは、以下の順です。

  1. サービス単位で一覧を出す
  2. 暗号化、公開設定、ログ、権限の観点で追加確認する
  3. 対象外候補も同時にメモする
  4. 顧客と是正有無をすり合わせる

たとえば S3 なら、

  • まずバケット一覧
  • パブリックアクセスブロック
  • 暗号化
  • バケットポリシー

という順で見ていくと、かなり整理しやすかったです。


使う上での注意点

1. 一覧コマンドだけでは足りない

一覧で存在確認はできますが、是正要否までは判断できません。

結局は、

  • その設定が業務要件上必要か
  • 代替統制があるか
  • 本当に是正対象か

まで見ないと、作業対象は確定しません。

2. --query を先に作ると楽

仮想ブラウザ環境では、出力が長いだけでかなり見づらくなります。
最初から必要な列だけ出すと、確認がだいぶ楽になります。

3. コマンドは“テンプレート”として持つ

案件ごとにサービス構成は違うので、完全な正解コマンドは毎回変わります。
ただ、

  • 一覧
  • 詳細
  • 暗号化
  • 権限
  • ログ

の型はかなり使い回せます。


まとめ

既存 AWS 環境のセキュリティ是正では、まず対象リソースを早く正確に洗い出すことが重要です。

特に、仮想ブラウザ経由での作業や、コンソール上の確認がやりづらい環境では、AWS CLI のテンプレートを持っておくとかなり助かります。

この記事では、対象リソース洗い出しの入口として使いやすい CLI コマンドをまとめました。

今後は、ここで触れたものをベースに、

  • Security Hub の検出結果に対してどのように対象リソースを絞るか
  • KMSS3 の是正時にどこを見るか

といったテーマも個別に深掘りしていきたいと思います。