dnssec-creatkey
changeset 19 2c3bcb280768
parent 13 4844031fc55e
child 20 5b52190d8750
equal deleted inserted replaced
18:8715e7b706db 19:2c3bcb280768
     1 #!/bin/bash
     1 #!/usr/bin/perl -w
     2 set -e
       
     3 
     2 
     4 #import aus der dnstools.conf
     3 use strict;
     5 source dnstools.conf
       
     6 master_dir=$MASTER_DIR
       
     7 key_counter_end=$KEY_COUNTER_END
       
     8 
     4 
       
     5 my $master_dir="/etc/bind/master";	# verzeichnis fuer bind
       
     6 my $key_counter_end="2";		# ablauf des schluessels
       
     7 my @zones = `ls $master_dir`;	# alle verwalteten zonen
       
     8 my @change;			# liste abgelaufener zonen
       
     9 my @manu;			# liste manuell eingegebener zonen aus ARGV
       
    10 my @index;
       
    11 my $zone;
       
    12 my $keyname;
     9 
    13 
    10 # gibt alle zonen ohne zsk in die standard-ausgabe
    14 # prueft ob eingaben in ARGV domains sind und gibt sie in die liste @manu
    11 function test_zsk_new {
    15 foreach (@ARGV) {
    12 	for zone in $master_dir/*
    16 	chomp ($zone = `idn --quiet "$_"`);
    13 	do
    17 
    14 		test -f $zone/${zone##*/}.signed || continue
    18 	if (-e "$master_dir/$zone") {
    15 		test -f $zone/.index.zsk || echo ${zone##/*/}
    19 		push (@manu, $zone);
    16 	done
    20 	} else {
       
    21 		print " $zone ist keine verwaltete zone \n ";
       
    22 	}
       
    23 }
       
    24 	
       
    25 # gibt alle zonen mit abgelaufenen keycounter in die liste @change
       
    26 foreach (@zones) {
       
    27 	chomp ($zone = $_);
       
    28 	my $key;
       
    29 
       
    30 	if (-e "$master_dir/$zone/.keycounter") {
       
    31 
       
    32 		open (KEY, "$master_dir/$zone/.keycounter");
       
    33 		$key = <KEY>;
       
    34 		close (KEY);
       
    35 
       
    36 		if ($key_counter_end < $key) {
       
    37 			push (@change, $zone);
       
    38 		}
       
    39 	}
       
    40 }
       
    41 
       
    42 #erzeugt zsks
       
    43 foreach (@change, @manu) {
       
    44 	$zone = $_;
       
    45 
       
    46 	chdir "$master_dir/$zone" or die "chdir nach / nicht moeglich: $1";
       
    47 	$keyname = `dnssec-keygen -a RSASHA1 -b 512 -n ZONE $zone`;
       
    48 
       
    49 	if (-e ".index.zsk") {
       
    50 		open (INDEX, ".index.zsk");
       
    51 		@index = <INDEX>;
       
    52 		close (INDEX);
       
    53 	} else {
       
    54 		@index = ();
       
    55 	}
       
    56 
       
    57 	push @index, $keyname;
       
    58 	if (@index > 2){
       
    59 		shift (@index);
       
    60 	}
       
    61 
       
    62 	open (INDEX, ">.index.zsk");
       
    63 	print INDEX @index;
       
    64 	close (INDEX);
       
    65 
       
    66 	chomp ($keyname);
       
    67 	print "$keyname (ZSK) erzeugt fuer $zone \n";
       
    68 
       
    69 	open (KC, ">.keycounter");
       
    70 	print KC "0";
       
    71 	close (KC);
       
    72 }
       
    73 
       
    74 #erzeugt ksks
       
    75 foreach (@manu) {
       
    76 	$zone = $_;
       
    77 
       
    78 	chdir "$master_dir/$zone" or die "chdir nach / nicht moeglich: $1";
       
    79 	$keyname = `dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE $zone`;
       
    80 
       
    81 	if (-e ".index.ksk") {
       
    82 		open (INDEX, ".index.ksk");
       
    83 		@index = <INDEX>;
       
    84 		close (INDEX);
       
    85 	} else {
       
    86 		@index = ();
       
    87 	}
       
    88 
       
    89 	push @index, $keyname;
       
    90 	if (@index > 2){
       
    91 		shift (@index);
       
    92 	}
       
    93 
       
    94 	open (INDEX, ">.index.ksk");
       
    95 	print INDEX @index;
       
    96 	close (INDEX);
       
    97 
       
    98 	chomp ($keyname);
       
    99 	print "$keyname (KSK) erzeugt fuer $zone \n";
    17 }
   100 }
    18 
   101 
    19 
   102 
    20 # gibt alle zonen ohne ksk in die standard-ausgabe
   103 # loescht alle unbenoetigten schluessel, fuegt die schluessel in
    21 function test_ksk_new {
   104 # die zone-datei
    22 	for zone in $master_dir/*
   105 foreach (@change, @manu) {
    23 	do
   106 	$zone = $_;
    24 		test -f $zone/${zone##*/}.signed || continue
   107 	my @old_zone_content = ();
    25 		test -f "$zone/.index.ksk" || echo ${zone##/*/}
   108 	my @new_zone_content = ();
    26 	done
   109 	my @keylist = ();
       
   110 	my $file = ();
       
   111 
       
   112 	open (INDEX, "$master_dir/$zone/.index.zsk");
       
   113 	@keylist = <INDEX>;
       
   114 	close (INDEX);
       
   115 
       
   116 	open (INDEX, "$master_dir/$zone/.index.ksk");
       
   117 	push @keylist, <INDEX>;
       
   118 	close (INDEX);
       
   119 
       
   120 	open (ZONE, "$master_dir/$zone/$zone");
       
   121 	@old_zone_content = <ZONE>;
       
   122 	close (ZONE);
       
   123 
       
   124 	# kuerzt die schluessel-bezeichnung aus der indexdatei auf die id um sie
       
   125 	# besser vergleichen zu koennen.
       
   126 	foreach (@keylist) {
       
   127 		chomp;
       
   128 		s#K.*\+.*\+(.*)#$1#;
       
   129 	}
       
   130 
       
   131 	# filtert alle schluessel aus der zonedatei
       
   132 	# old_zone_content ==> new_zone_content
       
   133 	foreach (@old_zone_content) {
       
   134 		unless (/IN\sDNSKEY/) {
       
   135 			push @new_zone_content, $_;
       
   136 		}
       
   137 	}
       
   138 
       
   139 	# prueft alle schluesseldateien (ksk, zsk) ob sie in der jeweiligen
       
   140 	# indexdatei beschrieben sind. wenn nicht werden sie geloescht.
       
   141 	foreach (`ls $master_dir/$zone/K*[key,private]`){
       
   142 		chomp;
       
   143 		$file = $_;
       
   144 		my $rm_count = 1;
       
   145 
       
   146 		foreach (@keylist) {
       
   147 
       
   148 			if ($file =~ /$_/) {
       
   149 				$rm_count = 0;
       
   150 
       
   151 				# schluessel die in der indexdatei standen, werden an die
       
   152 				# zonedatei angehangen.
       
   153 				if ($file =~ /.*key/) {
       
   154 					open (KEYFILE, "$file");
       
   155 					push @new_zone_content, <KEYFILE>;
       
   156 					close (KEYFILE);
       
   157 					
       
   158 					last;
       
   159 				}
       
   160 			}
       
   161 		}
       
   162 
       
   163 		#loescht alle unbenoetigten schluessel
       
   164 		if ($rm_count == 1) {
       
   165 			print `rm -f $file`;
       
   166 		}
       
   167 	}
       
   168 
       
   169 	open (ZONE, ">$master_dir/$zone/$zone");
       
   170 	print ZONE @new_zone_content;
       
   171 	close (ZONE);
       
   172 	
       
   173 	print "$master_dir/$zone/$zone wurde neu erstellt \n";
    27 }
   174 }
    28 
       
    29 
       
    30 # gibt alle zonen mitabgelaufenen keycounter in die standardausgabe
       
    31 function test_zsk_time {		# prueft den keycounter
       
    32 	for zone in $master_dir/*
       
    33 	do
       
    34 		test -f $zone/${zone##*/}.signed || continue
       
    35 		test -f $zone/keycounter || echo 0 > $zone/keycounter
       
    36 		key_counter=`< $zone/keycounter`
       
    37 	
       
    38 		if [ $key_counter_end -le $key_counter ]
       
    39 		then
       
    40 			echo ${zone##/*/} 
       
    41 		fi
       
    42 	done
       
    43 }
       
    44 
       
    45 
       
    46 #prueft die eingegebnen domains und erstellt eine liste
       
    47 for utf8domain in $@
       
    48 do
       
    49         domain=$(idn --quiet "$utf8domain")
       
    50 
       
    51         if [ -d $master_dir/$domain ]
       
    52         then
       
    53                 zsk_manuell="$zsk_manuell $domain"
       
    54         else
       
    55                 echo $domain ist keine verwaltete Zone
       
    56         fi
       
    57 done
       
    58 
       
    59 
       
    60 # gibt die standard-ausgabe aus den funktionen in listen
       
    61 zsk_time=`test_zsk_time`
       
    62 zsk_new=`test_zsk_new`
       
    63 ksk_new=`test_ksk_new`
       
    64 
       
    65 
       
    66 # erstellt zsks
       
    67 for NEW_ZSK_ZONE in $zsk_time $zsk_manuell
       
    68 do
       
    69 	cd $master_dir/$NEW_ZSK_ZONE
       
    70 	echo "erzeugt zsk fuer" $NEW_ZSK_ZONE
       
    71 	dnssec-keygen -a RSASHA1 -b 512 -n ZONE $NEW_ZSK_ZONE >> .index.zsk
       
    72 	INDEX_ZSK=$( tail -n2 .index.zsk )
       
    73 	echo $INDEX_ZSK | fmt -w1 > .index.zsk
       
    74 
       
    75 	echo 0 > keycounter	
       
    76 done
       
    77 
       
    78 
       
    79 # erstellt ksks
       
    80 for NEW_KSK_ZONE in $zsk_manuell
       
    81 do	
       
    82 	cd $master_dir/$NEW_KSK_ZONE
       
    83 	echo "erzeugt ksk fuer" $NEW_KSK_ZONE
       
    84 	dnssec-keygen -a RSASHA1 -b 2048 -f KSK -n ZONE $NEW_KSK_ZONE >> .index.ksk
       
    85 	INDEX_KSK=$( tail -n2 .index.ksk )
       
    86 	echo $INDEX_KSK | fmt -w1 > .index.ksk
       
    87 done
       
    88 
       
    89 
       
    90 # fuegt die schluessel in die zone-datei
       
    91 for zone in $zsk_time $zsk_manuell
       
    92 do
       
    93 	cd $master_dir/$zone
       
    94 
       
    95 	#loescht alle Schluessel die nicht in der indexdatei stehen
       
    96 	rm $(ls K*[key,private] | grep -v "`cat .index.zsk`" | grep -v "`cat .index.ksk`") 2>/dev/null || true
       
    97 
       
    98 	#erzeugt ein backup und entfernt alle schluessel aus der zonedatei
       
    99 	mv $zone .$zone
       
   100 	grep -v 'DNSKEY' .$zone >> $zone
       
   101 
       
   102 	#fuegt die existirenden schluessel in die zonedatei ein
       
   103 	cat K$zone.*key >> $zone
       
   104 done