1# -*-shell-script-*- 2# This should be sourced by bash (though we welcome changes to make it POSIX sh compliant) 3 4# Monkeysphere authentication setup subcommand 5# 6# The monkeysphere scripts are written by: 7# Jameson Rollins <jrollins@finestructure.net> 8# Jamie McClelland <jm@mayfirst.org> 9# Daniel Kahn Gillmor <dkg@fifthhorseman.net> 10# 11# They are Copyright 2009, and are all released under the GPL, 12# version 3 or later. 13 14setup() { 15 # make all needed directories 16 log debug "checking authentication directory structure..." 17 mkdir -p "${MADATADIR}" 18 chmod 0750 "${MADATADIR}" 19 chgrp "$MONKEYSPHERE_GROUP" "${MADATADIR}" 20 mkdir -p "${MATMPDIR}" 21 chmod 0750 "${MATMPDIR}" 22 chgrp "$MONKEYSPHERE_GROUP" "${MATMPDIR}" 23 mkdir -p "${GNUPGHOME_CORE}" 24 chmod 0700 "${GNUPGHOME_CORE}" 25 mkdir -p "${GNUPGHOME_SPHERE}" 26 chmod 0700 "${GNUPGHOME_SPHERE}" 27 mkdir -p "${SYSDATADIR}"/authorized_keys 28 29 # deliberately replace the config files via truncation 30 # FIXME: should we be dumping to tmp files and then moving atomically? 31 log debug "writing core gpg.conf..." 32 cat >"${GNUPGHOME_CORE}"/gpg.conf <<EOF 33# Monkeysphere trust core GnuPG configuration 34# This file is maintained by the Monkeysphere software. 35# Edits will be overwritten. 36no-greeting 37keyid-format 0xlong 38EOF 39 40 KEYSERVER_OPTIONS="" 41 for anchorfile in "${SYSCONFIGDIR}/monkeysphere-authentication-x509-anchors.crt" "${SYSCONFIGDIR}/monkeysphere-x509-anchors.crt"; do 42 if [ -z "$KEYSERVER_OPTIONS" ] && [ -r "$anchorfile" ] ; then 43 KEYSERVER_OPTIONS="keyserver-options ca-cert-file=$anchorfile" 44 log debug "using $anchorfile for keyserver X.509 anchor" 45 fi 46 done 47 48 log debug "writing sphere gpg.conf..." 49 cat >"${GNUPGHOME_SPHERE}"/gpg.conf <<EOF 50# Monkeysphere trust sphere GnuPG configuration 51# This file is maintained by the Monkeysphere software. 52# Edits will be overwritten. 53no-greeting 54list-options show-uid-validity 55keyid-format 0xlong 56${KEYSERVER_OPTIONS} 57EOF 58 59 # make sure the monkeysphere user owns everything in the sphere 60 # gnupghome 61 log debug "fixing sphere gnupg home ownership..." 62 chown "$MONKEYSPHERE_USER:$MONKEYSPHERE_GROUP" "${GNUPGHOME_SPHERE}" "${GNUPGHOME_SPHERE}"/gpg.conf 63 64 # get fingerprint of core key. this should be empty on unconfigured systems. 65 local CORE_FPR=$(core_fingerprint) 66 log debug "core fingerprint: $CORE_FPR" 67 68 if [ -z "$CORE_FPR" ] ; then 69 log info "setting up Monkeysphere authentication trust core..." 70 71 local CORE_UID=$(printf "Monkeysphere authentication trust core UID (random string: %s)" $(dd if=/dev/urandom bs=21 count=1 2>/dev/null | perl -MMIME::Base64 -ne 'print encode_base64($_)')) 72 73 printf "generating monkeysphere authentication trust core key:\nsize: %d bits\nuid: '%s'\n" "$CORE_KEYLENGTH" "$CORE_UID" | log debug 74 PEM2OPENPGP_USAGE_FLAGS=certify \ 75 PEM2OPENPGP_NEWKEY=$CORE_KEYLENGTH pem2openpgp "$CORE_UID" \ 76 | gpg_core --import \ 77 || failure "Could not import new key for Monkeysphere authentication trust core" 78 79 # get fingerprint of core key. should definitely not be empty at this point 80 CORE_FPR=$(core_fingerprint) 81 log debug "core fingerprint: $CORE_FPR" 82 if [ -z "$CORE_FPR" ] ; then 83 failure "Failed to create Monkeysphere authentication trust core!" 84 fi 85 86 else 87 log verbose "Monkeysphere authentication trust core already exists." 88 fi 89 90 # export the core key to the sphere keyring 91 log debug "exporting core pub key to sphere keyring..." 92 gpg_core --export | gpg_sphere --import 93 94 # ensure that the authentication sphere checker has absolute ownertrust on the expected key. 95 log debug "setting ultimate owner trust on core key in gpg_sphere..." 96 printf "%s:6:\n" "$CORE_FPR" | gpg_sphere --import-ownertrust 2>&1 | log verbose 97 gpg_sphere --export-ownertrust 2>&1 | log debug 98 99 # check the owner trust 100 log debug "checking gpg_sphere owner trust set properly..." 101 local ORIG_TRUST 102 if ORIG_TRUST=$(gpg_sphere --export-ownertrust | grep '^[^#]') ; then 103 if [ "${CORE_FPR}:6:" != "$ORIG_TRUST" ] ; then 104 failure "Monkeysphere authentication trust sphere should explicitly trust the core. It does not have proper ownertrust settings." 105 fi 106 else 107 failure "Could not get monkeysphere-authentication trust guidelines." 108 # FIXME: what does this mean? should we suggest how to fix? 109 fi 110 111 # ensure that we're using the extended trust model (1), and that 112 # our preferences are reasonable (i.e. 3 marginal OR 1 fully 113 # trusted certifications are sufficient to grant full validity. 114 log debug "checking trust model for authentication ..." 115 local TRUST_MODEL=$(gpg_sphere --with-colons --list-keys 2>/dev/null \ 116 | head -n1 | grep "^tru:" | cut -d: -f3,6,7) 117 log debug "sphere trust model: $TRUST_MODEL" 118 if [ "$TRUST_MODEL" != '1:3:1' ] ; then 119 failure "monkeysphere-authentication does not have the expected trust model settings." 120 # FIXME: what does this mean? should we suggest how to fix? 121 fi 122} 123