Ngân hàng đề — AWS Certified SysOps Administrator Associate

Tìm thấy 936 câu.

Câu 221 Domain 2: Reliability and Business Continuity

A Systems Administrator is generating reports of CloudWatch alarms for maintenance and reporting purposes. In the The AWS/ApplicationELB namespace, the administrator comes across HTTPCode_ELB_4XX_Count metric.

What does this metric signify?

  1. A

    The number of requests where the load balancer chose a new target because it couldn't use an existing sticky session

  2. B

    The number of HTTP 4XX client error codes that originate from the load balancer

  3. C

    The number of TLS connections initiated by the client that did not establish a session with the load balancer

  4. D

    The number of HTTP 4XX response codes generated by ELB targets

Xem giải thích

Đáp án

B — Số mã lỗi HTTP 4XX phía client mà CHÍNH LOAD BALANCER sinh ra.

Vì sao đúng

Tên chỉ số đã nói tất cả — chỉ cần đọc đúng phần giữa: HTTPCode_ELB_4XX_Count.

⚠ Điểm mấu chốt — chữ ELB hay TARGET trong tên quyết định ai sinh ra lỗi:

HTTPCode_ELB_4XX_Count
        ↓
    → LOAD BALANCER tự trả lỗi
    → request CHƯA từng tới ứng dụng của bạn

HTTPCode_TARGET_4XX_Count
        ↓
    → ỨNG DỤNG trả lỗi
    → request đã tới nơi, backend từ chối

Phân biệt hai chỉ số này quyết định bạn đi tìm nguyên nhân ở đâu.

⚠ Khi nào ALB tự sinh lỗi 4XX:

400 Bad Request      → request hỏng, header sai định dạng
401 Unauthorized     → xác thực (Cognito/OIDC) ở listener thất bại
403 Forbidden        → WAF chặn, hoặc listener rule từ chối
460                  → CLIENT ngắt kết nối trước khi ELB trả lời
463                  → X-Forwarded-For có quá nhiều địa chỉ

⚠ Và cách đọc hai chỉ số cùng nhau để chẩn đoán:

ELB_4XX cao, TARGET_4XX thấp
        ↓
    → vấn đề ở TẦNG LOAD BALANCER
    → xem WAF, listener rule, hoặc client gửi request hỏng

TARGET_4XX cao, ELB_4XX thấp
        ↓
    → vấn đề ở ỨNG DỤNG
    → đường dẫn sai, thiếu xác thực, dữ liệu không hợp lệ

Vì sao các phương án khác sai

  • D (số mã 4XX do TARGET của ELB sinh ra) — đây là phương án gần nhất và là mô tả chính xác của một chỉ số KHÁC: HTTPCode_Target_4XX_Count. Đây chính là bẫy trung tâm — hai chỉ số chỉ khác nhau một từ trong tên.

  • A (số request mà load balancer chọn target mới vì không dùng được sticky session) — đây là mô tả của chỉ số NonStickyRequestCount.

  • C (số kết nối TLS do client khởi tạo mà không thiết lập được phiên với load balancer) — đây là mô tả của ClientTLSNegotiationErrorCount.

Ghi nhớ

⚠ Các cặp chỉ số ELB/TARGET của ALB — bảng phải thuộc: | Chỉ số | Ai sinh ra | |---|---| | HTTPCode_ELB_4XX_Count | load balancer | | HTTPCode_Target_4XX_Count | ứng dụng | | HTTPCode_ELB_5XX_Count | load balancer (502, 503, 504) | | HTTPCode_Target_5XX_Count | ứng dụng | | HTTPCode_Target_2XX/3XX_Count | ứng dụng, phản hồi thành công |

Từ khoá nhận diện:

"lỗi do load balancer sinh ra" → chỉ số có chữ ELB "lỗi do ứng dụng sinh ra" → chỉ số có chữ Target "client ngắt kết nối sớm" → 460 "không có target khoẻ" → 503, trong HTTPCode_ELB_5XX_Count "target không trả lời kịp" → 504

Các chỉ số ALB nên đặt cảnh báo Ý nghĩa
TargetResponseTime độ trễ ứng dụng — dùng p99, không dùng trung bình
HTTPCode_Target_5XX_Count ứng dụng đang lỗi
HTTPCode_ELB_5XX_Count load balancer không phục vụ được
UnHealthyHostCount số target hỏng
RejectedConnectionCount chạm giới hạn kết nối
ActiveConnectionCount tải hiện tại
Các chỉ số ALB có tên dễ nhầm Ý nghĩa
NonStickyRequestCount request không dùng được sticky session
ClientTLSNegotiationErrorCount CLIENT bắt tay TLS thất bại
TargetTLSNegotiationErrorCount TARGET bắt tay TLS thất bại
TargetConnectionErrorCount không kết nối được tới target
ProcessedBytes tổng byte đã xử lý
ConsumedLCUs đơn vị tính tiền của ALB
Mã lỗi riêng của ALB — đáng nhớ Nghĩa
460 client ngắt kết nối trước khi ELB trả lời — thường do client timeout
463 X-Forwarded-For có quá nhiều địa chỉ
464 giao thức không tương thích giữa listener và target group
502 target trả phản hồi không hợp lệ
503 không có target khoẻ
504 target không trả lời kịp

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Lỗi đến từ đâu | so HTTPCode_ELB_* với HTTPCode_Target_* | | Request nào lỗi | ALB access log + Athena, lọc theo elb_status_code | | Chi tiết vì sao | cột x-edge-detailed-result-type (CloudFront) hoặc access log của ALB |

Và một mẹo chẩn đoán rất nhanh với hai chỉ số này: vẽ chồng HTTPCode_ELB_4XX_Count và HTTPCode_Target_4XX_Count lên cùng một biểu đồ. Chỉ cần nhìn xem đường nào tăng là bạn biết ngay nên gọi cho đội hạ tầng hay đội ứng dụng — và đó thường là mười phút tiết kiệm được nhiều nhất trong một sự cố.

Câu 222 Domain 1: Monitoring, Logging, and Remediation

A SysOps Administrator has enabled AWS CloudTrail on an AWS account that spans across multiple regions via the AWS Management Console.

Which of the following represents a valid outcome of this action?

  1. A

    CloudTrail can deliver log files from multiple regions to single Amazon S3 bucket of the AWS account

  2. B

    CloudTrail can deliver logs to S3 buckets in trail's home region. Configure an Amazon S3 bucket for each region to receive logs from all regions

  3. C

    It is not possible to enable CloudTrail in all regions of an AWS account from console. This can only be done through CLI

  4. D

    CloudTrail cannot log from multiple regions of an AWS account

Xem giải thích

Đáp án

A — CloudTrail có thể gửi tệp log từ NHIỀU REGION về MỘT bucket S3 duy nhất của tài khoản.

Vì sao đúng

Đây là hành vi mặc định của một multi-region trail, và cũng là lý do người ta luôn nên dùng loại trail này.

⚠ Điểm mấu chốt — một trail, mọi Region, một bucket:

Tạo trail với --is-multi-region-trail
        ↓
    CloudTrail ghi lại hoạt động ở MỌI Region
        ↓
    Tất cả đổ về CÙNG MỘT bucket S3
        ↓
    Phân chia theo tiền tố:
        AWSLogs/<account-id>/CloudTrail/<region>/<năm>/<tháng>/<ngày>/
        ↓
    → một nơi để phân tích
    → một bucket để bảo vệ
    → Region MỚI của AWS ra mắt cũng TỰ ĐỘNG được bao phủ

⚠ Và khi tạo trail từ Console thì mặc định đã là multi-region:

Console: ô "Enable for all accounts in my organization"
         và trail mặc định áp cho MỌI Region
        ↓
    → không phải làm gì thêm
        ↓
CLI: phải khai tường minh
    aws cloudtrail create-trail --name kiem-toan \
      --s3-bucket-name bucket-log --is-multi-region-trail

⚠ Vì sao gom về một bucket lại quan trọng đến vậy:

