복붙노트

[PYTHON] 도메인이 DNSSEC로 보호되어 있는지 프로그래밍 방식으로 확인

PYTHON

도메인이 DNSSEC로 보호되어 있는지 프로그래밍 방식으로 확인

제목에 따르면 DNSSEC을 사용하여 도메인에 대한 DNS 응답이 프로그래밍 방식으로 검사되는지 확인하려고합니다. 내가 어떻게 할 수 있니?

이것에 대한 pythonic 솔루션이 있다면 그것은 좋을 것입니다.

최신 정보: 응답 요청이 변경되었습니다. 혼란스러워서 죄송합니다.

해결법

  1. ==============================

    1.DNS 리졸버 (예 : dnspython)를 사용하면 DNSKEY RRset에 대해 도메인을 쿼리하고 DO (dnssec OK) 쿼리 플래그를 설정할 수 있습니다. 쿼리가 성공하면 대답에는 AD (인증 된 데이터) 플래그가 설정되고 영역에 대한 RRSIG 서명 (서명 된 경우)이 포함됩니다.

    DNS 리졸버 (예 : dnspython)를 사용하면 DNSKEY RRset에 대해 도메인을 쿼리하고 DO (dnssec OK) 쿼리 플래그를 설정할 수 있습니다. 쿼리가 성공하면 대답에는 AD (인증 된 데이터) 플래그가 설정되고 영역에 대한 RRSIG 서명 (서명 된 경우)이 포함됩니다.

    업데이트 : 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
    
  2. ==============================

    2.특정 요청이 보호되는지 확인하려면 요청 패킷의 DO 플래그를 확인하십시오. DNS에 인터페이스하기 위해 사용하는 언어와 라이브러리가 무엇이든간에 ( "dnssec"과 같은 다른 이름으로 불려질 ​​수도있는) 액세서가 있어야합니다.

    특정 요청이 보호되는지 확인하려면 요청 패킷의 DO 플래그를 확인하십시오. DNS에 인터페이스하기 위해 사용하는 언어와 라이브러리가 무엇이든간에 ( "dnssec"과 같은 다른 이름으로 불려질 ​​수도있는) 액세서가 있어야합니다.

    첫 번째 대답은 정확하지만 특정 영역이 보호되는지 알고 싶으면 불완전합니다. 설명 된 절차는 영역의 자체 데이터에 서명 여부를 알려줍니다. 해당 영역에 대한 위임이 보호되는지 확인하려면 관심 영역에 대한 (올바르게 서명 된) DS 레코드를 부모 영역의 네임 서버에 요청해야합니다.

  3. from https://stackoverflow.com/questions/26137036/programmatically-check-if-domains-are-dnssec-protected by cc-by-sa and MIT license