上級 35分 Lesson 9

Config — ルール評価・適合パック・自動修復

AWS Configのルール設計、適合パック、組織Config、自動修復パイプラインを徹底解説

AWS Config SCS-C03 コンプライアンス Security

はじめに:AWS Configの本質

AWS Configはリソース構成の継続的な記録と評価のサービスです。試験ではしばしば CloudTrail と混同されますが、根本的に異なります:

  • CloudTrail: 誰が何をしたか(API呼び出し)を記録
  • AWS Config: リソースの状態はどうか(設定値)を評価・追跡

SCS-C03では、単なる記録機能ではなく、ルール設計・組織レベルでの監視・自動修復パイプラインが狙われます。

AWS Config ルール評価フロー

Loading diagram...

AWS Config 自動修復パイプライン

Loading diagram...

AWS Config Rules マネジメントコンソール画面

AWS Config Rules の評価結果


1. 構成レコーダーと基本的な仕組み

1.1 構成レコーダー(Configuration Recorder)の役割

構成レコーダーは AWS Config の最も基本的なコンポーネントです。以下の処理を行います:

  1. リソース変更の検出

    • AWS API による変更を常に監視
    • サポート対象のリソース種別(EC2, RDS, S3, IAM, VPC等)をキャプチャ
  2. スナップショット取得

    • 変更検出時に構成スナップショットを記録
    • 指定されたS3バケットに JSON形式で保存
  3. タイムライン管理

    • リソースの過去の状態をすべて保持
    • 問題発生時に「いつ何が変わったか」を追跡可能

1.2 記録対象リソースの選択(重要な試験出題ポイント)

構成レコーダーの設定オプション:

# パターン1: すべてのサポート対象リソースを記録
recordingGroup:
  allSupported: true

# パターン2: 特定リソースタイプのみ記録(コスト削減)
recordingGroup:
  includeGlobalResources: true  # IAM, CloudFront, Route53等
  resourceTypes:
    - AWS::EC2::Instance
    - AWS::RDS::DBInstance
    - AWS::S3::Bucket

# パターン3: グローバルリソースを除外(複数リージョンで重複回避)
recordingGroup:
  allSupported: true
  includeGlobalResources: false
  # 主アカウント(マスターアカウント)のみで記録

最適実装

  • 本番環境: allSupported: true + includeGlobalResources: true(本アカウントでのみ)
  • コスト重視: 特定リソースタイプに絞る
  • マルチアカウント: グローバルリソースの重複記録を避ける

1.3 変更検出メカニズム

検出方法特徴レイテンシ
変更トリガーEventBridge統合、AWS API呼び出しで即座に検出数秒以内
定期評価デフォルト24時間ごと(設定可能)数分~24時間
CloudTrail統合API履歴から構成変更を遡及記録リアルタイム + 履歴

2. Config Rules の詳細設計

2.1 マネージドルール(Managed Rules)

AWS が提供するプリセットルール。~200以上存在し、即座にデプロイ可能です。

代表的なマネージドルール

セキュリティグループ関連

  • restricted-ssh — ポート22の全開放を検出
  • restricted-common-ports — 危険なポート(RDP, TELNET等)の開放を検出
  • vpc-flow-logs-enabled — VPC Flow Logs有効化を強制

暗号化関連

  • encrypted-volumes — 暗号化されていないEBSボリュームを検出
  • s3-bucket-server-side-encryption-enabled — S3デフォルト暗号化を強制
  • rds-encryption-enabled — RDS暗号化有効化を確認

IAM関連

  • iam-policy-no-statements-with-admin-access — 管理者権限ポリシーを検出
  • root-account-mfa-enabled — ルートアカウントMFAを確認
  • iam-user-unused-credentials-check — 未使用のアクセスキーを検出

リソース設定

  • ec2-instance-managed-by-systems-manager — SSM Agentの登録を確認
  • required-tags — 必須タグの有無を確認

マネージドルールの制約

制限事項

  • ソースコード非公開 — カスタマイズ不可
  • 判定ロジックが固定 — 設定パラメータで部分的に調整可能
  • 新しいリソース種別への対応に遅延あり — 最新リソースタイプに即対応不可

2.2 カスタムルール(Custom Rules)

マネージドルールでは対応できない要件に対応します。

パターンA: Lambda ベースのカスタムルール

# Lambda 関数(Python 3.11)
import json
import boto3

def lambda_handler(event, context):
    """
    S3バケットが特定のタグを持つかを評価
    """
    config = boto3.client('config')
    config_item = json.loads(event['configurationItem'])
    
    # リソースタイプチェック
    if config_item['resourceType'] != 'AWS::S3::Bucket':
        return {
            'compliance': 'NOT_APPLICABLE',
            'annotation': 'Not an S3 bucket'
        }
    
    bucket_name = config_item['resourceName']
    s3 = boto3.client('s3')
    
    try:
        # タグ取得
        tags_response = s3.get_bucket_tagging(Bucket=bucket_name)
        tags = {t['Key']: t['Value'] for t in tags_response.get('TagSet', [])}
        
        # 必須タグの確認
        required_tags = {'Environment', 'Owner', 'CostCenter'}
        missing = required_tags - set(tags.keys())
        
        if missing:
            return {
                'compliance': 'NON_COMPLIANT',
                'annotation': f'Missing tags: {", ".join(missing)}'
            }
        else:
            return {
                'compliance': 'COMPLIANT',
                'annotation': 'All required tags present'
            }
    
    except Exception as e:
        return {
            'compliance': 'NON_COMPLIANT',
            'annotation': f'Error evaluating rule: {str(e)}'
        }

Lambda ルールの特徴

  • 完全なカスタマイズ可能
  • Python, Java, JavaScript サポート
  • 初回評価 + 変更トリガー時の継続評価

パターンB: AWS Config Guard(DSL ベース)

Guard は YAML 風の DSL で、JSON スキーマを評価します。Lambda よりシンプル:

# guard-lib.guard
# EC2インスタンスの詳細監視が有効であることを確認

rule ec2_detailed_monitoring {
  aws_ec2_instance {
    monitoring {
      enabled == true
    }
  }
}

rule ebs_encryption_enabled {
  aws_ec2_volume {
    encrypted == true
  }
}

# 複数ルールを組み合わせる
rule all_ec2_security_checks {
  check( ec2_detailed_monitoring ) <<
    EC2インスタンスでは詳細監視が必須です
  >>
  
  check( ebs_encryption_enabled ) <<
    すべてのEBSボリュームは暗号化が必須です
  >>
}

Guard の利点

  • Lambda より低レイテンシ
  • バージョン管理・可視性が高い
  • 複雑なビジネスロジックには不向き

2.3 ルール評価の仕組み

1. 変更トリガー(推奨)

AWS API 呼び出し → EventBridge キャプチャ → Config ルール評価(数秒以内) → 結果:COMPLIANT / NON_COMPLIANT

2. 定期評価(デフォルト)

スケジュール(24時間など) → すべての対象リソースを再評価 → 更新検出

試験で狙われるポイント

  • 変更トリガーは 即座 だが、定期評価と同時に実行可能
  • 定期評価のみの設定でコスト削減可能(ただし検出遅延あり)
  • 新しいリソース作成時は自動的に評価対象になる

3. 適合パック(Conformance Packs)

適合パックは、複数のルールをグループ化し、業界標準に沿ったコンプライアンス要件を一括適用するものです。

3.1 適合パックの構造

# conformance-pack-template.yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: "CIS AWS Foundations Benchmark 適合パック"

Parameters:
  RequiredTagKey:
    Type: String
    Default: "Environment"
    Description: "必須タグキー"

Resources:
  # ルール1: EC2 詳細監視
  EC2DetailedMonitoringRule:
    Type: AWS::Config::ConfigRule
    Properties:
      ConfigRuleName: ec2-detailed-monitoring
      Description: "EC2インスタンスで詳細監視が有効であることを確認"
      Source:
        Owner: AWS
        SourceIdentifier: EC2_DETAILED_MONITORING_ENABLED
      Scope:
        ComplianceResourceTypes:
          - AWS::EC2::Instance

  # ルール2: 必須タグの確認
  RequiredTagsRule:
    Type: AWS::Config::ConfigRule
    Properties:
      ConfigRuleName: required-tags-rule
      Description: "すべてのタグ付けリソースに必須タグがあることを確認"
      Source:
        Owner: AWS
        SourceIdentifier: REQUIRED_TAGS
      InputParameters:
        tagKeys: !Ref RequiredTagKey

  # ルール3: CloudTrail 有効化
  CloudTrailEnabledRule:
    Type: AWS::Config::ConfigRule
    Properties:
      ConfigRuleName: cloudtrail-enabled
      Source:
        Owner: AWS
        SourceIdentifier: CLOUD_TRAIL_ENABLED
      MaximumExecutionFrequency: Six_Hours  # 定期評価間隔

  # ルール4: CloudWatch ログ設定
  CloudWatchLogsEnabledRule:
    Type: AWS::Config::ConfigRule
    Properties:
      ConfigRuleName: cloudtrail-cloudwatch-logs-enabled
      Source:
        Owner: AWS
        SourceIdentifier: CLOUD_TRAIL_CLOUD_WATCH_LOGS_ENABLED