Nhiều bucket, mỗi Region một cái
        ↓
    → phải bảo vệ nhiều bucket
    → phải tạo nhiều bảng Athena
    → dễ bỏ sót một Region khi rà soát
        ↓
Một bucket duy nhất
        ↓
    → một Object Lock, một bucket policy, một chính sách mã hoá
    → một bảng Athena truy vấn được tất cả
    → dễ chứng minh với kiểm toán viên

Vì sao các phương án khác sai

  • B (CloudTrail chỉ gửi log về bucket ở Region gốc của trail; phải cấu hình một bucket cho mỗi Region) — đây là phương án gần nhất và mô tả cách làm SAI mà nhiều người tưởng là bắt buộc. Thực tế trail đa Region gom tất cả về một bucket, và bucket đó không cần cùng Region với nơi phát sinh sự kiện.

  • C (không bật CloudTrail cho mọi Region từ Console được, chỉ làm qua CLI) — sai; Console là nơi dễ nhất để làm việc này, và đó còn là mặc định.

  • D (CloudTrail không ghi log từ nhiều Region) — sai hoàn toàn; đây là tính năng cốt lõi.

Ghi nhớ

⚠ Ba loại trail — bảng phải thuộc: | Loại | Phạm vi | |---|---| | Single-region trail | một Region — hiếm khi nên dùng | | Multi-region trail | MỌI Region, gồm cả Region mới ra mắt sau này | | Organization trail | mọi Region của MỌI TÀI KHOẢN trong tổ chức |

Từ khoá nhận diện:

"log từ nhiều Region về một chỗ" → multi-region trail "log của mọi tài khoản trong tổ chức" → organization trail "tài khoản thành viên không tắt được" → organization trail "chứng minh log chưa bị sửa" → log file validation "ai đã tải một tệp trong S3" → data event (có phí)

Cấu trúc thư mục log trong bucket Nội dung
Log AWSLogs/<account-id>/CloudTrail/<region>/<yyyy>/<mm>/<dd>/
Digest AWSLogs/<account-id>/CloudTrail-Digest/<region>/...
Organization trail thêm một tầng <org-id> trước <account-id>
Lợi ích phân vùng sẵn theo Region và ngày — rất hợp với Athena
Bảo vệ bucket chứa log CloudTrail Việc
Log file validation chứng minh toàn vẹn
S3 Object Lock (Compliance) không ai xoá được
Bucket ở tài khoản riêng tách khỏi tài khoản bị kiểm toán
SSE-KMS với CMK riêng kiểm soát ai đọc
Cảnh báo StopLogging, DeleteTrail biết ngay khi có người tắt kiểm toán
Ba loại sự kiện — nhắc lại chi phí Nội dung
Management event MIỄN PHÍ một bản sao
Data event có phí theo sự kiện
Insights event có phí
Lưu ý bản sao THỨ HAI của management event cũng tính phí
CloudTrail Lake — lựa chọn mới đáng biết Nội dung
Là gì kho dữ liệu sự kiện có quản lý, truy vấn bằng SQL ngay trong CloudTrail
Lợi ích không cần dựng Athena và Glue
Giữ được tới 10 năm
Đánh đổi có phí theo lượng dữ liệu nạp vào và truy vấn

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Trail có đa Region không | describe-trails, xem IsMultiRegionTrail | | Trail có đang ghi không | get-trail-status, xem IsLogging | | Có Region nào bị bỏ sót không | mở Event history ở vài Region ít dùng và đối chiếu |

Và một lời khuyên nên áp dụng cho mọi tài khoản AWS, kể cả tài khoản thử nghiệm: luôn tạo trail ở chế độ đa Region. Region mà bạn không dùng chính là Region mà kẻ tấn công sẽ dùng — vì đó là nơi không ai nhìn tới, không có cảnh báo nào, và nếu trail chỉ bật ở Region chính thì mọi hoạt động ở đó sẽ không để lại bất kỳ dấu vết nào trong hệ thống kiểm toán của bạn.

Câu 223 Domain 3: Deployment, Provisioning, and Automation

Two AWS CloudFormation stack policies are shared below.

As a SysOps Administrator, can you identify the actions that are possible when the policies are applied to a stack?

Policy-1:

{
  "Statement" : [
    {
      "Effect" : "Deny",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "LogicalResourceId/MyDatabase"
    },
    {
      "Effect" : "Allow",
      "Action" : "Update:*",
      "Principal": "*",
      "Resource" : "*"
    }
  ]
}

Policy-2:

{
  "Statement" : [
    {
      "Effect" : "Allow",
      "Action" : "Update:*",
      "Principal": "*",
      "NotResource" : "LogicalResourceId/MyDatabase"
    }
  ]
}
  1. A

    Both the policies allow updates on all resources

  2. B

    Policy-1 denies updates on MyDatabase, whereas, Policy-2 allows updates on MyDatabase

  3. C

    Policy-2 denies updates on MyDatabase, whereas, Policy-1 allows updates on MyDatabase

  4. D

    Both the policies deny all update actions on the database with the MyDatabase logical ID. And they allow all update actions on all other stack resources

Xem giải thích

Đáp án

D — CẢ HAI chính sách đều CHẶN mọi thao tác cập nhật lên tài nguyên có logical ID là MyDatabase, và CHO PHÉP mọi thao tác cập nhật lên tất cả tài nguyên khác của stack.

Vì sao đúng

Hai chính sách được viết theo hai cách khác nhau nhưng cho kết quả hoàn toàn giống nhau.

⚠ Policy-1 — cách viết tường minh: Deny cụ thể + Allow rộng:

Deny  Update:*  trên  LogicalResourceId/MyDatabase
Allow Update:*  trên  *
        ↓
    MyDatabase khớp CẢ HAI câu lệnh
        ↓
    → nhưng DENY TƯỜNG MINH THẮNG ALLOW
        ↓
    → MyDatabase: bị chặn
    → tài nguyên khác: chỉ khớp Allow → được phép

⚠ Policy-2 — cách viết bằng NotResource:

Allow Update:*  trên  NotResource: LogicalResourceId/MyDatabase
        ↓
    "Cho phép trên MỌI tài nguyên NGOẠI TRỪ MyDatabase"
        ↓
    → MyDatabase: KHÔNG khớp câu Allow nào
        ↓
    → rơi vào TỪ CHỐI NGẦM (implicit deny)
        ↓
    → tài nguyên khác: khớp Allow → được phép

⚠ Điểm mấu chốt — hai kiểu từ chối khác nhau nhưng kết quả như nhau:

Policy-1 → EXPLICIT DENY (từ chối tường minh)
Policy-2 → IMPLICIT DENY (từ chối ngầm, vì không có Allow nào khớp)
        ↓
    Trong tình huống này: KẾT QUẢ GIỐNG HỆT NHAU
        ↓
    Nhưng KHÁC NHAU khi có thêm chính sách khác chồng lên:
        - Explicit Deny: KHÔNG THỂ bị ghi đè bởi Allow nào
        - Implicit Deny: một Allow từ chính sách khác có thể lật ngược
        ↓
    → với stack policy chỉ có MỘT chính sách cho mỗi stack,
      nên khác biệt này không phát sinh ở đây

Xem thêm câu #11710: cùng chủ đề stack policy nhưng ở góc khác — nhấn mạnh rằng stack policy không phải cơ chế kiểm soát truy cập, và không thay thế được chính sách IAM.

Vì sao các phương án khác sai

  • B (Policy-1 chặn MyDatabase, còn Policy-2 CHO PHÉP MyDatabase) — đây là phương án gần nhất và là bẫy về cách đọc NotResource. Rất nhiều người đọc NotResource: MyDatabase thành "áp dụng cho MyDatabase", trong khi nó nghĩa là "áp dụng cho mọi thứ TRỪ MyDatabase".

  • C (Policy-2 chặn, Policy-1 cho phép) — hiểu sai cả hai chính sách, và bỏ qua quy tắc Deny thắng Allow.

  • A (cả hai đều cho phép cập nhật mọi tài nguyên) — bỏ qua hoàn toàn cả Deny lẫn NotResource.

Ghi nhớ

