Thứ tư, 19/03/2014 | 00:00 GMT+7

Cách thiết lập DNSSEC trên server DNS BIND ủy quyền


Giới thiệu về DNSSEC

Ta đều biết rằng DNS là một giao thức phân giải domain thành địa chỉ IP, nhưng làm cách nào để biết tính xác thực của địa chỉ IP được trả về? Kẻ tấn công có thể giả mạo phản hồi DNS hoặc đầu độc bộ nhớ cache DNS và đưa user đến một trang web độc hại có domain hợp lệ trên thanh địa chỉ. Tiện ích mở rộng bảo mật DNS (DNSSEC) là một đặc điểm kỹ thuật nhằm mục đích duy trì tính toàn vẹn dữ liệu của các phản hồi DNS. DNSSEC ký tất cả các bản ghi tài nguyên DNS (A, MX, CNAME, v.v.) của một vùng sử dụng PKI (Cơ sở hạ tầng public key ). Như vậy, các trình phân giải DNS được kích hoạt DNSSEC (như Google Public DNS) có thể xác minh tính xác thực của phản hồi DNS (chứa địa chỉ IP) bằng cách sử dụng bản ghi DNSKEY công khai.

Bản ghi tài nguyên DNSSEC

Bản ghi tài nguyên (RR) chứa thông tin cụ thể về domain . Một số bản ghi phổ biến là bản ghi chứa địa chỉ IP của domain , bản ghi AAAA chứa thông tin IPv6 và bản ghi MX có server thư của một domain . Bạn có thể tìm thấy danh sách đầy đủ các DNS RR tại đây .

Tương tự như vậy DNSSEC cũng yêu cầu một số RR.

  • DNSKEY Giữ public key mà trình phân giải sử dụng để xác minh.
  • RRSIG Tồn tại cho mỗi RR và chứa chữ ký điện tử của một bản ghi.
  • DS - Người ký ủy quyền - bản ghi này tồn tại trong server định danh của TLD. Vì vậy, nếu example.com là domain của bạn, TLD là “com” và server định danh của nó là a.gtld-servers.net. , b.gtld-servers.net. lên đến m.gtld-servers.net. . Mục đích của bản ghi này là để xác minh tính xác thực của chính DNSKEY.

Môi trường cài đặt

Tên domain : example.com

Tôi đã sử dụng domain .COM thực để thực hiện việc này, nhưng đã thay thế nó bằng example.com cho bài viết này.

Server tên chính:
Địa chỉ IP: 1.1.1.1
Tên server : master.example.com
Hệ điều hành: Debian 7

Server tên slaver :
Địa chỉ IP: 2.2.2.2
Tên server : slave.example.com
Hệ điều hành: CentOS

Vị trí và tên file

Tên và vị trí của các file cấu hình và vùng của BIND khác nhau tùy theo bản phân phối Linux được sử dụng.

Debian / Ubuntu

Tên dịch vụ:
ràng buộc9
Tệp cấu hình chính:
/etc/bind/named.conf.options
Tệp tên vùng:
/etc/bind/named.conf.local
Vị trí file vùng mặc định:
/var/cache/bind/

CentOS / Fedora

Tên dịch vụ:
được đặt tên
Tệp cấu hình chính và tên vùng:
/etc/named.conf
Vị trí file vùng mặc định:
/var/named/

Những điều này có thể thay đổi nếu bạn đang sử dụng bind-chroot . Đối với hướng dẫn này, tôi đã sử dụng Debian cho Master NS và CentOS cho Slave NS, vì vậy hãy thay đổi nó theo bản phân phối của bạn.

Cấu hình chính DNSSEC

Bật DNSSEC bằng cách thêm các lệnh cấu hình sau vào bên trong options{ }

nano /etc/bind/named.conf.options

dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; 

Có thể những thứ này đã được thêm vào trong một số bản phân phối. Điều hướng đến vị trí của các file vùng của bạn.

cd /var/cache/bind 

Tạo khóa ký vùng (ZSK) bằng lệnh sau.

dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE example.com 

Nếu bạn đã cài đặt hasged , sẽ chỉ mất vài giây để tạo khóa này; nếu không sẽ mất một thời gian rất dài. Đầu ra mẫu.

root@master:/var/cache/bind# dnssec-keygen -a NSEC3RSASHA1 -b 2048 -n ZONE example.com Generating key pair..................+++ .............+++ Kexample.com.+007+40400 

Tạo Khóa ký chính (KSK) bằng lệnh sau.

dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE example.com 

Đầu ra mẫu.

root@master:/var/cache/bind# dnssec-keygen -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE example.com Generating key pair......................++ .............................................................................................................................................................................................................++ Kexample.com.+007+62910 

Thư mục bây giờ sẽ có 4 khóa - cặp riêng tư / công khai của ZSK và KSK. Ta phải thêm các public key chứa bản ghi DNSKEY vào file vùng. Vòng lặp for sau đây sẽ thực hiện điều này.

for key in `ls Kexample.com*.key` do echo "\$INCLUDE $key">> example.com.zone done 

Ký vùng bằng lệnh dnssec-signzone .

dnssec-signzone -3 <salt> -A -N INCREMENT -o <zonename> -t <zonefilename> 

Thay thế muối bằng thứ gì đó ngẫu nhiên. Đây là một ví dụ với kết quả .

root@master:/var/cache/bind# dnssec-signzone -A -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) -N INCREMENT -o example.com -t example.com.zone Verifying the zone using the following algorithms: NSEC3RSASHA1. Zone signing complete: Algorithm: NSEC3RSASHA1: KSKs: 1 active, 0 stand-by, 0 revoked                         ZSKs: 1 active, 0 stand-by, 0 revoked example.com.zone.signed Signatures generated:                       14 Signatures retained:                         0 Signatures dropped:                          0 Signatures successfully verified:            0 Signatures unsuccessfully verified:          0 Signing time in seconds:                 0.046 Signatures per second:                 298.310 Runtime in seconds:                      0.056 

Một chuỗi 16 ký tự phải được nhập dưới dạng "muối". Lệnh sau

head -c 1000 /dev/random | sha1sum | cut -b 1-16 

xuất ra một chuỗi ngẫu nhiên gồm 16 ký tự sẽ được sử dụng làm muối.

Điều này tạo ra một file mới có tên example.com.zone.signed chứa các bản ghi RRSIG cho mỗi bản ghi DNS. Ta phải yêu cầu BIND tải vùng “đã ký” này.

nano /etc/bind/named.conf.local 

Thay đổi tùy chọn file bên trong phần zone { } .

zone "example.com" IN {     type master;     file "example.com.zone.signed";     allow-transfer { 2.2.2.2; };     allow-update { none; }; }; 

Lưu file này và reload liên kết

service bind9 reload 

Kiểm tra xem bản ghi DNSKEY có sử dụng dig trên cùng một server hay không.

dig DNSKEY example.com. @localhost +multiline 

Đầu ra mẫu

root@master:/var/cache/bind# dig DNSKEY example.com. @localhost +multiline ;; Truncated, retrying in TCP mode.  ; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> DNSKEY example.com. @localhost +multiline ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43986 ;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available  ;; QUESTION SECTION: ;example.com.       IN DNSKEY  ;; ANSWER SECTION: example.com.        86400 IN DNSKEY   256 3 7 (                 AwEAActPMYurNEyhUgHjPctbLCI1VuSj3xcjI8QFTpdM                 8k3cYrfwB/WlNKjnnjt98nPmHv6frnuvs2LKIvvGzz++                 kVwVc8uMLVyLOxVeKhygDurFQpLNNdPumuc2MMRvV9me                 fPrdKWtEEtOxq6Pce3DW2qRLjyE1n1oEq44gixn6hjgo                 sG2FzV4fTQdxdYCzlYjsaZwy0Kww4HpIaozGNjoDQVI/                 f3JtLpE1MYEb9DiUVMjkwVR5yH2UhJwZH6VVvDOZg6u6                 YPOSUDVvyofCGcICLqUOG+qITYVucyIWgZtHZUb49dpG                 aJTAdVKlOTbYV9sbmHNuMuGt+1/rc+StsjTPTHU=                 ) ; key id = 40400 example.com.        86400 IN DNSKEY   257 3 7 (                 AwEAAa2BE0dAvMs0pe2f+D6HaCyiFSHw47BA82YGs7Sj                 qSqH3MprNra9/4S0aV6SSqHM3iYZt5NRQNTNTRzkE18e                 3j9AGV8JA+xbEow74n0eu33phoxq7rOpd/N1GpCrxUsG                 kK4PDkm+R0hhfufe1ZOSoiZUV7y8OVGFB+cmaVb7sYqB                 RxeWPi1Z6Fj1/5oKwB6Zqbs7s7pmxl/GcjTvdQkMFtOQ                 AFGqaaSxVrisjq7H3nUj4hJIJ+SStZ59qfW3rO7+Eqgo                 1aDYaz+jFHZ+nTc/os4Z51eMWsZPYRnPRJG2EjJmkBrJ                 huZ9x0qnjEjUPAcUgMVqTo3hkRv0D24I10LAVQLETuw/                 QOuWMG1VjybzLbXi5YScwcBDAgtEpsQA9o7u6VC00DGh                 +2+4RmgrQ7mQ5A9MwhglVPaNXKuI6sEGlWripgTwm425                 JFv2tGHROS55Hxx06A416MtxBpSEaPMYUs6jSIyf9cjB                 BMV24OjkCxdz29zi+OyUyHwirW51BFSaOQuzaRiOsovM                 NSEgKWLwzwsQ5cVJBEMw89c2V0sHa4yuI5rr79msRgZT                 KCD7wa1Hyp7s/r+ylHhjpqrZwViOPU7tAGZ3IkkJ2SMI                 e/h+FGiwXXhr769EHbVE/PqvdbpcsgsDqFu0K2oqY70u                 SxnsLB8uVKYlzjG+UIoQzefBluQl                 ) ; key id = 62910  ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Wed Nov 27 18:18:30 2013 ;; MSG SIZE  rcvd: 839 

Kiểm tra sự hiện diện của các bản ghi RRSIG.

dig A example.com. @localhost +noadditional +dnssec +multiline ; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> A example.com. @localhost +noadditional +dnssec +multiline ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 32902 ;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 3, ADDITIONAL: 5 ;; WARNING: recursion requested but not available  ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags: do; udp: 4096 ;; QUESTION SECTION: ;example.com.         IN A  ;; ANSWER SECTION: example.com.          86400 IN A 93.184.216.119 example.com.          86400 IN RRSIG A 7 2 86400 20131227171405 (                             20131127171405 40400 example.com.                             JCoL8L7As1a8CXnx1W62O94eQl6zvVQ3prtNK7BWIW9O                             lir/4V+a6c+0tbt4z4lhgmb0sb+qdvqRnlI7CydaSZDb                             hlrJA93fHqFqNXw084YD1gWC+M8m3ewbobiZgBUh5W66                             1hsVjWZGvvQL+HmobuSvsF8WBMAFgJgYLg0YzBAvwHIk                             886be6vbNeAltvPl9I+tjllXkMK5dReMH40ulgKo+Cwb                             xNQ+RfHhCQIwKgyvL1JGuHB125rdEQEVnMy26bDcC9R+                             qJNYj751CEUZxEEGI9cZkD44oHwDvPgF16hpNZGUdo8P                             GtuH4JwP3hDIpNtGTsQrFWYWL5pUuuQRwA== )  ;; AUTHORITY SECTION: example.com.          86400 IN NS master.example.com. example.com.          86400 IN NS slave.example.com. example.com.          86400 IN RRSIG NS 7 2 86400 20131227171405 (                             20131127171405 40400 example.com.                             hEGzNvKnc3sXkiQKo9/+ylU5WSFWudbUc3PAZvFMjyRA                             j7dzcVwM5oArK5eXJ8/77CxL3rfwGvi4LJzPQjw2xvDI                             oVKei2GJNYekU38XUwzSMrA9hnkremX/KoT4Wd0K1NPy                             giaBgyyGR+PT3jIP95Ud6J0YS3+zg60Zmr9iQPBifH3p                             QrvvY3OjXWYL1FKBK9+rJcwzlsSslbmj8ndL1OBKPEX3                             psSwneMAE4PqSgbcWtGlzySdmJLKqbI1oB+d3I3bVWRJ                             4F6CpIRRCb53pqLvxWQw/NXyVefNTX8CwOb/uanCCMH8                             wTYkCS3APl/hu20Y4R5f6xyt8JZx3zkZEQ== )  ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Thu Nov 28 00:01:06 2013 ;; MSG SIZE  rcvd: 1335 

Cấu hình của server chính đã hoàn tất.

Cấu hình DNSSEC Slave

Máy chủ phụ chỉ yêu cầu kích hoạt DNSSEC và thay đổi vị trí file vùng. Chỉnh sửa file cấu hình chính của BIND.

nano /etc/named.conf 

Đặt những dòng này bên trong phần options { } nếu chúng không tồn tại.

dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; 

Chỉnh sửa tùy chọn file bên trong phần zone { } .

zone "example.com" IN {     type slave;     file "example.com.zone.signed";     masters { 1.1.1.1; };     allow-notify { 1.1.1.1; }; }; 

