AWS Config - Service quản lý cấu hình và compliance không thể thiếu (P1)

AWS Config - Service quản lý cấu hình và compliance không thể thiếu (P1)

avatar

Phong Nguyen

2025.08.10

Giới thiệu AWS config và các tính năng của service này.

Giới thiệu

Mình nhớ lại thời điểm mới làm việc với AWS ở 1 tập đoàn lớn - nơi có bộ phận Infra chịu trách nhiệm xây dựng hạ tầng base, viết guideline, các rule cho từng service, v.v. Mình thì tham gia với tư cách là 1 member của 1 Project, khi vào Project thì sẽ được cấp IAM user, cách switch role sang các môi trường khác thế nào. Tạo servive cho Project tuân thủ Guideline ra sao.

Có một ấn tượng là mỗi khi tạo để test service gì đó mà không tuân thủ theo các quy tắc đội infra đặt ra thì cứ mỗi sáng là nhận dc email báo là Project ACB gì đó, có Service có EC2, SNS v.v với tên resource đang không tuân thủ quy tắc XYZ gì đó.

Thoạt đầu cũng chưa hiểu tạo sao họ có thể biết được, sau này tìm hiểu thì vỡ ra họ dùng AWS config để setting các rule.

Với những dự án lớn, có nhiều môi trường, nhiều account, nhiều project thì sẽ có đội những người có kinh nghiệm để xây dựng base hạ tầng, bộ quy tắc tuân thủ, tiêu chuẩn security vv. Thành ra thì những người mới cũng rất khó có cơ hội để dụng tới mấy vấn đề này. ở chương trình SAA hay DVA thì cũng có nhắc đến, nhưng cũng là thoáng qua.

Hôm nay mình muốn giới thiệu rõ hơn về service này đi kèm 1 ví dụ demo. Bài viết sẽ chia làm 2 phần:

  • Phần 1: Giới thiệu tổng quan AWS Config và các tính năng của nó 👈 bài blog này
  • Phần 2: Tạo quy trình thông báo (trước 7 ngày, 14 ngày) trước khi Disable Access Key của User sau 90 ngày không sử dụng

Mục lục

  • Tổng quan về AWS Config- Service hữu ích cho security và governance
    • Record thông tin config của resources
    • Bổ sung khả năng đánh giá (evaluate) thông tin config
  • Config Records Deep dive- Tạo Configuration Recorder để bắt đầu ghi lại
    • Tuning việc recording
    • Thông tin config được quản lý dưới dạng JSON
    • Có thể delivery đến S3 bucket
  • Config Rules Deep dive- Tạo rules để evaluate thông tin config
    • Sử dụng AWS Managed Rules để deploy một cách dễ dàng
    • Dùng Custom Rules để định nghĩa rules linh hoạt
    • Có thể liên kết remediation actions (cho phép khắc phục việc không tuân thủ)
  • Các chức năng chính khác- Conformance Packs để package hóa Config Rules
    • Aggregator để tập hợp Config data
    • Advanced Queries để inventory thông tin cấu hình
    • Kết hợp Organizations để setup đơn giản
  • Các chức năng chi tiết khác- Notification qua SNS và EventBridge
    • Có dashboard
    • Cũng có thể record third-party resources
  • Pricing- Chi phí tính theo từng configuration item
    • Chi phí phát sinh mỗi lần resources được evaluated bởi rules
  • Kết luận
  • Tham khảo

0. Set up

Để tìm hiểu service này đầu tiên chúng ta đi set up trước đã

Set up AWS Config

  • Region: Osaka - ap-northeast-3 Dùng region này để dễ kiểm soát các resource được tạo

Vào AWS Config Console -> chọn 1-click-setup (các thông tin set up sẽ được giải thích sau)

