AWS Configを使用して、古いアクセスキーを検出する
以下のページで、AWS Config入門ということで、S3バケットのロギング設定を監査する方法をご紹介しました。
本ページでは、同様の手法で、ローテーションされていない古いアクセスキーを検出する方法をご紹介します。
構築する環境
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を使用してリソースを監査する方法に関しては、以下のページをご確認ください。
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スタックを作成します。
スタックの作成および各スタックの確認方法については、以下のページをご確認ください。
各スタックのリソースを確認した結果、今回作成された主要リソースの情報は以下の通りです。
- AWS Configルール:fa-131-IAM-Access-Keys-Rotated
作成されたリソースをAWS Management Consoleから確認します。
AWS Configの基本設定を確認します。
レコーダーの対象に、グローバルリソースを含めた全リソースが対象となっていることがわかります。
配信先に先述のS3バケットが指定されていることもわかります。
動作確認
準備が整いましたので、AWS Configルールの監査結果を確認します。
正常にルールが作成されていることが確認できます。
IAMユーザ1名がこのルールに非準拠とあります。
このユーザの詳細を確認します。
確かにアクセスキーが期日(90日)を過ぎています。
このようにAWS Configを使用することで、ローテーションされていない古いアクセスキーを検出することができます。
まとめ
ローテーションされていない古いアクセスキーを検出する方法を確認しました。