[小ネタ] AWS Configのアグリゲーターで収集したコンプライアンス状況のレポートをAWS CLIから確認する

2020.10.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは。大阪オフィスの林です。

AWS Configの『アグリゲーター』という機能を使用することで、 AWS Configで収集しているリソースや、Configルールのチェック結果を複数のアカウントや複数のリージョンにまたがり、集約してレポーティングすることができます。もちろんAWSマネージメントコンソールから集約されたレポートを確認することもできるのですが、チョットした経緯でCLIからレポートを確認する方法を試しましたのでまとめておきたいと思います。
『アグリゲーター』については下記エントリも参照頂ければと思います。

なぜCLIからレポートを確認したいか?

AWSマネージメントコンソールからアグリゲーターの集約ビューを使って全体のコンプライアンス状況を見てみると下記のような感じで確認ができます。

複数のアカウントや複数のリージョンにまたがって全体のコンプライアンス状況を確認できるのは大変ありがたいのですが、それらのデータ(結果)をエクスポートする機能は現状ありません。(頑張ってコピペすればできます)
このようにAWSマネージメントコンソールからだと痒いところに手が届かないという経緯もあり、CLIからコンプライアンス状況のレポートをイイ感じに取れないか試しましたのでまとめておきたいと思います。

AWS ConfigのAWS CLIリファレンス

AWS Config周りのコマンドの中でアグリゲーターを扱えるコマンドは下記が用意されています。
この中からコンプライアンス状況の結果を表示するために使用するコマンドはdescribe-aggregate-compliance-by-config-rulesとなります。今回はこちらのコマンドを使っていきます。

  • batch-get-aggregate-resource-config
  • describe-aggregate-compliance-by-config-rules
  • get-aggregate-compliance-details-by-config-rule
  • get-aggregate-config-rule-compliance-summary
  • get-aggregate-discovered-resource-counts
  • get-aggregate-resource-config
  • list-aggregate-discovered-resources
  • select-aggregate-resource-config

やってみた

最終的に下記のイメージでコンプライアンス状況を出力することができます。レポートに記録されるレコードが大量の場合はAWSマネジメントコンソールからコピペするより確実で効率的かと思います。左から、AWSアカウント リージョン コンプライアンス非準拠リソースの数 コンプライアンス非準拠 or 準拠 Configルール名 で出力しています。

~$ aws configservice describe-aggregate-compliance-by-config-rules --configuration-aggregator-name アグリゲーター名 --query 'AggregateComplianceByConfigRules[*].{AccountId:AccountId,AwsRegion:AwsRegion,ConfigRuleName:ConfigRuleName,ComplianceType:Compliance.ComplianceType,CappedCount:Compliance.ComplianceContributorCount.CappedCount}' --output text
4265xxxxxxxx    ap-northeast-1  None    COMPLIANT       ROOT_ACCOUNT_MFA_ENABLED
4265xxxxxxxx    ap-northeast-1  4       NON_COMPLIANT   VPC_FLOW_LOGS_ENABLED
4265xxxxxxxx    ap-southeast-1  1       NON_COMPLIANT   GUARDDUTY_ENABLED_CENTRALIZED
4265xxxxxxxx    ap-southeast-1  1       NON_COMPLIANT   EC2_EBS_ENCRYPTION_BY_DEFAULT
4265xxxxxxxx    ap-southeast-1  None    COMPLIANT       S3_DEFAULT_ENCRYPTION_KMS
4265xxxxxxxx    ap-southeast-1  None    COMPLIANT       ROOT_ACCOUNT_MFA_ENABLED
4265xxxxxxxx    ap-southeast-1  1       NON_COMPLIANT   ROOT_ACCOUNT_HARDWARE_MFA_ENABLED
4265xxxxxxxx    ap-southeast-1  11      NON_COMPLIANT   REQUIRED_TAGS
4265xxxxxxxx    ap-southeast-1  1       NON_COMPLIANT   IAM_PASSWORD_POLICY
4265xxxxxxxx    ap-southeast-1  1       NON_COMPLIANT   VPC_DEFAULT_SECURITY_GROUP_CLOSED
4265xxxxxxxx    ap-southeast-1  1       NON_COMPLIANT   VPC_FLOW_LOGS_ENABLED
4265xxxxxxxx    ap-southeast-1  None    COMPLIANT       INCOMING_SSH_DISABLED
4265xxxxxxxx    ap-southeast-1  None    COMPLIANT       RESTRICTED_INCOMING_TRAFFIC
5180xxxxxxxx    ap-northeast-1  None    COMPLIANT       ROOT_ACCOUNT_MFA_ENABLED
5180xxxxxxxx    ap-northeast-1  None    COMPLIANT       S3_DEFAULT_ENCRYPTION_KMS
5180xxxxxxxx    ap-northeast-1  None    COMPLIANT       IAM_ROOT_ACCESS_KEY_CHECK
5180xxxxxxxx    ap-northeast-1  28      NON_COMPLIANT   REQUIRED_TAGS
5180xxxxxxxx    ap-northeast-1  None    COMPLIANT       INCOMING_SSH_DISABLED
(省略)