Tạo resource để test AWS Config

  1. Tạo Security group có Inbound rule cho phép SSH from Internet: d-sg-soa-allow-ssh
  2. Tạo Security group KHÔNG có Inbound rule cho phép SSH from Internet: d-sg-soa-not-allow-ssh
  3. Tạo S3 bucket như sau:
    • Name: d-s3-soa-{AWS-Account-ID}-public-access
    • Bỏ check Block all public access

Tạo AWS Config rule để đánh gia tuân thủ

Vào AWS Config console -> Rule -> Add rule

Tìm và add các rule sau:

  • restricted-ssh
  • s3-bucket-level-public-access-prohibited
  • required-tags

Next -> Save

Tương tự như vậy với 2 rule còn lại

  • s3-bucket-level-public-access-prohibited
  • required-tags

Kết quả

Vậy là chúng ta đã có một số resource bị đánh giá là Noncompliant. Bây giờ chúng ta sẽ đi tìm hiểu chi tiết

1. Tổng quan về AWS Config

Service hữu ích cho security và governance

Các chức năng chính là Record (ghi lại) thông qua Configuration RecorderEvaluate (đánh giá) thông qua Config Rules.

Thông qua việc record, bạn có thể nắm được những resource nào tồn tại trên AWS và chúng được config như thế nào. Thông qua việc evaluate, bạn có thể phát hiện sớm các config có rủi ro trên AWS và giải quyết chúng.

Tại sao cần thiết? 🤔

Đặc điểm của cloud (AWS) là "nâng cao agility" đúng không? Developers có thể triển khai nhanh chóng các resource cần thiết để vận hành service.

Tuy nhiên, mặt trái của việc này chính là rủi ro "khối lượng lớn resource được tạo ra với tốc độ chóng mặt, khiến AWS environment trở nên hỗn loạn". Governance sẽ bị suy giảm. Nếu để mặc như vậy, có thể sẽ bỏ sót những config có rủi ro bảo mật tiềm ẩn.

AWS Config chính là service giúp bạn giải quyết những khó khăn đó.

AWS Config là service không thể thiếu để thực hiện "song hành giữa agility và governance".

Ghi lại thông tin config của resource

Cốt lõi của Config là liên tục record config của AWS resource.

Bạn có thể xác nhận được "hiện tại đang ở trạng thái như thế nào", "khi nào, những thay đổi config nào đã được thực hiện", "có mối quan hệ như thế nào với các resource khác" đối với các AWS resource.

Thông qua Management Console hoặc API, bạn có thể xác nhận thông tin config của các AWS resource đa dạng xuyên suốt các service.

Tương tự như vậy, bạn cũng có thể tracking xem resource đó đã trải qua những thay đổi config như thế nào.

Để test việc này thì chúng ta sẽ config thêm tag cho VPC. Chọn VPC ở Region Osaka hoặc click luôn tại đây

Thêm tag cho VPC của bạn

Sẽ mất khoảng 10-15 phút để thay đổi config được phản ánh trong AWS Config Resource Timeline

Bổ sung khả năng evaluate thông tin config

Hơn nữa, bạn cũng có thể tạo resource gọi là Config Rules. Đây là "chức năng evaluate xem thông tin config đang được record có ở trạng thái lý tưởng hay không".

Ví dụ về evaluation như "Security Group cho phép SSH từ bất cứ đâu không" hay "S3 bucket có được public không" v.v.

Bạn có thể xác nhận kết quả evaluation trên Management Console. Điều này rất hữu ích để duy trì việc sử dụng AWS environment một cách secure.

Ngoài ra, các AWS service có vị trí tương tự bao gồm AWS Trusted Advisor và AWS Security Hub. Những service này cũng hữu ích để check "các AWS resource có đang ở trạng thái lý tưởng hay không".

2. Config Records Deep dive

Tạo Configuration Recorder để bắt đầu ghi lại

Để bắt đầu record thông tin config, bạn cần tạo resource gọi là Configuration Recorder. Configuration Recorder chỉ có thể tạo một cái duy nhất cho mỗi region.

