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 |
---|