Outputs:
  ConformancePackArn:
    Description: "適合パックの ARN"
    Value: !GetAtt MyConformancePack.ConformancePackArn

3.2 組み込み適合パック テンプレート

AWS は以下のテンプレートを提供しています:

テンプレート対象基準用途
CIS AWS FoundationsCIS ベンチマーク基本的なセキュリティ
PCI DSS 3.2.1PCI-DSS決済カード処理
HIPAA SecurityHIPAA医療情報保護
SOC 2SOC 2 Type IIIT監査
NIST Cybersecurity FrameworkNIST CSF米国標準

適合パックのメリット

1. 業界基準への準拠が簡単

  • テンプレート適用するだけで複数ルールをデプロイ
  • コンプライアンス証明に活用可能

2. ルール間の依存性管理

  • 関連ルールが一括評価
  • 相互矛盾のないルールセット

3. バージョン管理

  • 適合パックテンプレートを Git 管理
  • 規制要件の更新時に容易に対応

適合パック評価の流れ

  1. テンプレートをアップロード
  2. AWS Config が CloudFormation スタック作成
  3. ルール群が一括作成・配置
  4. すべてのリソースが包括的に評価
  5. ダッシュボードで準拠率を可視化

4. 組織Config(Organization Config Rules)

4.1 単一アカウント vs 組織ルール

項目単一アカウント組織ルール
スコープ1アカウント、複数リージョン全アカウント、複数リージョン
設定箇所各アカウントで個別設定マスターアカウントで一括設定
継承なし配下アカウントに自動適用
ルール数制限アカウントあたり 150組織あたり 500
コスト高(重複記録)低(集約)

4.2 組織Config の有効化

# AWS CLI: 組織Config の有効化
# 前提: AWS Organizations が有効、マスターアカウントで実行

aws configservice put-organization-config-status \
  --organization-config-enabled \
  --organization-config-status ENABLED

# 委任管理アカウントの指定(オプション)
aws organizations register-delegated-administrator \
  --account-id 123456789012 \
  --service-principal config.amazonaws.com

# 組織ルールの作成
aws configservice put-organization-config-rule \
  --organization-config-rule-name "required-tags-org" \
  --organization-managed-rule-metadata \
    SourceIdentifier=REQUIRED_TAGS,\
    Description="All resources must have required tags",\
    InputParameters='{"tagKeys":"Environment,Owner"}'

4.3 組織適合パック

# 組織レベルで適合パックをデプロイ
aws configservice put-organization-conformance-pack \
  --organization-conformance-pack-name "cis-benchmark-org" \
  --template-s3-uri "s3://my-config-bucket/cis-conformance-pack.yaml" \
  --delivery-s3-bucket "my-config-bucket" \
  --delivery-s3-key-prefix "conformance-packs/" \
  --excluded-accounts "111111111111,222222222222"  # 除外アカウント

重要

  • 除外アカウントの指定でネストされたアカウント構造に対応
  • ルール失敗時の通知を SNS で受け取り可能
  • Organizations ツリー内の OU レベルでの制御も可能

5. アグリゲータ(Aggregator)

5.1 マルチアカウント・マルチリージョン集約

AWS Config の最大の制約は、単一アカウント・単一リージョンの Config データしか見えないことです。複数アカウント・リージョンで一括管理する場合、アグリゲータを使います。

単一アカウント Config 各アカウント・各リージョンの Config Data は独立して存在し、クロスアカウント・クロスリージョンでの統一的な可視化ができません。

アグリゲータで集約 全アカウント + 全リージョンのConfig データを集約し、単一ダッシュボードで可視化できるようになります:

  • 全体の適合率
  • 非準拠リソースの一覧

5.2 アグリゲータの設定パターン

パターン1: 自アカウント内の集約(シンプル)

# 集約リージョン(通常 us-east-1)で実行
aws configservice put-configuration-aggregator \
  --configuration-aggregator-name "single-account-aggregator" \
  --account-aggregation-sources \
    AccountIds=123456789012,\
    AllAwsRegions=true

パターン2: マルチアカウント集約(推奨)

# マスターアカウント(または委任管理アカウント)の us-east-1 で実行

