-
El servidor ssh:
SSH (Secure SHell -> intérprete de comandos seguro) es un protocolo de
- comunicación para controlar un ordenador en remoto a
través de una CLI
- (Command Line Interface -Interfaz de Línea de
Comandos- también llamada: "shell"). Sirve para conectarnos con un ordenador
ante el cual no estamos
- físicamente, bien porque está en una sala de
servidores refrigerada, bien
- porque no tiene teclado ni pantalla, por ejemplo los
que están apilados en un
- rack (un armario donde se guardan ordenadores como
los servidores web, de
- correo electrónico, firewalls, etc...).
Es parecido a Telnet, con la gran diferencia de que en el caso de ssh, la
- información viaja codificada con lo cual es muchísimo
más segura, en el caso
- de conectarnos a un ordenador que esté en nuestra LAN
no es tan importante,
- pero si nos conectamos a través de Internet es
fundamental, casi diría que
- imprescindible, usar un protocolo seguro como SSH.
- Contenido
- 1 Conexión a un servidor remoto
2 Tipo de ataque man-in-the-middle
3 Evitar que nos pida el password cada vez
4 Copia de seguridad
5 SSHFS o montar directorio remoto con SSH
6 Ejecutar comandos en un host remoto
7 Enviar u obtener archivos y carpetas con scp
8 Hacer todo esto en modo gráfico
9 Instalación del servidor SSH
10 Restringir el acceso SSH
1 ) Conexión a un servidor remoto
Para conectarnos con un servidor SSH remoto desde Ubuntu tenemos un cliente
por defecto. En Windows no, hay que descargar un cliente (por ejemplo, el
programa Putty). Usar el cliente es muy sencillo: basta con teclear desde
una consola o terminal lo siguiente:
$ ssh host_remoto
Donde host_remoto es la IP del servidor SSH o el nombre de este. Eso hará
que nos conectemos con nuestro nombre de usuario. Si queremos conectar como
un usuario remoto teclearemos:
$ ssh usuario_remoto@host_remoto
Luego nos pide la contraseña del usuario. La primera vez que nos conectemos
a un servidor tarda un poco más y nos pide confirmación tecleando "yes" con
todas sus letras, las subsiguientes ya no. Sabemos que estamos conectados
porque el prompt cambia y aparece en lugar del nombre de nuestro host el
nombre del host remoto.
Los comandos, programas y scripts que lancemos tras conectarnos se
ejecutarán en la máquina a las que nos hayamos conectado, utilizando los
recursos del host remoto (CPU, memoria, disco, etc.). Esta arquitectura
puede utilizarse, por ejemplo, para tener un servidor más potente y varios
clientes que ejecutan aplicaciones en dicha máquina.
Para ejecutar aplicaciones gráficas en la máquina a la que nos conectamos
tenemos dos opciones. La primera consiste en definir la variable $DISPLAY
apuntando a la máquina desde la que nos conectamos.
$ export DISPLAY=host_local:0.0
Este mecanismo no se recomienda por motivos de seguridad (el protocolo X11
no se encuentra cifrado) y, además, pueden encontrarse problemas porque
cortafuegos intermedios bloqueen ese tráfico (puertos 600x TCP).
Una solución mejor es utilizar un túnel SSH para encapsular el protocolo
X11, lo que transmite la información de manera segura y, además, no suele
dar problemas con los cortafuegos intermedios.
Para poder ejecutar aplicaciones gráficas en el host remoto de forma segura,
necesitamos dos cosas. La primera, que en la configuración del servidor SSH
del host remoto (/etc/ssh/sshd_config) se encuentre activada la siguiente
opción:
X11Forwarding yes
Para aprovechar esta característica, hemos de conectarnos usando el
parámetro -X, lo que exportará la configuración de la variable $DISPLAY con
lo que podremos ejecutar aplicaciones gráficas de forma remota:
$ ssh -X usuario_remoto@host_remoto
Ahora si ejecutas el programa xclock verás que la ventana sale en tu
escritorio:
$ xclock
2) Tipo de
ataque man-in-the-middle
Imaginemos que la IP de nuestro servidor es 192.168.2.3. Nos conectamos via
SSH desde otro equipo, la primera vez tarda un poco más porque tiene que
escribir en el archivo /home/[nuestro_usuario]/.ssh/known_host una entrada
para esa IP.
Las subsiguientes veces que nos conectemos compara la clave gpg de la IP con
la que tiene guardada en el archivo known_host, en caso de variar supone que
el ordenador es distinto, por ejemplo porque el ordenador servidor ssh ha
sido formateado o porque se ha apagado y sustituido por otro al que se le ha
asignado la misma IP. Ese es el error man-in-the-middle y significa: "el
ordenador cuya IP es esa no es el mismo que yo conocía, puede ser que
alguien se esté haciendo pasar por él" y no nos deja volvernos a conectar
salvo que borremos la entrada de esa IP en el archivo known_host. Tienes más
información al respecto en el artículo de la Wikipedia Ataque Man-in-the-middle.
3) Evitar
que nos pida el password cada vez
Siempre que conectemos a un ordenador remoto con SSH nos va a pedir el
password de acceso para asegurarse de que tenemos permisos. Hay una forma de
evitar que nos pida el password siempre haciendo que el ordenador remoto
confíe en nosotros. Para ello hemos de generar un par de claves DSA que se
usarán en la relación de confianza:
$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/usuario/.ssh/id_dsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/usuario/.ssh/id_dsa.
Your public key has been saved in /home/usuario/.ssh/id_dsa.pub.
The key fingerprint is:
81:a1:d3:96:fa:a2:73:4d:3a:76:c1:fd:3f:6a:6f:1e usuario@localhost
Una vez generada la copiamos al usuario del ordenador remoto con el que
queremos mantener la relación de confianza usando el comando ssh-copy-id.
Este es un ejemplo del uso con la salida del programa:
$ ssh-copy-id [email protected]
Now try logging into the machine, with "ssh '[email protected]'",
and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting. Para
que funcione correctamente el comando ssh-copy-id el agente tiene que estar
activo para la sesión. Si no lo has puesto que lo arranque al inicio como se
explica un poco más abajo, tendrás que arrancarlo desde la consola
ejecutando ssh-add.
Ahora solo hay que arrancar el agente SSH para que recuerde nuestra
contraseña. Nos pregunta la contraseña y ahora ya podemos acceder al
ordenador remoto sin tener que escribir el password cada vez.
$ ssh-add
El agente sólo dura mientras esté activa nuestra consola. O sea que si la
cerramos y la volvemos a abrir ya no está activo el agente y nos volverá a
pedir el password cada vez. Para evitar esto lo que podemos hacer es añadir
el agente a la sesión para que se ejecute cada vez que se inicie GNOME. Al
iniciar saldrá un diálogo que nos preguntará por la contraseña.
4) Copia de
seguridad
Si vas a migrar la configuración de tu usuario a otra máquina tienes que
conservar el directorio $HOME/.ssh. Ahí es donde se guarda los ficheros de
la clave pública y privada generadas en el punto anterior:
$ tar czf ssh.tgz $HOME/.ssh
[editar]
5) SSHFS o
montar directorio remoto con SSH
Algunas veces necesitamos trabajar durante bastante tiempo con un sistema
remoto, copiando y editando ficheros. Existe la posibilidad de usar Nautilus
que se puede conectar remotamente al servidor usando el protocolo 'sftp://,
pero suele ser lento y muchas veces es más práctico usar la línea de
comandos. La solución sería montar un recurso remoto al estilo de NFS y
encima sin tener que se root. Pues si, se puede :)
Fuse es un módulo del kenel que permite montar distintos sistemas de
ficheros con un usuario normal sin privilegios. SSHFS es un programa creado
por el autor de fuse que permite montar un directorio remoto usando SSH.
Accederemos localmente como si estuviera en nuestra propia máquina. Hay que
instalar el programa sshfs. El usuario que puede montar el sistema de
ficheros tiene que pertenecer al grupo fuse.
$ sudo usermod -G fuse -a usuario_local
Tenemos que salir y volver a entrar en el sistema para que se haga efectivo
el cambio de grupo. Antes de empezar a usar fuse tienes que cargar el módulo
en memoria:
$ sudo modprobe fuse
Ahora vamos a hacer una prueba:
$ mkdir ~/directorio_remoto
$ sshfs usuario_remoto@servidor_remoto:/tmp ~/directorio_remoto
Este comando monta el directorio /tmp del servidor remoto en el directorio
local ~/directorio_remoto. Ahora podemos trabajar en el directorio montado
como si de un directorio local se tratase. Para desmontar el directorio:
$ fusermount -u ~/directorio_remoto
Si vamos a trabajar a diario con este directorio remoto, quizás es buena
idea añadirlo al fichero /etc/fstab. De esta forma se montará
automáticamente al iniciar nuestro ordenador o manualmente (si elegimos la
opción noauto) sin necesidad de especificar la localización remota cada vez.
Este es un ejemplo de configuración:
$ sshfs#usuario_remoto@remote_server:/tmp /home/usuario_local/directorio_remoto
fuse defaults,auto 0 0
Si vamos a usar fuse y sshfs regularmente, tendrías que editar el fichero /etc/modules
y añadir el módulo fuse. De otra forma tendrás que cargar el módulo
manualmente cada vez que lo quieras usar:
$ sudo sh -c "echo fuse >> /etc/modules"
6) Ejecutar
comandos en un host remoto
Ahora que ya sabemos como entrar en un ordenador remoto sin el password, por
qué no ejecutar comandos remotamente? Se abre un nuevo mundo de
posibilidades muy útiles como tareas que se pueden ejecutar de forma
automática.
$ ssh usuario_remoto@host_remoto "find /tmp -name *.txt"
Este comando buscará los ficheros de texto del directorio temporal que hay
en el ordenador remoto. Si bien es un ejemplo poc útil, en la vida de un
administrador de sistema hay muchos buenos ejemplos.
Y vamos a dar una nueva vuelta de rosca: si estamos administrando sistemas
Unix/Linux es muy posible que necesitemos ejecutar el mismo programa en
varios servidores a la vez. Este sencillo script e suna gran ayuda en esos
casos:
#!/usr/bin/perl
@hosts=(
"usuario1\@maquina1.guay.es",
"usuario2\@maquina2.guay.es"
);
die "Uso: runonall \'command\'\n" unless $ARGV[0];
foreach(@hosts){
print "$_ -> $ARGV[0]:\n";
print `ssh $_ $ARGV[0]`;
}
7) Enviar u
obtener archivos y carpetas con scp
En una consola o terminal tecleamos:
$ scp -r usuario@maquina:/home/carpeta .
luego ponemos la password del usuario y nos copiará la carpeta "/home/carpeta"
remota en el directorio actual "." naturalmente siempre que usuario tenga
permisos sobre la carpeta y su cuenta esté entre las de los que pueden hacer
ssh. La opción "-r" significa recursivo, es decir, copia la carpeta y todo
su contenido, incluidas las subcarpetas y el contenido de éstas. Si no lo
ponemos la orden para copiar todos los archivos de una carpeta sería:
$ scp usuario@maquina:/home/carpeta/* .
Si lo que queremos es enviar una carpeta con su contenido, utilizaremos la
orden:
$ scp /home/carpeta/* usuario@maquina:/carpeta/
8) Hacer
todo esto en modo gráfico
Silo que que queremos es conectarnos a un ordenador por ssh en modo grafico
también lo podremos hacer. Es mas simple pero tambien tienes menos
posibilidades, o para hacer ciertas cosas tardas mas incluso que haciendolo
por consola pero para las operaciones faciles como administrar, editar un
fichero tambien es posible hacerlo de esta manera.
Entraremos en Lugares -> Conectarse al servidor...
Elegiremos en el combo de arriba en lugar de FTP publico, SSH y pondremos la
IP o el nombre (en caso de anteriormente ya hallamos editado el fichero
hosts) y asi despues de teclear la contraseña y aceptar estaremos ya dentro
del mismo.
9)
Instalación del servidor SSH
El cliente ya viene instalado por defecto( en algunos casos ), de modo que
para instalar el servidor de SSH en nuestro sistema lo único que necesitas
es instalar el paquete openssh-server.
- Instrucciones:
Deberá abrir el programa Synaptic como una de las soluciones para instalar
un paquete, en este caso
- el ssh y el openssh-server, luego aplicar, y ya o
tiene bajado e instalado.
-
-
-
10) Restringir el acceso SSH
Para evitar que todos los usarios de la máquina estén accesibles por SSH
tendremos que editar como root el fichero /etc/ssh/sshd_conf, y añadir la
línea AllowUsers y a continuación los usuarios que deseamos que se puedan
conectar remotamente via SSH:
$ sudo gedit /etc/ssh/sshd_conf
Y añadimos la línea:
AllowUsers usuario1 usuario2 usuario3
Para que los cambios surtan efectos habrá que reiniciar el servidor:
$ sudo /etc/init.d/ssh restart
* Restarting OpenBSD Secure Shell server...
Info sacada: http://www.guia-ubuntu.org/