[AWS Basic] Network security in AWS

AWS offer cho người dùng nhiều dịch vụ để có thể đảm bảo security khi sử dụng các dịch vụ của AWS, ví dụ như:

  • Security group

  • Network ACL

  • Các dịch vụ đối ứng với DDoS,..

Ở bài này, chủ yếu chúng ta sẽ tìm hiểu về security group và network ACL. Ở phần 2 của bài viết, chúng ta sẽ tìm hiểu về cơ chế mã hóa của HTTPS và tìm hiểu thêm về dịch vụ Key Management Service của AWS (AWS KMS).

Security group (SG)

Thực chất, sẽ có nhiều resource khác cũng sử dụng security group để làm tường lửa, không phải chỉ có EC2 instance. Tuy nhiên hiện tại, để cho đơn giản, chúng ta hãy quan tâm tới security group được associate vào EC2 instance.

Khi bạn associate security group với 1 EC2 instance, thì bạn có thể controls được inbound và outbound traffic cho EC2 instance của bạn.

Một số tính chất quan trọng của security group:

  • SG là stateful: Chỉ cần định nghĩa rule cho inbound traffic. Mặc định khi inbound cho phép thì outbound cũng sẽ cho phép luôn.

  • Bạn có thể chọn source cho EC2 instance: 0.0.0.0/0 – all traffic ngoài internet, IP cụ thể hoặc là refer tới 1 SG khác (tuy nhiên, hãy chú ý SG được refer tới phải cùng VPC với SG mà bạn đang set up)

  • SG chỉ cho phép định nghĩa allow rule, không hỗ trợ định nghĩa deny (bạn không muốn cho kết nối, giả sử port 22 thì bạn không định nghĩa inbound rule cho SG, chứ không thể định nghĩa 1 rule: deny port 22 ở SG)

  • Mặc định khi tạo ra: all inbound thì không allow (không có rule inbound cho phép nào), outbound thì allow all

  • Bạn có thể limit outbound traffic của SG (configure rule cụ thể, không phải là all traffic như mặc định nữa) trong 1 số use case cụ thể

  • Bạn có thể thay đổi security group gắn vào EC2 instance, miễn là SG đó cùng VPC.

Hướng dẫn tạo security group:

Bước 1: Truy cập đường link sau:

https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#SecurityGroups:

(Bạn có thể thay đổi region khác theo ý thích của bạn)

Bước 2: Nhấn Create security group

Bước 3: Lúc này, màn hình configure security group sẽ xuất hiện.

Tại mục Security group name, bạn điền tên cho SG, điền description cho SG. Tại mục VPC, bạn chọn VPC Id mà bạn mong muốn.

Bạn click vào button Add rule ở mục Inbound rules và Outbound rules để thực hiện define rule cho security group.

Giả sử như ở đây, mình define SSH rule chỉ cho phép SSH từ địa chỉ IP của máy mình. Sau đó chọn create security group.

Lúc này, bạn sẽ được kết quả dạng như sau:

Trong trường hợp bạn muốn edit inbound/outbound rules, hay muốn delete SG, bạn chọn SG mong muốn và chọn Actions như ảnh dưới đây:

Bước 4 (optional): Trường hợp bạn muốn xem security group nào được associate vào EC2 instance, bạn truy cập màn hình quản trị EC2, chọn instance mong muốn và nhấn vào tab Security:

Tại đây, bạn cũng có thể xem luôn inbound và outbound của SG đó.

Bạn có thể thay đổi security group cho EC2 instance bằng cách chọn instance, click chuột trái và chọn change SG như ảnh:

Hoặc click Actions > Security > Change security group.

Lưu ý:

Thông thường, nếu bạn kết nối mà gặp lỗi timeout, thì nên debug theo thứ tự sau:

  • SG

  • Network ACL

  • Nếu cả 2 virtual firewall trên không phải là thủ phạm, thì hãy kiểm tra xem bạn có đang có 1 proxy nào hay không?

Nếu kết nối mà báo lỗi: “Connection refused” thì có thể là application error, hoặc đơn giản là: EC2 instance đó đang không ở trạng thái “Running”

SG refer tới 1 SG khác:

Source và destination của security group có thể là:

  • 1 địa chỉ IPv4 (bạn sẽ phải sử dụng prefix length là /32). VD: muốn duy nhất địa chỉ IP là 10.0.0.1 được access thôi thì khi configure source cho SG bạn sẽ phải viết là 10.0.0.1/32

  • 1 địa chỉ IPv6 (bạn sẽ phải sử dụng prefix length là /128, VD: 2001:db8:1234:1a00::123/128)

  • 1 dải IPv4 (1 CIDR block). VD: 203.0.113.0/24

  • 1 dải IPv6, VD: 2001:db8:1234:1a00::/64

  • ID của 1 prefix list, vd: pl-1234abc1234abc123 (prefix list là gì thì hãy xem các bài viết sau nhé!)

  • ID của 1 security group khác (SG refer tới 1 SG khác). Điều này có nghĩa là chỉ cho phép private IP address của resource associate với SG kia. VD: tôi chỉ muốn traffic đến 1 EC2 instance từ load balancer thôi, thì tại SG của EC2 instance, tôi chỉ cho source là ID của SG gắn với load balancer.