aws configservice put-configuration-aggregator \
  --configuration-aggregator-name "organization-aggregator" \
  --organization-aggregation-sources \
    AllAwsRegions=true,\
    RoleArn=arn:aws:iam::123456789012:role/AWSConfigOrganizationRole,\
    AwsOrganizationRoleArn=arn:aws:iam::org-root:role/service-linked-role

# IAM ロール設定(重要)
cat > trust-policy.json << 'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "config.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF

aws iam create-role \
  --role-name AWSConfigOrganizationRole \
  --assume-role-policy-document file://trust-policy.json

aws iam attach-role-policy \
  --role-name AWSConfigOrganizationRole \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSConfigRoleForOrganizations

5.3 アグリゲータからのクエリ

# 全アカウント・全リージョンの EC2 インスタンス一覧
aws configservice get-aggregate-discovered-resources-count \
  --configuration-aggregator-name "organization-aggregator" \
  --filters '{"ResourceType":"AWS::EC2::Instance"}'

# 特定リージョンでの非準拠リソース一覧
aws configservice get-aggregate-compliance-details-by-config-rule \
  --configuration-aggregator-name "organization-aggregator" \
  --config-rule-name "restricted-ssh" \
  --account-id 123456789012 \
  --aws-region us-east-1 \
  --compliance-type NON_COMPLIANT

6. 自動修復(Remediation)

非準拠リソースを自動的に修復するパイプライン。AWS Systems Manager (SSM) Automation と統合します。

6.1 修復アクションの仕組み

リソース変更 → Config ルール評価 → NON_COMPLIANT 判定 → SNS 通知(オプション) → 自動修復トリガー → SSM Automation ドキュメント実行 → リソース修正 → 再評価

6.2 修復アクション設定例

例1: セキュリティグループの自動修復(非準拠ルール削除)

# Config ルール: 22 番ポートの全開放を検出
aws configservice put-config-rule \
  --config-rule \
    ConfigRuleName=restricted-ssh,\
    Source='Owner=AWS,SourceIdentifier=RESTRICTED_INCOMING_TRAFFIC,\
SourceDetails=[{EventSource=config.amazonaws.com,\
MessageType=ConfigurationItemChangeNotification}]',\
    Scope='ComplianceResourceTypes=["AWS::EC2::SecurityGroup"]',\
    InputParameters='{"REQUIRED_PERMISSION":"tcp:22:22:0.0.0.0/0"}'

# SSM Automation ドキュメント(修復スクリプト)
cat > remediate-sg.json << 'EOF'
{
  "schemaVersion": "0.3",
  "description": "セキュリティグループから SSH ルールを削除",
  "assumeRole": "{{ AutomationAssumeRole }}",
  "parameters": {
    "SecurityGroupId": {
      "type": "String",
      "description": "修復対象のセキュリティグループ ID"
    },
    "AutomationAssumeRole": {
      "type": "String",
      "description": "SSM が使用する IAM ロール"
    }
  },
  "mainSteps": [
    {
      "name": "RevokeSshIngress",
      "action": "aws:executeAwsApi",
      "properties": {
        "Service": "ec2",
        "Api": "RevokeSecurityGroupIngress",
        "GroupId": "{{ SecurityGroupId }}",
        "IpPermissions": [
          {
            "IpProtocol": "tcp",
            "FromPort": 22,
            "ToPort": 22,
            "IpRanges": [{"CidrIp": "0.0.0.0/0"}]
          }
        ]
      }
    }
  ]
}
EOF

# 修復アクション登録
aws configservice put-remediation-configurations \
  --remediation-configurations \
    ConfigRuleName=restricted-ssh,\
    TargetType=SSM_DOCUMENT,\
    TargetIdentifier=AWS-PubliclyExposedSecurityGroupRemediation,\
    TargetVersion=1,\
    Parameters='{"GroupId":{"ResourceValue":{"Value":"RESOURCE_ID"}},\
"AutomationAssumeRole":{"StaticValue":{"Values":["arn:aws:iam::123456789012:role/SSMAutomationRole"]}}}',\
    Automatic=true,\
    MaximumAutomaticAttempts=5,\
    AutomaticRetryAttempts=3

例2: EBS ボリューム暗号化の強制(スナップショットから再作成)

# Config ルール
aws configservice put-config-rule \
  --config-rule \
    ConfigRuleName=encrypted-volumes,\
    Source='Owner=AWS,SourceIdentifier=ENCRYPTED_VOLUMES'

