DNSSEC HOWTO

Obsah | Zpět | Dále

IV. Přílohy

A Instalace BIND

Autor má povědomí o dvou open-source referenčních implementacích DNSSEC pro autoritativní servery: BIND a NSD. BIND je v současnosti jediným open-source rekurzivním jmenným serverem, který zvládá ověření DNSSEC.

DNSSEC je k dispozici od BIND 9.3.0. Nejnovější verzi BIND naleznete na ftp serveru společnosti ISC. Podpora DNSSEC je nekompilována, pokud je během kompilace nakonfigurována knihovna openssl.

konfigurujte s příznakem --with-openssl.

Pokud chcete zakompilovat oprávnění (viz oddíl 7) „sigchase“ do „dig“ budete muset nastavit proměnnou STF_CDEFINES na -DDIG_SIGCHASE=1

Zkontrolujte výstup config, abyste se ujistili, že bylo nalezeno openssl. Například:

  cd /usr/local/src
   tar -xzf bind-9.3.2.tar.gz
   cd bind-9.3.2
   ./configure --prefix=/usr/local --with-openssl=/sw/ STD_CDEFINES="-DDIG_SIGCHASE=1"

  ...
  Checking whether byte ordering is bigendian... yes
  checking for OpenSSL library... using openssl from /sw//lib and /sw//include
  checking whether linking with OpenSSL works... yes
  ...

Nezapomeňte prosím, že BIND 9.3.0 nemá implicitně povolen DNSSEC. Proto musíte v oddílu možností named.conf použít příkaz dnssec-enable.

     options { 
      // turn on dnssec awareness
      dnssec-enable yes;

      };

B Odhad zvětšení zóny

Při plánování podepisování zón musíte brát v úvahu, že podepisování zón zvětší váš zónový soubor a zabere větší množství paměti v autoritativních jmenných serverech. Provedli jsme několik měření, kdy jsme vyjmuli řadu zónových souborů, podepsali je a nahráli na jmenný server.

Začali jsme s 1,8 tisícem zón, které RIPE NCC poskytuje na svých autoritativních serverech. Pro řadu těchto zón je RIPE NCC primárním serverem, ale pro větší část těchto zón je RIPE NCC sekundárním serverem. Zóny mohou být rozděleny zhruba do dvou tříd; zóny „end-node“ a „delegační“ zóny. V zónách end-node jsou data pro většinu jmen v zóně autoritativní (většina jmen obsahujících např. A, AAAA nebo PTR). Delegační zóny obsahují většinou záznamy (NS) delegování, jedná se obvykle o vrcholové domény a „ reverzní delegační“ domény.

Podepsali jsme zónové soubory 1024 bit RSASHA1 klíčem podepisujícím zóny. Během podepisování byly připojeny NSEC RR spolu s odpovídajícími RRSIG a podepsány všechny RRsety v zóně. Jelikož delegování NS RR není autoritativní součástí dat, nebyl vytvořen žádný podpis.

Obvykle jsou pro zónu „end-node“ vytvářeny jeden NSEC a dva RRSIG, zatímco pro zónu delegačního typu je vytvářen pouze jeden od každého typu bezpečnostního záznamu. Na obrázku 16 jsme zakreslili zvětšení zónového souboru jako funkci počtu záznamů NSEC. Počet záznamů NSEC koreluje s počtem doménových jmen v zóně. Na obrázku můžete jasně vidět bimodální rozdělení. Jedno pro „end-node“ typ zón a jedno pro delegační typ zón.

Na těchto datech jsme vyzkoušeli dvě přímé závislosti a zjistili, že u zóny delegačního typu se zvětší velikost o 350 bytů na jméno vlastníka, zatímco u zóny „end-node“ se zvětší o 672 bytů na jméno vlastníka.

Na obrázku 17 níže jsme zakreslili poměr mezi zvětšením jádra ve vztahu k zvětšení zónového souboru v důsledku podpisu. Poměr je lineární s koeficientem přibližně 0,73. Zvětšení jádra představuje u zóny delegačního typu asi 200 bytů a u zóny typu „end-node“ asi 500 bytů.

Tyto parametry můžete použít pro výpočet přibližné velikosti. Výsledky se mohou lišit v závislosti na velikosti a algoritmu klíče, který používáte, verzi BIND19 a obsahu zóny.

Velikost zóny vs počet jmen vlastníků

Obrázek 16: Velikost zóny vs počet jmen vlastníků

Velikost jádra vs velikost zónového souboru

Obrázek 17: Velikost jádra vs velikost zónového souboru

C Generování náhodných čísel

Generování klíčů a v případě algoritmů DSA generování podpisů vyžaduje náhodná čísla. Měli byste dohlédnout na to, že váš generátor náhodných čísel vytváří „opravdu“ náhodná čísla. Kvalita softwarově generovaných náhodných čísel je diskutabilní. To se týká také metod /dev/random. Ty získávají „náhodnost“ z časů odezvy hardwaru. Měli byste se ujistit, že váš operační systém vytváří proud kvalitních náhodných čísel. U počítače, který nemá žádné vnější zdroje „náhodnosti“, to může být komplikované a může to zapříčinit zablokování vašeho generátoru, nebo podepisovacího nástroje při čekání na entropii („náhodnost“).