Lưu ý rằng: Khi refer tới security group khác, không đồng nghĩa với việc traffic của security bạn đang configure sẽ kế thừa rule của SG mà bạn refer đến!

VD: tại security group của load balancer, tôi đang để allow traffic port 80, source là 0.0.0.0/0 và SG của EC2 instance refer đến security group của load balancer sẽ không có nghĩa là bạn có thể kết nối tới EC2 instance thông qua port 80 từ all traffic ngoài internet!

Bạn có thể tham khảo thêm 1 số SG trong các use case tại đây:

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html

Memo: Trong use case thực tế, bạn đôi khi còn có thể gặp self-referencing rule: inbound của 1 security group cho phép traffic từ chính nó. Thông thường, self-referencing này sẽ được sử dụng trong các use case đặc biệt, để nhằm cho dịch vụ AWS có thể connect giữa các components của nó. VD: Set up 1 self-referencing rule khi thực hiện set up network development endpoint.
Bạn có thể tham khảo thêm use case sử dụng self-referencing rule khi set up network cho Glue tại đây:

https://docs.aws.amazon.com/glue/latest/dg/start-development-endpoint.html

Network ACL (NACL)

  • NACL attach vào subnet, vì thế nó là subnet firewall. Bạn có thể setup NACL như optional layer để secure VPC của bạn.

  • NACL là stateless (khác với security group, security group là stateful)

  • NACL cho phép configure DENY rule

  • NACL sẽ đánh giá các rule dựa vào number của rule, số càng bé thì độ ưu tiên càng cao. AWS recommend increments là 100. Số của NACL có thể từ 1-32766. Rule cuối cùng của NACL sẽ có number (*), rule này sẽ có độ ưu tiên thấp nhất, và thường là rule deny request.

  • NACL là 1 cách hữu dụng để block 1 IP address nào đó ở subnet level.

Default NACL:

Hướng dẫn tạo NACL:

Bước 1: Truy cập vào đường link dưới đây:

https://ap-northeast-1.console.aws.amazon.com/vpc/home?region=ap-northeast-1#acls:

Lưu ý: Customize lại region theo ý bạn nếu cần.

Bước 2: Nhấn Create network ACL:

Chọn VPC mà bạn mong muốn rồi nhấn Create network ACL

Bước 3: Tạo inbound rule và outbound rule cho NACL:

Chọn NACL mà bạn mong muốn, chỉnh sửa inbound rules và outbound rules trong tab tương ứng:

Mặc định khi mới tạo ra, NACL sẽ deny all traffic (cả inbound và outbound đều bị deny)

Chọn Edit inbound rule và tạo rule:

Sau khi define rules xong thì chọn Save changes.

Làm tương tự với outbound rules.

Bước 4: Attach NACL và Subnet:

Attach vào subnet mà bạn mong muốn, rồi chọn Save changes.

Sau này, khi bạn muốn kiểm tra NACL được gắn với subnet nào thì bạn cũng xem ở phần Subnet association:

Ephemeral port:

Ephemeral port: server xác định được request là của ai và đi vào từ port nào(port ở đây là port của client) để khi response thì server sẽ xác định được đúng client cần response dựa trên port ban đầu do client cung cấp.

Ephemeral port là do client cung cấp và cũng tuỳ thuộc vào mỗi hệ điều hành thì range port này cũng khác nhau.

Hiểu đơn giản về ephemeral port: Giống như là khi mình mua cafe, nhân viên sẽ đưa cho mình 1 mã số để đến lúc trả đồ thì sẽ biết cần trả đồ gì cho ai.

Bài thi SAA sẽ không hỏi về ephemeral port, nhưng bạn nên đọc thêm. Trong trường hợp thông thường, nếu ở outbound bạn allow all traffic thì sẽ ít gặp những lỗi liên quan ephemeral port này.

Với ephemeral port thì bạn chỉ cần nhớ:

  • Nhiều Linux Kernel sẽ sử dụng port 32768-61000

  • Request từ load balancer sẽ sử dụng port 1024-65535

  • Windows OS từ Windows server 2003 sử dụng các port 1025-5000

  • Windows Server 20008 trở lên sử dụng các port 49152-65535

  • NAT gateway sử dụng port 1024-65535.

  • AWS Lambda function sử dụng port 1024-65535