table出力するとカラム名も付いて分かりやすいです。

~$ aws configservice describe-aggregate-compliance-by-config-rules --configuration-aggregator-name アグリゲーター名 --query 'AggregateComplianceByConfigRules[*].{AccountId:AccountId,AwsRegion:AwsRegion,ConfigRuleName:ConfigRuleName,ComplianceType:Compliance.ComplianceType,CappedCount:Compliance.ComplianceContributorCount.CappedCount}' --output table
----------------------------------------------------------------------------------------------------------
|                                DescribeAggregateComplianceByConfigRules                                |
+--------------+-----------------+--------------+-----------------+--------------------------------------+
|   AccountId  |    AwsRegion    | CappedCount  | ComplianceType  |           ConfigRuleName             |
+--------------+-----------------+--------------+-----------------+--------------------------------------+
|  4265xxxxxxxx|  ap-northeast-1 |  None        |  COMPLIANT      |  ROOT_ACCOUNT_MFA_ENABLED            |
|  4265xxxxxxxx|  ap-northeast-1 |  4           |  NON_COMPLIANT  |  VPC_FLOW_LOGS_ENABLED               |
|  4265xxxxxxxx|  ap-southeast-1 |  1           |  NON_COMPLIANT  |  GUARDDUTY_ENABLED_CENTRALIZED       |
|  4265xxxxxxxx|  ap-southeast-1 |  1           |  NON_COMPLIANT  |  EC2_EBS_ENCRYPTION_BY_DEFAULT       |
|  4265xxxxxxxx|  ap-southeast-1 |  None        |  COMPLIANT      |  S3_DEFAULT_ENCRYPTION_KMS           |
|  4265xxxxxxxx|  ap-southeast-1 |  None        |  COMPLIANT      |  ROOT_ACCOUNT_MFA_ENABLED            |
|  4265xxxxxxxx|  ap-southeast-1 |  1           |  NON_COMPLIANT  |  ROOT_ACCOUNT_HARDWARE_MFA_ENABLED   |
|  4265xxxxxxxx|  ap-southeast-1 |  11          |  NON_COMPLIANT  |  REQUIRED_TAGS                       |
|  4265xxxxxxxx|  ap-southeast-1 |  1           |  NON_COMPLIANT  |  IAM_PASSWORD_POLICY                 |
|  4265xxxxxxxx|  ap-southeast-1 |  1           |  NON_COMPLIANT  |  VPC_DEFAULT_SECURITY_GROUP_CLOSED   |
|  4265xxxxxxxx|  ap-southeast-1 |  1           |  NON_COMPLIANT  |  VPC_FLOW_LOGS_ENABLED               |
|  4265xxxxxxxx|  ap-southeast-1 |  None        |  COMPLIANT      |  INCOMING_SSH_DISABLED               |
|  4265xxxxxxxx|  ap-southeast-1 |  None        |  COMPLIANT      |  RESTRICTED_INCOMING_TRAFFIC         |
|  5180xxxxxxxx|  ap-northeast-1 |  None        |  COMPLIANT      |  ROOT_ACCOUNT_MFA_ENABLED            |
|  5180xxxxxxxx|  ap-northeast-1 |  None        |  COMPLIANT      |  S3_DEFAULT_ENCRYPTION_KMS           |
|  5180xxxxxxxx|  ap-northeast-1 |  None        |  COMPLIANT      |  IAM_ROOT_ACCESS_KEY_CHECK           |
|  5180xxxxxxxx|  ap-northeast-1 |  28          |  NON_COMPLIANT  |  REQUIRED_TAGS                       |
|  5180xxxxxxxx|  ap-northeast-1 |  None        |  COMPLIANT      |  INCOMING_SSH_DISABLED               |
(省略)
+--------------+-----------------+--------------+-----------------+--------------------------------------+

--queryオプション

上記コマンドでは、--query オプションを付けて結果を出力しています。--queryオプションを付けずにtextモードで出力すると行が分割されるなど中々キレイに結果の出力ができず、今回は--queryオプションの使用に落ち着きました。

まとめ

チョットした経緯から久しぶりにAWS CLIを触りました。AWS Configに限らずですが、GUIで出来ないことや煩わしい操作をCLIを使って解消できないかどうか、一度ご検討頂くのもオモシロいのではないでしょうか?!

以上、大阪オフィスの林がお送りしました!