# SSM Automation ドキュメント(暗号化ボリューム再作成)
cat > remediate-ebs-encryption.json << 'EOF'
{
  "schemaVersion": "0.3",
  "description": "非暗号化 EBS ボリュームを暗号化して再作成",
  "assumeRole": "{{ AutomationAssumeRole }}",
  "parameters": {
    "VolumeId": {
      "type": "String"
    },
    "AutomationAssumeRole": {
      "type": "String"
    }
  },
  "mainSteps": [
    {
      "name": "CreateSnapshot",
      "action": "aws:executeAwsApi",
      "properties": {
        "Service": "ec2",
        "Api": "CreateSnapshot",
        "VolumeId": "{{ VolumeId }}"
      },
      "outputs": [{
        "Name": "SnapshotId",
        "Selector": "$.SnapshotId",
        "Type": "String"
      }]
    },
    {
      "name": "WaitForSnapshot",
      "action": "aws:waitForAwsResourceProperty",
      "properties": {
        "Service": "ec2",
        "Api": "DescribeSnapshots",
        "SnapshotIds": ["{{ CreateSnapshot.SnapshotId }}"],
        "PropertySelector": "$.Snapshots[0].State",
        "DesiredValues": ["completed"]
      }
    },
    {
      "name": "CreateEncryptedVolume",
      "action": "aws:executeAwsApi",
      "properties": {
        "Service": "ec2",
        "Api": "CreateVolume",
        "SnapshotId": "{{ CreateSnapshot.SnapshotId }}",
        "AvailabilityZone": "us-east-1a",
        "Encrypted": true
      }
    }
  ]
}
EOF

# 修復アクション登録(手動確認ステップ付き)
aws configservice put-remediation-configurations \
  --remediation-configurations \
    ConfigRuleName=encrypted-volumes,\
    TargetType=SSM_DOCUMENT,\
    TargetIdentifier=remediate-ebs-encryption,\
    Automatic=false,\
    MaximumAutomaticAttempts=3,\
    AutomaticRetryAttempts=5

6.3 修復アクション設計のベストプラクティス

段階1: 検証・テスト段階

  • Automatic = false(手動トリガー)
  • 修復実行前にレビュー
  • テストアカウントで試行

段階2: 段階的導入

  • 非本番環境で Automatic = true
  • CloudWatch ログで監視
  • SNS 通知で追跡

段階3: 本番展開

  • MaximumAutomaticAttempts = 3(最大試行回数)
  • AutomaticRetryAttempts = 5(リトライ時間:分)
  • 修復失敗時は SNS で通知
  • 修復結果を定期レポート

重要な注意

  • 破壊的修復(削除など)は Automatic=false 必須
  • 修復対象リソースが複数の場合、段階的な処理を検討
  • 修復実行ロールに最小権限付与(過剰権限は禁止)

7. AWS Config Query(高度なクエリ機能)

7.1 SQL 構文での構成検索

AWS Config Query は、すべてのリソース構成データに対して SQL クエリを実行できます。

-- 例1: 非暗号化の RDS インスタンスを検索
SELECT
  resourceId,
  resourceType,
  configuration.storageEncrypted,
  configuration.engine,
  accountId,
  awsRegion
FROM
  aws_rds_dbinstance
WHERE
  configuration.storageEncrypted = false
  AND configuration.engine = 'mysql'
ORDER BY
  accountId, awsRegion;

-- 例2: 特定タグがないすべてのリソース
SELECT
  resourceId,
  resourceType,
  tags
FROM
  aws_generic_resource
WHERE
  tags.Environment IS NULL
  AND resourceType IN ('AWS::EC2::Instance', 'AWS::S3::Bucket')
ORDER BY
  resourceType;

-- 例3: セキュリティグループで複数のインバウンドルール持つものを特定
SELECT
  resourceId,
  configuration.groupId,
  configuration.ingressRules
FROM
  aws_ec2_securitygroup
WHERE
  length(configuration.ingressRules) > 5
  AND accountId = '123456789012'
  AND awsRegion = 'us-east-1';

-- 例4: リレーショナルクエリ(EC2 + セキュリティグループ)
SELECT
  i.resourceId AS instance_id,
  i.configuration.instanceType,
  sg.configuration.groupName,
  sg.configuration.ingressRules
FROM
  aws_ec2_instance i,
  aws_ec2_securitygroup sg
WHERE
  i.relationships.securityGroupId = sg.resourceId
  AND sg.configuration.ingressRules[0].cidrIp = '0.0.0.0/0';

7.2 集計クエリ

-- 例1: リソースタイプ別の集計
SELECT
  resourceType,
  count(*) AS total_count
FROM
  aws_generic_resource
GROUP BY
  resourceType
ORDER BY
  total_count DESC;

-- 例2: 非準拠ルール別の問題カウント
SELECT
  configRuleName,
  complianceType,
  count(*) AS count
