start
authorAndre Suess<andre.suess@pipkin.cc>
Fri, 18 Jun 2010 15:36:13 +0200
changeset 0 51d248a512a1
child 1 7fc97c57f9b4
start
.hgignore
README
creatkey
creatksk
creatzsk
killkeys
mkdomain
mkready
rmdomain
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgignore	Fri Jun 18 15:36:13 2010 +0200
@@ -0,0 +1,1 @@
+creatksk.old
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/README	Fri Jun 18 15:36:13 2010 +0200
@@ -0,0 +1,32 @@
+zonedatei erstellen
+
+- mkdomain kundenname domainname
+- creatzsk domainname
+- creatksk domainname
+- mkready
+
+
+zonedatei loeschen
+
+- rmdomain
+- mkready
+
+
+domainen eintragen
+
+- manuel mit texteditor in master/domainname/domainname
+- update-serial ausfuehren >>>	>>>	>>>	>>>	# evt. erweitern > dnssec-signzone domainname im
+							# entsprechenden verzeichnis (master/domainname)
+							# ausfuehren
+neuen ZSK erstellen
+
+- creatzsk domainname
+
+- spaeter oder per Cron killkeys ausfuehren
+
+
+neuen KSK erstellen
+
+- creatksk domainname
+
+- spaeter oder per cron killkeys ausfuehren
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatkey	Fri Jun 18 15:36:13 2010 +0200
@@ -0,0 +1,59 @@
+#!/bin/bash
+
+while getopts ":k" opt
+do
+        case $opt in
+        k )	K_OPTION="1";;
+        \? )	echo "SYNOPSIS: creatkey [-k] zonename"
+		exit 1
+        esac			# prueft ob -k als option angegeben wurde
+done
+
+test $# -lt $[$K_OPTION+1] && echo "SYNOPSIS: creatkey [-k] zonename" && exit 1
+					# prueft ob eine es eine domain gibt
+
+# durchgang fuer jede eingabe
+for DOMAIN in $@
+do
+
+	ZONE_DIR=/etc/bind/master	# konfiguration
+	ZONE_NAME=`idn --quiet $DOMAIN`
+	
+	if [ -d $ZONE_DIR/$ZONE_NAME ]		# prueft die existens des zoneordners
+	then
+		cd $ZONE_DIR/$ZONE_NAME/
+		
+		test -f index.ksk || touch index.ksk
+		test -f index.zsk || touch index.zsk
+		
+		if test		# erzeugt die schluessel und erstelt eine indexdatei
+		then
+			echo "erzeugt zsk fuer" $DOMAIN
+			dnssec-keygen -a RSASHA1 -b 512 -n ZONE $ZONE_NAME >> index.zsk
+			INDEX_ZSK=$( tail -n2 index.zsk ) ; echo $INDEX_ZSK | fmt -w1 > index.zsk
+		else
+			echo "erzeugt ksk fuer" $DOMAIN
+			dnssec-keygen -a RSASHA1 -b 1024 -n ZONE -f KSK $ZONE_NAME >> index.ksk
+			INDEX_KSK=$( tail -n2 index.ksk ) ; echo $INDEX_KSK | fmt -w1 > index.ksk
+		fi
+		
+		#loesche alle Schluessel die nicht in der indexdatei stehen
+		rm $(ls K*[key,private] | grep -v "`cat index.zsk`" | grep -v "`cat index.ksk`") 2> /dev/null
+		
+		#erzeugt ein backup und entfernt alle schluessel aus der zonedatei
+		mv $ZONE_NAME $ZONE_NAME.old
+		grep -v 'DNSKEY' $ZONE_NAME.old >> $ZONE_NAME
+		
+		#fuegt die schluessel in die zonedatei ein
+		cat K$ZONE_NAME.*key >>$ZONE_NAME
+		
+		#signiert die zonedatei - erzeugt zone.signed
+		dnssec-signzone $ZONE_NAME
+	else 
+		echo "zone $ZONE_NAME nicht gefunden"
+	fi
+	
+done
+
+
+exit 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatksk	Fri Jun 18 15:36:13 2010 +0200
@@ -0,0 +1,50 @@
+#!/bin/bash
+
+test $# -lt 1 && echo "SYNOPSIS: mkseckey domainname" && exit 1
+
+# durchgang fuer jede eingabe
+for DOMAIN in $@
+do
+	#konfiguration
+	ZONE_DIR=/etc/bind/master
+	ZONE_NAME=`idn --quiet $DOMAIN`
+	
+	# pruefe die existens des ordners der zone
+	# und beende den durchlauf bei negativer pruefung
+	if [ -d $ZONE_DIR/$ZONE_NAME ]
+	then
+		cd $ZONE_DIR/$ZONE_NAME/
+		
+		test -f index.ksk || touch index.ksk
+		test -f index.zsk || touch index.zsk
+		
+		#erzeugt die schluessel
+		#echo "erzeugt zsk fuer" $DOMAIN
+		#dnssec-keygen -a RSASHA1 -b 512 -n ZONE $ZONE_NAME >> index.zsk
+		echo "erzeugt ksk fuer" $DOMAIN
+		dnssec-keygen -a RSASHA1 -b 1024 -n ZONE -f KSK $ZONE_NAME >> index.ksk
+		
+		#aktuallisiert die schluesselindexdateien
+		# INDEX_ZSK=$( tail -n2 index.zsk ) ; echo $INDEX_ZSK | fmt -w1 > index.zsk
+		INDEX_KSK=$( tail -n2 index.ksk ) ; echo $INDEX_KSK | fmt -w1 > index.ksk
+		
+		#loesche alle Schluessel die nicht in der indexdatei stehen
+		rm $(ls K*[key,private] | grep -v "`cat index.zsk`" | grep -v "`cat index.ksk`") 2> /dev/null
+		
+		#erzeugt ein backup und entfernt alle schluessel aus der zonedatei
+		mv $ZONE_NAME $ZONE_NAME.old
+		grep -v 'DNSKEY' $ZONE_NAME.old >> $ZONE_NAME
+		
+		#fuegt die schluessel in die zonedatei ein
+		cat K$ZONE_NAME.*key >>$ZONE_NAME
+		
+		#signiert die zonedatei - erzeugt zone.signed
+		dnssec-signzone $ZONE_NAME
+	else 
+		echo "zone $ZONE_NAME nicht gefunden"
+	fi
+	
+done
+
+
+exit 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/creatzsk	Fri Jun 18 15:36:13 2010 +0200
@@ -0,0 +1,50 @@
+#!/bin/bash
+
+test $# -lt 1 && echo "SYNOPSIS: mkseckey domainname" && exit 1
+
+# durchgang fuer jede eingabe
+for DOMAIN in $@
+do
+	#konfiguration
+	ZONE_DIR=/etc/bind/master
+	ZONE_NAME=`idn --quiet $DOMAIN`
+	
+	# pruefe die existens des ordners der zone
+	# und beende den durchlauf bei negativer pruefung
+	if [ -d $ZONE_DIR/$ZONE_NAME ]
+	then
+		cd $ZONE_DIR/$ZONE_NAME/
+		
+		test -f index.ksk || touch index.ksk
+		test -f index.zsk || touch index.zsk
+		
+		#erzeugt die schluessel
+		echo "erzeugt zsk fuer" $DOMAIN
+		dnssec-keygen -a RSASHA1 -b 512 -n ZONE $ZONE_NAME >> index.zsk
+		# echo "erzeugt ksk fuer" $DOMAIN
+		# dnssec-keygen -a RSASHA1 -b 1024 -n ZONE -f KSK $ZONE_NAME >> index.ksk
+		
+		#aktuallisiert die schluesselindexdateien
+		INDEX_ZSK=$( tail -n2 index.zsk ) ; echo $INDEX_ZSK | fmt -w1 > index.zsk
+		# INDEX_KSK=$( tail -n2 index.ksk ) ; echo $INDEX_KSK | fmt -w1 > index.ksk
+		
+		#loesche alle Schluessel die nicht in der indexdatei stehen
+		rm $(ls K*[key,private] | grep -v "`cat index.zsk`" | grep -v "`cat index.ksk`") 2> /dev/null
+		
+		#erzeugt ein backup und entfernt alle schluessel aus der zonedatei
+		mv $ZONE_NAME $ZONE_NAME.old
+		grep -v 'DNSKEY' $ZONE_NAME.old >> $ZONE_NAME
+		
+		#fuegt die schluessel in die zonedatei ein
+		cat K$ZONE_NAME.*key >>$ZONE_NAME
+		
+		#signiert die zonedatei - erzeugt zone.signed
+		dnssec-signzone $ZONE_NAME
+	else 
+		echo "zone $ZONE_NAME nicht gefunden"
+	fi
+	
+done
+
+
+exit 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/killkeys	Fri Jun 18 15:36:13 2010 +0200
@@ -0,0 +1,43 @@
+#!/bin/bash
+
+ZONE_DIR="/etc/bind/master"	# ordner fuer die einzelnen zonedateiordner
+ABL_ZEIT=30			# zeit in minuten waehrend der 2 keys verwendet werden / ungefaehr doppelte TTL 
+
+cd $ZONE_DIR
+for DOMAIN in *
+do
+
+	if ( find $ZONE_DIR/$DOMAIN -name "index*" -mmin +$ABL_ZEIT >/dev/null )	# prueft die schluesselindexdateien
+	then										# auf zeitpunkt der aenderung
+
+		cd $ZONE_DIR/$DOMAIN
+		INDEX_FILE=`find . -name "index*" -mmin +$ABL_ZEIT`		# schreibt eine liste INDEX_FILE aller
+										# dateien die vor ABL_ZEIT erstellt worden
+		for INDEX in $INDEX_FILE
+		do
+		
+			if ( wc -l $INDEX | grep ^2 > /dev/null )	# prueft die indexdatei auf anzahl an eintraegen
+			then						
+				INDEX=${INDEX#./}			
+				echo aktualisiert $INDEX in $DOMAIN
+				
+				DNS_KEY=`tail -n1 $INDEX` 		# speichert den letzten eintrag aus dem
+									# index in die variable DNS_KEY
+			
+				echo $DNS_KEY > $ZONE_DIR/$DOMAIN/$INDEX	# schreibt nur die variable
+										# DNS_KEY in die indexdatei
+	
+				rm $(ls K*[key,private] | grep -v "`cat index.zsk`" | \
+				grep -v "`cat index.ksk`") 2> /dev/null		# loesche alle schluessel die nicht in der indexdatei
+										# stehen
+				mv $DOMAIN $DOMAIN.old
+				grep -v 'DNSKEY' $DOMAIN.old >> $DOMAIN		# erzeugt ein backup und entfernt alle schluessel
+										# aus der zonedatei
+				cat K$DOMAIN.*key >>$DOMAIN			# schreibt die aktuellen schluessel in die zonedatei
+				dnssec-signzone $DOMAIN
+			fi
+			
+
+		done
+	fi
+done
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mkdomain	Fri Jun 18 15:36:13 2010 +0200
@@ -0,0 +1,96 @@
+#! /bin/bash
+
+while getopts "d" opt; do
+	case $opt in
+	d)	opt_debug=1;;
+	?)	exit 1;;
+	esac
+done
+
+if test $# -lt 2; then
+	echo "usage: $0 kundennummer domain..." >&2
+	exit
+fi
+
+
+customer="$1"; shift
+start=$(date -I)
+
+# config
+
+secondary=hh.schlittermann.de
+this_host=ns1.eins.lan #${this_host=$(hostname -f)}
+this_ip=192.168.0.1 #${this_ip=$(hostname -i)}
+this_domain=eins.lan #${this_domain=$(hostname -d)}
+
+hostmaster=${hostmaster="hostmaster.$this_domain"}
+
+primary_dir=${primary_dir=/etc/bind/zones.d}
+master_dir=${master_dir=/etc/bind/master}
+
+test -d $primary_dir || mkdir $primary_dir
+test -d $master_dir || mkdir $master_dir
+
+secondary=${secondary?}
+secondary_ip=${secondary_ip=$(dig +short $secondary)}
+
+# debug option
+if test $opt_debug; then
+	cat <<xxx
+this host:		$this_host [$this_ip]
+this domain:		$this_domain
+secondary:		$secondary [$secondary_ip]
+hostmaster:		$hostmaster
+primary directory:	$primary_dir
+xxx
+	exit
+fi
+
+for utf8domain in "$@"; do
+	domain=$(idn --quiet "$utf8domain")
+
+	test -d $master_dir/$domain || mkdir $master_dir/$domain
+
+	zonefile=$master_dir/$domain/$domain
+	config=$primary_dir/$domain
+
+	echo "$domain ($utf8domain)"
+
+	test -f $zonefile && { echo "$zonefile exists. Skipping $domain" >&2; continue; }
+	test -f $config && { echo "$config exists. Skipping $domain" >&2; continue; }
+
+	cat <<xxx >$zonefile
+\$ORIGIN $domain.
+\$TTL 1d
+@		IN SOA $this_host. $hostmaster. (
+		$(date +%Y%m%d00)	; serial
+		1d		; refresh
+		2h		; retry
+		7d		; expire
+		1d		; default ttl
+)
+
+		IN TXT		"invoice: $customer"
+		IN TXT		"start: $start"
+		IN TXT		"utf8: $utf8domain"
+
+		IN NS		$this_host.
+		IN NS		$secondary.
+
+xxx
+
+	cat <<xxx >$config
+zone "$domain" {
+// Start: $start
+// Invoice: $customer
+// UTF8: $utf8domain
+	type master;
+	file "$master_dir/$domain/$domain.signed";
+	allow-transfer { $secondary_ip; };
+	allow-query { any; };
+};
+
+xxx
+done
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mkready	Fri Jun 18 15:36:13 2010 +0200
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+BIND_DIR=/etc/bind
+
+cat $BIND_DIR/zones.d/* > $BIND_DIR/named.conf.zones
+
+rndc reload
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rmdomain	Fri Jun 18 15:36:13 2010 +0200
@@ -0,0 +1,15 @@
+#!/bin/bash
+
+ZONE=/etc/bind/master
+CONF=/etc/bind/zones.d
+
+for UTF8DOMAIN in $@
+do
+
+	DOMAIN=$(idn --quiet $UTF8DOMAIN ) 
+	echo $DOMAIN
+
+	test -d $ZONE/$DOMAIN && rm -r $ZONE/$DOMAIN && echo "-> Zonedatei entfernt"
+	test -f $CONF/$DOMAIN && rm $CONF/$DOMAIN && echo "-> Konfiguration entfernt"
+	
+done