Cường hóa mạng Linux: Microsegmentation với nftables

Networking tutorial - IT technology blog
Networking tutorial - IT technology blog

Bảo mật mạng nội bộ: Vượt xa khỏi lớp phòng thủ biên

Hầu hết các thiết lập bảo mật hiện nay giống như một lâu đài thời trung cổ: tường thành bên ngoài dày đặc nhưng bên trong lại không có cổng ngăn cách. Một khi gói tin đã vượt qua tường lửa biên, mạng nội bộ thường trở thành một khu vực tự do di chuyển. Tôi đã dành sáu tháng quản lý một môi trường đa tầng với lưu lượng truy cập cao trước khi nhận ra rằng chiến lược “lâu đài và hào nước” này là một điểm yếu chết người. Một thực thể Nginx bị xâm nhập không nên là tấm vé thông hành cho kẻ tấn công truy cập vào toàn bộ cụm cơ sở dữ liệu của bạn.

Tôi đã chuyển hệ thống production của chúng tôi sang mô hình bảo mật ở cấp độ máy chủ (host-level) bằng cách sử dụng nftables. Kết quả đạt được rất tức thì và ổn định. Bằng cách triển khai microsegmentation (phân đoạn mạng siêu nhỏ), chúng tôi đã chuyển logic bảo mật trực tiếp vào workload. Điều này tuân thủ nguyên tắc cốt lõi của Zero Trust: không bao giờ tin tưởng, luôn luôn xác thực và giới hạn nghiêm ngặt việc giao tiếp ở mức tối thiểu cần thiết để dịch vụ hoạt động.

So sánh các chiến lược: Tường lửa truyền thống và Microsegmentation

Hiểu được sự thay đổi trong triết lý là điều quan trọng trước khi bạn chạm vào dòng lệnh. Các phương pháp truyền thống tập trung vào vùng biên, trong khi microsegmentation tập trung vào từng dịch vụ riêng lẻ.

1. Bảo mật dựa trên vùng biên (Cách truyền thống)

Các mô hình cũ dựa vào một điểm nhập duy nhất. Các dịch vụ nội bộ như Web, App và Database thường nằm trong cùng một VLAN. Hiếm khi có các hạn chế giữa chúng. Nếu kẻ tấn công khai thác được máy chủ Web thông qua lỗi thực thi mã từ xa (RCE), chúng sẽ có đường thẳng tiến tới tầng dữ liệu nhạy cảm của bạn.

2. Microsegmentation mạng (Cách tiếp cận Zero Trust)

Phương pháp này coi mỗi dịch vụ như một hòn đảo biệt lập. Ngay cả khi hai dịch vụ chia sẻ cùng một subnet vật lý, chúng không thể giao tiếp trừ khi có một quy tắc cụ thể cho phép. nftables cung cấp một khung làm việc hiệu suất cao để lọc các gói tin này ở cấp độ kernel. Nó cung cấp cú pháp sạch hơn và hiệu quả tài nguyên tốt hơn so với iptables cũ.

Tại sao nftables giành chiến thắng trong môi trường Production

Chuyển sang nftables để kiểm soát lưu lượng nội bộ mang lại nhiều lợi ích kỹ thuật, mặc dù nó đòi hỏi đội ngũ của bạn phải học một cú pháp mới.

Ưu điểm

  • Thao tác nguyên tử (Atomic Operations): Bạn có thể thay thế toàn bộ bộ quy tắc trong một lần thực hiện. Điều này loại bỏ tình trạng race condition thường thấy trong iptables, nơi các quy tắc được cập nhật từng cái một.
  • Cải thiện hiệu năng: Nó sử dụng một máy ảo hiệu quả hơn bên trong kernel. Trong các môi trường thông lượng cao—như đường truyền 10Gbps—việc giảm tải CPU là một lợi thế cực lớn.
  • Cú pháp dễ đọc: Ngon ngữ của nó mang lại cảm giác logic tự nhiên. Bạn có thể nhóm các cổng, IP và giao thức vào một quy tắc duy nhất bằng cách sử dụng các set và map, giúp giảm từ 50 dòng mã xuống còn 5 dòng.
  • Công cụ thống nhất: Nó hợp nhất iptables, ip6tablesebtables thành một công cụ tinh gọn duy nhất.

Nhược điểm

  • Đường cong học tập: Các đội ngũ đã có hàng thập kỷ kinh nghiệm với iptables sẽ cần vài ngày để thích nghi với mô hình tư duy mới.
  • Cập nhật công cụ: Các script giám sát cũ hoặc các pipeline IaC đời cũ có thể vẫn tìm kiếm đầu ra của iptables và sẽ cần phải được viết lại.

Một kiến trúc sẵn sàng cho Production

Khi triển khai cấu hình này trong môi trường của mình, tôi đã loại bỏ các danh sách quy tắc dài và tuyến tính. Thay vào đó, tôi tổ chức cấu hình thành các bảng (table) chức năng. Chúng tôi sử dụng sets để quản lý các nhóm máy chủ, chẳng hạn như các agent giám sát hoặc các node cơ sở dữ liệu, giúp hệ thống dễ dàng mở rộng hơn nhiều.

