Introducción.
En el presente artículo se especifica la configuración del servicio necsario para asegurar los nodos bajo una infraestructura basada en llaves SSH la cual permitirá al usuario root las siguientes acciones.
- Acceso SSH desde el nodo de adminstración y cada uno de los demás nodos del cluster.
- Acceso SSH entre todos los nodos cabeza del cluster.
- Acceso SSH entre los nodos cabeza y los nodos de trabajo del cluster.
Iniciar los nodos del cluster.
Para realizar las siguientes tareas de configuración es necesario garantizar que todos los nodos del cluster: cabeza y trabajadores, se encuentren activos. Para hacer esto desde el servidor de máquinas virtuales ejecute los siguientes comandos.
# virsh start c-head
# virsh start c-wn1
# virsh start c-wn2
Configuración general del servicio.
Los pasos de configuración descritos a continuación se deberán realizar en c-head y desde allí serán propagados a los distintos nodos trabajadores.
Realizar una copia de seguridad de la configuración actual del servicio.
# mv /etc/ssh/sshd_config /etc/ssh/sshd_config.orig
Crear el nuevo archivo de configuración del servicio.
# vi /etc/ssh/sshd_config
Protocol 2
# No passwords
PermitRootLogin without-password
## PasswordAuthentication no
PermitEmptyPasswords no
UsePAM no
# Pub keys configuration
RSAAuthentication yes
DSAAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
KerberosAuthentication no
GSSAPIAuthentication no
GSSAPICleanupCredentials no
# Hostbased and pubkey yes
PubkeyAuthentication yes
ChallengeResponseAuthentication no
X11Forwarding no
# Hostbased
HostbasedAuthentication yes
IgnoreRhosts no
#OPTIONALLY DON’T CHECK gethostbyaddr(), TRUST CLIENT
#HostbasedUsesNameFromPacketOnly yes
# chmod 600 /etc/ssh/sshd_config
Propagar el nuevo archivo de configuración a los nodos trabajadores.
# scp /etc/ssh/sshd_config jimezam@c-wn1:/tmp
# scp /etc/ssh/sshd_config jimezam@c-wn2:/tmp
En cada uno de los nodos, c-wn1 y c-wn2, ubique apropiadamente el archivo de configuración recién copiado ejecutando los siguientes comandos.
# mv /tmp/sshd_config /etc/ssh/sshd_config
# chown root:root /etc/ssh/sshd_config
# chmod 400 /etc/ssh/sshd_config
Configurar la autenticación basada en el huésped para root.
En el nodo cabeza (c-head) ejecutar los siguientes comandos.
# cd /root
# ssh-keyscan -t rsa,dsa c-head c-head.jorgeivanmeza.com c-nfs c-nfs.jorgeivanmeza.com c-wn1 c-wn1.jorgeivanmeza.com c-wn2 c-wn2.jorgeivanmeza.com > ssh_known_hosts
# mv ssh_known_hosts /etc/ssh/ssh_known_hosts
# chown root:root /etc/ssh/ssh_known_hosts
# chmod 644 /etc/ssh/ssh_known_hosts
Propagar el archivo ssh_known_hosts a los nodos trabajadores.
# scp /etc/ssh/ssh_known_hosts jimezam@c-wn1:/tmp/ssh_known_hosts
# scp /etc/ssh/ssh_known_hosts jimezam@c-wn2:/tmp/ssh_known_hosts
En cada uno de los nodos, c-wn1 y c-wn2, ubique apropiadamente el archivo de huéspedes conocidos recién copiado ejecutando los siguientes comandos.
# mv /tmp/ssh_known_hosts /etc/ssh/ssh_known_hosts
# chown root:root /etc/ssh/ssh_known_hosts
# chmod 644 /etc/ssh/ssh_known_hosts
Creación del archivo de .shosts.
El archivo .shosts corresponde al listado de huéspedes contenidos en ssh_known_hosts sin sus respectivas llaves. Este archivo también deberá ser replicado en los demás nodos del cluster.
En el nodo cabeza (c-head) ejecutar los siguientes comandos.
# cut -d’ ‘ -f1 < /etc/ssh/ssh_known_hosts|sort -u | grep -v , > shosts
# mv shosts /root/.shosts
# chown root:root /root/.shosts
# chmod 600 /root/.shosts
Propagar el archivo .shosts a los nodos trabajadores.
# scp /root/.shosts jimezam@c-wn1:/tmp/.shosts
# scp /root/.shosts jimezam@c-wn2:/tmp/.shosts
En cada uno de los nodos, c-wn1 y c-wn2, ubique apropiadamente el archivo de huéspedes confiables recién copiado ejecutando los siguientes comandos.
# mv /tmp/.shosts /root/.shosts
# chown root:root /root/.shosts
# chmod 600 /root/.shosts
Agregar nuevos nodos al cluster.
Si se agregan nuevos nodos al cluster es necesario que estos se conviertan en huéspedes conocidos. Para hacer esto es necesario actualizar el archivo manipulado en el punto anterior con sus nuevas llaves y propagado a todos y cada uno de los demás nodos.
Para obtener las llaves que deberán concatenarse con las ya existentes se deberá ejecutar el siguiente comando con una lista de los hostnames de los nuevos nodos separados por espacio.
# ssh-keyscan -t rsa,dsa nodo1 nodo2 nodo3 >> /etc/ssh/ssh_known_hosts
De igual manera será necesario que se actualice el archivo .shosts de todos los nodos del cluster de la manera como se describe en el apartado anterior.
Actualizar la configuración de los clientes.
Es necesario indicarle al cliente SSH que confíe en el método de autenticación basado en los huéspedes recién configurado. Para hacer esto es necesario realizar el siguiente paso en cada uno de los nodos del cluster.
# vi /etc/ssh/ssh_config
HostbasedAuthentication yes
EnableSSHKeysign yes
# /etc/init.d/sshd restart
Verificar la autenticación basada en el huésped para root.
Si la configuración de la autenticación basada en el huésped fue exitosa, el usuario root podrá iniciar una sesión SSH en cualquier nodo desde cualquier otro sin necesidad de autenticarse nuevamente con una contraseña.
Por ejemplo, desde el c-wn1 se deberá poder abrir sesiones a c-wn2 y c-head sin que se requiera una contraseña para el usuario root.
# hostname
c-wn1.jorgeivanmeza.com
# ssh root@c-head
Last login: Mon Jun 7 20:44:42 2010 from c-wn1
# hostname
c-head.jorgeivanmeza.com
Configurar la autenticación basada llaves públicas para usuarios sin privilegios.
Esta estrategia permitirá que los usuarios convencionales (no root) puedan acceder a sus respectivas cuentas entre nodos sin necesidad de una nueva autenticación por contraseña. Inicialmente será necesario replicar los archivos con las llaves públicas de cada uno de los usuarios pero posteriormente este proceso se simplificará ya que el directorio de las cuentas de usuario (/home) estará compartido por NFS y sólo será necesario que se genere el archivo authorized_keys para cada uno de los archivos que requieran de esta facilidad.
Iniciar sesión con el usuario sin privilegios al cual se le va a configurar la autenticación basada en llave pública. Por ejemplo: jimezam. Con el usuario elegido y en cada uno de los nodos crear el directorio .ssh de la siguiente manera.
$ mkdir ~/.ssh/ && cd ~/.ssh/
$ chmod 700 ~/.ssh
Desde uno de los nodos, c-head por ejemplo, ejecutar los comandos descritos a continuación.
$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/jimezam/.ssh/id_dsa):
Enter passphrase (empty for no passphrase): Romeo
Enter same passphrase again: Romeo
Your identification has been saved in /home/jimezam/.ssh/id_dsa.
Your public key has been saved in /home/jimezam/.ssh/id_dsa.pub.
The key fingerprint is:
98:ef:03:e3:8d:89:2e:7d:d5:b6:2b:5d:a6:11:3d:37 jimezam@c-head.jorgeivanmeza.com
$ cat id_dsa.pub >> authorized_keys
$ chmod 600 authorized_keys
$ chmod 600 id_dsa
Replicar la llave pública del usuario en los demás nodos del cluster. Este paso será obviado cuando el directorio de cuentas de usuario sea único al estar compartido por NFS.
$ scp authorized_keys jimezam@c-wn1:/home/jimezam/.ssh/
$ scp authorized_keys jimezam@c-wn2:/home/jimezam/.ssh/
$ scp id_dsa jimezam@c-wn1:/home/jimezam/.ssh/
$ scp id_dsa jimezam@c-wn2:/home/jimezam/.ssh/
Verificar la autenticación basada llave primaria para usuarios sin privilegios.
Si la configuración de la autenticación basada en la llave primaria fue exitosa, el usuario sin privilegios podrá iniciar una sesión SSH en cualquier nodo desde cualquier otro sin necesidad de autenticarse nuevamente con una contraseña, sin embargo deberá proporcionar la frase secreta (passphrase) con la que se encriptó su llave durante el proceso de creación (ssh-keygen).
Por ejemplo, desde el c-wn1 se deberá poder abrir sesiones a c-wn2 y c-head sin que se requiera una contraseña para el usuario jimezam.
$ hostname
c-wn1.jorgeivanmeza.com
$ ssh jimezam@c-head
Enter passphrase for key ‘/home/jimezam/.ssh/id_dsa‘: Romeo
Last login: Mon Jun 7 21:19:21 2010 from c-wn2
$ hostname
c-head.jorgeivanmeza.com
Utilizar ssh-agent para recordar las frases secretas.
Es posible minimizar el número de veces que se hace necesario introducir las frases secretas para acceder a las cuentas de un usuario en diferentes nodos según los procedimientos descritos antes en este artículo. Esto se logra utilizando la aplicación ssh-agent que se encarga de memorizar las frases secretas durante la sesión del usuario así que estas sólo serán solicitadas una vez por sesión.
El aplicativo puede accederse directamente desde la línea de comando o pueden utilizarse versiones GUI mas elaboradas como el GNOME KeyRing que es la versión de este software adaptada al escritorio de GNOME.
Para utilizarlo es necesario que el shell que se está utilizando esté cubierto por el ssh-agent, lo cual puede hacerse de la siguiente manera.
$ ssh-agent /bin/bash
Posteriormente ejecute el comando ssh-add e ingrese las frases secretas que requiera.
$ ssh-add
Enter passphrase for /home/jimezam/.ssh/id_dsa: Romeo
Identity added: /home/jimezam/.ssh/id_dsa (/home/jimezam/.ssh/id_dsa)
A partir de este momento y mientras dure la sesión, la llave podrá ser utilizada sin la necesidad de ingresar manualmente la frase secreta para desencriptarla.
Solución de problemas.
Al intentar ejecutar el comando ssh-add es posible que reciba el siguiente mensaje de error.
Could not open a connection to your authentication agent.
Esto significa que el shell que se está utilizando no fue abierto bajo el ssh-agent y por lo tanto no conoce cual es su proceso. Para solucionar esto de manera temporal puede ejecutar una de las siguientes dos soluciones.
$ eval `ssh-agent`
o reiniciar el shell bajo el agente.
$ exec ssh-agent bash
Enlaces.