#
# The monkeysphere scripts are written by:
# Jameson Rollins <jrollins@fifthhorseman.net>
+# Jamie McClelland <jm@mayfirst.org>
+# Daniel Kahn Gillmor <dkg@fifthhorseman.net>
#
# They are Copyright 2008, and are all released under the GPL, version 3
# or later.
VARLIB="/var/lib/monkeysphere"
export VARLIB
-# date in UTF format if needed
+# UTC date in ISO 8601 format if needed
DATE=$(date -u '+%FT%T')
# unset some environment variables that could screw things up
########################################################################
usage() {
- cat <<EOF
+ cat <<EOF >&2
usage: $PGRM <subcommand> [options] [args]
MonkeySphere server admin tool.
--length (-l) BITS key length in bits (2048)
--expire (-e) EXPIRE date to expire
--revoker (-r) FINGERPRINT add a revoker
+ extend-key (e) EXPIRE extend expiration to EXPIRE
add-hostname (n+) NAME[:PORT] add hostname user ID to server key
revoke-hostname (n-) NAME[:PORT] revoke hostname user ID
show-key (s) output all server host key information
- fingerprint (f) output just the key fingerprint
publish-key (p) publish server host key to keyserver
diagnostics (d) report on server monkeysphere status
# output key information
show_server_key() {
local fingerprint
+ local tmpkey
+
fingerprint=$(fingerprint_server_key)
- gpg_host --fingerprint --list-secret-key "$fingerprint"
+ gpg_authentication "--fingerprint --list-key --list-options show-unusable-uids $fingerprint"
+
+ # dumping to a file named ' ' so that the ssh-keygen output
+ # doesn't claim any potentially bogus hostname(s):
+ tmpkey=$(mktemp -d)
+ gpg_authentication "--export $fingerprint" | openpgp2ssh "$fingerprint" 2>/dev/null > "$tmpkey/ "
+ echo -n "ssh fingerprint: "
+ (cd "$tmpkey" && ssh-keygen -l -f ' ' | awk '{ print $2 }')
+ rm -rf "$tmpkey"
+ echo -n "OpenPGP fingerprint: "
+ echo "$fingerprint"
}
# update authorized_keys for users
for uname in $unames ; do
# check all specified users exist
if ! getent passwd "$uname" >/dev/null ; then
- log "----- unknown user '$uname' -----"
+ log error "----- unknown user '$uname' -----"
continue
fi
fi
fi
- log "----- user: $uname -----"
+ log verbose "----- user: $uname -----"
# exit if the authorized_user_ids file is empty
if ! check_key_file_permissions "$uname" "$AUTHORIZED_USER_IDS" ; then
- log "Improper permissions on authorized_user_ids file path."
+ log error "Improper permissions on path '$AUTHORIZED_USER_IDS'."
continue
fi
# check permissions on the authorized_keys file path
if ! check_key_file_permissions "$uname" "$RAW_AUTHORIZED_KEYS" ; then
- log "Improper permissions on authorized_keys file path path."
+ log error "Improper permissions on path '$RAW_AUTHORIZED_KEYS'."
continue
fi
# add user-controlled authorized_keys file path if specified
if [ "$rawAuthorizedKeys" != '-' -a -s "$rawAuthorizedKeys" ] ; then
- log -n "adding raw authorized_keys file... "
+ log verbose "adding raw authorized_keys file... "
cat "$rawAuthorizedKeys" >> "$AUTHORIZED_KEYS"
- loge "done."
fi
# openssh appears to check the contents of the
fi
# prompt about key expiration if not specified
- if [ -z "$keyExpire" ] ; then
- cat <<EOF
-Please specify how long the key should be valid.
- 0 = key does not expire
- <n> = key expires in n days
- <n>w = key expires in n weeks
- <n>m = key expires in n months
- <n>y = key expires in n years
-EOF
- while [ -z "$keyExpire" ] ; do
- read -p "Key is valid for? (0) " keyExpire
- if ! test_gpg_expire ${keyExpire:=0} ; then
- echo "invalid value"
- unset keyExpire
- fi
- done
- elif ! test_gpg_expire "$keyExpire" ; then
- failure "invalid key expiration value '$keyExpire'."
- fi
+ keyExpire=$(get_gpg_expiration "$keyExpire")
# set key parameters
keyParameters=$(cat <<EOF
EOF
)
- log "generating server key..."
+ log verbose "generating server key..."
echo "$keyParameters" | gpg_host --batch --gen-key
# output the server fingerprint
fingerprint=$(fingerprint_server_key)
# export host ownertrust to authentication keyring
- log "setting ultimate owner trust for server key..."
+ log verbose "setting ultimate owner trust for server key..."
echo "${fingerprint}:6:" | gpg_authentication "--import-ownertrust"
# translate the private key to ssh format, and export to a file
(umask 077 && \
gpg_host --export-secret-key "$fingerprint" | \
openpgp2ssh "$fingerprint" > "${VARLIB}/ssh_host_rsa_key")
- log "Private SSH host key output to file: ${VARLIB}/ssh_host_rsa_key"
+ log info "Private SSH host key output to file: ${VARLIB}/ssh_host_rsa_key"
+}
+
+# extend the lifetime of a host key:
+extend_key() {
+ local fpr=$(fingerprint_server_key)
+ local extendTo="$1"
+
+ if [ -z "$fpr" ] ; then
+ failure "You don't appear to have a MonkeySphere host key on this server. Try 'monkeysphere-server gen-key' first."
+ fi
+
+ # get the new expiration date
+ extendTo=$(get_gpg_expiration "$extendTo")
+
+ gpg_host --quiet --command-fd 0 --edit-key "$fpr" <<EOF
+expire
+$extendTo
+save
+EOF
+
+ echo
+ echo "NOTE: Host key expiration date adjusted, but not yet published."
+ echo "Run '$PGRM publish-key' to publish the new expiration date."
}
# add hostname user ID to server key
# execute edit-key script
if echo "$adduidCommand" | \
gpg_host --quiet --command-fd 0 --edit-key "0x${fingerprint}!" ; then
- # update trust db
- gpg_host --check-trustdb
+
+ # update the trustdb for the authentication keyring
+ gpg_authentication "--check-trustdb"
show_server_key
+ echo
echo "NOTE: User ID added to key, but key not published."
echo "Run '$PGRM publish-key' to publish the new user ID."
else
echo "WARNING: There is a known bug in this function."
echo "This function has been known to occasionally revoke the wrong user ID."
echo "Please see the following bug report for more information:"
- echo "http://monkeysphere.info/bugs/revoke-hostname-revoking-wrong-userid/"
+ echo "http://web.monkeysphere.info/bugs/revoke-hostname-revoking-wrong-userid/"
read -p "Are you sure you would like to proceed? (y/N) " OK; OK=${OK:=N}
if [ ${OK/y/Y} != 'Y' ] ; then
failure "aborting."
# execute edit-key script
if echo "$revuidCommand" | \
gpg_host --quiet --command-fd 0 --edit-key "0x${fingerprint}!" ; then
- # update trust db
- gpg_host --check-trustdb
+
+ # update the trustdb for the authentication keyring
+ gpg_authentication "--check-trustdb"
show_server_key
+ echo
echo "NOTE: User ID revoked, but revocation not published."
echo "Run '$PGRM publish-key' to publish the revocation."
else
warnwindow='2 months'
warndate=$(date +%s -d "$warnwindow")
+ if ! id monkeysphere >/dev/null ; then
+ echo "! No monkeysphere user found! Please create a monkeysphere system user."
+ fi
+
+ if ! [ -d "$VARLIB" ] ; then
+ echo "! no $VARLIB directory found. Please create it."
+ fi
+
echo "Checking host GPG key..."
if (( "$keysfound" < 1 )); then
echo "! No host key found."
if [ "$expire" ]; then
if (( "$expire" < "$curdate" )); then
echo "! Host key is expired."
- # FIXME: recommend a way to resolve this other than re-keying?
+ echo " - Recommendation: extend lifetime of key with 'monkeysphere-server extend-key'"
elif (( "$expire" < "$warndate" )); then
echo "! Host key expires in less than $warnwindow:" $(date -d "$(( $expire - $curdate )) seconds" +%F)
- # FIXME: recommend a way to resolve this?
+ echo " - Recommendation: extend lifetime of key with 'monkeysphere-server extend-key'"
fi
fi
if gpg_authentication "--delete-key --batch --yes 0x${keyID}!" ; then
# delete key from host keyring as well
gpg_host --delete-key --batch --yes "0x${keyID}!"
+
# update the trustdb for the authentication keyring
gpg_authentication "--check-trustdb"
# set empty config variable with ones from the environment, or with
# defaults
+LOG_LEVEL=${MONKEYSPHERE_LOG_LEVEL:=${LOG_LEVEL:="INFO"}}
KEYSERVER=${MONKEYSPHERE_KEYSERVER:=${KEYSERVER:="subkeys.pgp.net"}}
-AUTHORIZED_USER_IDS=${MONKEYSPHERE_AUTHORIZED_USER_IDS:=${AUTHORIZED_USER_IDS:="%h/.config/monkeysphere/authorized_user_ids"}}
+AUTHORIZED_USER_IDS=${MONKEYSPHERE_AUTHORIZED_USER_IDS:=${AUTHORIZED_USER_IDS:="%h/.monkeysphere/authorized_user_ids"}}
RAW_AUTHORIZED_KEYS=${MONKEYSPHERE_RAW_AUTHORIZED_KEYS:=${RAW_AUTHORIZED_KEYS:="%h/.ssh/authorized_keys"}}
MONKEYSPHERE_USER=${MONKEYSPHERE_MONKEYSPHERE_USER:=${MONKEYSPHERE_USER:="monkeysphere"}}
export DATE
export MODE
export MONKEYSPHERE_USER
+export LOG_LEVEL
export KEYSERVER
export CHECK_KEYSERVER
export REQUIRED_USER_KEY_CAPABILITY
gen_key "$@"
;;
+ 'extend-key'|'e')
+ extend_key "$@"
+ ;;
+
'add-hostname'|'add-name'|'n+')
add_hostname "$@"
;;
show_server_key
;;
- 'show-fingerprint'|'fingerprint'|'f')
- fingerprint_server_key
- ;;
-
'publish-key'|'publish'|'p')
publish_server_key
;;