Why SSL Isn’t Enough to Protect Your Website
Many network administrators feel confident that simply installing HTTPS (SSL/TLS) makes their website completely secure. However, after dozens of security audits for large systems, I’ve noticed a critical vulnerability: DNS. SSL only encrypts data between the browser and the server, but it’s useless if the user is redirected to a malicious server from the very start.
Imagine this scenario: An attacker performs DNS Spoofing, intercepting requests for itfromzero.com and returning the IP of a phishing site. The user’s browser connects straight to it. Even worse, Cache Poisoning can infect the cache of intermediate DNS servers, misdirecting millions of users in minutes. This is where DNSSEC (Domain Name System Security Extensions) comes into play.
DNSSEC is like attaching an unforgeable digital signature to every DNS record. It ensures that the response data reaching the user is intact and 100% authentic.
How DNSSEC Works
Traditional DNS is inherently “naive” because it accepts every answer without verification. DNSSEC fixes this using Public Key Infrastructure (PKI). Instead of blind trust, the computer requests mathematical proof for every record received.
When DNSSEC is enabled, the system uses two main types of keys for security:
- ZSK (Zone Signing Key): Used to directly sign records like A, MX, or CNAME. This key is typically 2048-bit.
- KSK (Key Signing Key): Used to sign the ZSK itself, creating a “Chain of Trust” from your domain up to the Root Servers. This key is usually stronger at 4096-bit.
Practical DNSSEC Implementation with BIND9
In this guide, I will be working on Ubuntu Server with BIND9 – the “king” of DNS servers. Let’s assume we are securing the zone for the domain lab.itfromzero.vn.
Step 1: Install Necessary Tools
First, update your system and install the latest BIND9 package:
sudo apt update && sudo apt install bind9 bind9utils -y
To manage keys more professionally, I’ll create a dedicated directory and grant permissions to the bind user:
sudo mkdir /etc/bind/keys
sudo chown bind:bind /etc/bind/keys
Step 2: Enable DNSSEC Features
By default, BIND9 might not have validation enabled. You need to open the configuration file:
sudo nano /etc/bind/named.conf.options
Find and check the following lines, ensuring they are not disabled:
dnssec-validation auto;
auth-nxdomain no;
listen-on-v6 { any; };
Step 3: Generate ZSK and KSK Key Pairs
This is where we create the “seal” for the domain. Navigate to the keys directory:
cd /etc/bind/keys
Create the ZSK (Zone Signing Key) using the RSASHA256 algorithm:
sudo dnssec-keygen -a RSASHA256 -b 2048 -n ZONE lab.itfromzero.vn
Next, create a stronger KSK (Key Signing Key):
sudo dnssec-keygen -a RSASHA256 -b 4096 -f KSK -n ZONE lab.itfromzero.vn
After these commands, you will see 4 files. Store the .private files very carefully. If these keys are leaked, an attacker could sign fraudulent records on your behalf.
Step 4: Sign the Zone and Publish Records
Now, embed the public keys into the original zone configuration file (e.g., /etc/bind/db.lab.itfromzero.vn). Add $INCLUDE lines pointing to the .key file paths you just created.
Then, use the following command to sign the entire 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
This command uses NSEC3 (parameter -3) to prevent “Zone Walking” – a technique hackers use to enumerate all your subdomains. The result is a db.lab.itfromzero.vn.signed file.
Step 5: Apply the New Configuration
Modify the /etc/bind/named.conf.local file so BIND reads the signed file:zone "lab.itfromzero.vn" {
type master;
file "/etc/bind/db.lab.itfromzero.vn.signed";
};
Restart the service to complete the process: sudo systemctl restart bind9.
Completing the Chain of Trust with DS Records
Many of you wonder why checks still fail after configuration. The reason is that you haven’t reported the key to your Domain Registrar.
When signing the zone, a dsset-lab.itfromzero.vn. file will appear. You need to take the DS (Delegation Signer) record content from this file and paste it into the DNSSEC Management section of your registrar’s dashboard, such as Mắt Bão, Cloudflare, or GoDaddy. This step is like getting your signature notarized by a local authority.
Verification and Maintenance
The fastest way to check is using the command dig +dnssec lab.itfromzero.vn. If RRSIG records appear, you have succeeded. For a more visual approach, visit DNSViz.net. A diagram that is entirely green means your system is secure.
Important Note: DNSSEC signatures have an expiration date (usually 30 days). If you let the signatures expire without resigning, browsers will completely block your website. I recommend setting up a cronjob to automatically run the dnssec-signzone command every month to avoid this risk.
Security is a continuous process. DNSSEC doesn’t make your website run faster, but it ensures your users never end up at the wrong address.

