Cách thiết lập tường lửa với UFW / iptables để bảo mật máy chủ Linux

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Vấn đề: Cuộc gọi đánh thức lúc nửa đêm từ tấn công vét cạn

Đã quá nửa đêm khi điện thoại của tôi rung liên hồi. Một cái nhìn nhanh vào nhật ký máy chủ ngay lập tức xác nhận nỗi sợ hãi của tôi: một làn sóng tấn công vét cạn SSH ồ ạt. Các tập lệnh tự động không ngừng nghỉ đang cố gắng đoán mật khẩu của tôi. Sự cố này, chỉ sáu tháng sau khi đưa vào sản xuất, là một lời cảnh tỉnh mạnh mẽ. Đêm đó, máy chủ của tôi đã bị hàng nghìn nỗ lực tấn công vét cạn SSH. Kể từ đó, tôi đã đặt bảo mật lên hàng đầu, ngay từ khi thiết lập ban đầu.

Mật khẩu mạnh hay cổng không phổ biến một mình không đủ để chống lại các mối đe dọa liên tục ngày nay. Bất kỳ máy chủ nào kết nối internet đều là mục tiêu tiềm năng. Một tường lửa mạnh mẽ không chỉ là một ý tưởng hay; đó là một hàng rào phòng thủ thiết yếu. Hãy nghĩ nó như một người gác cổng cảnh giác cho máy chủ của bạn, quyết định ai được phép vào và ai bị từ chối.

Các khái niệm cốt lõi: Hiểu rõ người bảo vệ máy chủ của bạn

Trước tiên, hãy cùng tìm hiểu tường lửa là gì và tại sao nó lại quan trọng đến vậy. Về cơ bản, tường lửa là một hệ thống bảo mật mạng. Nó liên tục giám sát và kiểm soát tất cả lưu lượng mạng vào và ra, thực thi một tập hợp các quy tắc bảo mật được xác định trước. Hãy hình dung nó như một người gác cổng chuyên dụng cho các kết nối của máy chủ của bạn.

Các hệ thống Linux dựa vào framework netfilter được tích hợp sẵn trong kernel để lọc gói tin. Công cụ dòng lệnh chính để cấu hình netfilteriptables. Công cụ này cực kỳ mạnh mẽ và linh hoạt, cung cấp khả năng kiểm soát chi tiết từng gói tin. Nhưng hãy cẩn thận: cú pháp của nó có thể khá khó hiểu, đặc biệt đối với người mới bắt đầu.

Đây là lúc UFW — Tường lửa không phức tạp — trở nên vô giá. UFW hoạt động như một lớp thân thiện với người dùng trên iptables, đơn giản hóa đáng kể việc quản lý tường lửa. Nó xử lý phần lớn sự phức tạp tiềm ẩn của iptables, mang lại một cách trực quan để quản lý các hoạt động tường lửa thông thường.

Đối với hầu hết các quản trị viên máy chủ, đặc biệt là những người mới làm quen với bảo mật Linux, UFW là giải pháp hoàn hảo. Nó cho phép bạn nhanh chóng thiết lập một nền tảng bảo mật vững chắc mà không cần phải thành thạo iptables ngay lập tức. Mặc dù chúng ta sẽ tập trung vào UFW vì tính dễ sử dụng của nó, hãy nhớ rằng iptables đang thực hiện công việc nặng nhọc ở hậu trường.

Trước khi đi sâu hơn, hãy cùng định nghĩa một số thuật ngữ thiết yếu:

  • Quy tắc (Rules): Đây là những hướng dẫn cụ thể mà tường lửa của bạn tuân theo. Ví dụ: “cho phép lưu lượng trên cổng 22” hoặc “chặn lưu lượng từ địa chỉ IP cụ thể này.”
  • Chính sách (Policies): Đây là các hành động mặc định của tường lửa khi không có quy tắc cụ thể nào được áp dụng. Đối với các kết nối đến, chính sách mặc định điển hình là “từ chối” — có nghĩa là mọi thứ đều bị chặn trừ khi bạn cho phép rõ ràng. Đối với các kết nối đi, thường là “cho phép.”
  • Cổng (Ports): Đây là các nhãn số xác định các ứng dụng hoặc dịch vụ riêng biệt trên một mạng. Ví dụ: cổng 22 được sử dụng cho SSH, 80 cho HTTP và 443 cho HTTPS.
  • Giao thức (Protocols): Các quy tắc tường lửa cũng chỉ định giao thức giao tiếp, chẳng hạn như TCP (Transmission Control Protocol) hoặc UDP (User Datagram Protocol), quy định cách dữ liệu được trao đổi.