Bạn hãy lưu ý với các use case như trên, thì bạn sẽ cần phải configure outbound để cho phép các traffic từ các ephermeral ports nếu đang không allow all traffic ở outbound để tránh lỗi!

KMS

Encryption:

HTTP và HTTPS:

HTTP:

  • Giao thức truyền tải siêu văn bản. Hoạt động theo mô hình client – server. Khi bạn truy cập một trang web qua giao thức HTTP, trình duyệt sẽ thực hiện các phiên kết nối đến server của trang web đó thông qua địa chỉ IP do hệ thống phân giải tên miền DNS cung cấp. Máy chủ sau khi nhận lệnh, sẽ trả về lệnh tương ứng giúp hiển thị website, bao gồm các nội dung như: văn bản, ảnh, video, âm thanh,…

  • Trong quá trình kết nối và trao đổi thông tin, trình duyệt của bạn sẽ mặc nhiên thừa nhận địa chỉ IP đó đến từ server của chính website mà bạn muốn truy cập mà không hề có biện pháp xác thực nào. Các thông tin được gửi đi qua giao thức HTTP (bao gồm địa chỉ IP, các thông tin mà bạn nhập vào website…) cũng không hề được mã hóa và bảo mật. -> Đây chính là kẽ hở mà hacker lợi dụng để nghe lén, đánh cắp thông tin người dùng.

HTTPS:

  • Thực chất, đây chính là giao thức HTTP nhưng tích hợp thêm chứng chỉ bảo mật.

  • HTTPS hoạt động tương tự như HTTP, tuy nhiên được bổ sung thêm chứng chỉ SSL (Secure Sockets Layer – tầng ổ bảo mật) hoặc TLS (Transport Layer Security – bảo mật tầng truyền tải).

SSL và TLS:

TLS là phiên bản SSL được nâng cấp, trong thực tế khi bạn đang nói về SSL ngày hôm nay, thì có nghĩa là bạn đang nói về TLS.

HTTP và HTTPS khác nhau thế nào?

Giao thức HTTP sử dụng Port 80, trong khi đó HTTPS sử dụng Port 443

HTTPS chậm hơn HTTP, nhưng không đáng kể

Mã hóa RSA:

Mã hóa RSA có thể được sử dụng trong một số hệ thống khác nhau. Nó có thể vận hành trong OpenSSL, wolfCrypt, cryptlib và một số thư viện mật mã khác.

HTTPS sử dụng kiểu mã hóa là RSA (SSH key cũng tương tự)

Thuật toán RSA dựa vào 1 sự kiện ngẫu nhiên (không thể lặp lại) để sinh ra 1 cặp key là public và private key.

Dữ liệu khi mã hóa bằng public key, thì chỉ có thể giải mã bằng private key.

Với HTTPS, khi truy cập 1 trang web thì nó sẽ tải chứng chỉ điện tử về máy. Phía trình duyệt sẽ lấy public key trong chứng chỉ để mã hóa thông tin gửi lên cho server, server sẽ sử dụng private key để giải mã thông tin.

Sơ đồ mã hóa

Giao tiếp với SSL

Sẽ trải qua 2 bước:

  • Bắt tay SSL (SSL hand-shake)

  • Vận chuyển data

Bắt tay SSL:

Quá trình SSL handshake

  1. Client gửi một message Hello tới Server. Message này bao gồm version của SSL trên client, cipher setting (các thiết lập về mật mã), session data và các thông tin cần thiết khác mà server cần để client có thể giao tiếp thông qua giao thức SSL

  2. Server phản hồi với một message Hello khác. Message này cũng bao gồm version của SSL trên server, thiết lập mật mã, session data, public key và các thông tin cần thiết khác mà client cần để giao tiếp thông qua SSL.

  3. Client tiến hành xác nhận SSL certificate (Public key và các info khác mà Server vừa gửi) với Certificate Authority – CA (là các đơn vị thứ 3 cung cấp dịch vụ chứng thực số, ví dụ: GeoTrust, Digicert…) xem SSL certificate đó có là “đồ thật” – không bị giả mạo hay không, nếu đúng thì tiếp tục bước 4.

  4. Client sinh một session key, mã hóa nó với public key và gửi nó đến server.

  5. Server dùng private key để giải mã session key sau đó gửi kết quả thành công về cho client. Kết này cũng sẽ được mã hóa đối xứng với session key mà vừa được giải mã.

Sau SSL handshake, cả client và server đều có trong tay session key, khóa này về sau sẽ được dùng để mã hóa và giải mã các data thực tế cần truyền tải giữa client và server.

Bạn có thể tham khảo thêm về cách SSL làm việc tại đây:

