You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

75 lines
1.8 KiB

  1. #!/bin/bash
  2. RSYNC_KEY_PATH=/etc/rsync/keys
  3. RECOVER_KEY_PATH=${RSYNC_KEY_PATH}/recover
  4. ANSI_ESC=$'\e['
  5. NORMAL="${ANSI_ESC}0m"
  6. GRAY="${ANSI_ESC}1;30m"
  7. RED="${ANSI_ESC}1;31m"
  8. GREEN="${ANSI_ESC}1;32m"
  9. YELLOW="${ANSI_ESC}1;33m"
  10. BLUE="${ANSI_ESC}1;34m"
  11. PINK="${ANSI_ESC}1;35m"
  12. CYAN="${ANSI_ESC}1;36m"
  13. WHITE="${ANSI_ESC}1;37m"
  14. DARKGRAY="${ANSI_ESC}0;30m"
  15. DARKRED="${ANSI_ESC}0;31m"
  16. DARKGREEN="${ANSI_ESC}0;32m"
  17. DARKYELLOW="${ANSI_ESC}0;33m"
  18. DARKBLUE="${ANSI_ESC}0;34m"
  19. DARKPINK="${ANSI_ESC}0;35m"
  20. DARKCYAN="${ANSI_ESC}0;36m"
  21. DARKWHITE="${ANSI_ESC}0;37m"
  22. ssh:mk-private-key() {
  23. local comment="$1"
  24. (
  25. tmpdir=$(mktemp -d)
  26. chmod go-rwx "$tmpdir"
  27. ssh-keygen -t rsa -N "" -f "$tmpdir/rsync_rsa" -C "$service_name@$host" >/dev/null
  28. cat "$tmpdir/rsync_rsa"
  29. rm -rf "$tmpdir"
  30. )
  31. }
  32. md5() {
  33. local md5
  34. md5=$(cat | md5sum)
  35. echo "${md5%% *}"
  36. }
  37. request-recovery-key() {
  38. local label="$1" ident="$2" key public_key
  39. ## Admin should have claimed the ident with at least one backup key
  40. if [ -n "$label" ] && ! [ -e "${RSYNC_KEY_PATH}/backup/$label/$ident.pub" ]; then
  41. echo "Error: Current admin '$label' has no ident '$ident' claimed." >&2
  42. return 1
  43. fi
  44. ## Find new label
  45. while true; do
  46. key=$(ssh:mk-private-key "recover@$ident")
  47. md5=$(printf "%s" "$key" | md5)
  48. [ -e "${RECOVER_KEY_PATH}/$md5" ] || break
  49. done
  50. mkdir -p "${RECOVER_KEY_PATH}"
  51. public_key=$(ssh-keygen -y -f <(printf "%s\n" "$key"))
  52. printf "%s %s\n" "$public_key" "recover@$ident" > "${RECOVER_KEY_PATH}/$md5.pub"
  53. touch "${RECOVER_KEY_PATH}/$md5"
  54. chmod go-rwx "${RECOVER_KEY_PATH}/$md5"
  55. printf "%s\n" "$key" | tee -a "${RECOVER_KEY_PATH}/$md5"
  56. /usr/local/sbin/ssh-update-keys
  57. }
  58. request-recovery-key "$@"