Thực hành: Thiết lập tường lửa UFW của bạn

Bây giờ, hãy đưa lý thuyết vào thực hành. Chúng tôi sẽ hướng dẫn bạn thiết lập UFW trên một máy chủ tiêu chuẩn dựa trên Ubuntu hoặc Debian. Đối với những người dùng hệ thống CentOS/RHEL, firewalld là tùy chọn phổ biến hơn, mặc dù các khái niệm cốt lõi phần lớn là như nhau.

Bước 1: Cài đặt UFW (nếu chưa có)

Hầu hết các bản phân phối Linux hiện đại đều được cài đặt sẵn UFW. Bạn có thể kiểm tra trạng thái của nó, và nếu nó không có, hãy cài đặt nó.

sudo apt update
sudo apt install ufw

Bước 2: Kiểm tra trạng thái UFW

Trước khi thực hiện bất kỳ thay đổi nào, luôn tốt khi xem trạng thái hiện tại.

sudo ufw status verbose

Ban đầu, nó có thể sẽ hiển thị “Status: inactive.”

Bước 3: Cấu hình chính sách mặc định

Bước này rất quan trọng. Mục tiêu của chúng ta là chặn tất cả lưu lượng truy cập đến theo mặc định trong khi cho phép tất cả lưu lượng truy cập đi. Cách tiếp cận này đảm bảo rằng chúng ta chỉ cho phép rõ ràng các dịch vụ mà máy chủ của chúng ta thực sự cần.

sudo ufw default deny incoming
sudo ufw default allow outgoing

Thiết lập này được coi là an toàn rộng rãi và rất được khuyến nghị. Theo mặc định, nó niêm phong máy chủ của bạn khỏi các kết nối bên ngoài, cấp cho bạn toàn quyền kiểm soát những gì được phép vào.

Bước 4: Cho phép các dịch vụ thiết yếu

Tiếp theo, chúng ta cần mở các cổng cho các dịch vụ mà máy chủ của bạn hoàn toàn cần. SSH là quan trọng nhất; nếu không cho phép nó, bạn sẽ bị khóa truy cập ngay khi UFW được kích hoạt!

  • SSH (Cổng 22):
    sudo ufw allow ssh
    # Hoặc, để chính xác hơn, chỉ định số cổng:
    sudo ufw allow 22/tcp

    Nếu bạn đã chuyển dịch vụ SSH của mình sang một cổng không chuẩn (ví dụ: 2222), hãy đảm bảo bạn cho phép cổng cụ thể đó thay vì:

    sudo ufw allow 2222/tcp
  • HTTP (Cổng 80) và HTTPS (Cổng 443): Nếu máy chủ của bạn lưu trữ nội dung web, các cổng này rất cần thiết. Đáng chú ý, UFW đơn giản hóa điều này hơn nữa cho các máy chủ web phổ biến như Nginx hoặc Apache bằng cách cung cấp các hồ sơ ứng dụng được xác định trước.
sudo ufw allow http
sudo ufw allow https
# Hoặc, sử dụng các số cổng cụ thể:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
  • Hồ sơ ứng dụng (Application Profiles): UFW bao gồm các hồ sơ được cấu hình sẵn cho nhiều ứng dụng phổ biến. Bạn có thể dễ dàng xem các hồ sơ có sẵn và kích hoạt chúng bằng tên.
sudo ufw app list
# Ví dụ, để cho phép lưu lượng Nginx Full:
sudo ufw allow 'Nginx Full'

Bước 5: Kích hoạt UFW

Sau khi bạn đã thêm các quy tắc thiết yếu (đặc biệt là SSH!), bạn có thể kích hoạt tường lửa. Bạn sẽ nhận được một cảnh báo về khả năng gián đoạn SSH – xác nhận bằng y.

sudo ufw enable

Sau khi kích hoạt, hãy kiểm tra lại trạng thái:

sudo ufw status verbose

Bây giờ bạn sẽ thấy các quy tắc đã cho phép của mình được liệt kê.

Bước 6: Quản lý quy tắc

  • Từ chối các cổng/dịch vụ cụ thể (Denying Specific Ports/Services): Mặc dù chính sách mặc định “deny incoming” (từ chối kết nối đến) đã bao gồm hầu hết các nhu cầu chặn, đôi khi bạn có thể muốn chặn rõ ràng một cổng hoặc dịch vụ cụ thể.
sudo ufw deny ftp # Lệnh này chặn lưu lượng FTP, thường trên cổng 21.
  • Từ chối/Cho phép theo địa chỉ IP (Denying/Allowing by IP Address): Để chặn một IP gây rối hoặc chỉ cho phép truy cập từ một mạng cụ thể.
