diff options
-rwxr-xr-x | client/shared/etc/preinit/fileslinks.sh | 6 | ||||
-rwxr-xr-x | server/bin/setsslkey | 127 |
2 files changed, 133 insertions, 0 deletions
diff --git a/client/shared/etc/preinit/fileslinks.sh b/client/shared/etc/preinit/fileslinks.sh index eecca019..826282da 100755 --- a/client/shared/etc/preinit/fileslinks.sh +++ b/client/shared/etc/preinit/fileslinks.sh @@ -9,6 +9,9 @@ #@version 1.0.5 - Enlace para librería libmac (obsoleto en versión 1.1.1). #@author Ramon Gomez, ETSII Universidad de Sevilla #@date 2012-06-28 +#@version 1.1.2 - Autenticación con clave pública para SSH +#@author Irina Gómez, ETSII Universidad de Sevilla +#@date 2019-09-25 #*/ @@ -39,6 +42,9 @@ if [ -n "$OPENGNSYS" ]; then [ -f $QTDIR/etc/$i ] || ln -fs $i $QTDIR/etc 2>/dev/null done + # Autenticación con clave pública para SSH + [ -f /scripts/ssl/authorized_keys ] && cp /scripts/ssl/* /root/.ssh + else # FIXME Error: entorno de OpenGnsys no configurado. echo "Error: OpenGnsys environment is not configured." # FIXME: definir mensaje. diff --git a/server/bin/setsslkey b/server/bin/setsslkey new file mode 100755 index 00000000..9652f006 --- /dev/null +++ b/server/bin/setsslkey @@ -0,0 +1,127 @@ +#!/bin/bash + +#/** +# setsslkey +#@file setsslkey [NEW] [ogLive] +#@brief Configura las claves públicas en los ogLive para que puedan autenticarse entre ellos. +#@param $1 crear_key [NEW] (opcional). Crear la pareja de claves ssl. Por defecto toma la del oglive por defecto. +#@param $2 ogLive (opcional). ogLive al que se le incluyen las claves públicas, por defecto a todos. +#@warning Se modifica el Initrd del cliente. +#@version 1.1.2 - Versión inicial - Basado en setserveraddr +#@author Irina Gómez - ETSII Universidad Sevilla +#@date 2019-09-25 +#*/ ## + + +# Variables. +PROG=$(basename "$0") +PATH=$PATH:$(dirname "$(realpath "$0")") +OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"} +TFTPDIR=$OPENGNSYS/tftpboot +INITRD=oginitrd.img +TMPDIR=/tmp/oglive$$ +let CHANGES=0 + +# Control básico de errores. +if [ "$USER" != "root" ]; then + echo "$PROG: Error: solo ejecutable por root" >&2 + exit 1 +fi + +# Regenerar las claves públicas aunque existan +[ "${1^^}" == "NEW" ] && NEWKEY="NEW" && shift + +case $# in + 0) # Cambios en todos los clientes ogLive instalados. + if which oglivecli &>/dev/null; then + LIST=$(oglivecli list | awk '{print $2}') + else + LIST="ogclient" + fi ;; + 1) # Cambios en único ogLive (AVISO: puede crear inconsistencias con otros ogLive). + LIST="$1" ;; + *) # Error de formato. + echo "$PROG: Error de ejecución" >&2 + echo "Formato: $PROG ogLive" + exit 1 ;; +esac + +# Si me salgo con error borro el directorio temporal +trap "rm -rf $TMPDIR 2>/dev/null" 1 2 3 6 9 15 + +# ogLive por defecto +OGLIVEDEFAULT=$(oglivecli list |awk -v NUM=$(oglivecli get-default) '{if ($1 == NUM) print $2}') + +if [ "$NEWKEY" != "NEW" ]; then + # Comprobamos si el ogLive por defecto contiene la clave + CLIENTINITRD="$TFTPDIR/$OGLIVEDEFAULT/$INITRD" + if [ -r "$CLIENTINITRD" ]; then + mkdir -p $TMPDIR + cd $TMPDIR || exit 3 + gzip -dc "$CLIENTINITRD" | cpio -im + if [ -r scripts/ssl/id_rsa ]; then + PRIVKEY=$(cat scripts/ssl/id_rsa |grep -v '\-\-\-') + PUBLICKEY=$(cat scripts/ssl/id_rsa.pub) + else + NEWKEY="NEW" + fi + rm -fr $TMPDIR + else + NEWKEY="NEW" + fi +fi + +# Genero nueva clave +if [ "$NEWKEY" == "NEW" ]; then + [ -d $TMPDIR ] && rm -rf $TMPDIR + mkdir $TMPDIR + ssh-keygen -N "" -f $TMPDIR/id_rsa + PRIVKEY=$(cat $TMPDIR/id_rsa |grep -v "\-\-\-") + PUBLICKEY=$(cat $TMPDIR/id_rsa.pub) + rm -rf $TMPDIR +fi + +# Buscar todos los clients ogLive instalados. +for OGLIVE in $LIST; do + # Si no hay generar nueva clave ssl no hay que modificar el ogLive por defecto + [ "$NEWKEY" != "NEW" ] && [ "$OGLIVE" == "$OGLIVEDEFAULT" ] && continue + + # Crear clave para usuario de acceso a los recursos. + CLIENTINITRD="$TFTPDIR/$OGLIVE/$INITRD" + if [ -r "$CLIENTINITRD" ]; then + # Editar la parte de acceso del cliente: + # descomprimir Initrd, sustituir clave y recomprimir Initrd). + echo "Configurando cliente \"$OGLIVE\" ..." + mkdir -p $TMPDIR + cd $TMPDIR || exit 3 + gzip -dc "$CLIENTINITRD" | cpio -im + + # Genero archivos de claves + [ -d $TMPDIR/scripts/ssl ] || mkdir -p $TMPDIR/scripts/ssl + + echo "-----BEGIN RSA PRIVATE KEY-----" > $TMPDIR/scripts/ssl/id_rsa + echo $PRIVKEY |sed s/" "/\\n/g >> $TMPDIR/scripts/ssl/id_rsa + echo "-----END RSA PRIVATE KEY-----" >> $TMPDIR/scripts/ssl/id_rsa + + echo $PUBLICKEY > $TMPDIR/scripts/ssl/id_rsa.pub + echo $PUBLICKEY > $TMPDIR/scripts/ssl/authorized_keys + + chmod 400 $TMPDIR/scripts/ssl/id_rsa + chmod 400 $TMPDIR/scripts/ssl/authorized_keys + + # Generar Initrd del cliente. + find . | cpio -H newc -oa | gzip -9c > "$CLIENTINITRD" + + rm -fr $TMPDIR + # Calcular suma de comprobación. + md5sum "$CLIENTINITRD" | cut -f1 -d" " > "$CLIENTINITRD.sum" + let CHANGES++ + else + echo "$PROG: Cliente \"$OGLIVE\" no accesible." + fi +done +if [[ $CHANGES != 0 ]]; then + echo "$PROG: Se ha modificado la pareja de claves ssl en $CHANGES clientes." +else + echo "$PROG: Aviso: no se ha modificado la clave de ningún cliente." +fi |