FROM
  aws_config_rules
WHERE
  complianceType = 'NON_COMPLIANT'
GROUP BY
  configRuleName, complianceType
ORDER BY
  count DESC;

-- 例3: アカウント・リージョン別の準拠状況
SELECT
  accountId,
  awsRegion,
  count(*) AS total_resources,
  sum(CASE WHEN complianceType = 'COMPLIANT' THEN 1 ELSE 0 END) AS compliant_count
FROM
  aws_generic_resource
GROUP BY
  accountId, awsRegion
ORDER BY
  accountId, awsRegion;

7.3 試験で狙われるポイント

1. アグリゲータ必須

  • 単一アカウントでは自アカウント+現在のリージョンのみ
  • マルチアカウント/リージョン検索にはアグリゲータが必要

2. JOIN の制限

  • aws_generic_resource テーブルでリレーショナル検索可能
  • ただしパフォーマンスは構成アイテム数に依存

3. 実行ロール

  • “config:GetResourceConfig” 権限が必須
  • “config:ListAggregateDiscoveredResources” でアグリゲータ経由

8. できないこと・制約

8.1 リアルタイム性の制約

一般的な誤解 「Config ルールはリアルタイムに評価される」

現実

  • 変更トリガー: 数秒~数分(EventBridge 経由なので即座だが完全保証なし)
  • 定期評価: 最大 24 時間
  • 履歴記録: API 呼び出しから Config 反映まで若干の遅延

重要 秒単位の応答が必要な場合は EventBridge 直結が必須。Config ルールは「監視・継続的評価」向き、リアルタイム検知向きではありません。

8.2 ルール数・リソース数の制限

制限項目上限値超過時の対応
単一アカウントの Config ルール数150AWS サポートに増加申請
組織ルール数500複数の適合パックに分割
Config ルール当たりの評価時間15 分複雑なカスタムルールは改善必須
構成レコーダー(アカウント当たり)1 個不可変(複数リージョンをカバー)

8.3 コスト関連の制約

Config の課金体系(2026年4月時点):

1) 構成アイテムの記録: $0.003/アイテム/月
   - サポート対象リソース(EC2, RDS, S3等)をすべて記録時の見積例
   - 小規模環境(100リソース): ~$0.30/月
   - 大規模環境(10000リソース): ~$30/月

2) Config ルールの評価: $0.001/ルール評価/月
   - 150 ルール × 24 評価/日(毎時) = ~$108/月

3) アグリゲータ: $0.5/集約/月
   - マルチアカウント集約が必須な場合は必須コスト

最適化戦略:
  ├─ すべてのリソース記録よりも「必須リソースのみ」
  ├─ 定期評価は 12 時間間隔に(24 時間の 2 倍評価回数削減)
  └─ ルール数は 100~150 程度に厳選(業界基準テンプレ活用)

非本番環境:
  ├─ 構成レコーダー OFF で記録コスト削減
  ├─ ルール評価は定期ジョブで限定
  └─ アグリゲータ未使用

8.4 データ保持期間の制限

Config 履歴保持期間:設定可能(デフォルト: 無制限、ただしコスト増)

推奨設定

  • 本番環境: 無制限(コンプライアンス要件)
  • 非本番環境: 90 日~180 日(コスト + セキュリティ・バランス)

S3 ライフサイクル設定

  • Glacier 移行: 1 年後
  • 削除: 7 年後(監査証跡要件に応じて)

8.5 サービスの依存性

1. IAM ロール

  • リソース読み取り権限が必須
  • 不足時は「リソース検出失敗」エラー

2. CloudTrail(オプションだが推奨)

  • 履歴トレース機能を有効化
  • 「誰が変更したか」を追跡(Config のみでは不可)

3. S3 バケット(設定スナップショット保存先)

  • バージョニング必須(推奨)
  • 過度なアクセス制限で Config の書き込み失敗

4. SNS トピック(通知用)

  • 非準拠通知のデリバリ先
  • トピックポリシーで config.amazonaws.com 許可必須

5. Systems Manager(修復時)

  • Automation ドキュメント実行用
  • IAM ロール信頼ポリシーに SSM サービスを追加

9. 連携パターン

9.1 Config + Security Hub

Security Hub の統合

AWS Config → Security Hub に同期 → Security Hub ダッシュボード表示

Security Hub ダッシュボード

  • Config ルール評価結果を「検出事項」として表示
  • セキュリティスコア算出に反映
  • 他セキュリティサービス(GuardDuty等)と統合表示

