Diferencia entre revisiones de «Servidor ssh»

De Guía Ubuntu
Saltar a: navegación, buscar
(¿Qué es un ataque man-in-the-middle?)
(Evitar que nos pida el password cada vez)
 
(No se muestran 42 ediciones intermedias realizadas por 13 usuarios)
Línea 1: Línea 1:
== ¿Qué es SSH? ==
+
'''Secure SHell''', cuya traducción sería ''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...).
  
[[w:es: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- tb 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 {{w|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 {{w|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.
  
Es parecido a [[w:es:Telnet|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 [[w:es:LAN|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.
+
== Conexión a un servidor remoto ==
  
== Inslación del servidor SSH ==
+
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 [http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html Putty]). Usar el cliente es muy sencillo: basta con teclear desde una consola o terminal lo siguiente:
+
El cliente ya viene instalado por defecto, de modo que para instalar el servidor de SSH en nuestro sistema lo único que necesitas es instalar el paquete '''openssh-server'''. Puedes leer [[Primeros pasos/Añadir aplicaciones|¿Cómo instalar aplicaciones?]] si no sabes como hacerlo.
+
  
== ¿Cómo permitir a ciertas cuentas ssh? ==
+
  $ ssh host_remoto
   
+
Cuando nos conectamos a una máquina a través del protocolo ssh coge el nombre del usuario que tenemos actualmente en la máquina local salvo que le demos uno con la opción -l. Ejemplo:
+
  
user1@maquina_local$ ssh maquina_remota >> nos conectamos a maquina_remota como "user1"
+
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:
user1@maquina_local$ ssh -l user_remoto maquina_remota >> nos conectamos a maquina_remota como "user_remoto"
+
  
También se puede uno conectar así:
+
$ ssh usuario_remoto@host_remoto
  
  user1@maquina_local$ ssh user_remoto@maquina_remota.  
+
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.
  
De todas formas, tanto si usamos nuestro usuario como otro distinto, tanto si es con la opción -l o poniéndolo antes del nombre o IP de la máquina con arroba, el usuario tiene que estar:
+
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.
  
a) dado de alta en la máquina remota
+
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).
  
b) permitido que haga ssh
+
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 permitir hay que editar, como root, el archivo /etc/ssh/sshd_conf. Y añadir la línea AllowUsers y el nick o los nicks que deseamos que se puedan conectar en remoto via ssh.
+
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''
== ¿Qué es un ataque man-in-the-middle? ==
+
 
 +
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
 +
 
 +
== 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.  
 
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 [[w:es:Ataque Man-in-the-middle|Ataque Man-in-the-middle]].
+
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 {{w|Ataque Man-in-the-middle}}.
  
== ¿Qué es el archivo /etc/hosts? ==
+
== Evitar que nos pida el password cada vez ==
  
A veces queremos conectarnos a una máquina por su nombre en lugar de por su IP, porque es más fácil recordar WEBSERVER que 192.168.2.3 para ello editamos el archivo /etc/host. Como es un archivo de sistema pertenece a root así que en una consola o terminal tras el prompt "usuario@host:directorio$" tecleamos:  
+
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 RSA que se usarán en la relación de confianza:
  
  sudo gedit /etc/host
+
  $ ssh-keygen -t rsa
o
+
 
  sudo vi /etc/host
+
Generating public/private rsa key pair.
 +
Enter file in which to save the key (/home/usuario/.ssh/id_rsa):
 +
Enter passphrase (empty for no passphrase):
 +
  Enter same passphrase again:
 +
Your identification has been saved in /home/usuario/.ssh/id_rsa.
 +
Your public key has been saved in /home/usuario/.ssh/id_rsa.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 usuario_remoto@192.168.0.1
 
   
 
   
== ¿Cómo conectarnos a un servidor ssh? ==
+
Now try logging into the machine, with "ssh 'usuario_remoto@192.168.0.1'", and check in:
 +
 +
  .ssh/authorized_keys
 +
 +
to make sure we haven't added extra keys that you weren't expecting.
  
Para conectarnos con un servidor ssh remoto desde ubuntu tenemos un cliente por defecto, en WinBugs no, hay que descargar el Putty por ejemplo.
+
{{nota|Si te da el error ''No identities found'' prueba a indicarle la ruta de la clave pública con ''-i''}}
Usar el cliente por defecto de ubuntu es muy sencillo basta con teclear desde una consola o terminal "usuario@host:directorio$" lo siguiente:
+
"ssh [maquina]"
+
Donde [maquina] es la IP del servidor ssh o su nombre, el que queramos si hemos usado una entrada en el archivo /etc/hosts.
+
Eso hará que nos conectemos con nuestro nombre de usuario. Si queremos usar otro nombre de usuario teclearemos bien:
+
  
ssh -l [nombre_usuario] [maquina]
 
o
 
ssh [nombre_usuario]@[maquina]
 
  
Luego nos pide la password 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.
+
{{nota|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''.}}
Sabemos que estamos conectados porque el prompt cambia y aparece en lugar del nombre de nuestro host el nombre del host remoto.  
+
  
== ¿Cómo montar una unidad a través de ssh? ==
+
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.
  
Para quienes les guste más el nautilus y necesiten coger archivos de un servidor ssh remoto o dejarlos en él se pueden montar unidades así:
+
  $ ssh-add
En Lugares >> Conectar con el servidor remoto
+
   
+
  
== ¿Cómo enviar u obtener archivos y carpetas con scp? ==
+
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.
 +
 
 +
== 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
 +
 
 +
== 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"
 +
 
 +
== 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:
 +
 
 +
<perl>
 +
#!/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]`;
 +
}
 +
</perl>
 +
 +
== Enviar u obtener archivos y carpetas con scp ==
  
 
En una consola o terminal tecleamos:  
 
En una consola o terminal tecleamos:  
Línea 72: Línea 145:
 
luego ponemos la password del usuario y nos copiará la carpeta "/home/carpeta" remota en el directorio actual "."  
 
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.
 
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 órden para compiar todos los archivos de una carpeta sería:  
+
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/* .
 
  $ 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/
 +
 +
== Hacer todo esto en modo gráfico ==
 +
 +
Si lo que que queremos es conectarnos a un ordenador por ssh en modo gráfico también lo podremos hacer. Es más simple pero también tienes menos posibilidades, o para hacer ciertas cosas tardas más incluso que haciéndolo por consola pero para las operaciones fáciles como administrar, editar un fichero también es posible hacerlo de esta manera.
 +
 +
Entraremos en '''Lugares -> Conectarse al servidor...'''
 +
 +
Elegiremos en el combo de arriba en lugar de FTP público, SSH y pondremos la IP o el nombre (en caso de anteriormente ya hayamos editado el fichero hosts) y así despues de teclear la contraseña y aceptar estaremos ya dentro del mismo.
 +
 +
== Instalación del servidor SSH ==
 +
 +
El cliente ya viene instalado por defecto, de modo que para instalar el servidor de SSH en nuestro sistema lo único que necesitas es instalar el paquete '''openssh-server'''. Puedes leer [[Añadir aplicaciones]] si no sabes como hacerlo.
 +
 +
== 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'' (o ''/etc/ssh/sshd_config''), 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
 +
o
 +
$ sudo gedit /etc/ssh/sshd_config
 +
 +
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
  
== Como hacer todo esto en modo grafico ==
+
* Restarting OpenBSD Secure Shell server...
  
Silo que que queremos es conectarnos a un ordenador por ssh en modo grafico tambien 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.
+
== Enlaces externos ==
  
Entraremos en Lugares > Conectarse al servidor...
+
* [http://wiki.lapipaplena.org/index.php/Como_montar_accesos_SFTP Guia de configuración de cliente y servidor]
 +
* {{w|SSH|Artículo de SSH en la Wikipedia}} {{es}}
 +
* [http://www.debuntu.org/how-to-import-export-gpg-key-pair How-To: Import/Export GPG key pair] {{en}}
  
Elegiremos en el combbo 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.
+
[[Category:Administración del sistema]]

Última revisión de 13:19 27 ene 2015

Secure SHell, cuya traducción sería 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.

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

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.

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 RSA que se usarán en la relación de confianza:

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/usuario/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/usuario/.ssh/id_rsa.
Your public key has been saved in /home/usuario/.ssh/id_rsa.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 usuario_remoto@192.168.0.1

Now try logging into the machine, with "ssh 'usuario_remoto@192.168.0.1'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.
Nota clasica.png Si te da el error No identities found prueba a indicarle la ruta de la clave pública con -i


Nota clasica.png 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.

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

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"

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:

<perl>

  1. !/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]`;

} </perl>

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/

Hacer todo esto en modo gráfico

Si lo que que queremos es conectarnos a un ordenador por ssh en modo gráfico también lo podremos hacer. Es más simple pero también tienes menos posibilidades, o para hacer ciertas cosas tardas más incluso que haciéndolo por consola pero para las operaciones fáciles como administrar, editar un fichero también es posible hacerlo de esta manera.

Entraremos en Lugares -> Conectarse al servidor...

Elegiremos en el combo de arriba en lugar de FTP público, SSH y pondremos la IP o el nombre (en caso de anteriormente ya hayamos editado el fichero hosts) y así despues de teclear la contraseña y aceptar estaremos ya dentro del mismo.

Instalación del servidor SSH

El cliente ya viene instalado por defecto, de modo que para instalar el servidor de SSH en nuestro sistema lo único que necesitas es instalar el paquete openssh-server. Puedes leer Añadir aplicaciones si no sabes como hacerlo.

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 (o /etc/ssh/sshd_config), 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

o

$ sudo gedit /etc/ssh/sshd_config

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

Enlaces externos