Reload dịch vụ BIND.

service named reload 

Kiểm tra xem có file vùng .signed mới không.

[root@slave ~]# ls -l /var/named/slaves/ total 16 -rw-r--r-- 1 named named  472 Nov 27 17:25 example.com.zone -rw-r--r-- 1 named named 9180 Nov 27 18:29 example.com.zone.signed 

Thì đấy! Đó là nó. Chỉ đảm bảo mọi thứ đang hoạt động bình thường, hãy truy vấn DNSKEY bằng cách sử dụng dig như đã đề cập trong phần trước.

Cấu hình bản ghi DS với tổ chức đăng ký domain

Khi ta chạy lệnh dnssec-signzone ngoài file vùng .signed , một file có tên dsset-example.com cũng đã được tạo, file này chứa các bản ghi DS.

root@master:/var/cache/bind# cat dsset-example.com. example.com.        IN DS 62910 7 1 1D6AC75083F3CEC31861993E325E0EEC7E97D1DD example.com.        IN DS 62910 7 2 198303E265A856DE8FE6330EDB5AA76F3537C10783151AEF3577859F FFC3F59D 

Chúng phải được nhập vào console của công ty đăng ký domain của bạn. Ảnh chụp màn hình bên dưới sẽ minh họa các bước trên GoDaddy.

Đăng nhập vào console của công ty đăng ký domain , chọn domain của bạn và chọn tùy chọn để quản lý bản ghi DS. Control panel của GoDaddy trông như thế này.

 Control panel  Miền của GoDaddy

Đây là bản phân tích dữ liệu trong dsset-example.com. file .

Bản ghi DS 1:

Từ khóa: 62910
Thuật toán: 7
Loại thông báo: 1
Chữ số : 1D6AC75083F3CEC31861993E325E0EEC7E97D1DD

Bản ghi DS 1

Bản ghi DS 2:

Từ khóa: 62910
Thuật toán: 7
Loại thông báo: 2
Số: 198303E265A856DE8FE6330EDB5AA76F3537C10783151AEF3577859FFFC3F59D

Bản ghi DS 2

Bản ghi DS thứ hai trong dsset-example.com. file có một khoảng trống trong thông báo, nhưng khi nhập file đó vào biểu mẫu, bạn nên bỏ qua. Bấm Tiếp theo , bấm Kết thúcLưu profile .

Sẽ mất vài phút để lưu những thay đổi này. Để kiểm tra xem các bản ghi DS đã được tạo hay chưa, hãy truy vấn server tên của TLD của bạn. Thay vì tìm server định danh của TLD, ta có thể thực hiện dig +trace đơn giản hơn nhiều.

root@master:~# dig +trace +noadditional DS example.com. @8.8.8.8 | grep DS ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.17.rc1.el6_4.6 <<>> +trace +noadditional DS example.com. @8.8.8.8 example.com.          86400   IN      DS      62910 7 2 198303E265A856DE8FE6330EDB5AA76F3537C10783151AEF3577859F FFC3F59D example.com.          86400   IN      DS      62910 7 1 1D6AC75083F3CEC31861993E325E0EEC7E97D1DD 

Khi điều này được xác nhận, ta có thể kiểm tra xem DNSSEC có hoạt động tốt hay không bằng cách sử dụng bất kỳ dịch vụ trực tuyến nào sau đây.

Công cụ đầu tiên là một công cụ đơn giản, trong khi công cụ thứ hai cung cấp cho bạn hình ảnh trực quan về mọi thứ. Đây là ảnh chụp màn hình từ công cụ đầu tiên.

Chú ý những dòng tôi đã đánh dấu. Đầu tiên đề cập đến giá trị thẻ Khóa (62910) của bản ghi DS trong khi id khóa thứ hai (40400) của bản ghi DNSKEY giữ ZSK (Khóa ký vùng).

Sửa đổi bản ghi vùng

Mỗi lần bạn chỉnh sửa khu vực bằng cách thêm hoặc xóa các bản ghi, nó phải được ký để làm cho nó hoạt động. Vì vậy, ta sẽ tạo một script cho việc này để không phải gõ các lệnh dài mỗi lần.

