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 tableやjsonで確認する
という流れに寄せた方が、現場で使いやすいと感じました。
この記事では、対象リソース洗い出しに使いやすい 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 は
- そのため、以降の具体例は 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
特に AccountMFAEnabled や AccountAccessKeysPresent をざっくり確認する入口として使いやすいです。
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
実務でよくやった進め方
私が実務でよくやったのは、以下の順です。
- サービス単位で一覧を出す
- 暗号化、公開設定、ログ、権限の観点で追加確認する
- 対象外候補も同時にメモする
- 顧客と是正有無をすり合わせる
たとえば S3 なら、
- まずバケット一覧
- パブリックアクセスブロック
- 暗号化
- バケットポリシー
という順で見ていくと、かなり整理しやすかったです。
使う上での注意点
1. 一覧コマンドだけでは足りない
一覧で存在確認はできますが、是正要否までは判断できません。
結局は、
- その設定が業務要件上必要か
- 代替統制があるか
- 本当に是正対象か
まで見ないと、作業対象は確定しません。
2. --query を先に作ると楽
仮想ブラウザ環境では、出力が長いだけでかなり見づらくなります。
最初から必要な列だけ出すと、確認がだいぶ楽になります。
3. コマンドは“テンプレート”として持つ
案件ごとにサービス構成は違うので、完全な正解コマンドは毎回変わります。
ただ、
- 一覧
- 詳細
- 暗号化
- 権限
- ログ
の型はかなり使い回せます。
まとめ
既存 AWS 環境のセキュリティ是正では、まず対象リソースを早く正確に洗い出すことが重要です。
特に、仮想ブラウザ経由での作業や、コンソール上の確認がやりづらい環境では、AWS CLI のテンプレートを持っておくとかなり助かります。
この記事では、対象リソース洗い出しの入口として使いやすい CLI コマンドをまとめました。
今後は、ここで触れたものをベースに、
Security Hubの検出結果に対してどのように対象リソースを絞るかKMSやS3の是正時にどこを見るか
といったテーマも個別に深掘りしていきたいと思います。