|
1 #! /usr/bin/perl -w |
|
2 |
|
3 use strict; |
|
4 |
|
5 my $sign_alert_time = 72; # Warnzeit in Stunden |
|
6 my $sign_critic_time = 12; # Critical-Zeit in Stunden |
|
7 my $indexserver = "84.19.194.5"; |
|
8 my $dns_server = "muli.schlittermann.de"; |
|
9 my $indexzone = "idx.net.schlittermann.de"; |
|
10 my @sec_zones = (); |
|
11 my $set_exit = 0; |
|
12 my (@print_zones, @print_infos); |
|
13 my $inter_time; |
|
14 my $count; |
|
15 my $oldest_time = 9000000000; |
|
16 my $oldest_name; |
|
17 my $dsrec; |
|
18 my $abltime; |
|
19 my $oldest_ftime; |
|
20 my $ftime; |
|
21 chomp( my $unixtime = `date +%s` ); |
|
22 |
|
23 # erzeugt liste @sec_zones aus der dig-abfrage |
|
24 my @digtxt = `dig \@$indexserver $indexzone TXT` or |
|
25 print "PROBLEM: no results from dig \n" and exit 2; |
|
26 |
|
27 # abbruch des skripts wenn dig nicht korrekt antwortet |
|
28 # ausfiltern der zonen im index mit dnssec unterstuetzung |
|
29 for (@digtxt) { |
|
30 chomp; |
|
31 if (m#status\:.(.*)\,#) { |
|
32 unless ($1 eq "NOERROR") { |
|
33 print "PROBLEM: $indexzone not reachable \n"; |
|
34 exit 2; |
|
35 } |
|
36 } |
|
37 if (m#ZONE::(.*)::sec-on#) { |
|
38 push @sec_zones, $1; |
|
39 } |
|
40 } |
|
41 |
|
42 # erstellt $alert_time aus der systemunixzeit und dem |
|
43 # konfigurationswert in $sign_alert_time |
|
44 $inter_time = $unixtime + ( 3600 * $sign_alert_time ); |
|
45 chomp( my $alert_time = `date -d \@$inter_time +%Y%m%d%H`); |
|
46 # erstellt $critic_time |
|
47 $inter_time = $unixtime + ( 3600 * $sign_critic_time ); |
|
48 chomp( my $critic_time = `date -d \@$inter_time +%Y%m%d%H`); |
|
49 |
|
50 # durchlauf fuer jede dnssec-zone |
|
51 for (@sec_zones) { |
|
52 chomp (my @zone_dig = `dig +dnssec \@$dns_server $_`); |
|
53 my $zone = $_; |
|
54 |
|
55 # parst die ablaufzeit der signatur |
|
56 for (@zone_dig) { |
|
57 unless (m#RRSIG.*SOA#) { next;} |
|
58 s#($zone).*([0-9]{10})([0-9]{4}).*[0-9]{14}.*#$2#; |
|
59 # ermittelt die naechste ablaufsdomain |
|
60 if ($oldest_time > $_) { |
|
61 $oldest_time = $_; |
|
62 $oldest_name = $zone; |
|
63 $oldest_ftime = $ftime; |
|
64 } |
|
65 # setzt exit 2 wen die critical-time ueberschritten ist |
|
66 if($_ < $critic_time) { |
|
67 $set_exit = 2; |
|
68 push @print_zones, $zone; |
|
69 last; |
|
70 } |
|
71 # setzt exit 1 wen die alert-time ueberschritten ist |
|
72 if($_ < $alert_time) { |
|
73 unless ($set_exit == 2) { |
|
74 $set_exit = 1; |
|
75 } |
|
76 push @print_zones, $zone; |
|
77 last; |
|
78 } |
|
79 } |
|
80 |
|
81 my @digtest_1 = `dig \@$dns_server $zone +dnssec DNSKEY`; |
|
82 my @digtest_2 = `dig \@$dns_server $zone +dnssec DS`; |
|
83 my @digtest_3 = `dig \@$dns_server $zone\.dlv.isc.org`; |
|
84 |
|
85 # ermittelt und formatiert die ablaufzeit |
|
86 for (@digtest_1) { |
|
87 if (m#RRSIG.*DNSKEY.*(\d{4})(\d{2})(\d\d)(\d\d)(\d\d)(\d\d).*(\d{14})#) { |
|
88 $ftime = "$3.$2.$1 $4:$5"; |
|
89 last; |
|
90 } |
|
91 } |
|
92 # setzt die zeit fuer die naechste ablaufsdomain |
|
93 if ($oldest_name eq $zone) { |
|
94 $oldest_ftime = $ftime; |
|
95 } |
|
96 |
|
97 # zskanzahl |
|
98 my $zskcount = 0; |
|
99 for (@digtest_1) { |
|
100 if (m#DNSKEY.*256#) { |
|
101 $zskcount ++; |
|
102 } |
|
103 } |
|
104 # kskanzahl |
|
105 my $kskcount = 0; |
|
106 for (@digtest_1) { |
|
107 if (m#DNSKEY.*257#) { |
|
108 $kskcount ++; |
|
109 } |
|
110 } |
|
111 # ds-test |
|
112 for (@digtest_2) { |
|
113 if (m#IN.*RRSIG.*DS.*(\d{14}).*(\d{14}).*(\s)([a-z]{0,100}\.)(\s).*#) { |
|
114 print "DSDS ($4) "; |
|
115 } |
|
116 } |
|
117 # dlv-check |
|
118 for (@digtest_3) { |
|
119 if (m#NOERROR#) { |
|
120 $dsrec = "dlv"; |
|
121 } |
|
122 } |
|
123 push @print_infos, "$zone - $zskcount - $kskcount - $dsrec - $ftime \n"; |
|
124 $count ++; |
|
125 } |
|
126 |
|
127 #print @print_infos;# @print_infos enthält mehr informationen |
|
128 |
|
129 # Ausgabe und Ende |
|
130 if ($set_exit == 0) { |
|
131 print "OK: $count DNSSEC-Zones checked; "; |
|
132 print "next end is $oldest_name at $oldest_ftime \n"; |
|
133 } |
|
134 if ($set_exit == 1) { print "WARNING: "} |
|
135 if ($set_exit == 2) { print "CRITICAL: "} |
|
136 print "@print_zones ($oldest_ftime)\n"; |
|
137 exit $set_exit; |