Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
#!/bin/sh # dnsseczonetool : Simple DNSSEC key management and zone signing tool # # $Id: dnsseczonetool.20100917,v 1.1 2011/02/13 07:06:25 fujiwara Exp $ # # http://member.wide.ad.jp/~fujiwara/dnssec/dnsseczonetool # # Installation and Configuration: # 1. Copy dnsseczonetool into some directory. # 2. Create dnsseczonetool.conf into the same directory of dnsseczonetool. # # dnsseczonetool.conf: # MASTERDIR: Zone file directory # Default: MASTERDIR="/etc/namedb/master" # KSK_PARAM: Default dnssec-keygen's options for KSK # Default: KSK_PARAM_DEFAULT="-n zone -a RSASHA1 -b 2048 -f ksk" # KSK_PARAM_$zone: dnssec-keygen's options for zone's KSK # Default: KSK_PARAM # ZSK_PARAM: Default dnssec-keygen's options for ZSK # Default: ZSK_PARAM_DEFAULT="-n zone -a RSASHA1 -b 1024" # ZSK_PARAM_$zone: dnssec-keygen's options for zone's ZSK # Default: ZSK_PARAM # SIGN_PARAM: Default dnssec-signzone options # Default: SIGN_PARAM_DEFAULT="-N unixtime" # SIGN_PARAM_$zone: dnssec-signzone options for zone # Default: SIGN_PARAM # DS_PARAM: Default dsfromkey options for zone # Default: SIGN_PARAM_DEFAULT="-2" # DS_PARAM_$zone: dsfromkey options for zone # Default: SIGN_PARAM # keygen: dnssec-keygen path # Default: keygen="/usr/local/sbin/dnssec-keygen" # signzone: dnssec-signzone path # Default: signzone="/usr/local/sbin/dnssec-signzone" # dsfromkey: dnssec-dsfromkey path # Default: dsfromkey="/usr/local/sbin/dnssec-dsfromkey" # rndc: rndc path # Default: rndc="/usr/local/sbin/rndc" # CONFIGDIR: directory where dnsseczonetool uses. # Default: CONFIGDIR="$MASTERDIR/config" # KEYDIR: directory where dnsseczonetool puts zone keys. # Default: KEYDIR="$MASTERDIR/config/keydir" # KEYBACKUPDIR: directory where dnsseczonetool puts old keys. # Default: KEYBACKUPDIR="$MASTERDIR/config/backup" # RNDC_OPTION: rndc options or OFF # Default: RNDC_OPTION="-k $MASTERDIR/rndc.key" # ZONE_PREPROCESS: zone preprocess command # Default: cat # RELOADALL_COMMAND: reload all command # Default: none # PRESERVE_REMOVED_KEY: NO|YES # Default: YES # # caution: $zone is zone name # whose '.' and '-' characters are replaced by '_'. # All zone name must be lowercase. # # Usage: # # 1. Generate KSK and ZSK # dnsseczonetool keygen zone(s) # # 2. Sign zone using keys generated in step 1 # dnsseczonetool sign zone(s) # # 3. Add next ZSK for ZSK rollover (generate new ZSK and sign with old key) # dnsseczonetool add-next-zsk zone(s) # # 4. ZSK Rollover (Change current ZSK as unused previous ZSK, # and sign new ZSK generated by step.3) # dnsseczonetool zsk-rollover zone(s) # # 4'. ZSK Rollover 2 (Change current ZSK as unused previous ZSK, # stand-by ZSK as current ZSK, # Generate new ZSK as a stand-by ZSK, # and sign the zone by new ZSK.) # dnsseczonetool zskroll zone(s) # # 5. Add next KSK for KSK rollover (generate new KSK and sign with both keys) # dnsseczonetool add-next-ksk zone(s) # # 6. KSK Rollover (Remove old KSK and sign new KSK generated by step.5) # dnsseczonetool ksk-rollover zone(s) # # 7. Zone key status # dnsseczonetool status zone(s) # # 8. Zone key status-dnskey (Show KSK DNSKEY for DLV registration) # dnsseczonetool status-dnskey zone(s) # Copyright (c) 2009 Kazunori Fujiwara . # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. PROG=$0 DIR=`dirname $0` CONFIGFILE="$DIR/dnsseczonetool.conf" keygen="/usr/local/sbin/dnssec-keygen" signzone="/usr/local/sbin/dnssec-signzone" dsfromkey="/usr/local/sbin/dnssec-dsfromkey" rndc="/usr/local/sbin/rndc" MASTERDIR="/etc/namedb/master" RNDC_OPTION="-k $MASTERDIR/rndc.key" KSK_PARAM="-n zone -a RSASHA1 -b 2048 -f ksk" ZSK_PARAM="-n zone -a RSASHA1 -b 1024" SIGN_PARAM="-N unixtime" DS_PARAM="-2" ZONE_PREPROCESS="cat" PRESERVE_REMOVED_KEY="YES" NOW=`date +%Y%m%d%H%M%S` if [ -f $CONFIGFILE ]; then . $CONFIGFILE fi if [ "$1" = "" -a "$DEFAULT_ACTION" != "" ]; then echo "Doing $DEFAULT_ACTION" set $DEFAULT_ACTION echo $1 $2 $3 fi CMD="$1" shift if [ "$CONFIGDIR" = "" ]; then CONFIGDIR="$MASTERDIR/config" fi if [ "$KEYDIR" = "" ]; then KEYDIR="$CONFIGDIR/keydir" fi if [ "$KEYBACKUPDIR" = "" ]; then KEYBACKUPDIR="$CONFIGDIR/backup" fi LOCKF="" HEAD_ZSKNAME="zsk-" HEAD_KSKNAME="ksk-" HEAD_ZSSNAME="zss-" HEAD_ZSRNAME="zsr-" # Removed ZSK HEAD_KSSNAME="kss-" NEED_RELOAD="NO" # setup if [ ! -d $CONFIGDIR ]; then mkdir -p $CONFIGDIR fi if [ ! -d $KEYBACKUPDIR ]; then mkdir -p $KEYBACKUPDIR fi if [ ! -d $KEYDIR ]; then mkdir -p $KEYDIR fi cd $MASTERDIR _check_file() { while [ "$1" != "" ]; do if [ ! -f "$1" ]; then echo "$1 does not exist." _usage fi shift done } _check_nofile() { while [ "$1" != "" ]; do if [ -f "$1" ]; then echo "$1 exist." _usage fi shift done } _usage() { if [ "$LOCKF" != "" ]; then rm $LOCKF fi cat < $ZONEFILE.tmp cat $KSK_FILE $ZSK_FILE | while read keyfile do _check_file "$KEYDIR/$keyfile.key" cat "$KEYDIR/$keyfile.key" >> $ZONEFILE.tmp done for i in $KSK_S_FILE $ZSK_S_FILE $ZSK_R_FILE do if [ -f $i ]; then keyfile=`head -1 $i` _check_file "$KEYDIR/$keyfile.key" cat "$KEYDIR/$keyfile.key" >> $ZONEFILE.tmp fi done cmdname=`basename $signzone` if [ "$cmdname" = "ldns-signzone" ]; then if [ "$KSS" != "" ]; then KSS="$KEYDIR/$KSS" fi echo $signzone $_SIGN_PARAM -o $ZONE -f "$ZONEFILE.signed" $ZONEFILE.tmp $KEYDIR/$ZSK $KEYDIR/$KSK $KSS $signzone $_SIGN_PARAM -o $ZONE -f "$ZONEFILE.signed" $ZONEFILE.tmp $KEYDIR/$ZSK $KEYDIR/$KSK $KSS else if [ "$KSS" != "" ]; then KSS="-k $KEYDIR/$KSS.private" fi echo $signzone $_SIGN_PARAM -o $ZONE -k $KEYDIR/$KSK.private $KSS -f "$ZONEFILE.signed" $ZONEFILE.tmp $KEYDIR/$ZSK.private 2>&1 $signzone $_SIGN_PARAM -o $ZONE -k $KEYDIR/$KSK.private $KSS -f "$ZONEFILE.signed" $ZONEFILE.tmp $KEYDIR/$ZSK.private 2>&1 fi rm $ZONEFILE.tmp echo "signzone returns $?" if [ "$RNDC_OPTION" != "OFF" ]; then $rndc $RNDC_OPTION reload $ZONE fi NEED_RELOAD="YES" } status() { if [ -f $KSK_FILE ]; then echo -n "$ZONE's KSK = " cat $KSK_FILE; $dsfromkey $_DS_PARAM $KEYDIR/`cat $KSK_FILE`.key fi if [ -f $KSK_S_FILE ]; then echo -n "$ZONE's next KSK = " cat $KSK_S_FILE; $dsfromkey $_DS_PARAM $KEYDIR/`cat $KSK_S_FILE`.key fi if [ -f $ZSK_FILE ]; then echo -n "$ZONE's ZSK = " cat $ZSK_FILE; fi if [ -f $ZSK_S_FILE ]; then echo -n "$ZONE's next ZSK = " cat $ZSK_S_FILE; fi if [ -f $ZSK_R_FILE ]; then echo -n "$ZONE's previous ZSK = " cat $ZSK_R_FILE; fi } status_dnskey() { if [ -f $KSK_FILE ]; then echo -n "$ZONE's KSK = " cat $KSK_FILE; grep DNSKEY $KEYDIR/`cat $KSK_FILE`.key fi if [ -f $KSK_S_FILE ]; then echo -n "$ZONE's next KSK = " cat $KSK_S_FILE; grep DNSKEY $KEYDIR/`cat $KSK_S_FILE`.key fi } keygensub() { ( cd $KEYDIR; echo "$keygen $1 $2" $keygen $1 $2 > $3; _FILE=`cat $3` if [ -f $_FILE.ds ]; then rm $_FILE.ds fi ) } removekeys_sub() { if [ -f $1 ]; then KEY=`head -1 $1` if [ -f $KEYDIR/$KEY.key ]; then mv $KEYDIR/$KEY.key $KEYDIR/$KEY.private $KEYBACKUPDIR/ fi fi } remove_previouskey() { if [ -f $ZSK_R_FILE ]; then removekeys_sub $ZSK_R_FILE mv $ZSK_R_FILE "$KEYBACKUPDIR/removed-ZSK-$NOW-$ZONE" fi } if [ "$CMD" = "" ]; then _usage fi if [ "$1" = "" -a "$ZONELIST" != "" ]; then set $ZONELIST fi for ZONE in $* do LOCKF="$CONFIGDIR/$ZONE.lock" TMPF="$CONFIGDIR/$ZONE.$$" OUTF="$ZONE.signed" KSK_FILE="$CONFIGDIR/$HEAD_KSKNAME$ZONE" ZSK_FILE="$CONFIGDIR/$HEAD_ZSKNAME$ZONE" KSK_S_FILE="$CONFIGDIR/$HEAD_KSSNAME$ZONE" ZSK_S_FILE="$CONFIGDIR/$HEAD_ZSSNAME$ZONE" ZSK_R_FILE="$CONFIGDIR/$HEAD_ZSRNAME$ZONE" if [ $ZONE = "." ]; then ZONEFILE="root" else ZONEFILE=$ZONE fi ZONE_=`echo $ZONE | tr .- __` eval _SIGN_PARAM=\${SIGN_PARAM_$ZONE_:-$SIGN_PARAM} eval _KSK_PARAM=\${KSK_PARAM_$ZONE_:-$KSK_PARAM} eval _ZSK_PARAM=\${ZSK_PARAM_$ZONE_:-$ZSK_PARAM} eval _DS_PARAM=\${DS_PARAM_$ZONE_:-$DS_PARAM} touch $TMPF if ln $TMPF $LOCKF; then : else rm $TMPF echo "zone $ZONE locked" continue fi rm $TMPF case $CMD in removekeys) removekeys_sub $KSK_FILE removekeys_sub $ZSK_FILE removekeys_sub $KSK_S_FILE removekeys_sub $ZSK_S_FILE rm $KSK_FILE $ZSK_FILE $KSK_S_FILE $ZSK_S_FILE ;; keygen) _check_nofile $KSK_FILE $ZSK_FILE keygensub "$_KSK_PARAM" $ZONE $KSK_FILE keygensub "$_ZSK_PARAM" $ZONE $ZSK_FILE status ;; keygen2) _check_nofile $KSK_FILE $ZSK_FILE $ZSK_S_FILE keygensub "$_KSK_PARAM" $ZONE $KSK_FILE keygensub "$_ZSK_PARAM" $ZONE $ZSK_FILE keygensub "$_ZSK_PARAM" $ZONE $ZSK_S_FILE status ;; standby-zsk-keygen) _check_nofile $ZSK_S_FILE keygensub "$_ZSK_PARAM" $ZONE $ZSK_S_FILE status ;; add-next-ksk|standby-ksk-keygen) _check_nofile $KSK_S_FILE keygensub "$_KSK_PARAM" $ZONE $KSK_S_FILE sign status ;; add-next-zsk|standby-zsk-keygen) _check_nofile $ZSK_S_FILE keygensub "$_ZSK_PARAM" $ZONE $ZSK_S_FILE sign status ;; ksk-rollover) _check_file $ZONE $KSK_FILE $KSK_S_FILE KSK=`head -1 $KSK_FILE` KSS=`head -1 $KSK_S_FILE` _check_file $KEYDIR/$KSK.key $KEYDIR/$KSS.key $KEYDIR/$KSK.private $KEYDIR/$KSS.private mv $KEYDIR/$KSK.key $KEYDIR/$KSK.private $KEYBACKUPDIR/ mv $KSK_S_FILE $KSK_FILE OLDKSK="$KSK" KSK="$KSS" KSS="" echo "$ZONE 's KSK: valid -> removed: $OLDKSK" echo "$ZONE 's KSK: next -> current: $KSK" sign status ;; zsk-rollover) _check_file $ZONE $ZSK_FILE $ZSK_S_FILE ZSK=`head -1 $ZSK_FILE` ZSS=`head -1 $ZSK_S_FILE` _check_file $KEYDIR/$ZSK.key $KEYDIR/$ZSS.key $KEYDIR/$ZSK.private $KEYDIR/$ZSS.private remove_previouskey mv $ZSK_FILE $ZSK_R_FILE mv $ZSK_S_FILE $ZSK_FILE OLDZSK="$ZSK" ZSK="$ZSS" ZSS="" if [ "$PRESERVE_REMOVED_KEY" = "NO" ]; then remove_previouskey fi echo "$ZONE 's ZSK: valid -> previous: $OLDZSK" echo "$ZONE 's ZSK: next -> current: $ZSK" sign status ;; zskroll) _check_file $ZONEFILE $ZSK_FILE $ZSK_S_FILE ZSK=`head -1 $ZSK_FILE` ZSS=`head -1 $ZSK_S_FILE` _check_file $KEYDIR/$ZSK.key $KEYDIR/$ZSS.key $KEYDIR/$ZSK.private $KEYDIR/$ZSS.private keygensub "$_ZSK_PARAM" $ZONE $ZSK_S_FILE.new remove_previouskey mv $ZSK_FILE $ZSK_R_FILE mv $ZSK_S_FILE $ZSK_FILE mv $ZSK_S_FILE.new $ZSK_S_FILE OLDZSK="$ZSK" ZSK="$ZSS" ZSS=`head -1 $ZSK_S_FILE` if [ "$PRESERVE_REMOVED_KEY" = "NO" ]; then remove_previouskey fi echo "$ZONE 's ZSK: valid -> previous: $OLDZSK" echo "$ZONE 's ZSK: next -> valid: $ZSK" echo "$ZONE 's ZSK: new next key: $ZSS" sign ;; sign) sign ;; status) status ;; status-dnskey) status_dnskey ;; remove-previouskey) _check_file $ZSK_R_FILE remove_previouskey sign ;; *) echo "unknown command: $CMD" _usage ;; esac rm $LOCKF done if [ "$NEED_RELOAD" = "YES" -a "$RELOADALL_COMMAND" != "" ]; then eval $RELOADALL_COMMAND fi exit 0