summaryrefslogtreecommitdiff
path: root/src/monkeysphere-server
blob: a109cf533229c78074e1fe543e37569b49618321 (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 users authorized_keys files
  27. gen-key (g) generate gpg key for the server
  28. publish-key (p) publish server key to keyserver
  29. trust-keys (t) KEYID... mark keyids as trusted
  30. update-user-userids (u) USER UID... add/update userids for a user
  31. help (h,?) this help
  32. EOF
  33. }
  34. # generate server gpg key
  35. gen_key() {
  36. # set key defaults
  37. KEY_TYPE=${KEY_TYPE:-"RSA"}
  38. KEY_LENGTH=${KEY_LENGTH:-"2048"}
  39. KEY_USAGE=${KEY_USAGE:-"encrypt,auth"}
  40. SERVICE=${SERVICE:-"ssh"}
  41. HOSTNAME_FQDN=${HOSTNAME_FQDN:-$(hostname -f)}
  42. USERID=${USERID:-"$SERVICE"://"$HOSTNAME_FQDN"}
  43. # set key parameters
  44. keyParameters=$(cat <<EOF
  45. Key-Type: $KEY_TYPE
  46. Key-Length: $KEY_LENGTH
  47. Key-Usage: $KEY_USAGE
  48. Name-Real: $USERID
  49. EOF
  50. )
  51. # add the revoker field if requested
  52. if [ "$REVOKER" ] ; then
  53. keyParameters="${keyParameters}"$(cat <<EOF
  54. Revoker: 1:$REVOKER sensitive
  55. EOF
  56. )
  57. fi
  58. log "The following key parameters will be used:"
  59. echo "$keyParameters"
  60. read -p "generate key? [Y|n]: " OK; OK=${OK:=Y}
  61. if [ ${OK/y/Y} != 'Y' ] ; then
  62. failure "aborting."
  63. fi
  64. if gpg --list-key ="$USERID" > /dev/null 2>&1 ; then
  65. failure "key for '$USERID' already exists"
  66. fi
  67. # add commit command
  68. keyParameters="${keyParameters}"$(cat <<EOF
  69. %commit
  70. %echo done
  71. EOF
  72. )
  73. echo "generating server key..."
  74. echo "$keyParameters" | gpg --batch --gen-key
  75. }
  76. # publish server key to keyserver
  77. publish_key() {
  78. read -p "publish key to $KEYSERVER? [Y|n]: " OK; OK=${OK:=Y}
  79. if [ ${OK/y/Y} != 'Y' ] ; then
  80. failure "aborting."
  81. fi
  82. keyID=$(gpg --list-key --with-colons ="$USERID" 2> /dev/null | grep '^pub:' | cut -d: -f5)
  83. # dummy command so as not to publish fakes keys during testing
  84. # eventually:
  85. #gpg --send-keys --keyserver "$KEYSERVER" "$keyID"
  86. echo "NOT PUBLISHED: gpg --send-keys --keyserver $KEYSERVER $keyID"
  87. }
  88. ########################################################################
  89. # MAIN
  90. ########################################################################
  91. COMMAND="$1"
  92. [ "$COMMAND" ] || failure "Type '$PGRM help' for usage."
  93. shift
  94. # set ms home directory
  95. MS_HOME=${MS_HOME:-"$ETC"}
  96. # load configuration file
  97. MS_CONF=${MS_CONF:-"$MS_HOME"/monkeysphere-server.conf}
  98. [ -e "$MS_CONF" ] && . "$MS_CONF"
  99. # set empty config variable with defaults
  100. GNUPGHOME=${GNUPGHOME:-"$MS_HOME"/gnupg}
  101. KEYSERVER=${KEYSERVER:-subkeys.pgp.net}
  102. REQUIRED_KEY_CAPABILITY=${REQUIRED_KEY_CAPABILITY:-"e a"}
  103. USER_CONTROLLED_AUTHORIZED_KEYS=${USER_CONTROLLED_AUTHORIZED_KEYS:-%h/.ssh/authorized_keys}
  104. STAGING_AREA=${STAGING_AREA:-"$LIB"/stage}
  105. export GNUPGHOME
  106. # make sure gpg home exists with proper permissions
  107. mkdir -p -m 0700 "$GNUPGHOME"
  108. case $COMMAND in
  109. 'update-users'|'s')
  110. if [ "$1" ] ; then
  111. unames="$@"
  112. else
  113. unames=$(ls -1 "$MS_HOME"/authorized_user_ids)
  114. fi
  115. for uname in $unames ; do
  116. MODE="authorized_keys"
  117. log "----- user: $uname -----"
  118. AUTHORIZED_USER_IDS="$MS_HOME"/authorized_user_ids/"$uname"
  119. cacheDir="$STAGING_AREA"/"$uname"/user_keys
  120. msAuthorizedKeys="$STAGING_AREA"/"$uname"/authorized_keys
  121. # make sure authorized_user_ids file exists
  122. if [ ! -s "$AUTHORIZED_USER_IDS" ] ; then
  123. log "authorized_user_ids file for '$uname' is empty or does not exist."
  124. continue
  125. fi
  126. # set user-controlled authorized_keys file path
  127. if [ "$USER_CONTROLLED_AUTHORIZED_KEYS" ] ; then
  128. userHome=$(getent passwd "$uname" | cut -d: -f6)
  129. userAuthorizedKeys=${USER_CONTROLLED_AUTHORIZED_KEYS/\%h/"$userHome"}
  130. fi
  131. # update authorized_keys
  132. update_authorized_keys "$cacheDir" "$msAuthorizedKeys" "$userAuthorizedKeys"
  133. done
  134. log "----- done. -----"
  135. ;;
  136. 'gen-key'|'g')
  137. gen_key
  138. ;;
  139. 'publish-key'|'p')
  140. publish_key
  141. ;;
  142. 'trust-keys'|'t')
  143. if [ -z "$1" ] ; then
  144. failure "you must specify at least one key to trust."
  145. fi
  146. for keyID ; do
  147. trust_key "$keyID"
  148. done
  149. ;;
  150. 'update-user-userids'|'u')
  151. uname="$1"
  152. shift
  153. if [ -z "$uname" ] ; then
  154. failure "you must specify user."
  155. fi
  156. if [ -z "$1" ] ; then
  157. failure "you must specify at least one userid."
  158. fi
  159. AUTHORIZED_USER_IDS="$MS_HOME"/authorized_user_ids/"$uname"
  160. userKeysCacheDir="$STAGING_AREA"/"$uname"/user_keys
  161. for userID ; do
  162. update_userid "$userID" "$userKeysCacheDir"
  163. done
  164. ;;
  165. 'help'|'h'|'?')
  166. usage
  167. ;;
  168. *)
  169. failure "Unknown command: '$COMMAND'
  170. Type 'cereal-admin help' for usage."
  171. ;;
  172. esac