https://www.tutorialsteacher.com/https/how-ssl-works

Mã hóa AES:

Thuật toán mã hóa AES sẽ phức tạp hơn, nhưng thường sẽ không dùng trong truyền thông mà sẽ dùng để mã hóa các gói tin, tệp tin.

Điều cần ghi nhớ:

  • Encrypt in transit thì sẽ thường dùng RSA.

  • Encrypt at rest thì thường dùng AES.

  • Khi mã hóa bằng RSA: public key có thể được chia sẻ, nhưng private key thì phải giữ bí mật.

  • Có 3 kiểu mã hóa: encrypt in transit, encrypt in server side, encrypt in client side.

Memo: đi thi sẽ không có những câu hỏi hỏi về bản chất mã hóa! Tuy nhiên, bạn nên đọc để hiểu sơ lược mã hóa là gì!

AWS KMS:

  • Khi nhắc đến “encryption” ở AWS, thì hãy nhớ đến KMS! (Đi thi cũng thế nhé!)

  • KMS là service giúp bạn dễ dàng tạo, lưu trữ và quản lý khóa mật mã cũng như kiểm soát việc sử dụng khóa mật mã.

  • KMS có khả năng xử lý cả khóa đối xứng (Symmetric: single key cho cả encrypt và decrypt) và không đối xứng (Asymmetric: key pairs dùng cho encrypt và decrypt)

  • Bạn có thể sử dụng AWS Managed key hoặc custom key. AWS managed key thì miễn phí.

  • Key policy: Để cấp quyền truy cập vào KMS cho ai đó: Đảm bảo rằng Key Policy cho phép user đó và Đảm bảo rằng IAM Policy cho phép các lệnh gọi API

  • Bạn có thể configure rotation policy. Lưu ý: rotation policy thì khóa mới sẽ được tạo hàng năm, khóa cũ sẽ được giữ nguyên. Thông thường thì rotate sẽ không ảnh hưởng các service sử dụng, và nếu các ông IAM user có đủ quyền với KMS thì vẫn sử dụng được.

  • Với KMS thì có thể configure ai có thể kiểm soát, sử dụng, truy cập khóa.

Sử dụng KMS như nào:
  • Cách 1: Gửi plaintext lên AWS KMS để mã hoá.

  • Cách 2: Gọi api lên AWS KMS để lấy data key nhằm mã hoá ở client.

Bạn có thể tham khảo thêm về cách KMS tạo ra các data keys tại link sau:

https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys

Memo: Khi làm việc với S3, bạn sẽ thấy có option mã hóa Amazon S3-managed keys (SSE-S3) và AWS Key Management Service key (SSE-KMS). Tại sao lại sinh ra thêm cái thằng Amazon S3-managed keys (SSE-S3)? -> Lý do là KMS có giới hạn gọi API, nếu sử dụng cho những bucket/object với nhiều request thì sẽ có thể bị vượt quá quota.

Chi tiết về quota của KMS tham khảo thêm tại:

https://docs.aws.amazon.com/kms/latest/developerguide/requests-per-second.html

Mục ngoài lề Q&A:

Q: Muốn xem dạng câu hỏi mà AWS SAA exam hay hỏi thì làm thế nào?

A: Bạn có thể đăng ký AWS practice exam (mỗi tội chỉ có 20 câu thôi) hoặc lên trang này:

https://www.examtopics.com/exams/amazon/aws-certified-solutions-architect-associate-saa-c02/view/

Q: Đi thi chỉ học lý thuyết được không? A: Cũng có những TH may mắn, ôm dump vớ chứng chỉ, nhưng please! Make your hand dirty! Hãy thực hành nhiều nhất có thể vì không biết gì mà ôm chứng chỉ, thì bạn nghĩ nó có hữu ích cho bạn không? Thêm nữa, có nhiều câu hỏi AWS năm trước đáp án đó là đúng, năm sau sai nữa!

Q: Tìm labs thực hành ở đâu?

A: Cách đơn giản: search google!

Cách search rất đơn giản: <tên dịch vụ> + workshops. VD: tôi muốn làm lab về S3: AWS S3 workshops. Sẽ trả về rất nhiều kết quả cho bạn!

Ngoài ra, mn có thể tham khảo thêm lab ở đây (có thể chọn tiếng Việt): https://cloudjourney.awsstudygroup.com/

Ngoài ra bạn có thể lên docs của AWS và thực hiện theo các phần Getting Started.

Hãy nhớ: Lab nhiều! Bài học xương máu là thực hành thật nhiều! Lý thuyết quan trọng đấy, nhưng thực hành thì rất rất quan trọng, chỉ khi bắt tay vào làm mới có thể hiểu vấn đề!