dnsnagios/dnssec-check
changeset 34 f5db9f4a3e76
equal deleted inserted replaced
33:d3269961e944 34:f5db9f4a3e76
       
     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;