[8645a4a] | 1 | #!/bin/bash |
---|
| 2 | |
---|
| 3 | #/** |
---|
| 4 | # setsslkey |
---|
| 5 | #@file setsslkey [NEW] [ogLive] |
---|
| 6 | #@brief Configura las claves públicas en los ogLive para que puedan autenticarse entre ellos. |
---|
| 7 | #@param $1 crear_key [NEW] (opcional). Crear la pareja de claves ssl. Por defecto toma la del oglive por defecto. |
---|
| 8 | #@param $2 ogLive (opcional). ogLive al que se le incluyen las claves públicas, por defecto a todos. |
---|
| 9 | #@warning Se modifica el Initrd del cliente. |
---|
| 10 | #@version 1.1.2 - Versión inicial - Basado en setserveraddr |
---|
| 11 | #@author Irina Gómez - ETSII Universidad Sevilla |
---|
| 12 | #@date 2019-09-25 |
---|
| 13 | #*/ ## |
---|
| 14 | |
---|
| 15 | |
---|
| 16 | # Variables. |
---|
| 17 | PROG=$(basename "$0") |
---|
| 18 | PATH=$PATH:$(dirname "$(realpath "$0")") |
---|
| 19 | OPENGNSYS=${OPENGNSYS:-"/opt/opengnsys"} |
---|
| 20 | TFTPDIR=$OPENGNSYS/tftpboot |
---|
| 21 | INITRD=oginitrd.img |
---|
| 22 | TMPDIR=/tmp/oglive$$ |
---|
| 23 | let CHANGES=0 |
---|
| 24 | |
---|
| 25 | # Control básico de errores. |
---|
| 26 | if [ "$USER" != "root" ]; then |
---|
| 27 | echo "$PROG: Error: solo ejecutable por root" >&2 |
---|
| 28 | exit 1 |
---|
| 29 | fi |
---|
| 30 | |
---|
| 31 | # Regenerar las claves públicas aunque existan |
---|
| 32 | [ "${1^^}" == "NEW" ] && NEWKEY="NEW" && shift |
---|
| 33 | |
---|
| 34 | case $# in |
---|
| 35 | 0) # Cambios en todos los clientes ogLive instalados. |
---|
| 36 | if which oglivecli &>/dev/null; then |
---|
| 37 | LIST=$(oglivecli list | awk '{print $2}') |
---|
| 38 | else |
---|
| 39 | LIST="ogclient" |
---|
| 40 | fi ;; |
---|
| 41 | 1) # Cambios en único ogLive (AVISO: puede crear inconsistencias con otros ogLive). |
---|
| 42 | LIST="$1" ;; |
---|
| 43 | *) # Error de formato. |
---|
| 44 | echo "$PROG: Error de ejecución" >&2 |
---|
| 45 | echo "Formato: $PROG ogLive" |
---|
| 46 | exit 1 ;; |
---|
| 47 | esac |
---|
| 48 | |
---|
| 49 | # Si me salgo con error borro el directorio temporal |
---|
| 50 | trap "rm -rf $TMPDIR 2>/dev/null" 1 2 3 6 9 15 |
---|
| 51 | |
---|
| 52 | # ogLive por defecto |
---|
| 53 | OGLIVEDEFAULT=$(oglivecli list |awk -v NUM=$(oglivecli get-default) '{if ($1 == NUM) print $2}') |
---|
| 54 | |
---|
| 55 | if [ "$NEWKEY" != "NEW" ]; then |
---|
| 56 | # Comprobamos si el ogLive por defecto contiene la clave |
---|
| 57 | CLIENTINITRD="$TFTPDIR/$OGLIVEDEFAULT/$INITRD" |
---|
| 58 | if [ -r "$CLIENTINITRD" ]; then |
---|
| 59 | mkdir -p $TMPDIR |
---|
| 60 | cd $TMPDIR || exit 3 |
---|
| 61 | gzip -dc "$CLIENTINITRD" | cpio -im |
---|
| 62 | if [ -r scripts/ssl/id_rsa ]; then |
---|
| 63 | PRIVKEY=$(cat scripts/ssl/id_rsa |grep -v '\-\-\-') |
---|
| 64 | PUBLICKEY=$(cat scripts/ssl/id_rsa.pub) |
---|
| 65 | else |
---|
| 66 | NEWKEY="NEW" |
---|
| 67 | fi |
---|
| 68 | rm -fr $TMPDIR |
---|
| 69 | else |
---|
| 70 | NEWKEY="NEW" |
---|
| 71 | fi |
---|
| 72 | fi |
---|
| 73 | |
---|
| 74 | # Genero nueva clave |
---|
| 75 | if [ "$NEWKEY" == "NEW" ]; then |
---|
| 76 | [ -d $TMPDIR ] && rm -rf $TMPDIR |
---|
| 77 | mkdir $TMPDIR |
---|
| 78 | ssh-keygen -N "" -f $TMPDIR/id_rsa |
---|
| 79 | PRIVKEY=$(cat $TMPDIR/id_rsa |grep -v "\-\-\-") |
---|
| 80 | PUBLICKEY=$(cat $TMPDIR/id_rsa.pub) |
---|
| 81 | rm -rf $TMPDIR |
---|
| 82 | fi |
---|
| 83 | |
---|
| 84 | # Buscar todos los clients ogLive instalados. |
---|
| 85 | for OGLIVE in $LIST; do |
---|
| 86 | # Si no hay generar nueva clave ssl no hay que modificar el ogLive por defecto |
---|
| 87 | [ "$NEWKEY" != "NEW" ] && [ "$OGLIVE" == "$OGLIVEDEFAULT" ] && continue |
---|
| 88 | |
---|
| 89 | # Crear clave para usuario de acceso a los recursos. |
---|
| 90 | CLIENTINITRD="$TFTPDIR/$OGLIVE/$INITRD" |
---|
| 91 | if [ -r "$CLIENTINITRD" ]; then |
---|
| 92 | # Editar la parte de acceso del cliente: |
---|
| 93 | # descomprimir Initrd, sustituir clave y recomprimir Initrd). |
---|
| 94 | echo "Configurando cliente \"$OGLIVE\" ..." |
---|
| 95 | mkdir -p $TMPDIR |
---|
| 96 | cd $TMPDIR || exit 3 |
---|
| 97 | gzip -dc "$CLIENTINITRD" | cpio -im |
---|
| 98 | |
---|
| 99 | # Genero archivos de claves |
---|
| 100 | [ -d $TMPDIR/scripts/ssl ] || mkdir -p $TMPDIR/scripts/ssl |
---|
| 101 | |
---|
| 102 | echo "-----BEGIN RSA PRIVATE KEY-----" > $TMPDIR/scripts/ssl/id_rsa |
---|
| 103 | echo $PRIVKEY |sed s/" "/\\n/g >> $TMPDIR/scripts/ssl/id_rsa |
---|
| 104 | echo "-----END RSA PRIVATE KEY-----" >> $TMPDIR/scripts/ssl/id_rsa |
---|
| 105 | |
---|
| 106 | echo $PUBLICKEY > $TMPDIR/scripts/ssl/id_rsa.pub |
---|
| 107 | echo $PUBLICKEY > $TMPDIR/scripts/ssl/authorized_keys |
---|
| 108 | |
---|
| 109 | chmod 400 $TMPDIR/scripts/ssl/id_rsa |
---|
| 110 | chmod 400 $TMPDIR/scripts/ssl/authorized_keys |
---|
| 111 | |
---|
| 112 | # Generar Initrd del cliente. |
---|
| 113 | find . | cpio -H newc -oa | gzip -9c > "$CLIENTINITRD" |
---|
| 114 | |
---|
| 115 | rm -fr $TMPDIR |
---|
| 116 | # Calcular suma de comprobación. |
---|
| 117 | md5sum "$CLIENTINITRD" | cut -f1 -d" " > "$CLIENTINITRD.sum" |
---|
| 118 | let CHANGES++ |
---|
| 119 | else |
---|
| 120 | echo "$PROG: Cliente \"$OGLIVE\" no accesible." |
---|
| 121 | fi |
---|
| 122 | done |
---|
| 123 | if [[ $CHANGES != 0 ]]; then |
---|
| 124 | echo "$PROG: Se ha modificado la pareja de claves ssl en $CHANGES clientes." |
---|
| 125 | else |
---|
| 126 | echo "$PROG: Aviso: no se ha modificado la clave de ningún cliente." |
---|
| 127 | fi |
---|