2014-10-01 14 views
5

Khi tiêu đề cho biết tôi muốn kiểm tra theo chương trình nếu đáp ứng DNS cho tên miền được bảo vệ bằng DNSSEC.
Tôi làm cách nào để thực hiện việc này?Kiểm tra theo chương trình nếu tên miền được DNSSEC bảo vệ

Thật tuyệt vời nếu có giải pháp pythonic cho việc này.

UPDATE: yêu cầu thay đổi để đáp lại, xin lỗi vì sự nhầm lẫn

+1

Điều này có vẻ phù hợp: http: // www.unbound.net/documentation/pyunbound/examples/example4.html – kasperd

+0

Liên kết tốt đẹp! Cảm ơn – Thorben

+0

Chúng tôi đã cố gắng sử dụng không liên kết trong một thời gian và nó không bao giờ hoạt động tốt. – vy32

Trả lời

11

Sử dụng một phân giải DNS (ví dụ dnspython), bạn có thể truy vấn tên miền cho DNSKEY RRset của nó và bật DO cờ truy vấn (DNSSEC OK). Nếu truy vấn thành công, câu trả lời sẽ có cờ AD (dữ liệu đã xác thực) và sẽ chứa chữ ký RRSIG cho vùng đó (nếu nó được ký).

Cập nhật: một ví dụ cơ bản sử dụng dnspython

import dns.name 
import dns.query 
import dns.dnssec 
import dns.message 
import dns.resolver 
import dns.rdatatype 

# get nameservers for target domain 
response = dns.resolver.query('example.com.',dns.rdatatype.NS) 

# we'll use the first nameserver in this example 
nsname = response.rrset[0] # name 
response = dns.resolver.query(nsname,dns.rdatatype.A) 
nsaddr = response.rrset[0].to_text() # IPv4 

# get DNSKEY for zone 
request = dns.message.make_query('example.com.', 
           dns.rdatatype.DNSKEY, 
           want_dnssec=True) 

# send the query 
response = dns.query.udp(request,nsaddr) 
if response.rcode() != 0: 
    # HANDLE QUERY FAILED (SERVER ERROR OR NO DNSKEY RECORD) 

# answer should contain two RRSET: DNSKEY and RRSIG(DNSKEY) 
answer = response.answer 
if len(answer) != 2: 
    # SOMETHING WENT WRONG 

# the DNSKEY should be self signed, validate it 
name = dns.name.from_text('example.com.') 
try: 
    dns.dnssec.validate(answer[0],answer[1],{name:answer[0]}) 
except dns.dnssec.ValidationFailure: 
    # BE SUSPICIOUS 
else: 
    # WE'RE GOOD, THERE'S A VALID DNSSEC SELF-SIGNED KEY FOR example.com 
+0

Tôi cũng đã tình cờ gặp dnspython, nhưng tôi không tìm được cách để lấy dữ liệu tôi cần từ nó và tài liệu thực sự xấu. Bạn có biết làm thế nào để mã này? – Thorben

+0

@Thorben Đã thêm một ví dụ cơ bản vào câu trả lời. – isedev

+0

Cảm ơn bạn. Mã có vẻ đẹp. Thật không may tôi nhận được một lỗi lạ 'TypeError: ép vào Unicode: cần chuỗi hoặc bộ đệm, NS tìm thấy' tại' response = dns.query.udp (yêu cầu, ns) ', nhưng tôi tin tưởng bạn rằng nó đang làm việc nói chung. Tuy nhiên, tôi đã kết thúc phân tích đầu ra của 'dig + dnssec domain'. – Thorben

2

Để xem một đặc biệt yêu cầu được bảo vệ, nhìn vào lá cờ DO trong gói theo yêu cầu. Bất cứ ngôn ngữ và thư viện nào bạn sử dụng để giao tiếp với DNS đều phải có một trình truy cập cho nó (nó có thể được gọi là một cái gì đó khác, như "dnssec").

Câu trả lời đầu tiên là chính xác nhưng không đầy đủ nếu bạn muốn biết nếu một khu vực nhất định được bảo vệ. Thủ tục được mô tả sẽ cho bạn biết liệu dữ liệu của vùng đó có được ký hay không. Để kiểm tra xem ủy quyền của khu vực có được bảo vệ hay không, bạn cần hỏi máy chủ định danh của khu vực mẹ để có bản ghi DS (được ký chính xác) cho vùng bạn quan tâm.

+0

Tôi đã có chính xác vấn đề này nhưng tôi không có bất kỳ ý tưởng làm thế nào để mở rộng mã để xác nhận chuỗi tin cậy với dnspython. Bạn có biết một ví dụ đơn giản? –

+1

Thật không may là không. Có mã thực hiện kiểm tra này (và nhiều người khác) trong công cụ phát hành gần đây của chúng tôi Zonemaster, nhưng được viết bằng Perl. Nếu bạn muốn xem nó, nó trên Github tại https://github.com/dotse/zonemaster-engine và hàm liên quan nhất là 'dnssec11' trong tập tin lib/Zonemaster/Test/DNSSEC.pm –

+0

, làm cách nào bạn kiểm tra xem một "phản hồi" cụ thể có được bảo vệ không? Chúng ta cũng xem xét sự tồn tại của "DO flag" trong gói phản hồi? – weefwefwqg3

Các vấn đề liên quan