Trong Configuration Recorder, bạn sẽ chỉ định các parameter như sau:

  • Recording strategy cần record ("All resource types with customizable overrides" hoặc "Specific resource types")
  • Tần suất record ("Continuous recording" hoặc "Daily recording")

Một số config khác:

  • Thời gian lưu trữ Config data
  • Deliverry đến S3
  • Stream configuration changes and notifications to an Amazon SNS topic.

Chi tiết về setup, vui lòng tham khảo:

Tuning việc recording

Các resource type được support có thể xem tại đây. Tính đến tháng 08/2025 đã có hơn 450 resource type.

Việc lấy resource type có thể tuning theo 2 pattern sau đây. Mình sẽ giới thiệu từng cái:

  • All resource types with customizable overrides
  • Specific resource types

All resource types with customizable overrides

  • Record các resource type hiện tại và tương lai được support.
  • Ngoài ra, có thể chỉ định "Recording frequency" và "Override settings" như tuning.

Specific resource types

Chỉ record các resource type được chỉ định một cách cụ thể. Setting kết hợp giữa resource type và recording frequency.

Thông tin config được quản lý dưới dạng JSON

Thông tin config được quản lý dưới dạng JSON theo từng resource unit. Dưới đây là sample JSON thông tin config của VPC. Điểm đáng chú ý là không chỉ có setting value đơn thuần mà còn có cả relationships với các resource khác.

{
  "accountId": "067057696393",
  "arn": "arn:aws:ec2:ap-northeast-3:067057696393:vpc/vpc-00eaccf1ea3dc6481",
  "availabilityZone": "Multiple Availability Zones",
  "awsRegion": "ap-northeast-3",
  "configuration": {
    "cidrBlock": "172.31.0.0/16",
    "dhcpOptionsId": "dopt-0a0f6efa24abc95cd",
    "state": "available",
    "vpcId": "vpc-00eaccf1ea3dc6481",
    "ownerId": "067057696393",
    "instanceTenancy": "default",
    "ipv6CidrBlockAssociationSet": [],
    "cidrBlockAssociationSet": [
      {
        "associationId": "vpc-cidr-assoc-0d85837403ab8be74",
        "cidrBlock": "172.31.0.0/16",
        "cidrBlockState": {
          "state": "associated",
          "statusMessage": null
        }
      }
    ],
    "isDefault": true,
    "tags": [
      {
        "key": "SystemID",
        "value": "SOA"
      }
    ]
  },
  "configurationItemCaptureTime": "2025-08-10T00:56:20.361Z",
  "configurationItemMD5Hash": "",
  "configurationItemStatus": "OK",
  "configurationStateId": "1754787380361",
  "relatedEvents": [],
  "relationships": [
    {
      "relationshipName": "Contains NetworkAcl",
      "resourceId": "acl-0b2c0b5b042478bc5",
      "resourceType": "AWS::EC2::NetworkAcl"
    },
    {
      "relationshipName": "Contains SecurityGroup",
      "resourceId": "sg-03703991600843d0a",
      "resourceType": "AWS::EC2::SecurityGroup"
    },
    {
      "relationshipName": "Contains RouteTable",
      "resourceId": "rtb-07c437a310de5b5f8",
      "resourceType": "AWS::EC2::RouteTable"
    },
    {
      "relationshipName": "Contains SecurityGroup",
      "resourceId": "sg-014b564c76a9f70a7",
      "resourceType": "AWS::EC2::SecurityGroup"
    },
    {
      "relationshipName": "Is attached to InternetGateway",
      "resourceId": "igw-09ae90dc1abf26bc5",
      "resourceType": "AWS::EC2::InternetGateway"
    },
    {
      "relationshipName": "Contains Subnet",
      "resourceId": "subnet-06650d5a188379137",
      "resourceType": "AWS::EC2::Subnet"
    },
    {
      "relationshipName": "Contains Subnet",
      "resourceId": "subnet-004571c24b89dd71e",
      "resourceType": "AWS::EC2::Subnet"
    },
    {
      "relationshipName": "Contains Subnet",
      "resourceId": "subnet-0e94b62747ae1835a",
      "resourceType": "AWS::EC2::Subnet"
    }
  ],
  "resourceId": "vpc-00eaccf1ea3dc6481",
  "resourceType": "AWS::EC2::VPC",
  "supplementaryConfiguration": {},
  "tags": {
    "systemID": "SOA"
  },
  "version": "1.3"
}