⚠ Resource và NotResource — bảng phải thuộc: | Cú pháp | Nghĩa | |---|---| | "Resource": "A" | áp dụng CHO A | | "NotResource": "A" | áp dụng cho MỌI THỨ TRỪ A | | "Action": "X" | áp dụng cho hành động X | | "NotAction": "X" | áp dụng cho mọi hành động TRỪ X |

Từ khoá nhận diện:

"NotResource" → mọi thứ NGOẠI TRỪ cái được nêu "Deny và Allow cùng khớp" → DENY thắng "không có Allow nào khớp" → implicit deny "chặn cập nhật một tài nguyên khi update stack" → stack policy "chặn xoá cả stack" → termination protection

⚠ Ba quy tắc vàng — áp dụng cho cả IAM lẫn stack policy: | Quy tắc | |---| | 1. Mặc định là TỪ CHỐI (implicit deny) | | 2. Allow tường minh cho phép | | 3. DENY TƯỜNG MINH THẮNG TẤT CẢ |

Đặc điểm riêng của stack policy Nội dung
Gắn vào một stack (không phải danh tính)
Principal bắt buộc là "*" nó không phân biệt người dùng
Chỉ áp dụng khi UPDATE stack không phải cơ chế kiểm soát truy cập
Mặc định không có stack policy → mọi tài nguyên đều update được
Ghi đè tạm cho một lần update --stack-policy-during-update-body
Ba giá trị Action của stack policy Ý nghĩa
Update:Modify sửa tại chỗ
Update:Replace XOÁ và tạo lại — nguy hiểm nhất
Update:Delete gỡ tài nguyên khỏi stack
Update:* cả ba
Nên viết stack policy thế nào Nội dung
Deny Update:Replace và Update:Delete trên tài nguyên có dữ liệu cho phép Update:Modify để vẫn cập nhật bình thường
Dùng Resource với logical ID, không phải ARN stack policy làm việc với tên logic trong template
Kết hợp với DeletionPolicy: Retain bảo vệ cả khi update lẫn khi xoá stack
Termination protection lớp cuối cùng

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Stack đang có policy gì | get-stack-policy --stack-name <ten> | | Update sẽ động vào gì | tạo change set và đọc cột Replacement | | Chính sách có chặn đúng không | thử một update cố tình chạm vào tài nguyên được bảo vệ |

Và một mẫu stack policy đáng áp dụng cho mọi stack sản xuất: chặn Update:Replace trên mọi tài nguyên có lưu trạng thái, nhưng vẫn cho Update:Modify. Cách này không cản trở việc cập nhật hằng ngày, nhưng biến một thay đổi vô tình gây thay thế cơ sở dữ liệu — thứ trông hoàn toàn vô hại khi đọc pull request — thành một lỗi rõ ràng ngay lúc triển khai.

Câu 224 Chọn nhiều đáp án Domain 4: Security and Compliance

A heavily used application needs to be built on an Amazon Aurora DB cluster. The connections to the DB instance will be secured using Transport Layer Security (TLS) and the database needs to be publicly accessible.

Which of the following steps are needed to connect to an Amazon Aurora DB cluster from outside a VPC? (Select three)

  1. A

    Disable the VPC attributes DNS hostnames and DNS resolution

  2. B

    Enable the VPC attributes DNS hostnames and DNS resolution

  3. C

    Choose a public subnet while creating the Aurora DB instance for ensuring public access

  4. D

    A publicly accessible Aurora DB instance cannot be launched into the default VPC. Choose a non-default VPC while creating the DB instance

  5. E

    The Aurora DB instance must have a public IP address

  6. F

    Configure a DB subnet group for public subnets and create the Aurora DB instance from this subnet group

Xem giải thích

Đáp án

B, E, F — ba bước cần để kết nối tới Aurora DB cluster từ ngoài VPC:

  • F — Cấu hình DB subnet group gồm các PUBLIC subnet, và tạo Aurora DB instance từ subnet group đó.
  • E — Aurora DB instance phải có ĐỊA CHỈ IP CÔNG CỘNG.
  • B — BẬT hai thuộc tính của VPC: DNS hostnames và DNS resolution.

Vì sao đúng

⚠ Điều F — RDS không cho bạn chọn subnet trực tiếp:

Với EC2: bạn chọn subnet khi khởi chạy
        ↓
Với RDS/Aurora: bạn chọn DB SUBNET GROUP
        ↓
    DB subnet group = tập hợp subnet ở ÍT NHẤT HAI AZ
        ↓
    → RDS tự chọn subnet trong nhóm đó
        ↓
    → muốn instance ở public subnet thì DB subnet group
      phải chứa PUBLIC subnet

⚠ Điều E — PubliclyAccessible quyết định có IP công cộng hay không:

PubliclyAccessible = true
        ↓
    RDS gán một IP CÔNG CỘNG cho instance
    Endpoint DNS phân giải thành IP CÔNG CỘNG khi hỏi từ ngoài
        ↓
    → client ngoài VPC kết nối được

PubliclyAccessible = false
        ↓
    Chỉ có IP riêng
    Endpoint DNS luôn phân giải thành IP RIÊNG
        ↓
    → chỉ truy cập được từ trong VPC (hoặc qua VPN/DX/peering)

⚠ Điều B — vì sao cần bật hai thuộc tính DNS của VPC:

enableDnsHostnames + enableDnsSupport
        ↓
    Không bật → endpoint của RDS không phân giải đúng
        ↓
    → client ngoài VPC không tìm được địa chỉ để kết nối
        ↓
    → đây là điều kiện thường bị bỏ sót nhất trong ba điều

⚠ Và ba lớp phải mở đủ, không chỉ ba bước trên:

1. Route table của subnet phải có 0.0.0.0/0 → IGW
2. Security Group của DB cho phép cổng 3306/5432 từ IP client
3. NACL cho phép cả hai chiều

Vì sao các phương án khác sai

  • C (chọn public subnet khi tạo Aurora DB instance) — đây là phương án gần nhất và ý tưởng thì đúng, nhưng cách diễn đạt sai về cơ chế: bạn không chọn subnet trực tiếp cho RDS — bạn chọn DB subnet group, đúng như đáp án F mô tả.

  • D (không tạo được Aurora public trong default VPC, phải dùng VPC khác) — sai; default VPC hoàn toàn dùng được, và thực ra nó còn thuận tiện hơn vì mọi subnet đã là public sẵn.

  • A (TẮT hai thuộc tính DNS) — ngược hẳn với điều B; tắt chúng là chắc chắn không kết nối được.

Ghi nhớ

⚠ Ba điều kiện để RDS/Aurora truy cập được từ internet — bảng phải thuộc: | Điều kiện | Nội dung | |---|---| | PubliclyAccessible = true | instance có IP công cộng | | DB subnet group chứa public subnet | subnet có tuyến 0.0.0.0/0 → IGW | | VPC bật enableDnsHostnames và enableDnsSupport | endpoint phân giải đúng | | (kèm) Security Group | cho phép cổng DB từ IP của client |

Từ khoá nhận diện:

"RDS truy cập từ ngoài VPC" → PubliclyAccessible + public subnet group + DNS attributes "chọn subnet cho RDS" → qua DB SUBNET GROUP, không chọn trực tiếp "RDS không được lộ ra internet" → PubliclyAccessible: false + private subnet "kết nối từ tại chỗ" → VPN/Direct Connect + private subnet — an toàn hơn nhiều "ép mọi kết nối phải mã hoá" → parameter group (rds.force_ssl)