# Chặn tất cả lưu lượng từ một IP cụ thể
sudo ufw deny from 192.168.1.100

# Cho phép SSH từ một IP hoặc mạng cụ thể
sudo ufw allow from 192.168.1.0/24 to any port 22
  • Xóa quy tắc (Deleting Rules): Bạn có thể xóa các quy tắc bằng số được gán hoặc bằng cách chỉ định chính quy tắc đó.
    Để xóa bằng số, trước tiên hãy liệt kê các quy tắc của bạn với các chỉ số tương ứng:
sudo ufw status numbered

Sau đó, xóa quy tắc bằng số của nó (ví dụ: để xóa quy tắc số 3):

sudo ufw delete 3

Ngoài ra, bạn có thể xóa một quy tắc bằng cách mô tả trực tiếp nó:

sudo ufw delete allow 22/tcp

  • Đặt lại UFW (Resetting UFW): Nếu bạn gặp lỗi hoặc muốn bắt đầu lại, bạn có thể đặt lại UFW về trạng thái không hoạt động mặc định, xóa tất cả các quy tắc. Hãy cẩn thận: Thao tác này sẽ xóa tất cả cài đặt bảo mật của bạn.
sudo ufw reset

Bước 7: Một lưu ý về iptables

UFW giúp quản lý tường lửa dễ dàng hơn đáng kể, nhưng việc nắm bắt mối liên hệ của nó với iptables là rất hữu ích. Mỗi quy tắc bạn tạo bằng UFW sẽ được chuyển đổi thành một hoặc nhiều quy tắc iptables cơ bản. Bạn có thể xem các quy tắc iptables thô này bằng cách chạy:

sudo iptables -L -n -v

Tại đây, bạn sẽ thấy các chuỗi như ufw-user-inputufw-user-output, minh họa cách UFW tích hợp. Đối với hầu hết các tình huống điển hình, UFW cung cấp tất cả các chức năng cần thiết.

Khi lần đầu tiên tôi cố gắng sử dụng iptables trực tiếp, cảm giác như đang cố đọc một ngôn ngữ ngoài hành tinh. UFW đã thay đổi hoàn toàn tốc độ tôi có thể bảo mật các máy chủ của mình, và nó đã hoạt động ổn định trong sản xuất hơn một năm. Tôi sẽ chỉ xem xét việc thao tác trực tiếp iptables cho các thiết lập mạng cực kỳ chuyên biệt, phức tạp.

Kết luận: Cảnh giác liên tục là chìa khóa

Việc triển khai tường lửa như UFW là bước đầu tiên thiết yếu để bảo vệ bất kỳ máy chủ Linux nào. Sự cố SSH đêm khuya đó đã dạy tôi một bài học sâu sắc về giá trị của việc dự đoán và ngăn chặn các mối đe dọa, và UFW đã là công cụ chính của tôi kể từ đó. Nó tạo ra một lá chắn mạnh mẽ chống lại truy cập trái phép, giảm đáng kể số lượng điểm truy cập tiềm năng vào máy chủ của bạn.

Hãy nhớ rằng, bảo mật không phải là nhiệm vụ “thiết lập một lần rồi quên đi”; đó là một cam kết liên tục.

  • Thường xuyên xem xét các quy tắc UFW của bạn: Luôn kiểm tra kỹ để đảm bảo rằng chỉ các cổng bạn thực sự cần mới được mở.
  • Cập nhật hệ thống của bạn: Thường xuyên áp dụng các bản cập nhật để khắc phục các lỗ hổng bảo mật nghiêm trọng.
  • Giám sát nhật ký máy chủ của bạn: Triển khai các công cụ như fail2ban (tích hợp liền mạch với UFW) để tự động chặn các địa chỉ IP đang cố gắng tấn công vét cạn, bổ sung một lớp bảo vệ quan trọng khác.

Bằng cách biến việc thiết lập tường lửa thành một phần thường xuyên trong quá trình triển khai máy chủ của bạn, bạn sẽ vượt ra ngoài việc chỉ phản ứng với các mối đe dọa. Thay vào đó, bạn chủ động xây dựng một môi trường mạnh mẽ, an toàn ngay từ nền tảng. Đó là một bước cơ bản mà, một khi đã được thiết lập, mang lại sự yên tâm đáng kể. Bạn sẽ dễ ngủ hơn khi biết rằng máy chủ của mình không bị tổn thương không cần thiết trước những nguy hiểm không ngừng của internet.

Share: