Cấu hình DNSSEC cho Linux: Đừng để Website bị ‘bắt cóc’ dù đã có SSL

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

Tại sao SSL là chưa đủ để bảo vệ website của bạn?

Nhiều anh em quản trị mạng thường tự tin rằng chỉ cần cài HTTPS (SSL/TLS) là website đã an toàn tuyệt đối. Tuy nhiên, qua hàng chục lần audit security cho các hệ thống lớn, mình nhận thấy một lỗ hổng chí mạng: DNS. SSL chỉ mã hóa dữ liệu giữa trình duyệt và máy chủ, nhưng nó không giúp ích gì nếu người dùng bị dẫn ngay sang một server giả mạo từ đầu.

Hãy tưởng tượng kịch bản này: Kẻ tấn công thực hiện DNS Spoofing, chặn yêu cầu truy cập itfromzero.com và trả về IP của một trang web lừa đảo. Trình duyệt của người dùng sẽ kết nối thẳng đến đó. Thậm chí, lỗi Cache Poisoning có thể đầu độc bộ nhớ đệm của các DNS trung gian, khiến hàng triệu người dùng bị điều hướng sai chỉ trong vài phút. Đây chính là lúc DNSSEC (Domain Name System Security Extensions) thể hiện vai trò của mình.

DNSSEC giống như việc gắn một chữ ký số không thể làm giả vào mọi bản ghi DNS. Nó đảm bảo dữ liệu phản hồi đến tay người dùng phải nguyên vẹn và xác thực 100%.

DNSSEC hoạt động như thế nào?

DNS truyền thống vốn rất “ngây thơ” vì nó chấp nhận mọi câu trả lời mà không cần kiểm chứng. DNSSEC khắc phục điều này bằng hạ tầng khóa công khai (PKI). Thay vì tin tưởng mù quáng, máy tính sẽ yêu cầu bằng chứng số học cho mỗi bản ghi nhận được.

Khi kích hoạt DNSSEC, hệ thống sẽ sử dụng hai loại khóa chính để bảo mật:

  • ZSK (Zone Signing Key): Dùng để ký trực tiếp lên các bản ghi như A, MX hay CNAME. Khóa này thường có độ dài 2048-bit.
  • KSK (Key Signing Key): Dùng để ký lên chính khóa ZSK, tạo ra một “chuỗi tin cậy” (Chain of Trust) từ tên miền của bạn lên đến các máy chủ gốc (Root Servers). Khóa này thường mạnh hơn với 4096-bit.

Các bước triển khai DNSSEC thực chiến với BIND9

Trong hướng dẫn này, mình sẽ thao tác trên Ubuntu Server với BIND9 – “ông vua” trong giới DNS server. Giả sử chúng ta đang bảo vệ zone cho tên miền lab.itfromzero.vn.

Bước 1: Cài đặt công cụ cần thiết

Đầu tiên, hãy cập nhật hệ thống và cài đặt gói BIND9 mới nhất:

sudo apt update && sudo apt install bind9 bind9utils -y

Để quản lý khóa chuyên nghiệp hơn, mình tạo riêng một thư mục và cấp quyền cho user bind:

sudo mkdir /etc/bind/keys
sudo chown bind:bind /etc/bind/keys

Bước 2: Bật tính năng DNSSEC

Mặc định BIND9 có thể chưa kích hoạt xác thực. Bạn cần mở file cấu hình:

sudo nano /etc/bind/named.conf.options

Tìm và kiểm tra các dòng sau, đảm bảo chúng không bị vô hiệu hóa:

dnssec-validation auto;
auth-nxdomain no;
listen-on-v6 { any; };

Bước 3: Tạo cặp khóa ZSK và KSK

Đây là lúc chúng ta tạo ra “con dấu” cho tên miền. Hãy di chuyển vào thư mục keys:

cd /etc/bind/keys

Tạo khóa ZSK (Zone Signing Key) với thuật toán RSASHA256:

sudo dnssec-keygen -a RSASHA256 -b 2048 -n ZONE lab.itfromzero.vn

Tiếp tục tạo khóa KSK (Key Signing Key) mạnh hơn:

sudo dnssec-keygen -a RSASHA256 -b 4096 -f KSK -n ZONE lab.itfromzero.vn

Sau lệnh này, bạn sẽ thấy 4 file xuất hiện. Hãy lưu trữ các file .private thật cẩn thận. Nếu lộ khóa này, kẻ tấn công có thể thay mặt bạn ký các bản ghi giả mạo.

Bước 4: Ký Zone và xuất bản bản ghi

Bây giờ, hãy nhúng các khóa công khai vào file cấu hình zone gốc (ví dụ: /etc/bind/db.lab.itfromzero.vn). Thêm các dòng $INCLUDE trỏ đến đường dẫn file .key bạn vừa tạo.

Sau đó, dùng lệnh sau để ký toàn bộ zone:

sudo dnssec-signzone -A -3 $(head -c 1000 /dev/urandom | sha1sum | cut -b 1-16) -N INCREMENT -o lab.itfromzero.vn -t /etc/bind/db.lab.itfromzero.vn /etc/bind/keys/Klab.itfromzero.vn*.private

Lệnh này sử dụng NSEC3 (tham số -3) để ngăn chặn kỹ thuật “Zone Walking” – một cách để hacker liệt kê toàn bộ các subdomain của bạn. Kết quả thu được là file db.lab.itfromzero.vn.signed.

Bước 5: Áp dụng cấu hình mới

Thay đổi file /etc/bind/named.conf.local để BIND đọc file đã được ký:

zone "lab.itfromzero.vn" {
    type master;
    file "/etc/bind/db.lab.itfromzero.vn.signed";
};

Khởi động lại dịch vụ để hoàn tất: sudo systemctl restart bind9.

Hoàn tất chuỗi tin cậy với DS Record

Nhiều bạn thắc mắc tại sao cấu hình xong mà check vẫn lỗi. Nguyên nhân là do bạn chưa báo cáo khóa lên nhà đăng ký tên miền (Registrar).

Khi ký zone, một file dsset-lab.itfromzero.vn. sẽ xuất hiện. Bạn cần lấy nội dung bản ghi DS (Delegation Signer) trong file này và dán vào mục DNSSEC Management trên trang quản trị của Mắt Bão, Cloudflare hay GoDaddy. Bước này giống như việc bạn lên phường để công chứng chữ ký của mình vậy.

Kiểm tra và Duy trì

Cách nhanh nhất để kiểm tra là dùng lệnh dig +dnssec lab.itfromzero.vn. Nếu thấy xuất hiện bản ghi RRSIG, bạn đã thành công. Để trực quan hơn, hãy truy cập DNSViz.net. Một sơ đồ toàn màu xanh lá cây đồng nghĩa với việc hệ thống của bạn đã an toàn.

Lưu ý quan trọng: Chữ ký DNSSEC có thời hạn (thường là 30 ngày). Nếu bạn để chữ ký hết hạn mà không ký lại, website sẽ bị các trình duyệt chặn hoàn toàn. Mình khuyên anh em nên viết một cronjob tự động chạy lệnh dnssec-signzone hàng tháng để tránh rủi ro này.

Bảo mật là một quá trình liên tục. DNSSEC không giúp website chạy nhanh hơn, nhưng nó giúp người dùng của bạn không bao giờ đi nhầm địa chỉ.

Share: