| 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 | source $OPENGNSYS/lib/ogfunctions.sh |
|---|
| 26 | |
|---|
| 27 | # Control básico de errores. |
|---|
| 28 | if [ "$USER" != "root" ]; then |
|---|
| 29 | echo "$PROG: Error: solo ejecutable por root" >&2 |
|---|
| 30 | exit 1 |
|---|
| 31 | fi |
|---|
| 32 | |
|---|
| 33 | # Regenerar las claves públicas aunque existan |
|---|
| 34 | [ "${1^^}" == "NEW" ] && NEWKEY="NEW" && shift |
|---|
| 35 | |
|---|
| 36 | case $# in |
|---|
| 37 | 0) # Cambios en todos los clientes ogLive instalados. |
|---|
| 38 | if which oglivecli &>/dev/null; then |
|---|
| 39 | LIST=$(oglivecli list | awk '{print $2}') |
|---|
| 40 | else |
|---|
| 41 | LIST="ogclient" |
|---|
| 42 | fi ;; |
|---|
| 43 | 1) # Cambios en único ogLive (AVISO: puede crear inconsistencias con otros ogLive). |
|---|
| 44 | LIST="$1" ;; |
|---|
| 45 | *) # Error de formato. |
|---|
| 46 | echo "$PROG: Error de ejecución" >&2 |
|---|
| 47 | echo "Formato: $PROG ogLive" |
|---|
| 48 | exit 1 ;; |
|---|
| 49 | esac |
|---|
| 50 | |
|---|
| 51 | # Si me salgo con error borro el directorio temporal |
|---|
| 52 | trap "rm -rf $TMPDIR 2>/dev/null" 1 2 3 6 9 15 |
|---|
| 53 | |
|---|
| 54 | # ogLive por defecto |
|---|
| 55 | OGLIVEDEFAULT=$(oglivecli list |awk -v NUM=$(oglivecli get-default) '{if ($1 == NUM) print $2}') |
|---|
| 56 | |
|---|
| 57 | if [ "$NEWKEY" != "NEW" ]; then |
|---|
| 58 | # Comprobamos si el ogLive por defecto contiene la clave |
|---|
| 59 | CLIENTINITRD="$TFTPDIR/$OGLIVEDEFAULT/$INITRD" |
|---|
| 60 | if [ -r "$CLIENTINITRD" ]; then |
|---|
| 61 | mkdir -p $TMPDIR |
|---|
| 62 | cd $TMPDIR || exit 3 |
|---|
| 63 | COMPRESS=$(file -b "$CLIENTINITRD" | awk '{print tolower($1);}') |
|---|
| 64 | $COMPRESS -dc "$CLIENTINITRD" | cpio -im |
|---|
| 65 | if [ -r scripts/ssl/id_rsa ]; then |
|---|
| 66 | PRIVKEY=$(cat scripts/ssl/id_rsa |grep -v '\-\-\-') |
|---|
| 67 | PUBLICKEY=$(cat scripts/ssl/id_rsa.pub) |
|---|
| 68 | else |
|---|
| 69 | NEWKEY="NEW" |
|---|
| 70 | fi |
|---|
| 71 | rm -fr $TMPDIR |
|---|
| 72 | else |
|---|
| 73 | NEWKEY="NEW" |
|---|
| 74 | fi |
|---|
| 75 | fi |
|---|
| 76 | |
|---|
| 77 | # Genero nueva clave |
|---|
| 78 | if [ "$NEWKEY" == "NEW" ]; then |
|---|
| 79 | [ -d $TMPDIR ] && rm -rf $TMPDIR |
|---|
| 80 | mkdir $TMPDIR |
|---|
| 81 | ssh-keygen -N "" -f $TMPDIR/id_rsa |
|---|
| 82 | PRIVKEY=$(cat $TMPDIR/id_rsa |grep -v "\-\-\-") |
|---|
| 83 | PUBLICKEY=$(cat $TMPDIR/id_rsa.pub) |
|---|
| 84 | rm -rf $TMPDIR |
|---|
| 85 | fi |
|---|
| 86 | |
|---|
| 87 | # Buscar todos los clients ogLive instalados. |
|---|
| 88 | for OGLIVE in $LIST; do |
|---|
| 89 | # Si no hay generar nueva clave ssl no hay que modificar el ogLive por defecto |
|---|
| 90 | [ "$NEWKEY" != "NEW" ] && [ "$OGLIVE" == "$OGLIVEDEFAULT" ] && continue |
|---|
| 91 | |
|---|
| 92 | # Crear clave para usuario de acceso a los recursos. |
|---|
| 93 | CLIENTINITRD="$TFTPDIR/$OGLIVE/$INITRD" |
|---|
| 94 | if [ -r "$CLIENTINITRD" ]; then |
|---|
| 95 | # Editar la parte de acceso del cliente: |
|---|
| 96 | # descomprimir Initrd, sustituir clave y recomprimir Initrd). |
|---|
| 97 | echolog "Configurando cliente \"$OGLIVE\" ..." |
|---|
| 98 | mkdir -p $TMPDIR |
|---|
| 99 | cd $TMPDIR || exit 3 |
|---|
| 100 | COMPRESS=$(file -b "$CLIENTINITRD" | awk '{print tolower($1);}') |
|---|
| 101 | $COMPRESS -dc "$CLIENTINITRD" | cpio -im |
|---|
| 102 | |
|---|
| 103 | # Genero archivos de claves |
|---|
| 104 | [ -d $TMPDIR/scripts/ssl ] || mkdir -p $TMPDIR/scripts/ssl |
|---|
| 105 | |
|---|
| 106 | echo "-----BEGIN RSA PRIVATE KEY-----" > $TMPDIR/scripts/ssl/id_rsa |
|---|
| 107 | echo $PRIVKEY |sed s/" "/\\n/g >> $TMPDIR/scripts/ssl/id_rsa |
|---|
| 108 | echo "-----END RSA PRIVATE KEY-----" >> $TMPDIR/scripts/ssl/id_rsa |
|---|
| 109 | |
|---|
| 110 | echo $PUBLICKEY > $TMPDIR/scripts/ssl/id_rsa.pub |
|---|
| 111 | echo $PUBLICKEY > $TMPDIR/scripts/ssl/authorized_keys |
|---|
| 112 | |
|---|
| 113 | chmod 400 $TMPDIR/scripts/ssl/id_rsa |
|---|
| 114 | chmod 400 $TMPDIR/scripts/ssl/authorized_keys |
|---|
| 115 | |
|---|
| 116 | # Generar Initrd del cliente. |
|---|
| 117 | find . | cpio -H newc -oa | gzip -9c > "$CLIENTINITRD" |
|---|
| 118 | |
|---|
| 119 | rm -fr $TMPDIR |
|---|
| 120 | # Calcular suma de comprobación. |
|---|
| 121 | md5sum "$CLIENTINITRD" | cut -f1 -d" " > "$CLIENTINITRD.sum" |
|---|
| 122 | let CHANGES++ |
|---|
| 123 | else |
|---|
| 124 | echolog "$PROG: Cliente \"$OGLIVE\" no accesible." |
|---|
| 125 | fi |
|---|
| 126 | done |
|---|
| 127 | if [[ $CHANGES != 0 ]]; then |
|---|
| 128 | echolog "$PROG: Se ha modificado la pareja de claves ssl en $CHANGES clientes." |
|---|
| 129 | else |
|---|
| 130 | echolog "$PROG: Aviso: no se ha modificado la clave de ningún cliente." |
|---|
| 131 | fi |
|---|