DB subnet group — chi tiết bắt buộc Nội dung
Phải có subnet ở ít nhất HAI Availability Zone
Vì sao để Multi-AZ failover có chỗ đặt standby
Có thể chứa public subnet, private subnet, hoặc cả hai
Đổi được sau khi tạo nhưng phải cẩn thận
TLS với Aurora — đề nhắc tới Nội dung
Ép TLS tham số rds.force_ssl = 1 (PostgreSQL) hoặc require_secure_transport (MySQL)
Chứng chỉ tải bundle CA của RDS (global-bundle.pem)
sslmode dùng verify-full để chống tấn công người-đứng-giữa
Xoay chứng chỉ CA AWS thông báo trước, ứng dụng phải cập nhật bundle
Vì sao KHÔNG nên để cơ sở dữ liệu công khai Nội dung
Bề mặt tấn công cả internet quét được cổng 3306/5432
Bảo vệ duy nhất Security Group — một luật mở nhầm là xong
Cách an toàn hơn VPN, Direct Connect, bastion, hoặc RDS Proxy trong VPC
Nếu buộc phải công khai siết Security Group theo IP đích danh, ép TLS, bật IAM authentication

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Instance có công khai không | describe-db-instances, xem PubliclyAccessible | | DNS phân giải ra IP gì | dig <endpoint> từ ngoài VPC — phải ra IP công cộng | | VPC đã bật DNS chưa | describe-vpc-attribute --attribute enableDnsHostnames |

Và một lời khuyên thẳng thắn về yêu cầu "cơ sở dữ liệu phải truy cập được công khai": hãy hỏi lại xem nhu cầu thật sự là gì trước khi triển khai. Trong phần lớn trường hợp, thứ người ta cần là truy cập được từ máy của lập trình viên hay từ một công cụ BI — và cả hai đều giải quyết tốt hơn bằng VPN hoặc bastion, thay vì mở một cổng cơ sở dữ liệu ra cho toàn bộ internet quét thấy.

Câu 225 Domain 1: Monitoring, Logging, and Remediation

While migrating the DynamoDB tables from one AWS account to another, a team had exported the DynamoDB table data in account A into an Amazon S3 bucket in account B. The users in account B are unable to access or perform any operation on this data.

What should be done to fix this issue?

  1. A

    Configure the export function to write data with the access control list (ACL) bucket-owner-full-control

  2. B

    Use AWS Data Pipeline to export account A DynamoDB table to an S3 bucket in account B

  3. C

    Include the PutObjectAcl permission on all exported objects after the export is complete

  4. D

    Use AWS Glue crawler to directly import the data into DynamoDB tables of account B

Xem giải thích

Đáp án

C — Cấp thêm quyền PutObjectAcl cho toàn bộ đối tượng đã xuất, sau khi việc xuất hoàn tất.

Vì sao đúng

Đây là biểu hiện kinh điển của bài toán object ownership liên tài khoản trên S3.

⚠ Điểm mấu chốt — ai GHI đối tượng thì người đó SỞ HỮU nó:

Tài khoản A xuất dữ liệu DynamoDB
        ↓
    Ghi vào bucket của TÀI KHOẢN B
        ↓
    → chủ sở hữu ĐỐI TƯỢNG là TÀI KHOẢN A
    → chủ sở hữu BUCKET là tài khoản B
        ↓
    → tài khoản B SỞ HỮU CÁI THÙNG nhưng KHÔNG SỞ HỮU
      những gì bên trong
        ↓
    → user của B không đọc được, dù bucket là của họ

⚠ Hai cách xử lý — một cách phòng, một cách chữa:

PHÒNG (lúc ghi):
    Ghi kèm ACL "bucket-owner-full-control"
        ↓
    → chủ bucket có toàn quyền ngay từ đầu

CHỮA (sau khi đã ghi):
    Tài khoản A gọi PutObjectAcl trên các đối tượng đã ghi
        ↓
    aws s3api put-object-acl --bucket bucket-b \
      --key du-lieu.json --acl bucket-owner-full-control
        ↓
    → đây là đáp án của đề, vì việc xuất ĐÃ hoàn tất

⚠ Và cách làm hiện đại khiến vấn đề này biến mất hoàn toàn:

S3 Object Ownership = BucketOwnerEnforced
        ↓
    → ACL bị VÔ HIỆU HOÁ hoàn toàn
    → CHỦ BUCKET LUÔN SỞ HỮU mọi đối tượng, bất kể ai ghi
        ↓
    → mặc định cho bucket tạo mới từ tháng 4/2023
    → AWS khuyến nghị dùng
        ↓
    Nếu bucket của B đã bật cái này thì bài toán không xảy ra

Vì sao các phương án khác sai

  • A (cấu hình hàm xuất để ghi dữ liệu kèm ACL bucket-owner-full-control) — đây là phương án gần nhất và là cách PHÒNG đúng đắn. Nhưng đề nói việc xuất đã hoàn tất và người dùng đang không truy cập được — nên cần một cách CHỮA cho dữ liệu đã có, tức là PutObjectAcl. (Cách A sẽ đúng nếu áp dụng trước khi xuất.)

  • B (dùng AWS Data Pipeline để xuất bảng DynamoDB sang S3 của tài khoản B) — không giải quyết vấn đề: dùng công cụ nào để ghi thì quyền sở hữu đối tượng vẫn thuộc về tài khoản ghi. (Ngoài ra AWS Data Pipeline đã ngừng nhận khách hàng mới — thay thế bằng Glue, Step Functions hoặc MWAA.)

  • D (dùng Glue crawler để nhập thẳng dữ liệu vào DynamoDB của tài khoản B) — hiểu sai công dụng: Glue crawler chỉ QUÉT dữ liệu và dựng catalog, nó không nhập dữ liệu vào đâu cả.

Ghi nhớ

⚠ Object ownership liên tài khoản — bảng phải thuộc: | Tình huống | Ai sở hữu đối tượng | |---|---| | Tài khoản A ghi vào bucket của A | A | | Tài khoản A ghi vào bucket của B (ACL cũ) | A — B không đọc được | | A ghi kèm bucket-owner-full-control | B có toàn quyền | | Bucket bật BucketOwnerEnforced | B LUÔN sở hữu, ACL bị vô hiệu |

Từ khoá nhận diện:

"chủ bucket không đọc được đối tượng" → object ownership liên tài khoản "phòng từ đầu" → bucket-owner-full-control hoặc BucketOwnerEnforced "chữa sau khi đã ghi" → PutObjectAcl "AWS khuyến nghị" → tắt ACL bằng BucketOwnerEnforced "Data Pipeline" → đã ngừng nhận khách mới

⚠ Ba chế độ Object Ownership — bảng phải thuộc: | Chế độ | Nội dung | |---|---| | BucketOwnerEnforced | ACL VÔ HIỆU, chủ bucket luôn sở hữu — mặc định cho bucket mới, AWS khuyến nghị | | BucketOwnerPreferred | chủ bucket sở hữu nếu người ghi dùng bucket-owner-full-control | | ObjectWriter | người ghi sở hữu — cách cũ, nguồn gốc của vấn đề trong đề |

Cách ép ghi kèm ACL đúng Nội dung
Bucket policy với điều kiện s3:x-amz-acl phải là bucket-owner-full-control
Nếu không khớp Deny
Kết quả bên ghi buộc phải dùng ACL đúng, nếu không request bị từ chối
Tốt hơn nữa bật BucketOwnerEnforced — không cần điều kiện nào
Các dịch vụ đã ngừng nhận khách mới — đáng biết khi ôn đề cũ Nội dung
AWS Data Pipeline thay bằng Glue, Step Functions, MWAA
AWS OpsWorks EOL 26/5/2024
AWS Server Migration Service (SMS) thay bằng Application Migration Service (MGN)
CodeCommit, CodeStar ngừng nhận khách mới
Elastic Transcoder thay bằng MediaConvert
Cách di chuyển DynamoDB liên tài khoản hiện nay Công cụ
DynamoDB export to S3 (native) không tốn RCU, xuất ra định dạng DynamoDB JSON hoặc Ion
AWS Backup sao lưu và khôi phục liên tài khoản
Glue ETL khi cần biến đổi dữ liệu
DynamoDB Streams + Lambda đồng bộ liên tục

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Ai sở hữu một đối tượng | get-object-acl --bucket ... --key ... | | Bucket đang ở chế độ nào | get-bucket-ownership-controls | | Vì sao AccessDenied | CloudTrail — xem lỗi từ s3 hay từ kms |

