Trong AWS, Network Access Control List (NACL) và Security Groups là các phương tiện để kiểm soát traffic vào và ra của một mạng VPC. Tuy nhiên, chúng có sự khác biệt về cách hoạt động và phạm vi áp dụng.
Security Group là một bảo vệ mức độ đầu cuối cho các instances trong VPC. Nó cho phép hoặc chặn traffic dựa trên các rule được đặt trong security group đó. Security group có thể được liên kết với nhiều instances khác nhau trong cùng một VPC, và các rules có thể được áp dụng cho một hoặc nhiều security group. Security group hoạt động ở mức độ instance và hỗ trợ rule cho phép (allow) và không hỗ trợ rule từ chối (deny). Nó cũng cho phép các kết nối trả lời tự động được phép, không phụ thuộc vào rule được thiết lập hay không.
NACL là một cách để kiểm soát traffic vào và ra của các subnet trong mạng VPC. Nó cũng hỗ trợ rule cho phép (allow) và rule từ chối (deny). Nó hoạt động trên mức độ subnet và có thể được áp dụng cho nhiều subnet khác nhau trong VPC. Nó cũng cung cấp khả năng điều khiển truy cập trả lời (ephemeral port), điều này có nghĩa là nó có thể điều khiển việc trả lời các yêu cầu của các client. Với NACL, các rules được kiểm tra theo thứ tự, từ dưới lên và nó sẽ không tự động cho phép các kết nối trả lời.
Để thực hiện kiểm soát truy cập bằng Security Group và NACL, ta có thể tạo các rules trong các phương tiện này. Trong Security Group, ta có thể tạo các rule cho phép (allow) hoặc từ chối (deny) một loại traffic cụ thể, dựa trên IP address hoặc port. Trong NACL, ta có thể tạo các rule cho phép (allow) hoặc từ chối (deny) một loại traffic cụ thể, dựa trên IP address, port hoặc protocol. Tuy nhiên, ta cần lưu ý rằng các rule trong NACL sẽ được áp dụng theo thứ tự, từ dưới lên và phải đảm bảo rằng các rule không xung đột với nhau.
Bây giờ bạn hãy thực hành bằng cách vào Network ACLs, bạn sẽ thấy có 1 Network ACLs không có tên và nó chính là ACLs mặc định.
Mình sẽ đổi tên nó thành DefaultNACL để dễ phân biệt.
Với NACL mặc định nó sẽ được gắn sẵn các subnet có trong VPC mà bạn đã tạo ra và chiều inbound của nó sẽ có 2 rule mặc định là deny và allow như dưới.
Tương tự chiều outbound của nó sẽ có 2 rule mặc định là deny và allow như dưới.
Như vậy mặc định trong Network ACLs phần Inbound rules và Outbound rules sẽ có 2 rule mặc định đó là rule chặn tất cả ở mọi nguồn và rule cho phép tất cả ở mọi nguồn và rule cho phép tất cả sẽ nằm ở trên rule chặn tất cả và điều đó dĩ nhiên tất cả các hành động sẽ được phép đi qua đây. Và mặc định Network ACLs sẽ tự động liên kết tới các subnet mà bạn đã tạo.
Tiếp theo bạn hãy demo với instance BastionHost.
Hãy truy cập vào nó và cài đặt 1 webserver để chúng ta thử nghiệm.
sudo yum install -y httpd
sudo systemctl start httpd
sudo systemctl enable httpd
echo "hello world" > /var/www/html/index.html
Sau khi cài đặt xong webserver chúng ta vào Security Group của instance này chỉnh sửa cho phép chiều inbound giao thức http.
Bấm vào Edit inbound rules.
Thêm giao thức http vào và lưu lại.
Hãy vào tiếp instance BastionHost tại thẻ details bạn hãy lấy địa chỉ public ip tại Public IPv4 address.
Hãy tiến hành truy cập thử ip này và bạn có kết quả.
Bạn hãy vào Network ACLs và vào DefaultNACL.
Kéo xuống tại phần inbound rules bấm Edit inbound rules.
Thêm giao thức http vào NACL này và nhớ cho rule http nằm trên các rule còn lại.
Đây là kết quả sau khi bạn thêm rule mới.
Và khi bạn tải lại trang kết quả bạn sẽ không truy cập được lý do là đã có rule deny http nằm ở trên cùng. Theo nguyên tắc thì hệ thống sẽ duyệt từ rule trên xuống dưới và sẽ dừng lại khi match kết quả. Trường hợp ở trên đang có 1 yêu cầu truy cập webserver từ bên ngoài giao thức http port 80 và khi đi qua NACL nó đã bị chặn nên kết quả không truy cập được.
Bây giờ chúng ta hãy thay đổi thứ tự rule như dưới và tải lại web.
Kết quả bạn đã truy cập web bình thường vì chiều inbound có 1 rule cho phép tất cả các giao thức đi qua nằm trên cùng.
Vậy giả sử config cho chiều outbound deny tất cả.
Bạn nhận được kết quả không truy cập được vì lý do client không thể nhận được gói tin trả về từ server.
Tại phần outbound của security group mình sẽ bỏ rule All traffic.
Xoá rule này.
Kết quả sau khi bỏ rule All traffic.
Vì Security Group là stateful, nghĩa là khi một yêu cầu được gửi đến một EC2 instance, Security Group sẽ tự động cho phép các gói tin trả về kể cả khi không có rule outbound tương ứng được chỉ định. Điều này có nghĩa là bạn chỉ cần tạo một rule inbound cho phép kết nối tới một EC2 instance, các gói tin trả về sẽ tự động được cho phép đi qua Security Group và trở về cho máy khách mà không cần chỉ định bất kỳ rule outbound nào.
Và đương nhiên rồi, bạn vẫn có quyền truy cập website bình thường.
Vậy nếu có một yêu cầu gửi đi từ trong instance ra ngoài thì nó sẽ được cho phép mặc dù chiều outbound của Security Group không có rule đi ra cụ thể cho yêu cầu đó. Tuy nhiên, nếu trong NACL không có rule cho phép đi ra (outbound) cho yêu cầu đó thì nó sẽ bị từ chối. Nên cả Security Group và NACL đều có vai trò quan trọng trong việc kiểm soát lưu lượng mạng trong môi trường AWS.