Mỗi thành phần của JSON được giải thích trong tài liệu chính thức bên dưới.

Console chỉ hiển thị một số thông số chính

Có thể delivery đến S3 bucket

Ban đầu khi set up config, default các config sẽ được ghi lại ở S3 bucket có tên: config-bucket-{AWS Account ID}

Lưu ý: Lịch sử thay đổi config sẽ Delivery to an S3 bucket every 6 hours.

(Hình ảnh bên dưới là log của Region Tokyo mà mình đã setting hôm qua, Region Osaka phải đợi 6 tiếng sau*)*

Có thể phân tích và trực quan hóa bằng các công cụ như Athena và QuickSight.

3. Config Rules Deep dive

Tạo rules để evaluate thông tin config

Config Rules là chức năng evaluate thông tin config của resource. Khi resource không tuân thủ rule, sẽ được gắn flag non-compliant (NON_COMPLIANT).

Ví dụ trong capture dưới đây, rule restricted-ssh đang evaluate từng Security group. Đối với các SG có Inbound cho phép SSH từ bất cứ đâu, sẽ được gắn flag non-compliant

Sử dụng AWS Managed Rules để deploy một cách dễ dàng

AWS Managed Rules là Quy tắc cấu hình được AWS xác định trước và dễ triển khai.

Tính đến thời điểm 8/2025 có hơn 500 Rule

Một số Rule phổ biến hay được sử dụng

RuleResourceTrạng thái noncompliant
restricted-sshSecurity GroupInbound rule mở SSH port toàn bộ
s3-bucket-level-public-access-prohibitedS3 BucketCó thể public access
rds-storage-encryptedRDS DB InstanceStorage chưa được encrypt
ec2-managedinstance-applications-requiredEC2 InstanceApplication được chỉ định chưa được install SSM Agent
guardduty-enabled-centralizedAWS AccountGuardDuty chưa được enable
required-tagsTham khảo documentTag được chỉ định (option: tag value) chưa được gán cho resource

Dùng Custom Rules để định nghĩa rules linh hoạt

Custom Rules có 2 loại

  • Phương pháp sử dụng Lambda function
  • Phương pháp sử dụng Guard custom policy.

Với phương pháp sử dụng Lambda function, bạn sẽ viết logic evaluate resource bên trong Lambda function. Cũng có tool được gọi là rdk - "tool hỗ trợ tạo Lambda function cho Config Rules".

Với phương pháp sử dụng Guard custom policy, bạn sẽ định nghĩa rule bằng cách sử dụng CloudFormation Guard - "ngôn ngữ để định nghĩa policy".

Có thể liên kết remediation actions

Bạn có thể liên kết remediation action với Config Rules. Nhờ đó có thể dễ dàng thực hiện remediation đối với các resource đã trở thành non-compliant.

Ví dụ Nếu có S3 bucket nào được tạo ra và cho public, khi đó rule s3-bucket-level-public-access-prohibited sẽ phát hiện và báo là Noncompliant, bạn muốn có 1 Action tự động để ngăn chặn việc pubic này. Lúc đó bạn sẽ áp dụng remediation action

Bạn nhớ đầu blog bạn đã setting rule s3-bucket-level-public-access-prohibited và có tạo 1 S3 bucket có tên d-s3-soa-{AWS Account ID}-public-access và cho nó public rồi chứ.

Bây giờ thử áp dụng remediation action cho nó

