SSH-Agent
El objetivo de este artículo es presentar ssh-agent, describiendo la herramienta, funcionalidades y uso. El mismo se complementará con una aplicación práctica en la cual se crearán claves con passphrase y se generará un sistema de login automático para utilizar con "gnomevfs" de forma que Nautilus vea los sistemas remotos como locales en forma transparente para el usuario.
En los siguientes capítulos se presenta una breve introducción a SSH-Agent y por último se especifica la solución de la aplicación práctica.
Introducción
editarEn cualquier ambiente informático, donde se requiera trabajar con múltiples servidores, es necesario contar con una comunicación segura como SSH. Para conectarse a un servidor remoto, basta con teclear el comando seguido del usuario y host destino, y de la contraseña del usuario remoto en cuestión. Este proceso de login en máquinas remotas puede ser molesto en los casos en que sea necesario realizar conexiones cada pequeño período de tiempo, debido a que hay que ingresar la contraseña cada vez.
De igual manera, cuando se desean utilizar discos remotos, puede ser beneficioso (sobre todo para los usuarios) que dichos discos sean montados automáticamente al momento de login, y que puedan ser utilizados transparentemente por los usuarios.
Con este fin fue creado el ssh-agent, que permite recordar mientras dure la sesión, cada una de las claves privadas del usuario, de modo que él se encargue de realizar la autenticación.
Funcionamiento interno de ssh-agent
editarDaemon
editarssh-agent es un programa para la manipulación de claves privadas. La idea es que al inicio de una Xsession se ejecute el comando
ssh-agent
y que el resto de las aplicaciones sean creadas como clientes de dicho daemon. De este modo, si alguna de las aplicaciones necesita autenticarse lo hará a través del agente, liberando al usuario de dicha tarea.
Para que las aplicaciones sean capaces de ubicar al agente se utilizan variables de entorno: SSH_AUTH_SOCK
y SSH_AGENT_PID
. La primera variable de entorno contiene la ruta del socket creado por el agente que veremos más adelante. La segunda variable contiene el Process ID del agente.
Al iniciar el agente, éste crea un socket unix que permite que las aplicaciones se conecten con él. El mismo solo es accesible para el usuario que lo creó, a excepción obviamente del usuario root. Por defecto el socket es creado en /tmp/ssh-XXXXXXXX/agent.<ppid>
, y es eliminado automáticamente cuando el agente termina.
El agente puede opcionalmente recibir un comando por parámetro, en cuyo caso, dicho comando es ejecutado como un subproceso del agente. Cuando el comando termine su ejecución, el agente también lo hará. En el caso de SuSe 8.2, el agente es iniciado como sigue:
ssh-agent ~/.xinitrc
donde .xinitrc
es el script de inicio de sesión (KDE).
Para detenerlo, basta con correr
ssh-agent -k
Registro de certificados
editarInicialmente el agente no contiene ningún certificado, los cuáles pueden agregarse mediante el comando ssh-add. Para listar todos los certificados que el agente tiene asignadas, basta ejecutar:
ssh-agent -l (OpenSSH: ssh-add -l)
La idea es que el agente se ejecute localmente. Esto permite que los datos de autenticación (certificados privados) no necesiten estar almacenados remotamente. A su vez, las passphrases nunca son transmitidas a través de la red. Como el agente no transmite claves privadas, el host remoto envía "desafíos" que necesitan de la clave privada para ser resueltos, y son devueltos a quien lo solicitó.
Uso
editarA continuación describimos los pasos necesarios para utilizar discos remotos a través de SSH y GNOME VFS.
Creación de claves pública y privada
editarEn primer lugar es necesario crear el par de claves pública y privada del usuario en cuestión (cliente). Las claves pueden ser de tres tipos distintos: RSA para la versión 1 de ssh; y DSA o RSA para la versión 2. Al momento de la creación de la clave es necesario especificar alguno de estos métodos (en nuestro caso usaremos RSA). Para ello se utiliza el comando:
ssh-keygen -t rsa
A continuación, la aplicación nos pedirá el nombre de la clave. En caso de no especificarse ninguno, se guardará con el nombre por defecto: ~/.ssh/id_rsa.pub
para la clave pública y ~/.ssh/id_rsa
para la clave privada. El siguiente paso consiste en introducir una passphrase, que será solicitada al usuario cada vez que la clave privada sea utilizada (a menos que usemos ssh-agent).
Autorización de clave pública
editarFinalmente es necesario agregar nuestra clave pública (en el directorio home del usuario al que nos conectaremos) al "llavero" de claves autorizadas del servidor. Éste es un archivo denominado ~/.ssh/authorized_keys2
que se encuentra en el directorio de (home) del Espacio de usuario (el 2 se debe a que estamos utilizando dicha versión de ssh). Por lo tanto, ejecutamos el comando
cat ~/.ssh/id_rsa.pub | ssh user@server 'cat - >> ~/.ssh/authorized_keys2'
que concatena nuestra clave pública al archivo antes mencionado. Una vez hecho lo anterior, no se pedirá más la clave del usuario remoto para realizar la conexión ssh, sino que por el contrario será solicitada la passphrase (indicándonos que se está utilizando la clave privada).
Conectar gnome-vfs
editarSi en este momento realizamos una conexión a un servidor remoto utilizando gnome-vfs, también será solicitada la passphrase. Para realizar dicha conexión, debemos ejecutar (desde el menú de ubuntu) Places → Connect to server. Se abrirá un cuadro de diálogo que nos pide ciertos datos, como se muestra en la siguiente figura:
Entre éstos se encuentra:
- Tipo de conexión: Elegiremos ssh.
- Servidor: ingresaremos la IP del servidor o su nombre si es que está registrado en
/etc/hosts
. - Usuario: nombre del usuario remoto
- Puerto: el puerto utilizado para ssh (por defecto puerto 22).
Desde este dialogo se puede conectar a cualquier host remoto mediante varios protocolos. Si se esta trabajando en una LAN y no se esta seguro a cual host se debe conectar se puede seleccionar el botón Browse Network y ver que servidores están disponibles en la red.
Para conectar a un host específico se selecciona el protocolo a utilizar (en nuestro caso SSH) y se completa el resto de la información.
Esta acción nos dejará un icono en el escritorio, que nos lleva directamente al disco del servidor.
Lo que GNOME ha realizado hasta aquí es tomar el host remoto y montarlo en el escritorio. Ahora se puede abrir esta carpeta y manipular archivos y directorios como si estuviera en la máquina local. Se tiene la opción de setear password-less authentication vía ssh en cuyo caso GNOME no preguntará por el password, en otro caso utilizará la característica Keyring para mantener todas las contraseñas remotas en un único lugar. Un aspecto a considerar es la velocidad de la red, puede existir un delay considerable dependiendo de las conexiones de la red.
Se pueden tener tantos accesos directos a host remotos como se desee. Cada icono tiene etiquetas que recuerdan con que protocolo se está conectado, por lo que se puede tener múltiples conexiones diferentes a una misma máquina.
Otra característica útil es que con múltiples accesos directos se pueden arrastrar los archivos entre dos host remotos alejados sin importar cuales son los protocolos que utilizan. Pero GNOME no solo coloca un icono en el escritorio, la meta es que esta transparencia se aplique a todas las aplicaciones. Las aplicaciones GNOME aprovechan esto mediante el dialogo de Archivo.
Validando una sola vez
editarLa primera vez que entremos, nos pedirá la passphrase, y la recordará durante toda la sesión. A primera vista esta parece la solución al problema planteado, pero en el caso de que existan conexiones a más de un servidor, la passphrase será solicitada una vez por cada servidor.
Para solucionar dicho inconveniente, debemos agregar la clave privada al agente y que éste se encargue de autenticarnos contra cada servidor y no nosotros. Para esto ejecutamos el comando
ssh-add
que por defecto carga en el agente las claves privadas ubicadas en ~/.ssh/
. De este modo solo debemos ingresar la passphrase cuando accedamos al primer servidor.
Este hecho no resulta 100% transparente (hay que abrir una consola y ejecutar el comando ssh-add), por lo que preferimos que la passphrase sea solicitada al inicio de la sesión, y no durante la misma. Para esto debemos hacer que el ssh-add se ejecute automáticamente luego de iniciar la sesión, por lo que en el menú de ubuntu, Preferences → Sessions → Startup Programs, agregamos dicho comando /usr/bin/ssh-add
con la prioridad más baja.
En conclusión, cada vez que iniciemos la sesión, debemos ingresar la passphrase por única vez y accederemos a los servidores en forma transparente.
Otras Características
editarUna característica interesante del ssh-add, es que permite bloquear el agente con una contraseña para que nadie abuse de él a menos que conozca dicha clave. Esto puede ser muy útil cuando no se apaga la máquina o cuando no se cierra la sesión durante la noche.
Para bloquearlo se ejecuta dicho comando con el switch "x", y se desbloquea con "X".
Véase también
editar- SSH Secure Shell
Enlaces externos
editar- Working with Remote Resources, The GNOME Journal
- GNOME keyring, una implementación nativa de GNOME, equivalente a ssh-agent.
- OpenSSH