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.20100303,v 1.1 2010/05/10 11:15:30 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
# 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"
#
# caution: $zone is zone name which '.' characters are replaced by '_'.
#
# Usage:
#
# 1. Generate KSK and ZSK
# dnsseczonetool keygen2 zone(s)
# 2. Sign zone using keys generated in step 1
# dnsseczonetool sign zone(s)
# 3. ZSK rollover
# dnsseczonetool zskroll zone(s)
# 4. Zone key status
# dnsseczonetool status 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"
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_KSSNAME="kss-"
# 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 < $INCFILE
_check_file "$KEYDIR/$KSK.private" "$KEYDIR/$ZSK.private"
cat $KSK_FILE $ZSK_FILE | while read keyfile
do
_check_file "$KEYDIR/$keyfile.key"
cat "$KEYDIR/$keyfile.key" >> $INCFILE
done
for i in $KSK_S_FILE $ZSK_S_FILE
do
if [ -f $i ]; then
keyfile=`head -1 $i`
_check_file "$KEYDIR/$keyfile.key"
cat "$KEYDIR/$keyfile.key" >> $INCFILE
fi
done
echo $signzone $_SIGN_PARAM -o $ZONE -k $KEYDIR/$KSK.private -f "$ZONEFILE.signed" $ZONEFILE $KEYDIR/$ZSK.private
$signzone $_SIGN_PARAM -o $ZONE -k $KEYDIR/$KSK.private -f "$ZONEFILE.signed" $ZONEFILE $KEYDIR/$ZSK.private 2>&1
echo "signzone returns $?"
if [ "$RNDC_OPTION" != "OFF" ]; then
$rndc $RNDC_OPTION reload $ZONE
fi
}
status()
{
if [ -f $KSK_FILE ]; then
echo -n "$ZONE's KSK = "
cat $KSK_FILE;
$dsfromkey -2 $KEYDIR/`cat $KSK_FILE`
fi
if [ -f $KSK_S_FILE ]; then
echo -n "$ZONE's standby KSK = "
cat $KSK_S_FILE;
$dsfromkey -2 $KEYDIR/`cat $KSK_S_FILE`
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 standby ZSK = "
cat $ZSK_S_FILE;
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"
if [ $ZONE = "." ]; then
ZONEFILE="root"
else
ZONEFILE=$ZONE
fi
INCFILE="$MASTERDIR/$ZONEFILE.keys"
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}
touch $TMPF
if ln $TMPF $LOCKF; then
:
else
rm $TMPF
echo "zone $ZONE locked"
continue
fi
rm $TMPF
case $CMD in
keygen)
_check_nofile $KSK_FILE $ZSK_FILE
(cd $KEYDIR; $keygen $_KSK_PARAM $ZONE) > $KSK_FILE
(cd $KEYDIR; $keygen $_ZSK_PARAM $ZONE) > $ZSK_FILE
status
;;
keygen2)
_check_nofile $KSK_FILE $ZSK_FILE $KSK_S_FILE $ZSK_S_FILE
(cd $KEYDIR; $keygen $_KSK_PARAM $ZONE) > $KSK_FILE
(cd $KEYDIR; $keygen $_ZSK_PARAM $ZONE) > $ZSK_FILE
(cd $KEYDIR; $keygen $_KSK_PARAM $ZONE) > $KSK_S_FILE
(cd $KEYDIR; $keygen $_ZSK_PARAM $ZONE) > $ZSK_S_FILE
status
;;
standby-zsk-keygen)
_check_nofile $ZSK_S_FILE
(cd $KEYDIR; $keygen $_ZSK_PARAM $ZONE) > $ZSK_S_FILE
status
;;
standby-ksk-keygen)
_check_nofile $KSK_S_FILE
(cd $KEYDIR; $keygen $_KSK_PARAM $ZONE) > $KSK_S_FILE
status
;;
zskroll)
_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
mv $KEYDIR/$ZSK.key $KEYDIR/$ZSK.private $KEYBACKUPDIR/
mv $ZSK_S_FILE $ZSK_FILE
(cd $KEYDIR; $keygen $_ZSK_PARAM $ZONE) > $ZSK_S_FILE
OLDZSK="$ZSK"
ZSK="$ZSS"
ZSS=`head -1 $ZSK_S_FILE`
echo "$ZONE 's ZSK: valid -> removed: $OLDZSK"
echo "$ZONE 's ZSK: standby -> valid: $ZSK"
echo "$ZONE 's ZSK: new standby: $ZSS"
sign
;;
sign)
sign
;;
status)
status
;;
*)
echo "unknown command: $CMD"
_usage
;;
esac
rm $LOCKF
done
exit 0