Logic dựa trên chính sách “Default Deny” (Mặc định từ chối). Chúng tôi chặn mọi thứ và chỉ đưa vào danh sách trắng (whitelist) các luồng dữ liệu cụ thể. Đối với một ứng dụng 3 lớp tiêu chuẩn, luồng dữ liệu sẽ như sau:

  • Tầng Web: Chấp nhận cổng 443 từ công cộng; giao tiếp với Tầng App qua cổng 8080.
  • Tầng App: Chấp nhận cổng 8080 từ Tầng Web; giao tiếp với Tầng DB qua cổng 5432.
  • Tầng DB: Chấp nhận cổng 5432 từ Tầng App; không kết nối với bất kỳ thứ gì khác.

Từng bước: Xây dựng bộ quy tắc của bạn

Hãy cùng xây dựng một cấu hình nftables cấp độ production. Đầu tiên, hãy đảm bảo gói phần mềm đã có trên hệ thống của bạn. Sử dụng apt install nftables cho Debian/Ubuntu hoặc yum install nftables cho các hệ thống dựa trên RHEL.

1. Xóa sạch cấu hình cũ

Bắt đầu với một trạng thái sạch. Nếu bạn đang làm việc qua SSH, hãy cẩn thận. Đừng thiết lập chính sách mặc định là drop cho đến khi bạn đã cho phép địa chỉ IP của chính mình.

# Xóa toàn bộ các quy tắc hiện tại
nft flush ruleset

2. Định nghĩa Table và Chain

Chúng ta sẽ tạo một bảng có tên là filter cho cả lưu lượng IPv4 và IPv6. Sau đó, định nghĩa các hook tiêu chuẩn cho input, forward và output.

nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop \; }
nft add chain inet filter output { type filter hook output priority 0 \; policy accept \; }

3. Xử lý lưu lượng thiết yếu

Không bao giờ chặn giao diện loopback. Bạn cũng cần cho phép các kết nối đã thiết lập để các gói tin phản hồi cho các yêu cầu gửi đi của bạn có thể quay trở lại.

# Cho phép giao diện loopback
nft add rule inet filter input iifname "lo" accept

# Cho phép lưu lượng đã thiết lập và có liên quan
nft add rule inet filter input ct state established,related accept

4. Tổ chức các lớp bằng Set

Set là tính năng mạnh mẽ nhất trong nftables. Thay vì viết hàng tá quy tắc lặp đi lặp lại, chúng ta định nghĩa các nhóm. Điều này giúp việc mở rộng từ hai máy chủ lên 200 máy chủ trở nên dễ dàng.

# Định nghĩa các set cho hạ tầng của chúng ta
nft add set inet filter web_servers { type ipv4_addr \; }
nft add set inet filter app_servers { type ipv4_addr \; }
nft add set inet filter db_servers { type ipv4_addr \; }

# Thêm các địa chỉ IP thực tế vào set
nft add element inet filter web_servers { 10.0.1.10, 10.0.1.11 }
nft add element inet filter app_servers { 10.0.2.50, 10.0.2.51 }
nft add element inet filter db_servers { 10.0.3.100 }

5. Thực thi logic Microsegmentation

Bây giờ chúng ta áp dụng các hạn chế. Chúng ta chỉ cho phép các máy chủ App truy cập các máy chủ DB qua cổng PostgreSQL (5432).

# Giới hạn SSH trong subnet quản lý (ví dụ: VPN của bạn)
nft add rule inet filter input ip saddr 192.168.100.0/24 tcp dport 22 accept

# Cho phép Web Tier truy cập App Tier qua cổng 8080 (Chạy trên các node App)
nft add rule inet filter input ip saddr @web_servers tcp dport 8080 accept

# Cho phép App Tier truy cập DB Tier qua cổng 5432 (Chạy trên các node DB)
nft add rule inet filter input ip saddr @app_servers tcp dport 5432 accept

6. Đảm bảo tính lâu dài

Các quy tắc của bạn sẽ biến mất khi khởi động lại trừ khi bạn lưu chúng. Trên Debian hoặc Ubuntu, vị trí tiêu chuẩn là /etc/nftables.conf.

nft list ruleset > /etc/nftables.conf
systemctl enable nftables
systemctl start nftables

Bảo trì và Tự động hóa lâu dài

Vận hành thiết lập này trong vài tháng đã dạy tôi rằng việc kiểm thử trở nên đơn giản hơn nhiều. Khi một kiểm toán viên hỏi dịch vụ nào có thể chạm vào cơ sở dữ liệu, tôi chỉ cần chạy nft list set inet filter app_servers. Đầu ra rất rõ ràng và không có chỗ cho sự phỏng đoán.

Đối với các hệ thống lớn, đừng quản lý các quy tắc này một cách thủ công. Hãy tích hợp chúng vào Ansible hoặc Terraform. Bằng cách định nghĩa các IP set trong một kho lưu trữ tập trung, bạn có thể đẩy các cập nhật microsegmentation tới hàng trăm node cùng một lúc. Cách tiếp cận này giúp cường hóa hạ tầng của bạn và biến một mạng lưới kết nối phức tạp thành một hệ thống có thể quản lý và được tài liệu hóa rõ ràng. Tự động hóa là chìa khóa để duy trì sự an toàn mà không làm tăng khối lượng công việc quản trị.

Share: