31/34 Tường lửa Các chương

Tường lửa là gì, và nó bảo vệ mạng như thế nào?

Máy chủ chạy nhiều dịch vụ, làm sao chỉ mở đúng thứ cần mở?

Giả sử bạn có một máy chủ nối với Internet.

Trên máy đó đang chạy ba dịch vụ:

443   Website
22    SSH
5432  PostgreSQL

Website phải cho mọi người truy cập.

SSH chỉ dành cho người quản trị.

PostgreSQL chỉ cần được chương trình bên trong hệ thống sử dụng.

Nhưng Internet không tự biết điều đó.

Nếu không có lớp bảo vệ nào phía trước, máy ở bên ngoài vẫn có thể thử gửi kết nối tới cả ba cổng.

Làm sao chỉ mở đúng thứ cần mở?

Đó là việc của tường lửa (firewall).

Tường lửa quyết định gói nào được đi qua

Khi một gói tin đi từ Internet tới máy chủ, tường lửa có thể kiểm tra một số thông tin như:

  • gói đến từ địa chỉ IP nào;
  • nó muốn tới máy nào;
  • dùng TCP hay UDP;
  • muốn tới cổng nào.

Sau đó tường lửa so những thông tin đó với các quy tắc đã được đặt trước.

Ví dụ:

CHO PHÉP   TCP   cổng 443   từ Internet
CHẶN       TCP   cổng 22    từ Internet
CHẶN       TCP   cổng 5432  từ Internet

Một người mở website:

Internet
   |
   | TCP :443
   v
Tường lửa
   |
   | cho phép
   v
Website

Gói tin được đi tiếp.

Nhưng nếu một máy trên Internet thử kết nối vào PostgreSQL:

Internet
   |
   | TCP :5432
   v
Tường lửa
   X
   |
Cơ sở dữ liệu

Tường lửa chặn nó trước khi nó tới cơ sở dữ liệu (database).

Cơ sở dữ liệu vẫn đang chạy.

Tường lửa không sửa cơ sở dữ liệu, cũng không làm cơ sở dữ liệu an toàn hơn.

Nó chỉ ngăn những máy không được phép chạm tới cơ sở dữ liệu ngay từ đầu.

Nếu quên viết quy tắc thì sao?

Giả sử ngày mai bạn cài thêm một dịch vụ mới trên cổng 8080.

Nhưng bạn quên cập nhật tường lửa.

Có hai cách xử lý.

Cách thứ nhất:

Nếu không có quy tắc → cho qua

Như vậy dịch vụ mới có thể vô tình bị mở ra Internet.

Cách an toàn hơn là:

Nếu không có quy tắc → chặn

Ba gói tin từ Internet tới cùng một máy chủ: gói :443 đi qua tường lửa tới Website :443, gói :22 và :5432 dừng ở tường lửa với dấu CHẶN; quy tắc ghi 443 → cho qua, còn lại → chặn; trong máy chủ, Website, SSH và PostgreSQL đều vẫn đang chạy

Đây gọi là mặc định chặn (default deny).

Ta chỉ liệt kê những thứ thực sự muốn mở:

CHO PHÉP   443
CHO PHÉP   một số kết nối cần thiết

CHẶN       mọi thứ còn lại

Nhờ vậy, một dịch vụ mới không tự nhiên xuất hiện trên Internet chỉ vì ai đó vừa bật nó lên.

Vì sao người ta cần cách này?

Internet ban đầu nhỏ hơn rất nhiều và phần lớn kết nối các trường đại học, viện nghiên cứu và cơ quan chính phủ.

Nhiều máy để mở các dịch vụ cho máy khác sử dụng.

Năm 1988, sâu Morris lợi dụng một số dịch vụ và cấu hình như vậy để tự lây từ máy này sang máy khác.

Trong khoảng một ngày, hàng nghìn máy bị ảnh hưởng.

Vấn đề lộ ra rất rõ.

Một tổ chức có thể có hàng nghìn máy. Mỗi máy lại chạy nhiều chương trình mạng khác nhau.

Nếu muốn bảo vệ hệ thống chỉ bằng cách đảm bảo:

mọi chương trình
trên mọi máy
đều không bao giờ có lỗi

thì rất khó.

Nhưng lưu lượng từ Internet thường chỉ đi vào tổ chức qua một số ít điểm.

Vì vậy có thể đặt bộ lọc ngay tại những điểm đó:

Internet
     |
     v
+-----------+
| Tường lửa |
+-----------+
     |
     v
Mạng bên trong
 |      |             |
PC    Máy chủ   Cơ sở dữ liệu

Thay vì để mọi gói tin đi tới từng máy rồi mới xử lý, ta loại bỏ những kết nối không cần thiết từ ngoài cửa.

Đó là ý tưởng cơ bản của tường lửa.

Nhưng máy trong mạng vẫn vào Internet được chứ?

Có.

Giả sử laptop của bạn mở một website.

Laptop chủ động tạo kết nối ra ngoài:

Laptop  ------>  Website

Website sau đó gửi dữ liệu trả về:

Laptop  <------  Website

Tường lửa hiện đại có thể nhớ rằng laptop vừa tạo kết nối này.

Hai hàng so sánh qua cùng một tường lửa: hàng Kết nối đã có, laptop trong mạng mở kết nối tới Website, tường lửa ghi nhớ Laptop ↔ Website và cho dữ liệu trả về đi qua; hàng Kết nối mới, một máy lạ trên Internet tự mở kết nối vào laptop và bị chặn ở tường lửa

Vì vậy khi dữ liệu trả về, nó biết:

Đây là dữ liệu trả lời
cho một kết nối đã được cho phép.

và cho nó đi qua.

Nhưng nếu một máy lạ trên Internet tự nhiên thử mở một kết nối mới vào laptop:

Máy lạ  ------>  Laptop

tường lửa có thể chặn lại.

Khả năng nhớ các kết nối đang tồn tại này thường được gọi là theo dõi trạng thái kết nối (stateful firewall).

Bạn không cần nhớ tên đó để hiểu ý chính:

máy bên trong có thể chủ động đi ra ngoài và nhận câu trả lời, nhưng máy bên ngoài không vì thế mà được tự do mở kết nối vào trong.

Tường lửa có chặn virus không?

Không phải theo cách phần mềm diệt virus làm.

Giả sử bạn tải một file qua website.

Website dùng HTTPS trên cổng 443.

Tường lửa có quy tắc:

CHO PHÉP TCP cổng 443

Vì vậy dữ liệu của website được đi qua.

Nếu file tải xuống là file độc hại, một tường lửa chỉ lọc theo địa chỉ, giao thức và cổng không thể kết luận:

file này là virus

Nó chỉ biết:

kết nối này được phép đi qua

Đây là hai việc khác nhau.

Câu hỏi nó trả lời
Tường lửa Kết nối này có được phép đi qua không?
Phần mềm chống mã độc File hoặc chương trình này có nguy hiểm không?

Các hệ thống bảo mật hiện đại có thể kiểm tra sâu hơn vào nội dung lưu lượng. Nhưng đó là những chức năng bổ sung.

Ý tưởng cơ bản của tường lửa vẫn rất đơn giản:

Gói tin tới
    |
    v
Có quy tắc cho phép?
   / \
 Có   Không
 |      |
 v      X
Qua    Chặn

Tường lửa không đảm bảo chương trình phía sau không có lỗi.

Nó làm một việc khác:

chỉ cho những kết nối cần thiết tới được chương trình đó.

Vì vậy với máy chủ ban đầu:

443   Website       → Internet được vào
22    SSH           → Internet bị chặn
5432  PostgreSQL    → Internet bị chặn

Máy chủ vẫn chạy cả ba dịch vụ.

Nhưng từ Internet, người ngoài chỉ thấy thứ mà chúng ta chủ động mở ra.

Gói cước 300 Mbps, sao game vẫn giật?

Nguồn bài viết (4)

  1. Morris Worm · FBI (bản lưu Wayback Machine)
  2. RFC 1135: The Helminthiasis of the Internet · IETF / RFC Editor, 1989
  3. Simple and Flexible Datagram Access Controls for Unix-based Gateways (WRL Research Report 89/4) · Digital Equipment Corporation, Western Research Laboratory, 1989 (bản lưu Wayback của HP Labs)
  4. NIST SP 800-41 Rev. 1 — Guidelines on Firewalls and Firewall Policy · NIST