Và một lời khuyên nên áp dụng cho mọi bucket nhận dữ liệu từ tài khoản khác: bật BucketOwnerEnforced ngay từ khi tạo bucket. Nó xoá sổ vĩnh viễn cả một lớp sự cố mà câu hỏi này mô tả — và với những bucket đã tồn tại từ lâu, đây là một trong những thay đổi cấu hình đơn giản nhất mang lại lợi ích lớn nhất, miễn là bạn xác nhận trước rằng không có quy trình nào đang phụ thuộc vào ACL.

Câu 226 Chọn nhiều đáp án Domain 4: Security and Compliance

As a SysOps Administrator, you are tasked with creating an AWS Certificate Manager (ACM) certificate for Elastic Load Balancer that is fronting Amazon EC2 instances.

What are the key points to consider while creating certificates through ACM? (Select two)

  1. A

    ACM provides certificates for SSL/TLS protocols only

  2. B

    You cannot use ACM certificates for email encryption

  3. C

    You can install an ACM certificate on your application running on an Amazon EC2 instance

  4. D

    The private key for an ACM certificate can only be downloaded from an AWS root user account

  5. E

    ACM helps you request certificates for Amazon-owned domain names

Xem giải thích

Đáp án

A, B — hai điểm cần nhớ về chứng chỉ ACM:

  • A — ACM chỉ cấp chứng chỉ cho giao thức SSL/TLS.
  • B — Bạn KHÔNG dùng được chứng chỉ ACM để mã hoá email.

Vì sao đúng

Cả hai điều đều xuất phát từ cùng một sự thật: ACM có phạm vi rất hẹp và rất chuyên biệt.

⚠ Điểm mấu chốt — ACM chỉ làm một việc:

ACM cấp chứng chỉ X.509 cho SSL/TLS
        ↓
    Dùng để MÃ HOÁ KẾT NỐI giữa client và dịch vụ
        ↓
    KHÔNG dùng cho:
        - mã hoá email (S/MIME)     ← điều B
        - ký mã nguồn (code signing)
        - xác thực client bằng chứng chỉ
        - mã hoá tài liệu
        ↓
    → mỗi loại chứng chỉ có một mục đích được ghi trong
      trường "Key Usage" và "Extended Key Usage"

⚠ Và ACM chỉ tích hợp được với các dịch vụ mà AWS tự kết thúc TLS:

Dùng được:
    Application / Network Load Balancer
    CloudFront (chứng chỉ BẮT BUỘC ở us-east-1)
    API Gateway, App Runner, AppSync
    Elastic Beanstalk (qua ELB)
        ↓
KHÔNG dùng được:
    EC2 instance          ← đây là lý do phương án C sai
    Máy chủ tại chỗ
    Container tự chạy TLS

Xem thêm câu #11725: cùng sự thật này ở góc khác — khi cần mã hoá toàn tuyến tới EC2, chứng chỉ ACM công khai không dùng được, phải dùng AWS Private CA hoặc chứng chỉ bên thứ ba.

Vì sao các phương án khác sai

  • C (cài chứng chỉ ACM lên ứng dụng chạy trên EC2) — đây là phương án gần nhất và là hiểu nhầm phổ biến nhất về ACM. Lý do không làm được: ACM giữ private key và không cho xuất ra — mà cài chứng chỉ lên EC2 thì bắt buộc phải có private key. (Chứng chỉ từ AWS Private CA thì xuất được và cài lên EC2 được.)

  • D (private key của chứng chỉ ACM chỉ tải về được bằng tài khoản root) — sai; KHÔNG AI tải được, kể cả root. Đó là thiết kế cốt lõi của ACM.

  • E (ACM giúp xin chứng chỉ cho tên miền do Amazon sở hữu) — ngược lại: ACM cấp chứng chỉ cho tên miền CỦA BẠN, và bạn phải chứng minh quyền sở hữu bằng DNS hoặc email validation.

Ghi nhớ

⚠ Hai loại chứng chỉ của ACM — bảng phải thuộc: | | ACM public certificate | AWS Private CA | |---|---|---| | Chi phí | MIỄN PHÍ | có phí (theo CA và theo chứng chỉ) | | Xuất private key | KHÔNG | CÓ | | Cài lên EC2 | KHÔNG | CÓ | | Trình duyệt tin cậy | có | không — chỉ nội bộ | | Tự gia hạn | có, nếu gắn với dịch vụ tích hợp | có |

Từ khoá nhận diện:

"cài chứng chỉ ACM lên EC2" → KHÔNG ĐƯỢC "tải private key từ ACM" → KHÔNG AI tải được "mã hoá email" → KHÔNG phải việc của ACM (dùng S/MIME từ CA khác) "chứng chỉ cho CloudFront" → ACM ở us-east-1, BẮT BUỘC "mã hoá toàn tuyến tới EC2" → AWS Private CA "ký mã nguồn" → AWS Signer, không phải ACM

Ba cách xác thực khi xin chứng chỉ Nội dung
DNS validation thêm bản ghi CNAME — tự gia hạn được, nên ưu tiên
Email validation phải xác nhận lại mỗi lần gia hạn
Import mang chứng chỉ mua sẵn vào — ACM KHÔNG tự gia hạn
Tự gia hạn của ACM — điều kiện Nội dung
Chứng chỉ phải đang được dùng bởi dịch vụ tích hợp
Dùng DNS validation và bản ghi CNAME vẫn còn
Nếu chứng chỉ không gắn với dịch vụ nào ACM có thể không gia hạn — theo dõi bằng sự kiện EventBridge
Cảnh báo dùng ACM Certificate Approaching Expiration event
Giới hạn cần nhớ Con số
Số tên miền trong một chứng chỉ tối đa 10 (xin tăng được)
Wildcard *.congty.com bao phủ một cấp subdomain
Chứng chỉ cho CloudFront BẮT BUỘC us-east-1
Chứng chỉ cho ALB cùng Region với ALB

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Chứng chỉ đang dùng ở đâu | describe-certificate, xem InUseBy | | Trạng thái xác thực | DomainValidationOptions[].ValidationStatus | | Sắp hết hạn chưa | NotAfter, và bật cảnh báo qua EventBridge |

Và một chi tiết khiến rất nhiều người mất thời gian mà không hiểu vì sao: chứng chỉ ACM cho CloudFront BẮT BUỘC nằm ở Region us-east-1, kể cả khi toàn bộ hạ tầng của bạn ở nơi khác. Triệu chứng là chứng chỉ hiện trạng thái Issued bình thường, nhưng ô chọn chứng chỉ trong cấu hình CloudFront lại trống trơn — và không có thông báo nào giải thích lý do.

Câu 227 Domain 3: Deployment, Provisioning, and Automation

Among the following actions, what action is the IAM policy allowing you to do?

{
    "Version": "2012-10-17",
    "Id": "Secret Policy",
    "Statement": [
        {
            "Sid": "EC2",
            "Effect": "Allow",
            "Action": "ec2:*",
            "Resource": "*"
        },
        {
            "Sid": "Passrole",
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": "arn:aws:iam:::role/RDS-*"
        }
    ]
}
  1. A

    Allowing you to give RDS full access to EC2 instances

  2. B

    Allowing you to give any role to EC2 instances

  3. C

    Allowing you to assign IAM Roles to EC2 if they start with RDS-

  4. D

    Allowing you to give any role to RDS instances

Xem giải thích

Đáp án

C — Cho phép bạn gán IAM Role cho EC2, với điều kiện tên role bắt đầu bằng RDS-.

Vì sao đúng

Chính sách này gồm hai câu lệnh, và ý nghĩa nằm ở cách chúng kết hợp với nhau.

⚠ Câu lệnh thứ nhất — toàn quyền trên EC2:

"Action": "ec2:*", "Resource": "*"
        ↓
    → làm được mọi thao tác EC2: khởi chạy, dừng, xoá, sửa

⚠ Câu lệnh thứ hai — iam:PassRole, và đây mới là phần quan trọng:

"Action": "iam:PassRole"
"Resource": "arn:aws:iam:::role/RDS-*"
        ↓
    → được phép TRAO một role cho một dịch vụ AWS
    → nhưng CHỈ những role có tên bắt đầu bằng "RDS-"

⚠ Điểm mấu chốt — PassRole là gì và vì sao nó tồn tại:

Khởi chạy EC2 với một instance profile
        ↓
    Nghĩa là bạn TRAO quyền của role đó cho instance
        ↓
    → instance sẽ hành động với quyền của role
        ↓
    Nếu không có kiểm soát:
        một người chỉ có quyền ec2:*
        có thể khởi chạy máy với role AdministratorAccess
        rồi dùng máy đó làm mọi thứ
        ↓
    → đó chính là LEO THANG ĐẶC QUYỀN
        ↓
    iam:PassRole tồn tại để chặn điều đó

⚠ Vì sao chính sách này ghép hai câu lệnh lại:

ec2:* một mình
        ↓
    → khởi chạy được máy, nhưng KHÔNG gắn role nào được

ec2:* + iam:PassRole trên role/RDS-*
        ↓
    → khởi chạy máy VÀ gắn được role có tên RDS-*
    → nhưng không gắn được role nào khác
        ↓
    → đúng như đáp án C mô tả

Vì sao các phương án khác sai

  • B (cho phép gán BẤT KỲ role nào cho EC2) — đây là phương án gần nhất và sẽ đúng nếu Resource là "*". Nhưng chính sách giới hạn ở role/RDS-*, nên chỉ những role khớp mẫu đó mới gán được.

  • D (cho phép gán bất kỳ role nào cho RDS instance) — hiểu sai: RDS- chỉ là TIỀN TỐ TÊN ROLE, không có nghĩa là role dành cho dịch vụ RDS. Chính sách này không cấp quyền RDS nào cả.

  • A (cho phép trao cho RDS toàn quyền trên EC2) — hiểu sai hoàn toàn cả hai câu lệnh.

Ghi nhớ

⚠ iam:PassRole — quyền quan trọng nhất mà ít người để ý: | Nội dung | |---| | Cần khi trao một role cho một DỊCH VỤ AWS | | EC2 (instance profile), Lambda (execution role), ECS (task role), CloudFormation (service role), Glue, SageMaker… | | Không giới hạn Resource là mở đường leo thang đặc quyền | | Luôn giới hạn bằng mẫu tên role hoặc iam:PassedToService |

Từ khoá nhận diện:

"gán role cho EC2/Lambda/ECS" → cần iam:PassRole "PassRole với Resource: *" → RỦI RO LEO THANG ĐẶC QUYỀN "đóng vai" → sts:AssumeRole — khác hẳn PassRole "giới hạn role được trao cho dịch vụ nào" → điều kiện iam:PassedToService

⚠ PassRole và AssumeRole — hai thứ rất dễ lẫn: | | iam:PassRole | sts:AssumeRole | |---|---|---| | Ai dùng role | DỊCH VỤ AWS (EC2, Lambda…) | CHÍNH BẠN | | Bạn nhận chứng chỉ không | KHÔNG | CÓ | | Ví dụ | gắn instance profile cho EC2 | aws sts assume-role để đổi vai | | Kiểm soát ở | chính sách IAM của người gọi | trust policy của role |

Cách siết PassRole cho an toàn Ví dụ
Giới hạn theo tiền tố tên "Resource": "arn:aws:iam::*:role/UngDung-*"
Giới hạn theo dịch vụ nhận "Condition": {"StringEquals": {"iam:PassedToService": "ec2.amazonaws.com"}}
Kết hợp cả hai chặt nhất
Không bao giờ "Action": "iam:PassRole", "Resource": "*"
Vì sao đây là lỗ hổng leo thang đặc quyền hay gặp Kịch bản
Người dùng có ec2:* và iam:PassRole với Resource: *
Họ khởi chạy một instance với role AdministratorAccess
SSH hoặc Session Manager vào máy đó
Dùng chứng chỉ tạm của instance để làm bất cứ điều gì
Kết quả một người dùng quyền hẹp trở thành quản trị viên toàn quyền
Công cụ phát hiện Nội dung
IAM Access Analyzer tìm quyền thừa, chính sách quá rộng
Access Advisor dịch vụ nào thật sự được dùng
Policy Simulator thử trước khi áp
IAM Access Analyzer policy generation sinh chính sách từ lịch sử CloudTrail

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Ai có PassRole rộng | rà chính sách tìm iam:PassRole với Resource: "*" | | Instance đang dùng role nào | describe-instances, xem IamInstanceProfile | | Quyền hiệu lực thật | IAM Policy Simulator |

Và một việc đáng làm ngay trong bất kỳ tài khoản AWS nào đã dùng lâu năm: rà soát mọi chính sách có iam:PassRole và kiểm tra trường Resource của chúng. Đây là một trong những đường leo thang đặc quyền phổ biến nhất và cũng khó nhận ra nhất — vì bản thân PassRole nghe rất vô hại, và người viết chính sách thường thêm "Resource": "*" chỉ để "cho nó chạy" mà không nhận ra mình vừa mở cánh cửa nào.

Câu 228 Domain 4: Security and Compliance

A project stores sensitive customer data on Amazon S3 buckets. This data needs to be encrypted at rest. Also, the encryption keys need to be rotated annually at least.

What is an easy way to implement this requirement?

  1. A

    Use SSE-C with automatic key rotation on an annual basis

  2. B

    Encrypt the data before sending it to Amazon S3

  3. C

    Use AWS KMS with automatic key rotation

  4. D

    Import a custom key into AWS KMS and automate the key rotation on an annual basis by using a Lambda function

Xem giải thích

Đáp án

C — Dùng AWS KMS với tính năng xoay khoá tự động (automatic key rotation).

Vì sao đúng

Đề nêu ba yêu cầu, và SSE-KMS đáp ứng cả ba bằng một công tắc:

Đề yêu cầu SSE-KMS
Mã hoá dữ liệu khi lưu có
Xoay khoá ít nhất hằng năm có — enable-key-rotation
Cách DỄ nhất một lệnh, không viết mã

⚠ Điểm mấu chốt — xoay khoá tự động của KMS hoàn toàn trong suốt:

aws kms enable-key-rotation --key-id <key-id>
        ↓
    KMS tự tạo key material MỚI mỗi năm
    và GIỮ LẠI toàn bộ material CŨ
        ↓
    Dữ liệu mới → mã hoá bằng material mới
    Dữ liệu cũ  → vẫn giải mã được bằng material cũ
        ↓
    → KHÔNG phải mã hoá lại gì cả
    → ARN và alias của khoá KHÔNG ĐỔI
    → ứng dụng không biết là đã có chuyện gì xảy ra

⚠ Vì sao "không phải mã hoá lại" là điều quan trọng nhất:

Xoay khoá theo cách thủ công (tạo khoá mới)
        ↓
    → phải mã hoá lại TOÀN BỘ dữ liệu cũ
    → với hàng terabyte thì đó là một dự án
        ↓
KMS automatic rotation
        ↓
    → chỉ đổi material bên trong cùng một CMK
    → dữ liệu cũ nằm yên, vẫn đọc được

Xem thêm câu #11655, #11720 và #11662: cùng họ chọn kiểu mã hoá S3 — mỗi câu một yêu cầu khác nhau nên đáp án khác nhau. Ở đây yêu cầu là xoay khoá định kỳ, và đó là thứ chỉ KMS làm tự động được.

Vì sao các phương án khác sai

  • D (nhập khoá tuỳ chỉnh vào KMS rồi tự động xoay hằng năm bằng Lambda) — đây là phương án gần nhất và về kỹ thuật thì làm được. Nhưng nó vi phạm ràng buộc "cách dễ nhất": khoá nhập từ ngoài (imported key material) KHÔNG hỗ trợ xoay tự động — bạn phải tự sinh, tự nhập, tự viết Lambda, và tự giữ bản gốc để phòng khi cần nhập lại.

  • A (SSE-C với xoay khoá tự động hằng năm) — SSE-C không có cơ chế xoay khoá nào: bạn tự giữ khoá và tự gửi kèm mỗi request. Muốn "xoay" thì phải tự mã hoá lại toàn bộ dữ liệu bằng khoá mới.

  • B (mã hoá dữ liệu trước khi gửi lên S3) — client-side encryption cho kiểm soát cao nhất nhưng công sức lớn nhất: tự mã hoá, tự lưu khoá, tự xoay khoá. Trái thẳng yêu cầu "dễ nhất".

Ghi nhớ

⚠ Xoay khoá theo từng loại khoá KMS — bảng phải thuộc: | Loại khoá | Xoay tự động | |---|---| | AWS managed key (aws/s3) | CÓ, mỗi năm — bắt buộc, không tắt được | | Customer managed key (CMK) | CÓ, phải BẬT thủ công — mỗi năm (chỉnh được chu kỳ) | | Imported key material | KHÔNG — phải tự nhập khoá mới | | CloudHSM key store / XKS | tuỳ cấu hình bên ngoài | | AWS owned key | AWS lo, bạn không thấy |

Từ khoá nhận diện:

"xoay khoá tự động, dễ nhất" → KMS CMK + enable-key-rotation "khoá nhập từ ngoài" → KHÔNG xoay tự động được "SSE-C xoay khoá" → KHÔNG CÓ cơ chế nào "xoay MẬT KHẨU cơ sở dữ liệu" → Secrets Manager (khác hoàn toàn) "cần nhật ký ai dùng khoá" → SSE-KMS + CloudTrail

Xoay khoá KMS — chi tiết đáng nhớ Nội dung
Chu kỳ mặc định 365 ngày
Từ 2024 chỉnh được chu kỳ (90 ngày tới 2560 ngày)
Material cũ giữ lại vĩnh viễn để giải mã dữ liệu cũ
ARN, key ID, alias KHÔNG ĐỔI
Xoay theo yêu cầu rotate-key-on-demand — dùng khi nghi ngờ lộ khoá
Chi phí không tính thêm cho việc xoay
Khi nào cần xoay thủ công (tạo khoá mới) Nội dung
Nghi ngờ khoá đã bị lộ tạo CMK mới, trỏ alias sang, mã hoá lại dữ liệu
Yêu cầu tuân thủ đòi thay hẳn khoá không chỉ đổi material
Đổi từ imported sang KMS-generated
Cách làm dùng ALIAS để ứng dụng không phụ thuộc key id
Bẫy chi phí của SSE-KMS ở quy mô lớn Nội dung
Mỗi lần đọc/ghi một lời gọi KMS được tính tiền
Có hạn mức lời gọi mỗi Region ứng dụng bận có thể gặp ThrottlingException
S3 Bucket Keys giảm lời gọi KMS tới 99% — nên bật
Đánh đổi encryption context ở mức bucket thay vì mức đối tượng

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Xoay khoá đã bật chưa | get-key-rotation-status | | Bucket dùng khoá nào | get-bucket-encryption | | Có bao nhiêu material đã xoay | list-key-rotations |

Và một điểm rất đáng hiểu rõ để không hiểu nhầm ý nghĩa của tính năng này: xoay khoá KMS đổi key material BÊN TRONG cùng một CMK, chứ không tạo ra một khoá mới. Nghĩa là nó không bảo vệ bạn khỏi việc CMK bị vô hiệu hoá hay bị xoá, và cũng không thay đổi ai có quyền dùng khoá — nó chỉ giới hạn lượng dữ liệu được mã hoá bằng cùng một material, đúng như các chuẩn tuân thủ yêu cầu.

Câu 229 Domain 1: Monitoring, Logging, and Remediation

To provide a directly manageable security layer, a company has enabled encryption of CloudTrail log files using server-side encryption with AWS KMS–managed keys (SSE-KMS). However, the digest files seem to use a different encryption scheme.

Which of the following would you identify as the underlying reason for this behavior?

  1. A

    Digest files are encrypted with Amazon S3-managed encryption keys (SSE-S3)

  2. B

    The log files are created in a different region from the digest files

  3. C

    Per the default configuration, different S3 buckets are used for log and digest files

  4. D

    AWS KMS–managed key (SSE-KMS) is different for log files and digest files

Xem giải thích

Đáp án

A — Digest file được mã hoá bằng khoá do S3 quản lý (SSE-S3), không phải SSE-KMS.

Vì sao đúng

Đây là hành vi cố ý của CloudTrail, và lý do đằng sau nó rất đáng hiểu.

⚠ Điểm mấu chốt — hai loại tệp, hai cơ chế mã hoá khác nhau:

Tệp LOG
        ↓
    Chứa NỘI DUNG nhạy cảm: ai làm gì, tham số request
        ↓
    → mã hoá bằng SSE-KMS nếu bạn cấu hình
    → bạn kiểm soát ai giải mã được, có nhật ký dùng khoá

Tệp DIGEST
        ↓
    Chỉ chứa MÃ BĂM của các tệp log + chữ ký số
    KHÔNG chứa nội dung nhạy cảm nào
        ↓
    → luôn mã hoá bằng SSE-S3

⚠ Vì sao AWS thiết kế như vậy — lý do rất thực tế:

Digest file dùng để CHỨNG MINH tính toàn vẹn của log
        ↓
    Việc kiểm chứng phải luôn thực hiện được
        ↓
    Nếu digest cũng mã hoá bằng CMK của bạn:
        - CMK bị vô hiệu hoá → không kiểm chứng được
        - CMK bị xoá        → mất khả năng chứng minh VĨNH VIỄN
        - kiểm toán viên không có quyền dùng CMK → bó tay
        ↓
    → digest dùng SSE-S3 để việc kiểm chứng luôn khả thi

⚠ Và điều này KHÔNG làm giảm mức bảo mật:

Digest file chỉ chứa:
        - mã băm SHA-256 của từng tệp log
        - mã băm của digest file TRƯỚC ĐÓ
        - chữ ký số bằng khoá riêng của AWS
        ↓
    → không suy ngược ra nội dung log được từ mã băm
    → chữ ký số vẫn bảo đảm digest không bị làm giả

Vì sao các phương án khác sai

  • D (CMK dùng cho log khác với CMK dùng cho digest) — đây là phương án gần nhất và nghe rất hợp lý, nhưng sai: digest không dùng CMK nào cả, nó dùng SSE-S3 — khoá do AWS quản lý hoàn toàn, không nằm trong tài khoản bạn.

  • C (theo cấu hình mặc định, log và digest nằm ở hai bucket khác nhau) — sai; cả hai nằm CÙNG một bucket, chỉ khác tiền tố: AWSLogs/.../CloudTrail/ và AWSLogs/.../CloudTrail-Digest/.

  • B (log và digest được tạo ở hai Region khác nhau) — sai; chúng được tạo cho cùng một Region và đổ về cùng một nơi.

Ghi nhớ

⚠ Log file và digest file của CloudTrail — bảng phải thuộc: | | Log file | Digest file | |---|---|---| | Nội dung | sự kiện API chi tiết | mã băm + chữ ký | | Tần suất | khoảng 5 phút một lần | mỗi giờ một lần | | Mã hoá | SSE-S3 hoặc SSE-KMS (bạn chọn) | LUÔN là SSE-S3 | | Vị trí | AWSLogs/.../CloudTrail/ | AWSLogs/.../CloudTrail-Digest/ | | Mục đích | ghi lại hoạt động | chứng minh log chưa bị sửa |

Từ khoá nhận diện:

"digest file mã hoá kiểu gì" → luôn SSE-S3 "chứng minh log chưa bị sửa" → log file validation + digest file "ai đọc được log" → SSE-KMS + key policy "không ai xoá được log" → S3 Object Lock chế độ Compliance "xoá digest file" → ĐỨT CHUỖI, mất khả năng chứng minh

⚠ Cơ chế chuỗi digest — vì sao nó chống được việc làm giả:

Digest giờ N chứa:
        - mã băm của mọi tệp log trong giờ N
        - MÃ BĂM CỦA DIGEST GIỜ N-1        ← mắt xích
        - chữ ký số bằng khoá riêng của AWS
        ↓
    → tạo thành một CHUỖI liên tục
        ↓
    Sửa một tệp log   → mã băm không khớp
    Xoá một tệp log   → digest thiếu mục
    Xoá một digest    → chuỗi ĐỨT
    Làm giả digest    → chữ ký không hợp lệ
        ↓
    → mọi kiểu can thiệp đều để lại dấu vết
Kiểm chứng bằng lệnh nào Nội dung
aws cloudtrail validate-logs kiểm tra một khoảng thời gian
Kết quả nêu đích danh tệp nào bị sửa hoặc bị xoá
Điều kiện trail phải đã bật log file validation từ trước
Đừng xoá digest file và đừng đổi tên chúng
Bảo vệ bucket log toàn diện Việc
Log file validation chứng minh toàn vẹn
SSE-KMS cho log kiểm soát ai đọc
S3 Object Lock (Compliance) không ai xoá được
Bucket ở tài khoản riêng tách khỏi tài khoản bị kiểm toán
Cảnh báo StopLogging biết ngay khi ai đó tắt kiểm toán

Ba việc kiểm chứng: | Việc | Cách | |---|---| | Validation đã bật chưa | describe-trails, xem LogFileValidationEnabled | | Log có toàn vẹn không | validate-logs với khoảng thời gian cần kiểm | | Digest còn đủ không | liệt kê tiền tố CloudTrail-Digest/, kiểm tra không thiếu giờ nào |

Và một lời nhắc về việc bảo vệ chuỗi digest: hãy đặt lifecycle policy cho bucket log sao cho digest file KHÔNG bị xoá trước tệp log tương ứng. Một quy tắc lifecycle vô tình xoá digest sớm hơn log sẽ khiến bạn còn nguyên dữ liệu nhưng mất khả năng chứng minh nó chưa bị sửa — và với một cuộc kiểm toán thì hai điều đó không giống nhau chút nào.

Câu 230 Domain 3: Deployment, Provisioning, and Automation

A SysOps Administrator has been tasked with copying AMIs from one Region to another. While doing this task, the following error message popped up: Linux error message "This AMI was copied from an AMI with a kernel that is unavailable in the destination Region: {Image ID}"

Which of the following would you identify as the root cause behind the issue?

  1. A

    The error is a general indication of AMI not being provisioned correctly

  2. B

    Linux hardware virtual machine (HVM) AMIs aren't supported in all AWS Regions and copying these across unsupported Regions results in this error

  3. C

    Linux paravirtual (PV) AMIs aren't supported in all AWS Regions and copying these across unsupported Regions results in this error

  4. D

    Linux AMIs do not support copy across Regions

Xem giải thích

Đáp án

C — AMI Linux dạng paravirtual (PV) không được hỗ trợ ở mọi Region của AWS, và sao chép chúng sang Region không hỗ trợ sẽ gây ra lỗi này.

Vì sao đúng

Thông báo lỗi nói rõ về kernel không có ở Region đích — và chỉ AMI kiểu PV mới phụ thuộc vào kernel do AWS cung cấp.

⚠ Điểm mấu chốt — hai kiểu ảo hoá và cách chúng khởi động:

PV (Paravirtual) — kiểu CŨ
        ↓
    Dùng AKI (Amazon Kernel Image) — một kernel RIÊNG
    do AWS cung cấp, gắn theo Region
        ↓
    → AMI PV tham chiếu tới một AKI ID cụ thể
    → AKI đó CHỈ TỒN TẠI ở một số Region
        ↓
    → copy sang Region không có AKI đó → LỖI ĐÚNG NHƯ ĐỀ

HVM (Hardware Virtual Machine) — kiểu HIỆN ĐẠI
        ↓
    Máy ảo tự khởi động như một máy vật lý
    KHÔNG phụ thuộc AKI nào
        ↓
    → copy sang MỌI Region đều được

⚠ Cách xử lý:

Ngắn hạn:
    - copy sang Region CÓ hỗ trợ PV, hoặc
    - dựng lại instance từ một AMI HVM tương đương

Dài hạn (nên làm):
    - CHUYỂN HẲN sang HVM
        ↓
    → mọi loại instance thế hệ mới CHỈ hỗ trợ HVM
    → PV đã lỗi thời từ lâu

⚠ Và vì sao HVM đã thay thế hoàn toàn PV:

HVM hỗ trợ:
        - enhanced networking (ENA, SR-IOV)
        - GPU và thiết bị phần cứng khác
        - mọi loại instance thế hệ hiện tại
        ↓
    PV không hỗ trợ những thứ đó
        ↓
    → AWS đã ngừng phát triển PV từ lâu
    → chỉ một số loại instance rất cũ còn dùng được

Vì sao các phương án khác sai

  • B (AMI HVM không được hỗ trợ ở mọi Region) — đây là phương án gần nhất và đảo ngược sự thật: HVM được hỗ trợ ở MỌI Region; chính PV mới là loại bị giới hạn.

  • D (AMI Linux không copy được giữa các Region) — sai; copy-image hoạt động bình thường với AMI Linux, chỉ trừ trường hợp PV gặp vấn đề AKI như câu này.

  • A (lỗi chung chung, do AMI chưa được cấp phát đúng) — thông báo lỗi rất cụ thể, nêu đích danh vấn đề về kernel; đây không phải lỗi mơ hồ.

Ghi nhớ

⚠ PV và HVM — bảng phải thuộc: | | PV (Paravirtual) | HVM | |---|---|---| | Kernel | AKI do AWS cung cấp, gắn theo Region | tự chứa trong AMI | | Copy chéo Region | có thể LỖI | luôn được | | Enhanced networking | KHÔNG | CÓ | | GPU và thiết bị đặc biệt | KHÔNG | CÓ | | Loại instance thế hệ mới | KHÔNG hỗ trợ | hỗ trợ | | Trạng thái | lỗi thời | tiêu chuẩn hiện nay |

Từ khoá nhận diện:

"kernel không có ở Region đích" → AMI kiểu PV "AMI dùng ở Region khác" → copy-image (tạo AMI mới, id mới) "AMI dùng ở tài khoản khác" → modify-image-attribute launch permission "AMI mã hoá chia sẻ" → phải là CMK, không dùng aws/ebs "instance thế hệ mới không khởi chạy được từ AMI cũ" → AMI đang là PV

Phạm vi của các tài nguyên EC2 — nhắc lại Nội dung
AMI theo Region — dùng nơi khác phải copy-image
EBS snapshot theo Region
EBS volume theo AZ
Elastic IP, key pair, security group theo Region
Copy AMI chéo Region — chi tiết đáng nhớ Nội dung
Tạo ra AMI MỚI với ID MỚI ở Region đích
AMI mã hoá phải có quyền dùng CMK ở CẢ HAI Region
Mã hoá lại khi copy dùng --encrypted --kms-key-id
Chi phí phí truyền dữ liệu liên Region + lưu trữ snapshot ở đích
Tự động hoá EC2 Image Builder phân phối AMI ra nhiều Region
Kiểm tra và chuyển đổi từ PV sang HVM Bước
Kiểm tra kiểu ảo hoá describe-images, xem VirtualizationType
Chuyển đổi không có công cụ tự động — phải dựng lại từ AMI HVM
Cách làm khởi chạy AMI HVM mới, cài lại ứng dụng, chuyển dữ liệu
Lợi ích kèm theo dùng được instance thế hệ mới, rẻ hơn và nhanh hơn

Ba việc kiểm chứng: | Việc | Cách | |---|---| | AMI thuộc kiểu nào | describe-images --image-ids ami-xxx, xem VirtualizationType | | Region đích có hỗ trợ không | thử copy-image và đọc thông báo lỗi | | AMI có AKI không | describe-images, xem trường KernelId — có giá trị nghĩa là PV |

Và một lời khuyên rút ra từ chính lỗi này: nếu bạn còn AMI kiểu PV trong sản xuất, hãy coi đây là tín hiệu để lên kế hoạch chuyển sang HVM. PV không chỉ gây rắc rối khi copy chéo Region — nó còn khoá bạn vào các loại instance thế hệ cũ, vốn đắt hơn và chậm hơn so với thế hệ hiện tại, đồng thời không dùng được enhanced networking hay bất kỳ tính năng phần cứng nào ra đời trong nhiều năm qua.