Jedním z relativně snadných nástrojů pro testování „náhodnosti“ datových toků je ent od Fourmilab. Nebo můžete použít nástroj institutu NIST. „Dobré“ výsledky měření z entu nebo nástrojů NIST by neměly být považovány za důkaz toho, že je váš generátor náhodných čísel dokonalý. Mohou existovat systémové vlivy, které se pomocí tohoto konkrétního nástroje 20 těžko objevují.

Relativně levným zdrojem náhodných dat jsou USB krypto žetony. Více informací o těchto žetonech a generování náhodných čísel naleznete na webové stránce Openfortress.

D Knihovna Net::DNS::SEC v Perlu

Pokud hledáte nástroj pro správu vašich zón DNSSEC, možná vás bude zajímat knihovna Net::DNS::SEC dostupná na CPAN. S použitím tohoto rozšíření knihovny Net::DNS je velice snadné psát skripty, jako je ten níže uvedený, který ověřuje, zda podpisy přes SOA nevyprší během následujících 24 hodin.

  #!/usr/local/bin/perl -T -Wall
  #

  # checkexpire.pl

  # Příkladový skript, který se dotazuje autoritativního serveru na záznam SOA a ověřuje, že podpisy záznamu jsou stále 
  # platné a v následujících 24 hodinách nevyprší.

  # Tento komentovaný a do jisté míry upovídaný skript je napsán pouze pro demonstrační účely, a proto nejsou testovány 
  # případné chybové stavy.

  use strict;
  use Net::DNS::SEC;
  use Time::Local;

  # Doména a její master server.
  my $domain="secret-wg.org";
  my $authoritative_server="ns.secret-wg.org";

  # Nastavení resolveru (použijte dokumentaci pro Perl Net::DNS::Resolver této třídy a těchto metod)
  my $res = Net::DNS::Resolver->new();

  # Dotazujte se implicitního resolveru, abyste zjistili, jaká je adresa autoritativního serveru.

  my $answerpacket_auth_server= $res->query($authoritative_server,"A");

  # Prostudujte paket viz dokumentace pro Perl Net::DNS::Packet a dokumentace pro Perl Net::DNS::RR::A. Nebereme 
  # v úvahu ověřování chyb. Předpokládáme, že první RR v oddíle odpovědí je A RR pro ns.secret-wg.org.

  my $auth_address=($answerpacket_auth_server->answer)[0]->address;

  # Nastavte cílový resolver tak, aby dotazoval autoritativní server.
  $res->nameserver( $auth_address );

  # Nastavte resolver tak, aby komunikoval DNSSEC
  $res->dnssec(1);

  # Pošlete dotaz pro SOA autoritativnímu jmennému serveru.
  my $packet=$res->send($domain,"SOA");

  # Prostudujte oddíl odpovědí a uvědomte si, že může obsahovat více než jeden RRSIG (pro definici existuje
  # vždy jeden SOA RR).

  my $soa;
  my @soasig;
  foreach my $rr ( $packet->answer ){
      if ($rr->type eq "SOA"){
          $soa=$rr;
          next;
      }
      if ($rr->type eq "RRSIG"){
          push @soasig,$rr;
          next;
      }
  }


  die "NO SOA RR found" unless $soa;
  die "NO RRSIGs over the SOA found" unless @soasig;
  print @soasig ." signatures found\n";

  # Získejte klíče, které patří do této zóny (DNSKEY jsou aktivní jako SOA v apexu).

  my @keyrr;

  $packet=$res->send($domain,"DNSKEY");
  foreach my $rr ( $packet->answer ){
          if ($rr->type eq "DNSKEY"){
          push @keyrr,$rr;
          next;
      }
  }


  die "NO DNSKEYS found for $domain" unless @keyrr;



      # Nyní zpracujte všechny podpisy, získejte veřejnou část klíče, pomocí které byl vytvořen,
      # ověřte podpis a porovnejte data.
      # Přístupové metody k vnitřním položkám RRSIG naleznete v dokumentaci pro Perl Net::DNS::RR::RRSIG

 SIGLOOP: foreach my $sig ( @soasig ){
      print "Checking signature made with key ".$sig->keytag ."\n";
      # verify the signature.
      # first select the key with the proper keytag from the key set.
      my $keyfound=0;
    KEYLOOP: foreach my $key (@keyrr){
        next KEYLOOP if ($key->keytag != $sig->keytag);
        $keyfound=$key;
        last KEYLOOP;
    }
      print "WARNING: NO public key found to validate:\n " .
   $sig->string."\n" unless $keyfound;

      # Proveďte reálné ověření.
      if (! $sig->verify([ $soa ],$keyfound)){
        # Podpis se neověřil. Řekněte proč.
        print "WARN: Signature made with " .$sig->keytag . " failed to verify:\n".
             $sig->vrfyerrstr;

      }else{

      # Podpis se ověřil.
      # Ověřme si, zda máme více než 24 hodin před vypršením.

      $sig->sigexpiration =~ /(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/;
      my $expiration=timegm ($6, $5, $4, $3, $2-1, $1-1900);
      my $hourstogo=($expiration-time())/3600;
      print "WARNING: Signature made with ".$sig->tag. "will expire within ".
             $hourstogo . " hours\n" if $hourstogo <24;

      }

  }



  ####
  # $Id: expire.pl 21 2004-10-11 14:52:09Z olaf $   
  ####

Obsah | Zpět | Dále