AWS Configを使用して、古いアクセスキーを検出する

AWS Configを使用して、古いアクセスキーを検出する

AWS Configを使用して、古いアクセスキーを検出する

以下のページで、AWS Config入門ということで、S3バケットのロギング設定を監査する方法をご紹介しました。

https://awstut.com/2022/12/03/introduction-to-aws-config-with-cfn-auditing-s3-bucket-logging-settings

本ページでは、同様の手法で、ローテーションされていない古いアクセスキーを検出する方法をご紹介します。

構築する環境

Diagram of using AWS Config to detect outdated access keys.

AWS Configでアクセスキーを監査するルールを作成します。

一定日数を過ぎているキーが検出された場合、そのキーは非準拠になります。
今回は90日を期限とします。

S3バケットを1つ作成します。
AWS Configが動作するために使用されるバケットです。
AWSリソースの設定状況や変更状況に関するデータが保存されます。

CloudFormationテンプレートファイル

上記の構成をCloudFormationで構築します。
以下のURLにCloudFormationテンプレートを配置しています。

https://github.com/awstut-an-r/awstut-fa/tree/main/131

テンプレートファイルのポイント解説

本ページは、AWS Configを使用して、ローテーションされていない古いアクセスキーを検出する方法を中心に取り上げます。

AWS Configを使用してリソースを監査する方法に関しては、以下のページをご確認ください。

https://awstut.com/2022/12/03/introduction-to-aws-config-with-cfn-auditing-s3-bucket-logging-settings

S3

Resources:
  ConfigBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref Prefix
      AccessControl: Private

  ConfigBucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref ConfigBucket
      PolicyDocument:
        Statement:
          - Principal:
              Service: config.amazonaws.com
            Action: s3:GetBucketAcl
            Effect: Allow
            Resource: !Sub "arn:aws:s3:::${ConfigBucket}"
            Condition:
              StringLike:
                AWS:SourceAccount: !Ref AWS::AccountId
          - Principal:
              Service: config.amazonaws.com
            Action: s3:ListBucket
            Effect: Allow
            Resource: !Sub "arn:aws:s3:::${ConfigBucket}"
            Condition:
              StringLike:
                AWS:SourceAccount: !Ref AWS::AccountId
          - Principal:
              Service: config.amazonaws.com
            Action: s3:PutObject
            Effect: Allow
            Resource: !Sub "arn:aws:s3:::${ConfigBucket}/*"
            Condition:
              StringLike:
                s3:x-amz-acl: bucket-owner-full-control
                AWS:SourceAccount: !Ref AWS::AccountId
Code language: YAML (yaml)

AWS Configの配信チャネル用のバケットです。

バケットに関しては特別な設定は不要です。
一方でバケットポリシーを定義して、AWS Configからの各種アクセスを許可します。

AWS Config

配信チャネル

Resources:
  DeliveryChannel:
    Type: AWS::Config::DeliveryChannel
    Properties:
      Name: !Sub "${Prefix}-DeliveryChannel"
      S3BucketName: !Ref ConfigBucket
Code language: YAML (yaml)

先述のバケットを配信チャネルに指定します。

設定レコーダー

Resources:
  ConfigurationRecorder:
    Type: AWS::Config::ConfigurationRecorder
    Properties:
      Name: !Sub "${Prefix}-ConfigurationRecorder"
      RecordingGroup:
        AllSupported: true
        IncludeGlobalResourceTypes: true
      RoleARN: !Sub "arn:aws:iam::${AWS::AccountId}:role/aws-service-role/config.amazonaws.com/${AWSServiceRoleForConfig}"

  AWSServiceRoleForConfig:
    Type: AWS::IAM::ServiceLinkedRole
    DeletionPolicy: Delete
    Properties:
      AWSServiceName: config.amazonaws.com
Code language: YAML (yaml)

アクセスキーのようなグローバルなリソースに対して監査する際は、以下の引用の通り、AllSupported・IncludeGlobalResourceTypesプロパティがポイントとなります。

Specifies whether AWS Config includes all supported types of global resources (for example, IAM resources) with the resources that it records.

Before you can set this option to true, you must set the AllSupported option to true.

AWS::Config::ConfigurationRecorder RecordingGroup

上記に従い、両プロパティに「true」を設定します。

AWS Configルール

Resources:
  ConfigRule:
    Type: AWS::Config::ConfigRule
    DependsOn:
      - ConfigurationRecorder
    Properties:
      ConfigRuleName: !Sub "${Prefix}-IAM-Access-Keys-Rotated"
      InputParameters:
        maxAccessKeyAge: 90
      Source:
        Owner: AWS
        SourceIdentifier: ACCESS_KEYS_ROTATED
Code language: YAML (yaml)

ローテーションされていない古いアクセスキーを検出するためには、マネージドルールaccess-key-rotatedが使用できます。

https://docs.aws.amazon.com/ja_jp/config/latest/developerguide/access-keys-rotated.html

SourceIdentifierプロパティに「ACCESS_KEYS_ROTATED」を指定します。

また本ルールは以下のパラメータを取ります。

maxAccessKeyAge

タイプ: int

デフォルト: 90

ローテーションなしの最大日数。

access-keys-rotated

InputParametersプロパティに「maxAccessKeyAge: 90」の形式で設定します。

環境構築

CloudFormationを使用して、本環境を構築し、実際の挙動を確認します。

CloudFormationスタックを作成し、スタック内のリソースを確認する

CloudFormationスタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。

https://awstut.com/2021/12/02/cloudformation-nested-stacks

各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。

  • AWS Configルール:fa-131-IAM-Access-Keys-Rotated

作成されたリソースをAWS Management Consoleから確認します。

AWS Configの基本設定を確認します。

Detail of AWS Config 1.

レコーダーの対象に、グローバルリソースを含めた全リソースが対象となっていることがわかります。
配信先に先述のS3バケットが指定されていることもわかります。

動作確認

準備が整いましたので、AWS Configルールの監査結果を確認します。

Detail of AWS Config 2.

正常にルールが作成されていることが確認できます。

IAMユーザ1名がこのルールに非準拠とあります。

このユーザの詳細を確認します。

Detail of AWS Config 3.

確かにアクセスキーが期日(90日)を過ぎています。

このようにAWS Configを使用することで、ローテーションされていない古いアクセスキーを検出することができます。

まとめ

ローテーションされていない古いアクセスキーを検出する方法を確認しました。