dnssec-signer 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. #!/usr/bin/env bash
  2. #####################################################
  3. # This script require the following
  4. #
  5. # * A path structure like this:
  6. # [..path..]/<domainname.tld>/
  7. # * This path contains a zone file named `db`
  8. #
  9. # Your named.conf.local file must link to a
  10. # filed named `db.signed`, e.g
  11. #
  12. # zone "domain.tld" {
  13. # type master;
  14. # file "[..path..]/domain.tld/db.signed";
  15. # };
  16. #
  17. # USAGE:
  18. #
  19. # 1. Make `dnssec-signer` executable:
  20. # chmod +x /path/to/dnssec-signer
  21. #
  22. # 2. Run:
  23. # ./path/to/dnssec-signer <domain.tld>
  24. # 3. Or, for every domain in path
  25. # ./path/to/dnssec-signer
  26. #
  27. ######################################################
  28. SELF="$(basename ${0})"
  29. # EDIT CONFIGURATION BEFORE START
  30. source ./dnssec-signer-config
  31. function error_msg {
  32. FOR=${1}
  33. ERRMSG="${2}"
  34. echo -e "\e[31m[${SELF}:\e[1m${FOR}\e[21m]:\e[0m ${ERRMSG}"
  35. ${LOGGER} ${LOGGERFLAGE} "[${SELF}:${FOR}]: ${ERRMSG}"
  36. }
  37. function note_msg {
  38. FOR=${1}
  39. NOTEMSG="${2}"
  40. echo -e "\e[32m[${SELF}:\e[1m${FOR}\e[21m]:\e[0m ${NOTEMSG}"
  41. ${LOGGER} ${LOGGERFLAGN} "[${SELF}:${FOR}]: ${NOTEMSG}"
  42. }
  43. # Generating keys for zone
  44. # Note, this doesnt check if they exists!
  45. function genkeys {
  46. ZONE=${1}
  47. note_msg "${ZONE}" "Generating missing ZSK and KSK"
  48. ${KEYGEN} -a NSEC3RSASHA1 -b 2048 -n ZONE "${ZONE}"
  49. if [ $? -ne 0 ]; then
  50. error_msg "${ZONE}" "Failed to generate Zone Signing Key (ZSK)"
  51. return 1
  52. fi
  53. ${KEYGEN} -f KSK -a NSEC3RSASHA1 -b 4096 -n ZONE "${ZONE}"
  54. if [ $? -ne 0 ]; then
  55. error_msg "${ZONE}" "Failed to generate Key Signing Key (KSK)"
  56. return 1
  57. fi
  58. note_msg "${ZONE}" "ZSK and KSK generated"
  59. return 0
  60. }
  61. # Sign zone
  62. # The actual signing process.
  63. function sign {
  64. ZONE="${1}"
  65. note_msg "${ZONE}" "Signing ZONE"
  66. if ! [ -d "${2}" ]; then
  67. error_msg "${ZONE}" "Path ${2} doesnt exist"
  68. return 1
  69. fi
  70. cd "${2}"
  71. echo `pwd`
  72. F="db"
  73. if ! [ -w "${F}" ]; then
  74. error_msg "${ZONE}" "Missing $(pwd)/${F}"
  75. return 1
  76. fi
  77. ZONEF="db.zone"
  78. ZONEINCF="${ZONEF}.include"
  79. note_msg "${ZONE}" "Validating unsigned zone file"
  80. ${CHECKZONE} "${ZONE}" "${F}"
  81. if [ $? -ne 0 ]; then
  82. error_msg "${ZONE}" "Error(s) in zone file"
  83. if [ -r "${ZONEF}" ]; then
  84. note_msg "${ZONE}" "Existing signed zone, allowing restart"
  85. return 1
  86. else
  87. note_msg "${ZONE}" "No existing signed zone, disallowing restart"
  88. return 2
  89. fi
  90. fi
  91. KEYS=()
  92. for KEY in $(ls "./"); do
  93. if [[ "${KEY}" == "K${ZONE}"* ]] && [[ "${KEY}" == *key ]]; then
  94. KEYS[${#KEYS[@]}]="${KEY}"
  95. fi
  96. done
  97. if [ "${#KEYS[@]}" -ne 2 ]; then
  98. if [ "${#KEYS[@]}" -ne 0 ]; then
  99. rm "${KEYS[@]}"
  100. fi
  101. genkeys "${ZONE}"
  102. if [ $? -ne 0 ]; then
  103. return 1
  104. fi
  105. sign "${ZONE}" "${2}"
  106. return $?
  107. fi
  108. cat "${F}" > "${ZONEINCF}"
  109. for KEY in "${KEYS[@]}"; do
  110. echo "\$INCLUDE ${KEY}" >> "${ZONEINCF}"
  111. done
  112. SALT=$(head -c 1000 /dev/random | sha1sum | cut -b 1-16)
  113. ${SIGNZONE} -A -3 "${SALT}" -N increment -f "${ZONEF}" -o "${ZONE}" -t "${ZONEINCF}"
  114. if [ $? -ne 0 ]; then
  115. error_msg "${ZONE}" "Error signing zone"
  116. return 2
  117. fi
  118. note_msg "${ZONE}" "Checking zone-file"
  119. ${CHECKZONE} "${ZONE}" "${ZONEF}"
  120. if [ $? -ne 0 ]; then
  121. error_msg "${ZONE}" "Error zone-file'${SONEF}'"
  122. return 2
  123. fi
  124. note_msg "${ZONE}" "Signing successul!"
  125. return 0
  126. }
  127. # Sign zone;
  128. # Checks that dir exists first...
  129. # and ensures we're entering and leaving correctly
  130. function signzone {
  131. SIGN="${1}"
  132. CWDIR=$(pwd)
  133. sign "${1}" "${ZONESDIR}/${SIGN}"
  134. RET=$?
  135. cd "${CWDIR}"
  136. return ${RET}
  137. }
  138. note_msg "date" "$(date)"
  139. if [[ ${EUID} -ne 0 ]]; then
  140. error_msg "${USER}" "Must execute file as root."
  141. exit 1
  142. fi
  143. # Collect arguments (zones)
  144. ZONES="${*}"
  145. IFS=' ', read -r -a ZONES <<< "${ZONES}"
  146. if [ ${#ZONES[@]} -ne 0 ]; then
  147. error_msg "${#ZONES[@]}" "Start signing zones"
  148. ERR=0
  149. for ZONE in "${ZONES[@]}"; do
  150. signzone "${ZONE}"
  151. if [ $? -eq 2 ]; then
  152. # To prevent restarting dns if failure
  153. ERR=1
  154. fi
  155. done;
  156. if [ ${ERR} -eq 0 ]; then
  157. ${CHECKCONF}
  158. if [ $? -ne 0 ]; then
  159. error_msg "${CHECKCONF}" "Error in configruation, not reloading"
  160. else
  161. note_msg "${SYSCTL}" "Restarting ${DNSSERVICE}"
  162. ${SYSCTL} restart "${DNSSERVICE}"
  163. fi
  164. else
  165. error_msg "${DNSSERVICE}" "Errors in configuration(s) for zone(s), not restarting."
  166. fi
  167. else
  168. note_msg "${ZONESDIR}" "Finding zones to sign corresponding to ${NAMEDZONES}"
  169. CWD=$(pwd)
  170. cd "${ZONESDIR}"
  171. NAMED=$(cat $NAMEDZONES)
  172. for ZONE in $(ls -d */); do
  173. ACTIVE=$(cat $NAMEDZONES | grep "\"$(basename ${ZONE})\"" | tr -d '[:space:]')
  174. if [[ "${ACTIVE}" == zone* ]]; then
  175. ZONES[${#ZONES[@]}]=$(basename ${ZONE})
  176. fi
  177. done
  178. cd ${CWD}
  179. note_msg "" "Found ${#ZONES[@]} zone(s) active"
  180. if [ "${#ZONES[@]}" -ne 0 ]; then
  181. ${SELF} "${ZONES[@]}"
  182. fi
  183. fi