root@master# nano /usr/sbin/zonesigner.sh  #!/bin/sh PDIR=`pwd` ZONEDIR="/var/cache/bind" #location of your zone files ZONE=$1 ZONEFILE=$2 DNSSERVICE="bind9" #On CentOS/Fedora replace this with "named" cd $ZONEDIR SERIAL=`/usr/sbin/named-checkzone $ZONE $ZONEFILE | egrep -ho '[0-9]{10}'` sed -i 's/'$SERIAL'/'$(($SERIAL+1))'/' $ZONEFILE /usr/sbin/dnssec-signzone -A -3 $(head -c 1000 /dev/random | sha1sum | cut -b 1-16) -N increment -o $1 -t $2 service $DNSSERVICE reload cd $PDIR 

Lưu file và làm cho nó có thể thực thi được.

root@master# chmod +x /usr/sbin/zonesigner.sh 

Khi nào bạn muốn thêm hoặc xóa bản ghi, hãy chỉnh sửa example.com.zone chứ KHÔNG phải file .signed . Tệp này cũng đảm nhận việc tăng giá trị nối tiếp, vì vậy bạn không cần thực hiện mỗi lần chỉnh sửa file . Sau khi chỉnh sửa, nó chạy tập lệnh bằng cách chuyển domain và tên file vùng làm tham số.

root@master# zonesigner.sh example.com example.com.zone 

Bạn không phải làm bất cứ điều gì trên server tên slaver vì nối tiếp tăng dần sẽ đảm bảo khu vực nếu được chuyển và cập nhật.

Bảo mật cài đặt DNSSEC khỏi Zone Walking

Zone Walking là một kỹ thuật được sử dụng để tìm tất cả các Bản ghi Tài nguyên của một vùng bằng cách truy vấn bản ghi NSEC (Next-Secure). NSEC3 đã được phát hành "băm" thông tin này bằng cách sử dụng một muối. Nhớ lại lệnh dnssec-signzone trong đó ta đã chỉ định tùy chọn -3 theo sau là một lệnh phức tạp khác để tạo một chuỗi ngẫu nhiên. Đây là muối có thể được tìm thấy bằng cách sử dụng truy vấn dig sau.

# dig NSEC3PARAM example.com. @master.example.com. +short 1 0 10 7CBAA916230368F2 

Tất cả những điều này làm cho việc đi bộ trong khu vực trở nên khó khăn nhưng không phải là không thể. Một tin tặc quyết tâm sử dụng bảng cầu vồng có thể phá vỡ hàm băm, mặc dù sẽ mất nhiều thời gian. Để ngăn chặn điều này, ta có thể tính toán lại muối này theo định kỳ, điều này khiến cho nỗ lực của hacker trở nên vô ích vì có một muối mới trước khi anh ta / cô ta có thể tìm thấy hàm băm với muối cũ. Tạo một công việc cron để thực hiện việc này cho bạn bằng cách sử dụng tập lệnh zoneigner.sh mà ta đã tạo trước đó. Nếu bạn chạy cronjob dưới dạng root bạn không phải lo lắng về quyền sở hữu file . Hoặc nếu không, hãy đảm bảo user mà bạn đang đặt cron có quyền ghi trên folder vùngquyền đọc trên các private key (Kexample.com. *. Private).

root@master:~# crontab -e  0       0       */3     *       *       /usr/sbin/zonesigner.sh example.com example.com.zone 

Điều này sẽ ký vùng 3 ngày một lần và kết quả là một loại muối mới sẽ được tạo ra. Bạn cũng sẽ nhận được một email chứa kết quả của lệnh dnssec-signzone .

<div class = “author”> Người gửi: <a rel=p>author[ href=osystemhttp://jesin.tk/[> Jesin A </a> </div>


Tags:

Các tin liên quan

Cách thiết lập DNSSEC trên server DNS BIND ủy quyền
2014-03-19
Cách cài đặt TrueCrypt (CLI) trên Linux
2014-03-17
Cách sử dụng Công cụ IPRoute2 để quản lý cấu hình mạng trên VPS Linux
2014-03-11
Cách sử dụng các lệnh và mở rộng lịch sử Bash trên VPS Linux
2014-03-05
Giới thiệu về Bảo mật VPS Linux của bạn
2014-03-04
Cách đọc và đặt các biến Môi trường và Hệ vỏ trên VPS Linux
2014-03-03
Cách đọc và đặt các biến Môi trường và Hệ vỏ trên VPS Linux
2014-03-03
Cách sử dụng cd, pwd và ls để khám phá hệ thống tệp trên server Linux
2014-02-28
Cách di chuyển server Linux Phần 1 - Chuẩn bị hệ thống
2014-02-27
Cách di chuyển server Linux Phần 2 - Truyền dữ liệu cốt lõi
2014-02-27