From 41b38ace2b23bebf61fbf63cda8d3be005d28385 Mon Sep 17 00:00:00 2001 From: Daniel Kahn Gillmor Date: Wed, 18 Feb 2009 21:30:01 -0500 Subject: added debian/NEWS file so that early adopters are appraised of the changes. --- packaging/debian/NEWS | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 packaging/debian/NEWS (limited to 'packaging/debian') diff --git a/packaging/debian/NEWS b/packaging/debian/NEWS new file mode 100644 index 0000000..3fceea2 --- /dev/null +++ b/packaging/debian/NEWS @@ -0,0 +1,22 @@ +monkeysphere (0.23-1) unstable; urgency=low + + * There has been a major interface and data refactoring. Please see the + man pages for details. Major changes are listed here: + * For end users: monkeysphere-ssh-proxycommand is no more. + its functionality has been folded into monkeysphere as a subcommand. + So if you are currently using: + ssh -oProxyCommand='monkeysphere-ssh-proxycommand %h %p' + plese use instead: + ssh -oProxyCommand='monkeysphere ssh-proxycommand %h %p' + * For sysadmins: monkeysphere-server has been split into + monkeysphere-host (for publishing the ssh host key of your machine) + and monkeysphere-authentication (for setting up your machine to + authenticate users via the OpenPGP Web of Trust) + * For too-curious sysadmins: the layout of /var/lib/monkeysphere has + changed dramatically. If you did any tricky tweaking of the files in + there, you probably want to check that your changes have been + preserved after the upgrade. The old files can be found in + /var/lib/monkeysphere/backup-from-0.23-transition. + + -- Daniel Kahn Gillmor Wed, 18 Feb 2009 21:29:22 -0500 + -- cgit v1.2.3 From a5b856642557d0a8463aa7ca26a6e3f898a8ac54 Mon Sep 17 00:00:00 2001 From: Daniel Kahn Gillmor Date: Thu, 19 Feb 2009 02:02:19 -0500 Subject: making clearer comments in the transition script, invoking from postinst for debian. --- packaging/debian/monkeysphere.postinst | 3 +++ src/share/common | 2 +- src/transition_0.22_0.23 | 26 +++++++++++++++++++++----- 3 files changed, 25 insertions(+), 6 deletions(-) (limited to 'packaging/debian') diff --git a/packaging/debian/monkeysphere.postinst b/packaging/debian/monkeysphere.postinst index 8e79771..efa7fb4 100755 --- a/packaging/debian/monkeysphere.postinst +++ b/packaging/debian/monkeysphere.postinst @@ -17,6 +17,9 @@ if ! getent passwd monkeysphere >/dev/null ; then monkeysphere fi +# try to transition from 0.22 to 0.23: +/usr/share/monkeysphere/transition_0.22_0.23 + # setup monkeysphere authentication monkeysphere-authentication setup diff --git a/src/share/common b/src/share/common index b45363a..a2f4494 100644 --- a/src/share/common +++ b/src/share/common @@ -8,7 +8,7 @@ # Jamie McClelland # Daniel Kahn Gillmor # -# Copyright 2008, released under the GPL, version 3 or later +# Copyright 2008-2009, released under the GPL, version 3 or later # all-caps variables are meant to be user supplied (ie. from config # file) and are considered global diff --git a/src/transition_0.22_0.23 b/src/transition_0.22_0.23 index 12ef1d2..e1c9e9e 100755 --- a/src/transition_0.22_0.23 +++ b/src/transition_0.22_0.23 @@ -1,10 +1,24 @@ #!/bin/bash -# this script should run without any errors. -set -e - # This is a post-install script for monkeysphere, to transition an old -# (<0.23) setup to the new (>=0.23) setup +# (<0.23) setup to the new (>=0.23) setup. + +# You should be able to run this script after any version >= 0.23 is +# installed. This script should be well-behaved, even if it is run +# repeatedly. + +# Written by +# Jameson Rollins +# Daniel Kahn Gillmor +# +# Copyright 2009, released under the GPL, version 3 or later + +# NOTE: the reverse operation (downgrading) is not directly supported, +# and MAY LOCK YOU OUT OF YOUR SYSTEM, depending on how you have +# configured the monkeysphere! + +# any unexpected errors should cause this script to bail: +set -e SYSDATADIR=${MONKEYSPHERE_SYSDATADIR:-"/var/lib/monkeysphere"} @@ -29,7 +43,9 @@ is_domain_name() { printf "%s" "$1" | egrep -q '^[[:alnum:]][[:alnum:]-.]*[[:alnum:]]$' } -# run the authentication setup +# run the authentication setup (this is also the first chance to bail +# if 0.23 is not fully-installed, because m-a did not exist before +# 0.23) monkeysphere-authentication setup # before 0.23, the old gnupg-host data directory used to contain the -- cgit v1.2.3 From 98dbe4834e52014acd968b96b9ad5f7dce9aa1af Mon Sep 17 00:00:00 2001 From: Daniel Kahn Gillmor Date: Thu, 19 Feb 2009 02:15:20 -0500 Subject: added notes about transition to debian/changelog --- packaging/debian/changelog | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'packaging/debian') diff --git a/packaging/debian/changelog b/packaging/debian/changelog index c825b64..6a9ea18 100644 --- a/packaging/debian/changelog +++ b/packaging/debian/changelog @@ -18,8 +18,10 @@ monkeysphere (0.23~pre-1) UNRELEASED; urgency=low * added version output option * check that existing authentication keys are valid in gen_key function. + * add transition infrastructure for major changes between releases (see + transitions/README.txt) - -- Jameson Graef Rollins Thu, 12 Feb 2009 21:50:54 -0500 + -- Daniel Kahn Gillmor Thu, 19 Feb 2009 02:14:44 -0500 monkeysphere (0.22-1) unstable; urgency=low -- cgit v1.2.3 From 2ab50bee3f2cc4030cb4555b6c9644e3c206141e Mon Sep 17 00:00:00 2001 From: Jameson Graef Rollins Date: Thu, 19 Feb 2009 02:33:53 -0500 Subject: fix call to transition script in postinst script, and fix lintian error about transitions README --- Makefile | 1 + packaging/debian/monkeysphere.postinst | 4 ++-- src/monkeysphere-host | 2 -- 3 files changed, 3 insertions(+), 4 deletions(-) (limited to 'packaging/debian') diff --git a/Makefile b/Makefile index fc608d2..71df92b 100755 --- a/Makefile +++ b/Makefile @@ -54,6 +54,7 @@ install: all installman install src/monkeysphere-host src/monkeysphere-authentication $(DESTDIR)$(PREFIX)/sbin install -m 0644 src/share/common $(DESTDIR)$(PREFIX)/share/monkeysphere install -m 0744 src/transitions/* $(DESTDIR)$(PREFIX)/share/monkeysphere/transitions + install -m 0644 src/transitions/README.txt $(DESTDIR)$(PREFIX)/share/monkeysphere/transitions install -m 0644 src/share/m/* $(DESTDIR)$(PREFIX)/share/monkeysphere/m install -m 0644 src/share/mh/* $(DESTDIR)$(PREFIX)/share/monkeysphere/mh install -m 0644 src/share/ma/* $(DESTDIR)$(PREFIX)/share/monkeysphere/ma diff --git a/packaging/debian/monkeysphere.postinst b/packaging/debian/monkeysphere.postinst index efa7fb4..3d0d66f 100755 --- a/packaging/debian/monkeysphere.postinst +++ b/packaging/debian/monkeysphere.postinst @@ -17,8 +17,8 @@ if ! getent passwd monkeysphere >/dev/null ; then monkeysphere fi -# try to transition from 0.22 to 0.23: -/usr/share/monkeysphere/transition_0.22_0.23 +# try to transition from to 0.23: +/usr/share/monkeysphere/transitions/0.23 # setup monkeysphere authentication monkeysphere-authentication setup diff --git a/src/monkeysphere-host b/src/monkeysphere-host index 9b31ee0..9e73ad2 100755 --- a/src/monkeysphere-host +++ b/src/monkeysphere-host @@ -85,8 +85,6 @@ gpg_host_list() { } # command for edit key scripts, takes scripts on stdin -# FIXME: should we supress all the edit script spew? or pipe it -# through log debug? gpg_host_edit() { gpg_host --command-fd 0 --edit-key "0x${HOST_FINGERPRINT}!" "$@" } -- cgit v1.2.3 From bd64869a3b68ff8a020c381371a8ab1e24a5a0e4 Mon Sep 17 00:00:00 2001 From: Jameson Graef Rollins Date: Thu, 19 Feb 2009 15:19:02 -0500 Subject: The monkeysphere {import,gen}_subkey functions were not up-to-date. did a lot of work to bring them up-to-date, and better handle argument checking. also updated man page, changelog, and tests/basic. --- man/man1/monkeysphere.1 | 41 ++++++++++++++--------- packaging/debian/changelog | 6 ++-- src/monkeysphere | 82 ++++++++++++++++++++++++++++++++++++++++++--- src/share/m/gen_subkey | 83 ++++++++-------------------------------------- src/share/m/import_subkey | 62 ++++++++++++++++++---------------- src/share/mh/import_key | 9 +++-- tests/basic | 2 +- 7 files changed, 161 insertions(+), 124 deletions(-) (limited to 'packaging/debian') diff --git a/man/man1/monkeysphere.1 b/man/man1/monkeysphere.1 index 3ed43e1..345e1d8 100644 --- a/man/man1/monkeysphere.1 +++ b/man/man1/monkeysphere.1 @@ -56,24 +56,32 @@ ID, 1 if no matching keys were found at all, and 2 if matching keys were found but none were acceptable. `a' may be used in place of `update-authorized_keys'. .TP +.B import-subkey FILE [KEYID] +Import an existing ssh RSA key as an authentication subkey for a +private key in your GnuPG keyring. KEYID is the key ID for the +primary key for which the subkey with "authentication" capability will +be imported. If no key ID is specified, but only one key exists in +the secret keyring, that key will be used. `i' may be used in place +of `import-subkey'. +.TP .B gen-subkey [KEYID] Generate an authentication subkey for a private key in your GnuPG -keyring. For the primary key with the specified key ID, generate a -subkey with "authentication" capability that can be used for -monkeysphere transactions. An expiration length can be specified with -the `-e' or `--expire' option (prompt otherwise). If no key ID is +keyring. KEYID is the key ID for the primary key for which the subkey +with "authentication" capability will be generated. If no key ID is specified, but only one key exists in the secret keyring, that key -will be used. `g' may be used in place of `gen-subkey'. +will be used. The length of the generated key can be specified with +the `--length` or `-l` option. `g' may be used in place of +`gen-subkey'. .TP .B ssh-proxycommand -an ssh proxy command that can be used -to trigger a monkeysphere update of the ssh known_hosts file for a -host that is being connected to with ssh. This works by updating the -known_hosts file for the host first, before an attempted connection to -the host is made. Once the known_hosts file has been updated, a TCP -connection to the host is made by exec'ing netcat(1). Regular ssh -communication is then done over this netcat TCP connection (see -ProxyCommand in ssh_config(5) for more info). +An ssh ProxyCommand that can be used to trigger a monkeysphere update +of the ssh known_hosts file for a host that is being connected to with +ssh. This works by updating the known_hosts file for the host first, +before an attempted connection to the host is made. Once the +known_hosts file has been updated, a TCP connection to the host is +made by exec'ing netcat(1). Regular ssh communication is then done +over this netcat TCP connection (see ProxyCommand in ssh_config(5) for +more info). This command is meant to be run as the ssh "ProxyCommand". This can either be done by specifying the proxy command on the command line: @@ -108,9 +116,10 @@ change in the future, possibly by adding a deferred check, so that hosts that go from non-monkeysphere-enabled to monkeysphere-enabled will be properly checked. -Setting the MONKEYSPHERE_CHECK_KEYSERVER -variable (to `true' or `false') will override the keyserver-checking policy -defined above. +Setting the CHECK_KEYSERVER variable in the config file or the +MONKEYSPHERE_CHECK_KEYSERVER environment variable to either `true' or +`false' will override the keyserver-checking policy defined above and +either always or never check the keyserver for host key updates. .TP .B subkey-to-ssh-agent [ssh-add arguments] diff --git a/packaging/debian/changelog b/packaging/debian/changelog index 6a9ea18..fc317d9 100644 --- a/packaging/debian/changelog +++ b/packaging/debian/changelog @@ -16,12 +16,12 @@ monkeysphere (0.23~pre-1) UNRELEASED; urgency=low functions that require it to be there. * get rid of getopts dependency * added version output option - * check that existing authentication keys are valid in gen_key - function. + * better checks on validity of existing authentication subkeys when + doing monkeysphere {import,gen}_subkey. * add transition infrastructure for major changes between releases (see transitions/README.txt) - -- Daniel Kahn Gillmor Thu, 19 Feb 2009 02:14:44 -0500 + -- Jameson Graef Rollins Thu, 19 Feb 2009 15:11:04 -0500 monkeysphere (0.22-1) unstable; urgency=low diff --git a/src/monkeysphere b/src/monkeysphere index 992ca06..4169f2a 100755 --- a/src/monkeysphere +++ b/src/monkeysphere @@ -45,12 +45,9 @@ Monkeysphere client tool. subcommands: update-known_hosts (k) [HOST]... update known_hosts file update-authorized_keys (a) update authorized_keys file - import-subkey (i) import existing ssh key as gpg subkey - --keyfile (-f) FILE key file to import - --expire (-e) EXPIRE date to expire + import-subkey (i) FILE [KEYID] import existing ssh key as gpg subkey gen-subkey (g) [KEYID] generate an authentication subkey --length (-l) BITS key length in bits (2048) - --expire (-e) EXPIRE date to expire ssh-proxycommand monkeysphere ssh ProxyCommand subkey-to-ssh-agent (s) store authentication subkey in ssh-agent version (v) show version number @@ -59,6 +56,83 @@ subcommands: EOF } +# take a secret key ID and check that only zero or one ID is provided, +# and that it corresponds to only a single secret key ID +check_gpg_sec_key_id() { + local gpgSecOut + + case "$#" in + 0) + gpgSecOut=$(gpg --quiet --fixed-list-mode --list-secret-keys --with-colons 2>/dev/null | egrep '^sec:') + ;; + 1) + gpgSecOut=$(gpg --quiet --fixed-list-mode --list-secret-keys --with-colons "$keyID" | egrep '^sec:') || failure + ;; + *) + failure "You must specify only a single primary key ID." + ;; + esac + + # check that only a single secret key was found + case $(echo "$gpgSecOut" | grep -c '^sec:') in + 0) + failure "No secret keys found. Create an OpenPGP key with the following command: + gpg --gen-key" + ;; + 1) + echo "$gpgSecOut" | cut -d: -f5 + ;; + *) + echo "Multiple primary secret keys found:" | log error + echo "$gpgSecOut" | cut -d: -f5 | log error + echo "Please specify which primary key to use." | log error + failure + ;; + esac +} + +# check that a valid authentication subkey does not already exist +check_gpg_authentication_subkey() { + local keyID + local IFS + local line + local type + local validity + local usage + + keyID="$1" + + # check that a valid authentication key does not already exist + IFS=$'\n' + for line in $(gpg --quiet --fixed-list-mode --list-keys --with-colons "$keyID") ; do + type=$(echo "$line" | cut -d: -f1) + validity=$(echo "$line" | cut -d: -f2) + usage=$(echo "$line" | cut -d: -f12) + + # look at keys only + if [ "$type" != 'pub' -a "$type" != 'sub' ] ; then + continue + fi + # check for authentication capability + if ! check_capability "$usage" 'a' ; then + continue + fi + # if authentication key is valid, prompt to continue + if [ "$validity" = 'u' ] ; then + log error "A valid authentication key already exists for primary key '$keyID'." + if [ "$PROMPT" = "true" ] ; then + read -p "Are you sure you would like to generate another one? (y/N) " OK; OK=${OK:N} + if [ "${OK/y/Y}" != 'Y' ] ; then + failure "aborting." + fi + break + else + failure "aborting." + fi + fi + done +} + ######################################################################## # MAIN ######################################################################## diff --git a/src/share/m/gen_subkey b/src/share/m/gen_subkey index d926ad5..7c3ebb7 100644 --- a/src/share/m/gen_subkey +++ b/src/share/m/gen_subkey @@ -15,10 +15,10 @@ gen_subkey(){ local keyLength - local keyExpire + local gpgSecOut local keyID - local gpgOut - local userID + local editCommands + local fifoDir # get options while true ; do @@ -27,10 +27,6 @@ gen_subkey(){ keyLength="$2" shift 2 ;; - -e|--expire) - keyExpire="$2" - shift 2 - ;; *) if [ "$(echo "$1" | cut -c 1)" = '-' ] ; then failure "Unknown option '$1'. @@ -41,67 +37,11 @@ Type '$PGRM help' for usage." esac done - case "$#" in - 0) - gpgSecOut=$(gpg --quiet --fixed-list-mode --list-secret-keys --with-colons 2>/dev/null | egrep '^sec:') - ;; - 1) - gpgSecOut=$(gpg --quiet --fixed-list-mode --list-secret-keys --with-colons "$1" | egrep '^sec:') || failure - ;; - *) - failure "You must specify only a single primary key ID." - ;; - esac - - # check that only a single secret key was found - case $(echo "$gpgSecOut" | grep -c '^sec:') in - 0) - failure "No secret keys found. Create an OpenPGP key with the following command: - gpg --gen-key" - ;; - 1) - keyID=$(echo "$gpgSecOut" | cut -d: -f5) - ;; - *) - echo "Multiple primary secret keys found:" - echo "$gpgSecOut" | cut -d: -f5 - failure "Please specify which primary key to use." - ;; - esac + # check that the keyID is unique + keyID=$(check_gpg_sec_key_id "$@") - # check that a valid authentication key does not already exist - IFS=$'\n' - for line in $(gpg --quiet --fixed-list-mode --list-keys --with-colons "$keyID") ; do - type=$(echo "$line" | cut -d: -f1) - validity=$(echo "$line" | cut -d: -f2) - usage=$(echo "$line" | cut -d: -f12) - - # look at keys only - if [ "$type" != 'pub' -a "$type" != 'sub' ] ; then - continue - fi - # check for authentication capability - if ! check_capability "$usage" 'a' ; then - continue - fi - # if authentication key is valid, prompt to continue - if [ "$validity" = 'u' ] ; then - log error "A valid authentication key already exists for primary key '$keyID'." - if [ "$PROMPT" = "true" ] ; then - read -p "Are you sure you would like to generate another one? (y/N) " OK; OK=${OK:N} - if [ "${OK/y/Y}" != 'Y' ] ; then - failure "aborting." - fi - break - else - failure "aborting." - fi - fi - done - - # set subkey defaults - # prompt about key expiration if not specified - keyExpire=$(get_gpg_expiration "$keyExpire") + # check that an authentication subkey does not already exist + check_gpg_authentication_subkey "$keyID" # generate the list of commands that will be passed to edit-key editCommands=$(cat <