セキュリティチーム統一運用

  • Security Hub が「セキュリティ全体の窓」
  • Config ルール結果もここで可視化

設定例

# Security Hub で Config 統合を有効化
aws securityhub enable-security-hub \
  --tags '{"Environment":"Production"}'

# Config ルール結果を Security Hub に送信(自動)
aws configservice put-config-rule \
  --config-rule \
    ConfigRuleName=my-rule,\
    Source='Owner=AWS,...'

9.2 Config + CloudTrail

役割分担

  • CloudTrail: 「誰が」「いつ」「何を」(API レベル)
  • Config: 「その結果、リソースはどうなったか」(構成レベル)

組み合わせ活用

  1. CloudTrail: IAM ユーザーが SecurityGroup を修正した API ログ
  2. Config: その修正によって SecurityGroup の構成が変わった記録
  3. 連動: 修正の因果関係を追跡可能

例:EC2 セキュリティグループ変更の完全追跡

# 1. CloudTrail で API 呼び出しを検出
aws cloudtrail lookup-events \
  --lookup-attributes AttributeKey=ResourceType,AttributeValue=AWS::EC2::SecurityGroup \
  --max-results 10

# 2. Config でその時点の構成を確認
aws configservice get-config-item-history \
  --configuration-item-identifier \
    ConfigurationItemId=sg-12345,\
    ResourceType=AWS::EC2::SecurityGroup \
  --chronological-order REVERSE \
  --max-results 5

# 3. リレーション: 「この API 呼び出しによってこの構成変化が生じた」を確認

9.3 Config + Systems Manager

自動修復パイプライン

Config ルール(評価) → NON_COMPLIANT 検出 → 修復アクション → Systems Manager Automation ドキュメント実行 → リソース修正 → Config ルール再実行 → COMPLIANT 確認

9.4 Config + Organizations

階層的なガバナンス

組織レベル(マスターアカウント)で組織 Config ルール設定と組織適合パックをデプロイ → 配下アカウントに自動継承(ルール自動適用、準拠状況を親に報告)

メリット

  • 統一されたセキュリティポリシー
  • 設定漏れがない(自動適用)
  • 除外アカウント設定で柔軟性確保

9.5 Config + EventBridge

イベント駆動のアクション

Config ルール評価結果 → EventBridge イベント生成 → NON_COMPLIANT ルール検出 → 複数ターゲットへ並行実行

並行実行ターゲット

  • Lambda: カスタム修復ロジック
  • SNS: メール/Slack 通知
  • SQS: 修復ジョブキュー
  • Systems Manager: 自動修復実行

統一的なアクション管理が可能になります。


10. ベストプラクティス

10.1 全リソース記録の推奨

構成レコーダー設定:

production:
  allSupported: true
  includeGlobalResources: true  # IAM, CloudFront 等
  recordingGroup:
    resourceTypes:
      - AWS::EC2::*               # EC2 全リソース
      - AWS::RDS::*               # RDS 全リソース
      - AWS::S3::*                # S3 全リソース
      - AWS::IAM::*               # IAM 全リソース
      - AWS::CloudTrail::*        # CloudTrail 監視

理由:
  1. 予期しない変更の追跡が容易
  2. コンプライアンス監査で必須
  3. インシデント調査時に情報不足が起こらない
  4. AWS の新リソース種別対応も自動追加

コスト:
  - 大規模環境(10000リソース以上)でも月数百円程度
  - 節約の価値がない

10.2 組織ルール活用による統一化

戦略

本社(マスターアカウント):

  • CIS Benchmark 適合パック配置
  • すべてのセキュリティルール統一
  • 除外アカウント明示(開発環境など)

支社・子会社アカウント:

  • 親ルールを自動継承
  • ローカルルールのみ追加可能
  • 準拠状況を親に自動報告

利点

  • セキュリティポリシーの統一と実装
  • アカウント追加時も自動的に適用
  • コンプライアンス効率化

10.3 自動修復の段階的導入

フェーズ1: 検証(テスト環境、本番の小規模機能)

  • Automatic = false
  • 手動トリガー
  • 修復結果を記録・確認
  • 副作用チェック(最低 1 週間)

フェーズ2: 部分的導入(非本番環境)

  • Automatic = true
  • MaximumAutomaticAttempts = 3
  • SNS 通知で監視
  • 修復失敗率が 5% 未満を確認

フェーズ3: 本番展開(本番環境)

  • 非破壊的修復(ルール削除、タグ追加など)のみ
  • 破壊的修復(リソース削除など)は Automatic = false 維持
  • 修復前に CloudFormation、Terraform との干渉チェック
  • 定期的にドキュメント更新