Click Action -> Manage remediation

  • Select remediation method: Automatic remediation
  • Choose remediation action: AWS-DisableS3BucketPublicReadWrite
  • Resource ID parameter: S3BucketName
  • Parameters:
    • AutomationAssumeRole: Arn của Role cho phép System Manager thực thi Document có quyền trên S3 (bây giờ chúng ta sẽ đi tạo Role này)

Giải thích cho sự lựa chọn này:

AWS-DisableS3BucketPublicReadWrite: đây là SSM Document đã được viết sẵn với mục đích là Disable S3 Bucket Public ReadWrite. Bạn cũng có thể tự tạo 1 Document riêng để thực hiện những logic của mình.

Resource ID parameter: S3BucketName: đây giống như là parameter của Document AWS-DisableS3BucketPublicReadWrite vậy, nhận đầu vào là tên bucket để thực hiện action.

Mở tab khác để tạo Role

  • Trusted entity type: AWS service
  • Use case: Systems Manager
  • Permissions policies: AmazonS3FullAccess
  • Role name: CMPDisableS3BucketPublicReadWriteRole

Copy Arn của Role

Quay lại màn hình Manage remediation

Bây giờ hãy đi tạo S3 bucket

  • Name: d-s3-soa-{Account-ID}-public-access-2
  • Bỏ check Block all public access

Đợi tầm vài phút bạn sẽ thấy bucket vừa rồi bị báo là Noncompliant và remediation được kích hoạt, kiểm tra S3 bucket sẽ thấy:

4. Các chức năng chính khác

Conformance Packs để package hóa Config Rules

Sử dụng Conformance Packs có thể quản lý và deploy Config Rules một cách tập trung. Viết YAML template với cú pháp tương tự như CloudFormation. Trong Config dashboard, bạn có thể xác nhận tình trạng compliant/non-compliant theo từng Conformance Pack.

AWS cung cấp rất nhiều sample template của Conformance Packs:

Aggregator để tập hợp Config data

Bằng cách tạo Config Aggregator, bạn có thể tập hợp Config data (thông tin config resource và kết quả evaluation của Config Rules). Có thể tập hợp từ multi-account, multi-region.

Về implementation, Config data từ mỗi "source account" được replicate đến "aggregator account". Trên aggregator account có thể xem aggregated view dạng read-only.

Demo như sau:

Đợi khoảng 1 lúc sau bạn sẽ thấy data được hiển thị

Advanced Queries để inventory thông tin cấu hình

Advanced Queries là chức năng có thể thực hiện query đối với Config records để lấy thông tin mong muốn. Vì cũng có thể chọn aggregator làm query target nên có thể inventory xuyên suốt multiple accounts và multiple regions. Rất tiện lợi.

Trong Management Console có cung cấp một số sample query do AWS cung cấp. Cũng có thể save các query thường dùng dưới dạng custom query.

Ví dụ: bạn có thể lập danh sách các EC2 instance bằng cách chạy truy vấn sau:

SELECT
  accountId,
  awsRegion,
  resourceId,
  configuration.instanceType,
  tags.tag,
  resourceCreationTime
WHERE
  resourceType = 'AWS::EC2::Instance'
ORDER BY
  accountId;

Kết hợp Organizations để setup đơn giản

Config hỗ trợ AWS Organizations integration. Giúp quản lý Config cross-account dễ dàng hơn.

Có thể làm chủ yếu 2 việc sau:

  • Deploy Conformance Packs cho toàn bộ organization
  • Tạo Aggregator cho organization

5. Các chức năng chi tiết khác

Notification qua SNS và EventBridge

AWS Config kết hợp với SNS topic. Ví dụ khi resource được update, có thể gửi notification đến email address cụ thể.

Về các event có thể send, vui lòng tham khảo official document sau: Notifications that AWS Config Sends to an Amazon SNS topic

AWS Config gửi notification cho các event sau:

  • Thay đổi configuration item của resource
  • Configuration history của resource đã được deliver đến account
  • Configuration snapshot của resource được record đã được khởi động và deliver trong account
  • Compliance state của resource và việc resource có tuân thủ rule hay không
  • Rule evaluation đã bắt đầu đối với resource
  • AWS Config fail khi deliver notification đến account

