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 |
|