10.4 ルール選定のポイント

必須ルール(すべての環境に推奨)

  • required-tags — リソース可視化・コスト管理
  • restricted-ssh — セキュリティ
  • ec2-instance-managed-by-systems-manager — 運用効率
  • iam-policy-no-statements-with-admin-access — 権限最小化
  • s3-bucket-public-read-prohibited — データ漏洩防止

監査・コンプライアンスルール

  • cloudtrail-enabled — 監査
  • config-enabled — 構成管理
  • multi-region-cloudtrail-enabled — 全リージョン監視
  • kms-cmk-backing-key-rotation-enabled — 暗号化キー管理

環境別の追加ルール

本番環境:

  • db-backup-enabled — バックアップ
  • ec2-volume-inuse-check — 不要なボリューム削除

非本番環境:

  • ec2-instance-type-check — コスト削減
  • ebs-volumes-not-attached-to-instance — 不要リソース削除

10.5 クエリとダッシュボード

メインダッシュボード

  • 全体準拠率(%)
  • リージョン別・アカウント別の準拠率
  • ルール別の非準拠リソース数
  • 過去 7 日間のトレンド

詳細ドリルダウン

  • リソースタイプ別の準拠状況
  • 特定ルールの非準拠リソース一覧
  • 修復アクションの成功率
  • リソースの過去 30 日間の変更履歴

Webhook / Slack 連携

  • 新規非準拠リソース検出時に通知
  • 修復アクション失敗時に通知
  • 週次のコンプライアンスレポート配信

試験で狙われるポイント

頻出問題パターン

パターン1:「どのサービスを組み合わせるか」

問題例:「セキュリティグループから 22 番ポートの全開放を自動的に削除したい。どのサービス・設定を使うか」

答え:

  1. Config ルール(restricted-ssh)で検出
  2. SSM Automation ドキュメント作成(修復スクリプト)
  3. 修復アクション設定(Automatic = true)で自動実行

重要:

  • 単独の Config では修復できない(評価のみ)
  • Systems Manager 統合が必須

パターン2:「マルチアカウント・マルチリージョンで何が可能か」

よくある誤解:「Config ルール自体がマルチアカウント対応」

現実:

  • 単一 Config ルールは 1 アカウント用
  • 組織ルール(Organization Config Rules)で複数アカウント対応
  • マルチリージョン検索にはアグリゲータが必須

設問の読み方:「全アカウント・全リージョンのセキュリティグループを検索」 → アグリゲータ + SQL クエリ + 適合パック

パターン3:「リアルタイム vs 継続的評価」

シナリオ:「MySQL ポート 3306 を開放したセキュリティグループの作成を即座に検出して警告したい」

最適解:EventBridge ルール(リアルタイム検知) + Config ルール(継続的評価)

注意:

  • Config のみでは不十分(定期評価の遅延リスク)
  • EventBridge のみでは追跡困難(状態管理が必要)

パターン4:「コスト最適化」

シナリオ:「多数のアカウント・リージョンで Config 運用するが、コストを最小化したい」

対策:

  • 特定リソースタイプのみ記録(すべてではなく)
  • 定期評価間隔を 24 時間に(変更トリガーは併用)
  • 非本番環境では構成レコーダー OFF
  • アグリゲータは本当に必要なときだけ
  • ルール数を 50~100 に厳選(適合パック活用)

注意:「コスト削減」と「コンプライアンス」のバランスが問われる → 非本番環境の割り切りが重要

パターン5:「適合パック vs カスタムルール」

適合パック活用時:

  • CIS Benchmark / PCI-DSS / HIPAA 対応が必要
  • 業界標準に沿いたい
  • 複数ルールを一括管理したい
  • CloudFormation テンプレート管理で保守性向上

カスタムルール必須:

  • ビジネスロジック特有のルール(非標準)
  • 既存システムとの統合が必要
  • 高度なデータ検証
  • Lambda / Guard で実装

試験での問い方:「いかなる状況でカスタムルールが必要か」と聞かれたら → 「マネージドルールでカバーされない要件」を答える


まとめ:AWS Config の立場

AWS Config は セキュリティ・コンプライアンスの基盤です。

  • CloudTrail は「何が起きたか」の記録
  • Config は「結果どうなったか」の記録

両者が揃って初めて完全な監視が成立します。

SCS-C03 では、Config の技術的な深さ(ルール設計・修復パイプライン・マルチアカウント運用)が試験ポイントになります。単なる「オンにする」ではなく、本番環境での運用形態まで意識して学習してください。