Home | History | Annotate | Download | only in regress
      1 #	$OpenBSD: principals-command.sh,v 1.3 2016/09/26 21:34:38 bluhm Exp $
      2 #	Placed in the Public Domain.
      3 
      4 tid="authorized principals command"
      5 
      6 rm -f $OBJ/user_ca_key* $OBJ/cert_user_key*
      7 cp $OBJ/sshd_proxy $OBJ/sshd_proxy_bak
      8 
      9 if [ -z "$SUDO" -a ! -w /var/run ]; then
     10 	echo "skipped (SUDO not set)"
     11 	echo "need SUDO to create file in /var/run, test won't work without"
     12 	exit 0
     13 fi
     14 
     15 SERIAL=$$
     16 
     17 # Create a CA key and a user certificate.
     18 ${SSHKEYGEN} -q -N '' -t ed25519  -f $OBJ/user_ca_key || \
     19 	fatal "ssh-keygen of user_ca_key failed"
     20 ${SSHKEYGEN} -q -N '' -t rsa -f $OBJ/cert_user_key || \
     21 	fatal "ssh-keygen of cert_user_key failed"
     22 ${SSHKEYGEN} -q -s $OBJ/user_ca_key -I "Joanne User" \
     23     -z $$ -n ${USER},mekmitasdigoat $OBJ/cert_user_key || \
     24 	fatal "couldn't sign cert_user_key"
     25 
     26 CERT_BODY=`cat $OBJ/cert_user_key-cert.pub | awk '{ print $2 }'`
     27 CA_BODY=`cat $OBJ/user_ca_key.pub | awk '{ print $2 }'`
     28 CERT_FP=`${SSHKEYGEN} -lf $OBJ/cert_user_key-cert.pub | awk '{ print $2 }'`
     29 CA_FP=`${SSHKEYGEN} -lf $OBJ/user_ca_key.pub | awk '{ print $2 }'`
     30 
     31 # Establish a AuthorizedPrincipalsCommand in /var/run where it will have
     32 # acceptable directory permissions.
     33 PRINCIPALS_COMMAND="/var/run/principals_command_${LOGNAME}"
     34 cat << _EOF | $SUDO sh -c "cat > '$PRINCIPALS_COMMAND'"
     35 #!/bin/sh
     36 test "x\$1" != "x${LOGNAME}" && exit 1
     37 test "x\$2" != "xssh-rsa-cert-v01 (at] openssh.com" && exit 1
     38 test "x\$3" != "xssh-ed25519" && exit 1
     39 test "x\$4" != "xJoanne User" && exit 1
     40 test "x\$5" != "x${SERIAL}" && exit 1
     41 test "x\$6" != "x${CA_FP}" && exit 1
     42 test "x\$7" != "x${CERT_FP}" && exit 1
     43 test "x\$8" != "x${CERT_BODY}" && exit 1
     44 test "x\$9" != "x${CA_BODY}" && exit 1
     45 test -f "$OBJ/authorized_principals_${LOGNAME}" &&
     46 	exec cat "$OBJ/authorized_principals_${LOGNAME}"
     47 _EOF
     48 test $? -eq 0 || fatal "couldn't prepare principals command"
     49 $SUDO chmod 0755 "$PRINCIPALS_COMMAND"
     50 
     51 if ! $OBJ/check-perm -m keys-command $PRINCIPALS_COMMAND ; then
     52 	echo "skipping: $PRINCIPALS_COMMAND is unsuitable as " \
     53 	    "AuthorizedPrincipalsCommand"
     54 	$SUDO rm -f $PRINCIPALS_COMMAND
     55 	exit 0
     56 fi
     57 
     58 if [ -x $PRINCIPALS_COMMAND ]; then
     59 	# Test explicitly-specified principals
     60 	for privsep in yes no ; do
     61 		_prefix="privsep $privsep"
     62 
     63 		# Setup for AuthorizedPrincipalsCommand
     64 		rm -f $OBJ/authorized_keys_$USER
     65 		(
     66 			cat $OBJ/sshd_proxy_bak
     67 			echo "UsePrivilegeSeparation $privsep"
     68 			echo "AuthorizedKeysFile none"
     69 			echo "AuthorizedPrincipalsCommand $PRINCIPALS_COMMAND" \
     70 			    "%u %t %T %i %s %F %f %k %K"
     71 			echo "AuthorizedPrincipalsCommandUser ${LOGNAME}"
     72 			echo "TrustedUserCAKeys $OBJ/user_ca_key.pub"
     73 		) > $OBJ/sshd_proxy
     74 
     75 		# XXX test missing command
     76 		# XXX test failing command
     77 
     78 		# Empty authorized_principals
     79 		verbose "$tid: ${_prefix} empty authorized_principals"
     80 		echo > $OBJ/authorized_principals_$USER
     81 		${SSH} -2i $OBJ/cert_user_key \
     82 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
     83 		if [ $? -eq 0 ]; then
     84 			fail "ssh cert connect succeeded unexpectedly"
     85 		fi
     86 
     87 		# Wrong authorized_principals
     88 		verbose "$tid: ${_prefix} wrong authorized_principals"
     89 		echo gregorsamsa > $OBJ/authorized_principals_$USER
     90 		${SSH} -2i $OBJ/cert_user_key \
     91 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
     92 		if [ $? -eq 0 ]; then
     93 			fail "ssh cert connect succeeded unexpectedly"
     94 		fi
     95 
     96 		# Correct authorized_principals
     97 		verbose "$tid: ${_prefix} correct authorized_principals"
     98 		echo mekmitasdigoat > $OBJ/authorized_principals_$USER
     99 		${SSH} -2i $OBJ/cert_user_key \
    100 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
    101 		if [ $? -ne 0 ]; then
    102 			fail "ssh cert connect failed"
    103 		fi
    104 
    105 		# authorized_principals with bad key option
    106 		verbose "$tid: ${_prefix} authorized_principals bad key opt"
    107 		echo 'blah mekmitasdigoat' > $OBJ/authorized_principals_$USER
    108 		${SSH} -2i $OBJ/cert_user_key \
    109 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
    110 		if [ $? -eq 0 ]; then
    111 			fail "ssh cert connect succeeded unexpectedly"
    112 		fi
    113 
    114 		# authorized_principals with command=false
    115 		verbose "$tid: ${_prefix} authorized_principals command=false"
    116 		echo 'command="false" mekmitasdigoat' > \
    117 		    $OBJ/authorized_principals_$USER
    118 		${SSH} -2i $OBJ/cert_user_key \
    119 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
    120 		if [ $? -eq 0 ]; then
    121 			fail "ssh cert connect succeeded unexpectedly"
    122 		fi
    123 
    124 		# authorized_principals with command=true
    125 		verbose "$tid: ${_prefix} authorized_principals command=true"
    126 		echo 'command="true" mekmitasdigoat' > \
    127 		    $OBJ/authorized_principals_$USER
    128 		${SSH} -2i $OBJ/cert_user_key \
    129 		    -F $OBJ/ssh_proxy somehost false >/dev/null 2>&1
    130 		if [ $? -ne 0 ]; then
    131 			fail "ssh cert connect failed"
    132 		fi
    133 
    134 		# Setup for principals= key option
    135 		rm -f $OBJ/authorized_principals_$USER
    136 		(
    137 			cat $OBJ/sshd_proxy_bak
    138 			echo "UsePrivilegeSeparation $privsep"
    139 		) > $OBJ/sshd_proxy
    140 
    141 		# Wrong principals list
    142 		verbose "$tid: ${_prefix} wrong principals key option"
    143 		(
    144 			printf 'cert-authority,principals="gregorsamsa" '
    145 			cat $OBJ/user_ca_key.pub
    146 		) > $OBJ/authorized_keys_$USER
    147 		${SSH} -2i $OBJ/cert_user_key \
    148 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
    149 		if [ $? -eq 0 ]; then
    150 			fail "ssh cert connect succeeded unexpectedly"
    151 		fi
    152 
    153 		# Correct principals list
    154 		verbose "$tid: ${_prefix} correct principals key option"
    155 		(
    156 			printf 'cert-authority,principals="mekmitasdigoat" '
    157 			cat $OBJ/user_ca_key.pub
    158 		) > $OBJ/authorized_keys_$USER
    159 		${SSH} -2i $OBJ/cert_user_key \
    160 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
    161 		if [ $? -ne 0 ]; then
    162 			fail "ssh cert connect failed"
    163 		fi
    164 	done
    165 else
    166 	echo "SKIPPED: $PRINCIPALS_COMMAND not executable " \
    167 	    "(/var/run mounted noexec?)"
    168 fi
    169