Cách setting khá dễ dàng:

Đầu tiên tạo 1 SNS topic

  • Type: Standard
  • Name: d-sns-soa-config-topic
  • Display name - optional: AWS Config Notification

Thực hiện Subscription bằng email

Tại AWS Config Setting

Thử thực hiện một vài thay đổi trên resource, ví dụ như add thêm Inbound cho Security group

Bạn sẽ nhận ngay 1 email về sự thay đổi này

Ngoài ra, cũng có thể detect Config event bằng EventBridge. Khi muốn thu hẹp đến specific event như "trở thành non-compliant với Config rule cụ thể", thì implement bằng EventBridge sẽ dễ dàng hơn.

Ví dụ tạo EventBridge Rule với Pattern sau:

{
  "source": ["aws.config"],
  "detail-type": ["Config Rules Compliance Change"],
  "detail": {
    "messageType": ["ComplianceChangeNotification"],
    "newEvaluationResult": {
      "complianceType": ["NON_COMPLIANT"]
    }
  }
}

Với pattern này thì Rule sẽ được kích hoạt mỗi khi Resoure bạn bị AWS Config báo là NON_COMPLIANT

Và liên kết với SNS Topic để notification, bạn sẽ nhận email như sau:

Có dashboard

Dashboard có sẵn 📊

Các dashboard có thể xem trong Management Console gồm 3 loại sau:

  • Config > Dashboard
  • Config > Aggregator > Compliance Dashboard
  • Config > Aggregator > Inventory Dashboard

Cũng có thể record third-party resources

Ngoài AWS resources, cũng có thể record third-party resources và on-premises servers. Cần một số tools và steps. Chi tiết cách setting vui lòng tham khảo document sau:

6. Pricing 💰

Giải thích về chi phí phát sinh khi sử dụng Config.

Chi phí tính theo từng configuration item

Được tính phí theo từng configuration item được deliver. Configuration item được tạo "khi resource mới được tạo" hoặc "khi có thay đổi trong relationship của resource※".

Ví dụ khi "attach security group vào EC2 instance", configuration item của EC2 instance đó sẽ được tạo. Dù bản thân setting của EC2 instance không thay đổi, nhưng vì relationships đã thay đổi nên configuration item được tạo.

Giá tại Tokyo region tính đến tháng 08/2025 như sau:

Chi phí phát sinh mỗi lần resources được evaluated bởi rules

Billing của Config Rules (và Conformance Packs) được quyết định bởi "số lần evaluation của rules". Nếu enable cả detection mode và proactive mode, thì "chỉ tính phí cho evaluation ở detection mode".

Giá tại Tokyo region tính đến tháng 08/2025 như sau:

Kết luận

Như vậy là mình đã giới thiệu bức tranh toàn cảnh về service AWS Config, ở phần 2, chúng ta sẽ áp dụng để setting 1 User thực tế nữa.

  • Tạo quy trình thông báo (trước 7 ngày, 14 ngày) trước khi Disable Access Key của User sau 90 ngày không sử dụng

Tham khảo

Clean up resources

  • Xoá Security group:
    • d-sg-soa-allow-ssh
    • d-sg-soa-not-allow-ssh
  • Xoá S3 bucket:
    • d-s3-soa-{AWS-Account-ID}-public-access
    • d-s3-soa-{AWS-Account-ID}-public-access-2
  • Giữ lại SNS topic nếu bạn muốn tiếp tục Phần 2
  • Xoá EventBridge Rule (nếu bạn có tạo)
  • Xoá Remediation action của rule s3-bucket-level-public-access-prohibited

  • Xoá tất cả các rule trong AWS Config -> Rule
    • required-tags
    • restricted-ssh
    • s3-bucket-level-public-access-prohibited
  • Stop Recording nếu không muốn tiếp tục theo dõi ressource