Xử lý sự cố lúc 2 giờ sáng
Đó là 2 giờ sáng ngày thứ Ba. Biểu đồ giám sát của bạn vừa tăng vọt. Hàng chục máy trạm đang cố gắng kết nối với một tên miền Command and Control (C2) đã biết, báo hiệu một đợt bùng phát ransomware tiềm tàng. Bạn có thể trực tiếp rút cáp mạng hoặc cố gắng chặn hàng nghìn IP thay đổi liên tục trên tường lửa. Tuy nhiên, có một cách hiệu quả hơn để vô hiệu hóa mối đe dọa này: DNS Sinkholing.
Hướng dẫn này sẽ trình bày cách triển khai DNS Sinkhole bằng Response Policy Zones (RPZ) của BIND9. Cấu hình này cho phép bạn chặn và ghi đè các truy vấn DNS đối với các tên miền độc hại trên toàn bộ hạ tầng của mình mà không cần chạm vào bất kỳ máy khách nào.
So sánh các phương pháp chặn DNS
Khi bạn cần ngăn các thiết bị truy cập vào những góc cụ thể của internet, thường có ba lựa chọn. Việc chọn phương pháp phù hợp phụ thuộc vào quy mô và mức độ phức tạp của mối đe dọa.
- Phương pháp /etc/hosts: Bao gồm việc thêm các mục vào file cục bộ. Cách này hiệu quả với một máy lab đơn lẻ nhưng sẽ thất bại khi bạn cần bảo vệ 500 máy chủ hoặc một đội thiết bị IoT không được quản lý.
- Chặn IP bằng tường lửa: Chặn lưu lượng ở Layer 3 hoặc 4 là phương pháp truyền thống. Tuy nhiên, các mối đe dọa hiện đại sử dụng CDN và kỹ thuật fast-flux DNS. Nếu bạn chặn một IP độc hại, bạn có thể vô tình làm sập 1.200 trang web hợp lệ khác đang chia sẻ cùng địa chỉ edge của Cloudflare đó.
- DNS RPZ (Response Policy Zones): Hãy coi đây như một tường lửa cho DNS. Nó kiểm tra mọi truy vấn dựa trên danh sách uy tín. Nếu một tên miền bị gắn cờ, BIND sẽ trả về một phản hồi đã được sửa đổi, chẳng hạn như 0.0.0.0 hoặc lỗi NXDOMAIN.
Thực tế khi sử dụng BIND9 RPZ
Tôi đã triển khai hệ thống này trong các môi trường có lưu lượng truy cập cao. Mặc dù nó cực kỳ ổn định, nhưng điều quan trọng là phải hiểu những gì nó có thể và không thể làm.
Lợi ích
- Thực thi tập trung: Một bản cập nhật duy nhất trên máy chủ BIND sẽ bảo vệ mọi laptop, máy chủ và máy in thông minh trong mạng.
- Không phụ thuộc nền tảng: Nó hoạt động bất kể hệ điều hành nào. Nếu thiết bị sử dụng DNS của bạn, nó sẽ tuân theo quy tắc của bạn.
- Hiệu suất cao: BIND xử lý tra cứu RPZ với độ trễ dưới một mili giây. Người dùng của bạn sẽ không nhận thấy sự chậm trễ nào.
- Tiêu chuẩn công nghiệp: RPZ là một phần mở rộng hoàn thiện, giúp nó tương thích với nhiều nguồn cung cấp dữ liệu tình báo mối đe dọa (threat intelligence feeds).
Hạn chế
- DNS over HTTPS (DoH): Các trình duyệt hiện đại như Chrome hoặc Firefox có thể bỏ qua DNS nội bộ bằng cách sử dụng các nhà cung cấp được mã hóa như Google hoặc Cloudflare. Để lấp lỗ hổng này, bạn phải chặn các IP của nhà cung cấp DoH tại tường lửa biên.
- Bảo trì: Một sinkhole chỉ tốt khi dữ liệu của nó chính xác. Bạn cần một quy trình để cập nhật danh sách đen (blacklist) hàng ngày.
Môi trường khuyến nghị
Đối với một trình phân giải (resolver) cấp độ production, hãy sử dụng một bản phân phối Linux ổn định. Ubuntu 22.04 LTS hoặc Debian 12 là những lựa chọn tiêu chuẩn. Đảm bảo bạn đang chạy BIND 9.16 hoặc mới hơn để tận dụng việc xử lý RPZ đã được tối ưu hóa.
Thông số Lab:
- Hệ điều hành: Ubuntu 22.04 LTS
- IP nội bộ: 192.168.1.10
- Phần mềm: BIND 9.18.x
Hướng dẫn triển khai
Bước 1: Cài đặt BIND9
Cập nhật kho lưu trữ và cài đặt bộ BIND9. Chúng ta bao gồm cả bind9utils để kiểm tra cấu hình.
sudo apt update
sudo apt install bind9 bind9utils bind9-doc -y
Bước 2: Cấu hình các tùy chọn chung
Cấu hình BIND để hoạt động như một trình phân giải đệ quy cho mạng con cục bộ của bạn. Chúng ta cũng sẽ bật tính năng response-policy. Chỉnh sửa file /etc/bind/named.conf.options:
acl "trusted" {
127.0.0.0/8;
192.168.1.0/24; # Mạng nội bộ của bạn
};
options {
directory "/var/cache/bind";
recursion yes;
allow-query { trusted; };
forwarders {
9.9.9.9; # Quad9 để tăng cường bảo mật
1.1.1.1;
};
dnssec-validation auto;
listen-on-v6 { any; };
# Dòng này kích hoạt logic RPZ
response-policy { zone "rpz.blacklist"; };
};
Bước 3: Định nghĩa RPZ Zone
Định nghĩa vị trí file zone trong /etc/bind/named.conf.local. Zone này hoàn toàn là nội bộ và không được phép truy cập từ bên ngoài.
zone "rpz.blacklist" {
type master;
file "/etc/bind/db.rpz.blacklist";
allow-query { localhost; };
};
Bước 4: Tạo file chính sách (Policy File)
File này chứa danh sách các tên miền bị chặn. Chúng ta sẽ ánh xạ các mục độc hại tới các hành động cụ thể. Tạo file /etc/bind/db.rpz.blacklist:
$TTL 60
@ IN SOA localhost. root.localhost. (
2023102701 ; số serial (YYYYMMDDNN)
1h ; làm mới (refresh)
15m ; thử lại (retry)
30d ; hết hạn (expire)
1h ) ; ttl mặc định
IN NS localhost.
# --- Quy tắc chính sách ---
# Trả về NXDOMAIN cho tên miền này và tất cả tên miền con
bad-malware-site.com IN CNAME .
*.bad-malware-site.com IN CNAME .
# Chuyển hướng một tracker về IP null
evil-tracker.net IN A 0.0.0.0
*.evil-tracker.net IN A 0.0.0.0
# Chặn một máy chủ quảng cáo cụ thể
adservice.google.com IN CNAME .
Trong cú pháp RPZ, CNAME . yêu cầu BIND trả về lỗi NXDOMAIN. Điều này thường tốt hơn 0.0.0.0 vì các ứng dụng sẽ ngừng thử ngay lập tức thay vì chờ đợi kết nối hết hạn (timeout).
Bước 5: Kiểm tra và tải cấu hình
Lỗi cú pháp có thể làm hỏng dịch vụ DNS của bạn. Luôn xác thực cấu hình trước khi khởi động lại. Tôi đã từng thấy một dấu chấm phẩy bị thiếu làm mất quyền truy cập internet của toàn bộ văn phòng.
# Kiểm tra các lỗi cú pháp chung
sudo named-checkconf
# Xác thực riêng zone RPZ
sudo named-checkzone rpz.blacklist /etc/bind/db.rpz.blacklist
# Đảm bảo BIND có quyền đọc file
sudo chown bind:bind /etc/bind/db.rpz.blacklist
# Áp dụng các thay đổi
sudo systemctl restart bind9
Kiểm tra chính sách
Sử dụng lệnh dig để xác minh rằng máy chủ đang chặn các truy vấn một cách chính xác. Chạy các lệnh này từ một máy khách hoặc chính máy chủ đó.
# Kiểm tra chính sách NXDOMAIN
dig @localhost bad-malware-site.com
# Kết quả sẽ hiển thị: status: NXDOMAIN
# Kiểm tra chuyển hướng 0.0.0.0
dig @localhost evil-tracker.net
# Kết quả sẽ hiển thị: evil-tracker.net. 60 IN A 0.0.0.0
Nếu bạn nhận được địa chỉ IP thực từ internet, hãy kiểm tra xem IP của máy khách đã được đưa vào ACL trusted trong file named.conf.options chưa.
Tự động hóa và bảo trì
Việc cập nhật các file văn bản theo cách thủ công là không khả thi. Trong môi trường thực tế, bạn nên tự động hóa việc nạp dữ liệu từ các nguồn cấp mối đe dọa. Nhiều quản trị viên sử dụng script Python để lấy dữ liệu từ Spamhaus DBL hoặc URLHaus.
Tôi thường sử dụng một script để tổng hợp các danh sách này, định dạng chúng theo cú pháp BIND và tăng số serial SOA. Một lệnh rndc reload rpz.blacklist đơn giản sau đó sẽ đẩy các lệnh chặn mới lên hệ thống mà không cần khởi động lại toàn bộ dịch vụ.
Một cảnh báo: hãy cẩn thận với việc chặn quảng cáo quá mức. Tôi đã từng chặn một tên miền cần thiết cho việc xác thực bản quyền của một phần mềm kế toán quan trọng. Luôn duy trì một zone whitelist (danh sách trắng) để nhanh chóng khôi phục quyền truy cập khi xảy ra trường hợp nhận diện nhầm (false positive).
Tổng kết
DNS Sinkholing với BIND9 RPZ là một cách tiết kiệm chi phí để gia cố mạng lưới của bạn. Nó ngăn chặn các mối đe dọa trước khi kết nối TCP được thiết lập. Mặc dù nó sẽ không ngăn được một kẻ tấn công quyết tâm sử dụng IP cứng, nhưng nó loại bỏ hiệu quả phần lớn malware tự động và các trình theo dõi xâm nhập trên toàn bộ hạ tầng của bạn.

