GĐ29 — AWS SAA: Security, IAM, VPC và Networking
Đọc sau GĐ28. Mục tiêu: mỗi mũi tên trong sơ đồ đều có đường mạng, danh tính và quyền; truy cập được qua mạng chưa đồng nghĩa được phép đọc dữ liệu.
Kiểm chứng ngày 2026-10-05 (đọc tài liệu AWS; lệnh CLI chỉ kiểm cờ bằng aws ... help và --generate-cli-skeleton, chưa chạy trên AWS): Cognito user pool và identity pool, trust policy của role identity pool, role SAML, role OIDC, permission set, ACM gia hạn DNS, KMS rotation, thông báo AccessDenied, policy evaluation, S3 gateway endpoint, Client VPN, mã hóa Direct Connect, Route 53 alias, edge functions. Các mục viết từ trước giữ nguồn riêng ở cuối mỗi mục.
1. IAM: principal, action, resource, condition#
Principal là danh tính thực hiện request. Policy mô tả action trên resource, có thể kèm condition. Role được assume để nhận temporary credentials qua STS; ứng dụng AWS nên dùng role thay access key nằm trong code.
| Thành phần | Dùng khi |
|---|---|
| IAM Identity Center | Người trong tổ chức đăng nhập và truy cập nhiều account |
| IAM role + STS | EC2/Lambda/task hoặc principal khác cần temporary permissions |
| Identity-based policy | Gắn quyền vào user/group/role |
| Resource-based policy | Tài nguyên như S3 cho phép principal nào truy cập |
| Trust policy của role | Quy định ai được assume role |
| Permissions boundary | Giới hạn quyền tối đa của identity; không tự cấp quyền |
| Organizations SCP | Giới hạn quyền trong member accounts; không tự cấp quyền |
| Cognito | Đăng nhập user của ứng dụng; khác truy cập AWS của nhân viên |
Nguồn: IAM roles, Identity Center, SCP, Cognito.
Ví dụ policy tự xây, chỉ cho worker đọc object trong prefix. Đây là identity policy minh họa, chưa gồm quyền KMS nếu object dùng SSE-KMS:
ListBucket dùng ARN bucket; GetObject dùng ARN object. Cấp một action không tự cấp action khác. Trust policy cho assume role cũng không tự cấp quyền đọc S3.
Cognito: user pool và identity pool#
Hai thành phần trả lời hai câu hỏi khác nhau và độc lập với nhau:
| User pool | Identity pool | |
|---|---|---|
| Câu hỏi | Người này là ai (authentication) | Người này được dùng tài nguyên AWS nào (authorization) |
| Phát ra | JWT (ID token, access token) theo OIDC/OAuth 2.0 | Credentials tạm thời từ STS |
| Nguồn danh tính | Thư mục user riêng, social, SAML, OIDC | User pool, social, SAML, OIDC, hoặc khách chưa đăng nhập |
Dùng cùng nhau khi app vừa đăng nhập vừa gọi thẳng S3/DynamoDB: user đăng nhập ở user pool, app đổi token lấy credentials tạm ở identity pool. Nếu chỉ có backend của bạn kiểm tra JWT thì không cần identity pool. Cặp nhầm hay gặp: identity pool không lưu hồ sơ user; user pool không cấp credentials AWS. Nguồn: What is Amazon Cognito.
Role mà identity pool cho user đã đăng nhập assume phải có trust policy khóa theo pool ID (aud); IAM không cho lưu trust policy trỏ tới cognito-identity.amazonaws.com mà thiếu điều kiện này. Mẫu theo tài liệu Cognito (ID pool là giá trị minh họa):
Tạo identity pool chỉ cho user đã đăng nhập từ một user pool có sẵn (đã kiểm cờ bằng CLI help; chưa chạy trên AWS):
Nguồn: Cognito IAM roles và trust policy.
Federation SAML, OIDC và IAM Identity Center#
Federation là tin một IdP bên ngoài rồi đổi bằng chứng đăng nhập lấy credentials tạm: SAML dùng sts:AssumeRoleWithSAML, OIDC/web identity dùng sts:AssumeRoleWithWebIdentity. Trust policy phải giới hạn đúng ứng dụng hoặc đúng repo, nếu không bên thứ ba cũng assume được. Trust policy cho SAML (mẫu theo tài liệu IAM; us-east-1 và tên provider là giá trị minh họa):
Trust policy OIDC cho workflow CI của một repo và một nhánh (GitHub Actions; org/repo là giá trị minh họa). Tài liệu IAM yêu cầu điều kiện sub có mặt và không chỉ là wildcard; thiếu giới hạn này thì repo ngoài tổ chức của bạn cũng assume được role:
Nguồn: Role cho SAML, Role cho OIDC, OIDC federation.
IAM Identity Center dành cho nhân viên đăng nhập nhiều account. Permission set là mẫu gồm các IAM policy; khi gán cho user/group ở một account, Identity Center tạo role do nó quản lý trong account đó. Session mặc định của permission set là 1 giờ, tối đa 12 giờ; phiên cổng truy cập (access portal) mặc định 8 giờ, tối đa 90 ngày. Quy tắc chọn: nhân viên vào AWS qua IdP công ty thì Identity Center; người dùng cuối của ứng dụng bạn bán thì Cognito. Chuỗi lệnh tối thiểu (đã kiểm cờ bằng CLI help; chưa chạy trên AWS):
Nguồn: Permission sets.
Root user, Access Analyzer và Control Tower#
- Root user: chỉ dùng cho việc bắt buộc phải là root (ví dụ đóng account standalone, khôi phục quyền khi IAM admin tự thu quyền, gỡ bucket policy chặn mọi principal). Bật MFA cho root; việc hằng ngày làm bằng Identity Center hoặc role. Nguồn: AWS account root user.
- IAM Access Analyzer: tìm tài nguyên chia sẻ ra ngoài vùng tin cậy (S3 bucket, role, KMS key, ...), quyền không dùng, kiểm tra cú pháp policy và sinh policy từ hoạt động trong CloudTrail. Phân tích external access theo từng Region. Nguồn: Access Analyzer.
- Control Tower: dựng landing zone nhiều account trên Organizations, Service Catalog và Identity Center; áp controls (preventive, detective, proactive) và cấp account bằng Account Factory. Nguồn: Control Tower.
2. Cách suy luận allow/deny và cross-account#
Bắt đầu từ implicit deny. Kiểm tra policy cấp quyền, rồi các giới hạn áp dụng; explicit deny thắng allow. Trong cùng account, identity/resource policies có thể phối hợp; boundary/session policy/SCP có quy tắc tương tác tùy principal. Không rút gọn mọi trường hợp thành “cộng tất cả Allow”.
Cross-account qua assume-role: caller cần quyền sts:AssumeRole, role đích cần trust phù hợp; sau đó session dùng permissions của role đích và các giới hạn áp dụng. Với truy cập resource trực tiếp xuyên account, kiểm tra cả phía identity và resource. External ID giúp chống confused deputy trong tình huống bên thứ ba assume role; nó không phải password.
Ví dụ debug AccessDenied:
- Xác định principal thực bằng
aws sts get-caller-identitytrong môi trường của app. - Đọc action/resource/condition của request bị chặn.
- Kiểm tra policy role, resource policy, boundary và SCP áp dụng.
- Nếu có KMS, kiểm tra key policy và quyền dùng key.
- Đối chiếu CloudTrail; không chữa bằng cách cấp
AdministratorAccess.
Nguồn: Policy evaluation, cross-account role.
Ví dụ vì sao AccessDenied#
Tình huống tự dựng: role app-worker (account 111122223333) đọc s3://lab-data/raw/a.csv từ laptop bằng credentials của role. Các lớp áp dụng:
| Lớp | Nội dung | Kết quả cho request này |
|---|---|---|
| Identity policy | Allow s3:GetObject trên lab-data/raw/* | Allow |
| Permissions boundary | Allow s3:* | Không chặn |
| SCP | Không có Deny liên quan | Không chặn |
| Bucket policy | Deny s3:GetObject nếu không đi qua endpoint vpce-0abc | Request từ laptop khớp Deny |
Explicit deny thắng mọi allow, nên request bị từ chối dù identity policy đúng. Bucket policy trong ví dụ (mẫu theo tài liệu gateway endpoint, giá trị là minh họa):
Cách sửa đúng là cho request đi qua endpoint (chạy từ trong VPC) hoặc đổi điều kiện của Deny. Thêm Allow vào identity policy không có tác dụng. Policy dạng này cũng chặn truy cập từ AWS Management Console, theo tài liệu.
Thông báo lỗi chỉ ra lớp nào chặn, nếu dịch vụ hỗ trợ định dạng này (tùy dịch vụ, theo tài liệu IAM):
| Cụm trong thông báo | Nghĩa |
|---|---|
because no identity-based policy allows the ... action | Implicit deny: thiếu Allow ở identity policy |
because no permissions boundary allows the ... action | Boundary không cho phép action |
with an explicit deny in a resource-based policy | Có Deny trong resource policy, như ví dụ trên |
with an explicit deny in a service control policy | Có Deny trong SCP |
Nếu nhiều loại policy cùng chặn, thông báo chỉ nêu một loại. Công cụ giả lập chỉ đánh giá identity policy và permissions boundary của principal; với principal là role, nó không mô phỏng được resource policy (theo aws iam simulate-principal-policy help), nên với ví dụ bucket policy ở trên hãy đọc thông báo lỗi hoặc CloudTrail thay vì tin kết quả allowed của simulator. Lệnh dưới (đã kiểm cờ bằng CLI help; chưa chạy trên AWS; --context-entries cho phép giả lập khóa như aws:SourceVpce) hợp để kiểm phần identity policy:
Nguồn: Troubleshoot access denied, Gateway endpoints cho S3.
3. Mã hóa, TLS và secret#
| Nhu cầu | Công cụ | Phần ứng dụng vẫn phải làm |
|---|---|---|
| Mã hóa dữ liệu lưu trữ | KMS + cơ chế encryption của S3/EBS/RDS | Quyền key, dữ liệu nào cần bảo vệ, backup |
| HTTPS/TLS | ACM certificate cho endpoint được hỗ trợ | DNS validation, listener, policy TLS |
| DB password/API secret | Secrets Manager | Quyền đọc, cache, tích hợp rotation và reconnect |
| Cấu hình và secret đơn giản | Systems Manager Parameter Store / SecureString | Thiết kế namespace, quyền và quy trình cập nhật |
Envelope encryption: dữ liệu được mã hóa bằng data key; data key được bảo vệ bằng KMS key. Quyền đọc S3 chưa chắc đủ quyền giải mã SSE-KMS. Rotation key không đồng nghĩa ứng dụng tự mã hóa lại toàn bộ dữ liệu cũ.
TLS bảo vệ đường truyền; encryption at rest bảo vệ dữ liệu lưu; authorization quyết định ai đọc được. Cần cả ba lớp. Khi ALB terminate TLS, xem xét riêng kết nối ALB → target theo yêu cầu bảo mật.
Nguồn: KMS keys, ACM, Secrets Manager, Parameter Store.
S3 + KMS trong identity policy#
Worker đọc và ghi object mã hóa SSE-KMS cần quyền S3 và quyền key, trong cùng policy (ARN là minh họa). Key policy của key cũng phải cho phép, như đã nói ở phần tự kiểm tra:
Nguồn: S3 SSE-KMS permissions, KMS key policies.
Xoay vòng KMS key#
- Customer managed key đối xứng (
AWS_KMSorigin): rotation tự động là tùy chọn; bật mà không đặt chu kỳ thì mặc định 365 ngày. AWS managed key luôn xoay mỗi năm và bạn không bật/tắt được. - Asymmetric key, HMAC key và key trong custom key store không hỗ trợ rotation tự động hay theo yêu cầu; muốn xoay thì tạo key mới và đổi alias/ứng dụng.
- Rotation chỉ đổi key material hiện tại; ciphertext cũ vẫn giải mã được và dữ liệu không bị mã hóa lại. Key ID không đổi.
Đã kiểm cờ bằng CLI help; chưa chạy trên AWS. Nguồn: Rotate KMS keys.
ACM: chứng chỉ gia hạn thế nào#
- DNS validation: ACM tự gia hạn khi cert đang được một dịch vụ AWS dùng và các CNAME do ACM cấp vẫn còn, tra được qua DNS công khai. ACM kiểm tra điều kiện này ở 45 ngày trước khi hết hạn (chứng chỉ cấp trước đây với hiệu lực 395 ngày gia hạn ở 60 ngày trước, và sau gia hạn có hiệu lực 198 ngày). Thiếu CNAME thì ACM không xác thực được tên miền và gia hạn không diễn ra.
- Email validation: ACM gửi email nhắc khi gần hết hạn; không tự gia hạn như DNS.
- Chứng chỉ import không được ACM gia hạn tự động; ACM cũng không gia hạn chứng chỉ đã hết hạn.
- Gia hạn giữ nguyên ARN. Chứng chỉ ACM là tài nguyên theo Region; cert cho CloudFront phải nằm ở us-east-1.
- Khi không xác thực được, ACM gửi sự kiện AWS Health và EventBridge ở 30, 15, 7, 3 và 1 ngày trước khi hết hạn.
Đã kiểm tên trường bằng CLI help; chưa chạy trên AWS. Nguồn: Managed renewal, Renewal cho DNS validation, ACM Regions.
4. VPC: đọc route table bằng một request thật#
Sơ đồ ví dụ tự xây cho API container:
VPC ví dụ 10.20.0.0/16; subnet /24 được chia theo AZ/tầng. Giữ CIDR không trùng với mạng cần kết nối sau này. Route table chọn route có prefix cụ thể nhất phù hợp đích.
| Subnet trong ví dụ | Route ngoài VPC | Ý nghĩa |
|---|---|---|
| Public | 0.0.0.0/0 → IGW | Có đường Internet; EC2 còn cần public IPv4/EIP cho truy cập IPv4 trực tiếp |
| Private app | 0.0.0.0/0 → public NAT | Khởi tạo kết nối ra ngoài; không cho Internet tự mở kết nối vào app |
| Private DB | Không có default route Internet | Cô lập egress theo nhu cầu DB |
| App có S3 endpoint | Prefix list S3 → gateway endpoint | Truy cập S3 theo route endpoint thay NAT |
Subnet “public” không làm mọi tài nguyên trong đó public. Route, địa chỉ, SG và NACL cùng quyết định kết nối. IPv6 có mô hình riêng: egress-only IGW cho outbound IPv6; không áp nguyên xi public NAT IPv4 cho mọi đích IPv6.
Nguồn: Route tables, Internet gateway, egress-only IGW.
5. Security group, NACL và Flow Logs#
| Thuộc tính | Security group | Network ACL |
|---|---|---|
| Gắn vào | Network interface/tài nguyên hỗ trợ | Subnet |
| Stateful? | Có: response của traffic được phép được theo dõi | Không: cần rule cho cả chiều đi và về |
| Rule | Allow | Allow và deny, xét thứ tự rule number |
| Thiết kế thường dùng | SG app nhận từ SG ALB; SG DB nhận từ SG app | Kiểm soát subnet, chặn CIDR cụ thể |
Port trả lời thường là ephemeral port; NACL chỉ mở port 443 một chiều có thể làm HTTPS timeout. SG reference nhận diện nguồn theo SG trong điều kiện hỗ trợ, không sao chép rules của SG nguồn.
Flow Logs hỗ trợ phân tích metadata kết nối bị accept/reject. Nó không phải bản ghi payload HTTP; lỗi IAM vẫn có thể xảy ra dù network flow được accept.
Nguồn: VPC security, SG rules, NACL.
Cho SG của DB nhận từ SG của app bằng CLI#
Rule dưới đây mở 5432 chỉ cho tài nguyên gắn sg-app, không dùng CIDR. Thêm hay bớt instance trong sg-app không cần sửa rule của DB (ID là minh họa; đã kiểm cờ bằng CLI help; chưa chạy trên AWS):
6. NAT, VPC endpoints và private access#
Public NAT gateway giúp tài nguyên private khởi tạo traffic tới Internet. Nó không phải inbound load balancer và không thay quyền IAM. Với thiết kế NAT zonal, cân nhắc NAT theo AZ và route cùng AZ để tránh phụ thuộc một AZ và transfer xuyên AZ. Kiểm tra các kiểu NAT/topology hiện có trong Region trước khi triển khai.
AWS hiện có Regional NAT gateway hỗ trợ mở rộng multi-AZ theo mô hình regional. Phân biệt kiểu này với sơ đồ zonal ở trên; kiểm tra availability, cấu hình routing và giá trước khi chọn. Không coi “mỗi AZ phải tạo một NAT riêng” là quy tắc cho mọi kiểu NAT.
Gateway endpoint cho S3/DynamoDB dùng route table; không dùng PrivateLink. Interface endpoint dùng ENI/private IP và PrivateLink cho dịch vụ hỗ trợ; xét SG, DNS, endpoint policy và chi phí. Endpoint policy là lớp kiểm soát bổ sung, không tự cấp quyền dịch vụ.
Ví dụ app private chỉ đọc S3: cân nhắc S3 gateway endpoint để bỏ đường NAT cho traffic đó. App còn gọi LLM API bên ngoài vẫn cần egress khác. Nếu tải nhỏ, nhiều interface endpoints có fixed cost lớn hơn dự đoán; cần so tổng chi phí.
Nguồn: NAT gateways, PrivateLink concepts, gateway endpoints.
Endpoint policy cho S3 gateway endpoint#
Endpoint policy mặc định cho toàn quyền. Policy dưới giới hạn endpoint chỉ truy cập một bucket (mẫu theo tài liệu, tên bucket là minh họa), rồi gắn khi tạo endpoint (đã kiểm cờ bằng CLI help; chưa chạy trên AWS):
Điểm dễ nhầm theo tài liệu: gateway endpoint chỉ có ở Region đã tạo; không dùng được từ on-premises, từ VPC peering khác Region hay qua Transit Gateway (các trường hợp đó cần interface endpoint); request đi qua endpoint không dùng được aws:SourceIp trong identity/bucket policy mà dùng aws:VpcSourceIp; mặc định có quota 20 gateway endpoint mỗi Region. Nguồn: Gateway endpoints cho S3.
7. Kết nối nhiều VPC và on-premises#
| Dịch vụ | Bài toán | Pitfall |
|---|---|---|
| VPC Peering | Kết nối hai VPC | Không transitive; cần route và CIDR phù hợp |
| Transit Gateway | Hub kết nối nhiều VPC/VPN | Cần thiết kế routing/isolation và phí attachment/traffic |
| Site-to-Site VPN | Tunnel mã hóa qua mạng Internet | Băng thông/độ trễ phụ thuộc đường truyền; dự phòng tunnel |
| Direct Connect | Kết nối riêng từ on-premises | Không mặc định mã hóa mọi đường; cần dự phòng và phương án encryption |
| PrivateLink | Expose dịch vụ riêng cho consumer | Khác việc mở toàn bộ mạng giữa hai VPC |
Ví dụ A peer B và B peer C: A không tự đi qua B tới C. Với yêu cầu mạng hub cho nhiều account, xem Transit Gateway thay xây mesh peering bằng tay.
Nguồn: Peering, Transit Gateway, VPN, Direct Connect.
Client VPN và mã hóa trên Direct Connect#
- AWS Client VPN là VPN dựa trên client OpenVPN do AWS quản lý, cho người dùng ở bất cứ đâu vào VPC hoặc mạng on-premises; khác Site-to-Site VPN nối mạng với mạng. Mặc định chưa có authorization rule nào, nên user kết nối được vẫn chưa vào được mạng đích cho tới khi bạn thêm rule theo nhóm AD/IdP. Xác thực bằng Active Directory, federated (SAML) hoặc certificate; cổng 443 hoặc 1194, mặc định 443; tính phí theo giờ cho mỗi endpoint association và mỗi kết nối. Nguồn: What is Client VPN.
- Direct Connect không mã hóa traffic theo mặc định. Hai cách mã hóa theo tài liệu: chạy Site-to-Site VPN (IPsec) trên Direct Connect, hoặc dùng MACsec trên kết nối hỗ trợ (mã hóa từ data center của bạn tới điểm Direct Connect). Nguồn: Encryption in Direct Connect.
- Ba loại virtual interface: private (vào VPC bằng IP riêng), public (tới dịch vụ AWS công khai bằng IP công khai), transit (tới Transit Gateway qua Direct Connect gateway). Nguồn: Virtual interfaces.
8. Route 53, CloudFront và Global Accelerator#
Route 53 là DNS, không proxy HTTP. Weighted routing dùng chia traffic, latency routing chọn theo độ trễ, failover routing dùng primary/secondary với health evaluation, geolocation/geoproximity phục vụ yêu cầu vị trí. TTL/cache DNS khiến chuyển traffic không tức thì cho mọi client.
CloudFront cache nội dung ở edge. Thiết kế cache key theo dữ liệu thật: query/header/cookie đưa vào cache key quá nhiều sẽ giảm cache hit; đưa quá ít có thể trả nhầm dữ liệu. Với nội dung private, cần viewer authorization và cấu hình cache phù hợp.
S3 origin nên private, dùng Origin Access Control (OAC) và bucket policy cho distribution. S3 website endpoint là custom origin, không dùng OAC như S3 REST origin. Signed URL/cookie kiểm soát viewer; OAC kiểm soát CloudFront → S3: hai đoạn khác nhau.
Global Accelerator hướng traffic TCP/UDP qua mạng AWS tới endpoint, có static anycast IP; không phải CDN cache object. Chọn CloudFront khi cần cache HTTP content; đánh giá Accelerator khi cần static IP/global routing cho ứng dụng phù hợp.
Nguồn: Route 53 policies, CloudFront cache key, OAC, Global Accelerator.
Alias hay CNAME trong Route 53#
Alias record là phần mở rộng riêng của Route 53, trỏ tới một số tài nguyên AWS (CloudFront, ELB, API Gateway, S3 website, Global Accelerator, record khác cùng zone, ...). So với CNAME theo tài liệu:
| Alias | CNAME | |
|---|---|---|
Zone apex (example.com) | Tạo được | Không tạo được |
| Phí truy vấn tới tài nguyên AWS | Không tính | Tính |
| Đích | Chỉ một số tài nguyên AWS | Bất kỳ tên DNS nào |
| TTL khi trỏ tới tài nguyên AWS | Không đặt được, dùng TTL mặc định của tài nguyên | Tự đặt |
Quy tắc luyện thi: domain gốc trỏ vào ALB hoặc CloudFront thì dùng alias. Nguồn: Alias và non-alias.
CloudFront Functions và Lambda@Edge#
Cả hai chạy code theo sự kiện CloudFront. Số liệu theo trang so sánh của AWS (hạn mức có thể thay đổi, đọc ngày 2026-10-05):
| CloudFront Functions | Lambda@Edge | |
|---|---|---|
| Ngôn ngữ | JavaScript (ES 5.1) | Node.js, Python |
| Sự kiện | Viewer request/response | Viewer và origin request/response |
| Thời gian chạy | Dưới 1 ms | Tối đa 30 giây |
| Mạng, file system, request body | Không | Có |
| Dùng cho | Chuẩn hóa cache key, header, redirect/rewrite, kiểm JWT băm | Logic nặng hơn, thư viện ngoài, gọi dịch vụ khác |
Nguồn: CloudFront Functions và Lambda@Edge.
9. Chọn đúng dịch vụ bảo vệ và phát hiện#
| Dịch vụ | Nhận diện vai trò |
|---|---|
| WAF | Lọc request web theo rule; không thay authorization trong app |
| Shield | Bảo vệ DDoS; Standard và Advanced có phạm vi/chi phí khác nhau |
| Network Firewall | Lọc traffic mạng trong VPC theo topology đã cấu hình |
| GuardDuty | Phát hiện hoạt động đáng ngờ/threat từ nguồn dữ liệu hỗ trợ |
| Inspector | Đánh giá lỗ hổng ở workload hỗ trợ |
| Macie | Phát hiện dữ liệu nhạy cảm trong S3 |
| Security Hub | Tổng hợp findings và kiểm tra security posture |
| CloudTrail | Ai gọi AWS API, lúc nào; xem event loại nào đã bật |
| Config | Lịch sử cấu hình tài nguyên và compliance rules |
Ví dụ cần “ai xóa security group?” → CloudTrail. Cần “bucket có cấu hình đúng policy nội bộ không?” → Config. Cần “API bị SQL injection request” → WAF kết hợp xử lý input đúng trong ứng dụng.
Nguồn: AWS security services, CloudTrail, Config.
10. Tự kiểm tra#
-
Vẽ request Internet → ALB → app → DB, có subnet/route/SG.
Đáp án
Đáp án mẫu:
textReadyPhải thấy: ALB cần subnet ở ít nhất hai AZ khác nhau; DB subnet group cũng nên có subnet ở ít nhất hai AZ; DB không có route Internet; SG-db tham chiếu SG-app thay vì CIDR. Sai thường gặp: đặt app ở public subnet "cho dễ" hoặc mở 5432 cho
0.0.0.0/0. Xem GĐ29 mục 4. -
Giải thích vì sao NAT không cho user truy cập app private.
Đáp án
Public NAT gateway chỉ dịch địa chỉ cho kết nối do phía trong khởi tạo (outbound). App private không có public IPv4 và subnet private không có route tới IGW cho chiều vào. Đường vào hợp lệ là ALB ở public subnet rồi tới app qua SG. NAT không phải load balancer và không cấp quyền IAM. Sai thường gặp: tưởng đặt NAT là mở app ra Internet. Xem mục 6.
-
Phân biệt role trust và permission; tìm explicit deny.
Đáp án
Trust policy trả lời "ai được assume role"; permission policy trả lời "role làm được gì". Có trust mà thiếu permission thì assume được nhưng bị
AccessDeniedkhi gọi API. Explicit deny có thể nằm ở identity policy, resource policy, permissions boundary, SCP; nó thắng mọi allow. Cùng account: identity policy và resource policy được cộng (union); boundary và SCP là giới hạn trần (intersection), không tự cấp quyền. Cách tìm deny: đọc từng lớp theo thứ tự, dùng CloudTrail để biết principal và action thật, và IAM policy simulator (chưa chạy ở đây). Xem mục 2. -
Phân biệt S3 gateway endpoint với interface endpoint.
Đáp án
Gateway: chỉ S3 và DynamoDB, hoạt động bằng route trong route table, không tính phí thêm, nhưng không dùng được từ on-premises, từ VPC peering khác Region hay qua Transit Gateway. Interface: ENI với private IP (PrivateLink), nhiều dịch vụ, có chi phí, dùng được từ on-premises. Với app private chỉ đọc S3 trong cùng Region, gateway endpoint thường là phương án "most cost-effective". Xem mục 6.
-
Giải thích S3 access và KMS decrypt là hai quyền khác nhau.
Đáp án
Đọc object SSE-KMS cần
s3:GetObjectvàkms:Decrypttrên key; ghi cầnkms:GenerateDataKey. Với KMS, IAM policy chỉ có tác dụng cấp quyền khi key policy cho phép (key policy mặc định bật IAM policies; nếu key policy không bật, allow trong IAM vô hiệu). Sai thường gặp: chỉ sửa IAM role rồi vẫnAccessDenied. Từ 05/01/2023 object mới được mã hóa SSE-S3 mặc định; đó là mặc định khác với SSE-KMS. Xem mục 3. -
Chọn đúng DNS/CDN/global routing cho một yêu cầu.
Đáp án
Route 53 chỉ là DNS (weighted, latency, failover, geolocation); CloudFront cache nội dung HTTP ở edge, S3 origin private dùng OAC; Global Accelerator đưa TCP/UDP qua mạng AWS, cấp hai địa chỉ IPv4 anycast tĩnh theo mặc định, không cache. Cách chọn: cần cache file tĩnh toàn cầu thì CloudFront; cần IP tĩnh/failover nhanh cho ứng dụng không phải HTTP cache thì Global Accelerator; chuyển vùng theo chính sách DNS thì Route 53. Sai thường gặp: dùng Route 53 failover rồi cho rằng dữ liệu cũng đã failover (chỉ DNS đổi). Xem mục 8.
-
Debug timeout và AccessDenied theo hai đường kiểm tra khác nhau.
Đáp án
Hai triệu chứng, hai tầng:
textReadyCó phản hồi
AccessDeniednghĩa là gói tin đã đi và về được, nên đừng sửa SG. Timeout thường là route/SG/NACL, đừng sửa IAM. NACL không có trạng thái: mở 443 chiều vào mà thiếu chiều ra cho cổng ephemeral (tài liệu AWS khuyên mở 1024-65535 để phủ nhiều loại client; yêu cầu từ ELB và NAT gateway dùng 1024-65535) thì HTTPS timeout. NACL mặc định của VPC cho phép mọi traffic; NACL tạo mới chặn mọi traffic tới khi thêm rule. Xem mục 5 và mục 2. -
Một role có identity policy cho
s3:GetObject, boundary chos3:*, nhưng bucket policy có Deny khi request không đi qua endpoint. Vì sao request từ laptop vẫn bị từ chối, và sửa ở đâu?Đáp án
Explicit deny trong resource policy thắng mọi allow, nên identity policy đúng vẫn không cứu được. Thông báo lỗi dạng
with an explicit deny in a resource-based policy(nếu dịch vụ dùng định dạng này) chỉ đúng lớp cần sửa. Sửa bằng cách cho request đi qua endpoint hoặc đổi điều kiện của Deny; thêm Allow vào identity policy không giúp được gì. Sai thường gặp: cấp thêm quyền cho role. Xem mục 2 (ví dụ vì sao AccessDenied). -
Chọn Cognito user pool, identity pool hay IAM Identity Center cho ba nhu cầu: (a) khách hàng đăng nhập vào SPA của bạn, backend kiểm JWT; (b) app di động tải ảnh thẳng lên S3 bằng credentials tạm; (c) kỹ sư công ty dùng IdP công ty vào năm account AWS.
Đáp án
(a) User pool: phát JWT, backend tự kiểm, không cần identity pool. (b) User pool để đăng nhập cộng identity pool để đổi token lấy credentials STS, role có trust policy khóa theo pool ID. (c) IAM Identity Center với permission set gán cho group ở từng account. Sai thường gặp: dùng identity pool để lưu hồ sơ user, hoặc dùng Cognito cho nhân viên vào console AWS. Xem mục 1.
Nguồn và tín hiệu đề thi
Chưa chạy trên AWS thật; đáp án đối chiếu tài liệu AWS (URL ở cuối khối). Địa chỉ trong sơ đồ là ví dụ.
Tín hiệu trong đề thi: "private subnet cần gọi API bên ngoài" gợi ý NAT; "S3 qua đường riêng, ít tốn kém" gợi ý gateway endpoint; "chặn một địa chỉ IP cụ thể" gợi ý NACL (SG không có rule deny); "tránh cấu hình hai chiều" gợi ý SG (có trạng thái). Đây là cách đọc luyện thi, chưa phải nguồn AWS chính thức.
Nguồn: Custom network ACL (ephemeral ports), Default network ACL, Gateway endpoints cho S3 (không phí, giới hạn on-premises/peering/TGW), Policy evaluation logic, KMS key policies, S3 SSE-KMS permissions, ALB subnets (tối thiểu hai AZ), RDS DB subnet group, Global Accelerator. Public NAT: instance ở private subnet kết nối ra Internet được nhưng không nhận kết nối đến không do chúng khởi tạo (NAT gateways). SG mặc định cho inbound từ chính SG đó và outbound mọi nơi (Default security groups).
Tiếp: GĐ30 — Compute & Resilience.