背景
「AWS Security Hub が AWS CloudFormation を使用した管理機能の強化を発表」で以下のような update(Jun. 2023) がありました。
また、新しい AWS::SecurityHub::Standard リソースを使用することで、NIST 800-53 や PCI DSS など、特定のセキュリティ基準を有効にして、そこに含まれる個別のコントロールを管理することもできます。
コントロール毎の有効化/無効化の設定をするために、Security Hub のコントロール情報を AWS CLI で出力したくなった人が急増(?)しているのではないでしょうか。
以下のように aws securityhub describe-standards-controls
コマンドでセキュリティ基準の ARN を指定することで、該当のコントロール一覧を出力することができます。
# AWS Foundational Security Best Practices (FSBP) 標準のコントロール出力コマンド例
aws securityhub describe-standards-controls \
--max-results 100 \
--standards-subscription-arn arn:aws:securityhub:<region>:<account-id>:subscription/aws-foundational-security-best-practices/v/1.0.0
(参考: AWS CLI Command Reference)
課題
が!しかし、このコマンドは出力数が多くなると、途中までしか出力してくれません。上限は、上記の例のように --max-results
で変更できますが、これも 100 までです。(なお、AWS FSBP のコントロールの数は、2023年11月時点で221個・・・)
出力が途中で途切れた場合は、下記のように "NextToken" という識別子が最後に出力されます。
"NextToken": "U2FsdGVkX18tJIExN ~省略~"
これを上記のコマンドに "--next-token" という引数のパラメータに指定することで、残りのコントロールを出力することができます。
aws securityhub describe-standards-controls \
--next-token "U2FsdGVkX18tJIExN ~省略~" \
--max-results 100 \
--standards-subscription-arn arn:aws:securityhub:<region>:<account-id>:subscription/aws-foundational-security-best-practices/v/1.0.0
いかがでしたでしょうか?簡単ですね。
・・・え?「面倒くさい。こんなの毎回やりたくない。」ですか?はい!私もそう思いました!
Bash のスクリプトを使って解決
そうするとスクリプトや、プログラムを作って、効率化できそうですよね。ということで、コントロールの量が多くても一撃で一覧を出力できる Bash スクリプト作りました。
#!/bin/bash
export script=$0
export standardsArn=$1
export maxResults=100
export nextToken=""
export outputFile="outputFile.json"
while true ; do
aws securityhub describe-standards-controls --next-token "${nextToken}" --max-results "${maxResults}" --standards-subscription-arn "${standardsArn}" > ${outputFile}
cat ${outputFile} # 結果出力箇所、なおここで jq コマンドにパイプするなどして、出力形式をカスタマイズすることも可能
export nextToken=$( cat ${outputFile} | jq -r ".NextToken" )
if [ $nextToken = "null" ]; then # .NextToken がnullなら終了
exit 0
fi
done
実行はスクリプト(例: describe-standards-controls_loop.bash
)とセキュリティ基準の ARN を指定することで出力が可能です。
bash describe-standards-controls_loop.bash arn:aws:securityhub:<region>:<account-id>:subscription/aws-foundational-security-best-practices/v/1.0.0
このサンプルで、誰かがちょっとでも楽になっていただければ幸いです。