summaryrefslogtreecommitdiff
path: root/src/monkeysphere-server
blob: fd7b58330ae6fc58a5696958ccbb122713e99bdd (plain)
  1. #!/bin/sh
  2. # monkeysphere-server: MonkeySphere server admin tool
  3. #
  4. # The monkeysphere scripts are written by:
  5. # Jameson Rollins <jrollins@fifthhorseman.net>
  6. #
  7. # They are Copyright 2008, and are all released under the GPL, version 3
  8. # or later.
  9. ########################################################################
  10. PGRM=$(basename $0)
  11. SHAREDIR=${SHAREDIR:-"/usr/share/monkeysphere"}
  12. export SHAREDIR
  13. . "${SHAREDIR}/common"
  14. # date in UTF format if needed
  15. DATE=$(date -u '+%FT%T')
  16. # unset some environment variables that could screw things up
  17. GREP_OPTIONS=
  18. ########################################################################
  19. # FUNCTIONS
  20. ########################################################################
  21. usage() {
  22. cat <<EOF
  23. usage: $PGRM <subcommand> [args]
  24. Monkeysphere server admin tool.
  25. subcommands:
  26. update-users (s) [USER]... update user authorized_keys file
  27. gen-key (g) generate gpg key for the server
  28. publish-key (p) publish server gpg to keyserver
  29. trust-key (t) KEYID [KEYID]... mark keyid as trusted
  30. update-user-userids (u) USER UID [UID]... add/update userid for user
  31. help (h,?) this help
  32. EOF
  33. }
  34. # generate server gpg key
  35. gen_key() {
  36. KEY_TYPE=${KEY_TYPE:-RSA}
  37. KEY_LENGTH=${KEY_LENGTH:-2048}
  38. KEY_USAGE=${KEY_USAGE:-encrypt,auth}
  39. SERVICE=${SERVICE:-ssh}
  40. HOSTNAME_FQDN=${HOSTNAME_FQDN:-$(hostname -f)}
  41. USERID=${USERID:-"$SERVICE"://"$HOSTNAME_FQDN"}
  42. echo "key parameters:"
  43. cat <<EOF
  44. Key-Type: $KEY_TYPE
  45. Key-Length: $KEY_LENGTH
  46. Key-Usage: $KEY_USAGE
  47. Name-Real: $USERID
  48. EOF
  49. read -p "generate key? [Y|n]: " OK; OK=${OK:=Y}
  50. if [ ${OK/y/Y} != 'Y' ] ; then
  51. failure "aborting."
  52. fi
  53. if gpg --list-key ="$USERID" > /dev/null 2>&1 ; then
  54. failure "key for '$USERID' already exists"
  55. fi
  56. echo "generating server key..."
  57. gpg --batch --gen-key <<EOF
  58. Key-Type: $KEY_TYPE
  59. Key-Length: $KEY_LENGTH
  60. Key-Usage: $KEY_USAGE
  61. Name-Real: $USERID
  62. %commit
  63. EOF
  64. }
  65. # publish server key to keyserver
  66. publish_key() {
  67. read -p "publish key to $KEYSERVER? [Y|n]: " OK; OK=${OK:=Y}
  68. if [ ${OK/y/Y} != 'Y' ] ; then
  69. failure "aborting."
  70. fi
  71. keyID=$(gpg --list-key --with-colons ="$USERID" 2> /dev/null | grep '^pub:' | cut -d: -f5)
  72. # dummy command so as not to publish fakes keys during testing
  73. # eventually:
  74. #gpg --send-keys --keyserver "$KEYSERVER" "$keyID"
  75. echo "gpg --send-keys --keyserver $KEYSERVER $keyID"
  76. }
  77. ########################################################################
  78. # MAIN
  79. ########################################################################
  80. COMMAND="$1"
  81. [ "$COMMAND" ] || failure "Type '$PGRM help' for usage."
  82. shift
  83. # set ms home directory
  84. MS_HOME=${MS_HOME:-"$ETC"}
  85. # load configuration file
  86. MS_CONF=${MS_CONF:-"$MS_HOME"/monkeysphere-server.conf}
  87. [ -e "$MS_CONF" ] && . "$MS_CONF"
  88. # set empty config variable with defaults
  89. GNUPGHOME=${GNUPGHOME:-"$MS_HOME"/gnupg}
  90. KEYSERVER=${KEYSERVER:-subkeys.pgp.net}
  91. REQUIRED_KEY_CAPABILITY=${REQUIRED_KEY_CAPABILITY:-"e a"}
  92. USER_CONTROLLED_AUTHORIZED_KEYS=${USER_CONTROLLED_AUTHORIZED_KEYS:-%h/.ssh/authorized_keys}
  93. STAGING_AREA=${STAGING_AREA:-"$LIB"/stage}
  94. export GNUPGHOME
  95. # make sure gpg home exists with proper permissions
  96. mkdir -p -m 0700 "$GNUPGHOME"
  97. case $COMMAND in
  98. 'update-users'|'s')
  99. if [ "$1" ] ; then
  100. unames="$@"
  101. else
  102. unames=$(ls -1 "$MS_HOME"/authorized_user_ids)
  103. fi
  104. for uname in $unames ; do
  105. MODE="authorized_keys"
  106. authorizedUserIDs="$MS_HOME"/authorized_user_ids/"$uname"
  107. cacheDir="$STAGING_AREA"/"$uname"/user_keys
  108. msAuthorizedKeys="$STAGING_AREA"/"$uname"/authorized_keys
  109. # make sure authorized_user_ids file exists
  110. if [ ! -s "$authorizedUserIDs" ] ; then
  111. log "authorized_user_ids file for '$uname' is empty or does not exist."
  112. continue
  113. fi
  114. log "processing authorized_keys for user '$uname'..."
  115. process_authorized_ids "$authorizedUserIDs" "$cacheDir"
  116. # write output key file
  117. log "writing monkeysphere authorized_keys file... "
  118. touch "$msAuthorizedKeys"
  119. if [ "$(ls "$cacheDir")" ] ; then
  120. log -n "adding gpg keys... "
  121. cat "$cacheDir"/* > "$msAuthorizedKeys"
  122. echo "done."
  123. else
  124. log "no gpg keys to add."
  125. fi
  126. if [ "$USER_CONTROLLED_AUTHORIZED_KEYS" ] ; then
  127. userHome=$(getent passwd "$uname" | cut -d: -f6)
  128. userAuthorizedKeys=${USER_CONTROLLED_AUTHORIZED_KEYS/\%h/"$userHome"}
  129. if [ -s "$userAuthorizedKeys" ] ; then
  130. log -n "adding user authorized_keys file... "
  131. cat "$userAuthorizedKeys" >> "$msAuthorizedKeys"
  132. echo "done."
  133. fi
  134. fi
  135. log "monkeysphere authorized_keys file generated:"
  136. log "$msAuthorizedKeys"
  137. done
  138. ;;
  139. 'gen-key'|'g')
  140. gen_key
  141. ;;
  142. 'publish-key'|'p')
  143. publish_key
  144. ;;
  145. 'trust-key'|'t')
  146. if [ -z "$1" ] ; then
  147. failure "you must specify at least one key to trust."
  148. fi
  149. for keyID ; do
  150. trust_key "$keyID"
  151. done
  152. ;;
  153. 'update-user-userids'|'u')
  154. uname="$1"
  155. shift
  156. if [ -z "$uname" ] ; then
  157. failure "you must specify user."
  158. fi
  159. if [ -z "$1" ] ; then
  160. failure "you must specify at least one userid."
  161. fi
  162. AUTHORIZED_USER_IDS="$MS_HOME"/authorized_user_ids/"$uname"
  163. userKeysCacheDir="$STAGING_AREA"/"$uname"/user_keys
  164. for userID ; do
  165. update_userid "$userID" "$userKeysCacheDir"
  166. done
  167. ;;
  168. 'help'|'h'|'?')
  169. usage
  170. ;;
  171. *)
  172. failure "Unknown command: '$COMMAND'
  173. Type 'cereal-admin help' for usage."
  174. ;;
  175. esac