# Secure Shell (Español)

Secure Shell o SSH es un protocolo de red que permite el intercambio de datos sobre un canal seguro entre dos computadoras. SSH usa técnicas de cifrado que hacen que la información que viaja por el medio de comunicación vaya de manera no legible y ninguna tercera persona pueda descubrir el usuario y contraseña de la conexión ni lo que se escribe durante toda la sesión. SSH usa criptografía de clave pública para autenticar el equipo remoto y permitir al mismo autenticar al usuario si es necesario.

Además de la conexión a otros dispositivos, SSH nos permite copiar datos de forma segura (tanto ficheros sueltos como simular sesiones FTP cifradas), gestionar claves RSA para no escribir claves al conectar a los dispositivos y pasar los datos de cualquier otra aplicación por un canal seguro tunelizado mediante SSH.

Un servidor SSH, por defecto, escucha el puerto TCP 22. Un programa cliente de SSH es utilizado generalmente para establecer conexiones a un demonio sshd que acepta conexiones remotas. Ambos se encuentran comúnmente en los sistemas operativos más modernos, incluyendo Mac OS X, Linux, Solaris y OpenVMS. Existen versiones propietarias, freeware y open-source de varios niveles de complejidad y exhaustividad.

(Source: Wikipedia:Secure Shell)

# OpenSSH

OpenSSH (OpenBSD Secure Shell) es un conjunto de programas de computadora que proveen una sesión de comunicación encriptada en una red informática que utiliza el protocolo SSH. Fue creado como una alternativa de código abierto al software propietario ofrecido por by SSH Communications Security. OpenSSH es desarrollado como parte del proyecto OpenBSD, que está a cargo de Theo de Raadt.

OpenSSH es confundido a veces con OpenSSL por la similitud de nombre, sin embargo, los proyectos tienen objetivos distintos y están desarrollados por equipos diferentes.

## Instalando OpenSSH

    # pacman -S openssh

## Configurando SSH

### Cliente

El archivo de configuración del cliente SSH se pueden encontrar y editar en `/etc/ssh/ssh_config`

Un ejemplo de configuración:

    /etc/ssh/ssh_config

    #       $OpenBSD: ssh_config,v 1.25 2009/02/17 01:28:32 djm Exp $

    # This is the ssh client system-wide configuration file.  See
    # ssh_config(5) for more information.  This file provides defaults for
    # users, and the values can be changed in per-user configuration files
    # or on the command line.

    # Configuration data is parsed as follows:
    #  1. command line options
    #  2. user-specific file
    #  3. system-wide file
    # Any configuration value is only changed the first time it is set.
    # Thus, host-specific definitions should be at the beginning of the
    # configuration file, and defaults at the end.

    # Site-wide defaults for some commonly used options.  For a comprehensive
    # list of available options, their meanings and defaults, please see the
    # ssh_config(5) man page.

    Host *
    #   ForwardAgent no
    #   ForwardX11 no
    #   RhostsRSAAuthentication no
    #   RSAAuthentication yes
    #   PasswordAuthentication yes
    #   HostbasedAuthentication no
    #   GSSAPIAuthentication no
    #   GSSAPIDelegateCredentials no
    #   BatchMode no
    #   CheckHostIP yes
    #   AddressFamily any
    #   ConnectTimeout 0
    #   StrictHostKeyChecking ask
    #   IdentityFile ~/.ssh/identity
    #   IdentityFile ~/.ssh/id_rsa
    #   IdentityFile ~/.ssh/id_dsa
    #   Port 22
    #   Protocol 2,1
    #   Cipher 3des
    #   Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc
    #   MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160
    #   EscapeChar ~
    #   Tunnel no
    #   TunnelDevice any:any
    #   PermitLocalCommand no
    #   VisualHostKey no
    HashKnownHosts yes
    StrictHostKeyChecking ask

Se recomiendo cambiar la linea Protocol a esta

    Protocol 2

Quiere decir que solo se utilizará Protocol 2 , ya que Protocol 1 es considerado un tanto inseguro.

### Demonio(daemon)

El archivo de configuración del demonio SSH se puede encontrar y editar en `/etc/ssh/sshd_config`.

Para permitir el acceso sólo a algunos usuarios añadir esta línea:

    AllowUsers    user1 user2

Para permitir el acceso sólo a algunos grupos:

     AllowGroups group1 group2

Para deshabilitar el acceso a root por SSH, cambie la linea PermitRootLogin así:

     PermitRootLogin no

Para agregar un agradable mensaje de bienvenida edite el archivo `/etc/issue` y cambie la linea Banner para que luzca así:

     Banner /etc/issue

Tip: Es posible que desee cambiar el puerto por defecto de 22 a cualquier puerto superior (ver seguridad por oscuridad). A pesar de que el puerto ssh que esta siendo ejecutado puede ser detectado utilizando un port-scanner o escáner de puertos como nmap, cambiarlo reducirá el número de entradas en el log causados por intentos de autentificación automáticos.

### Restringiendo el acceso

Note: Tienes que ajustar este archivo para conectarse remotamente a la máquina ya que está vacío de forma predeterminada

Para permitir a otra gente entrar a tu equipo necesitas realizar unos cambios a `/etc/hosts.allow`, añadiendo lo siguiente:

    # que todo el mundo pueda conectarse
    sshd: ALL

    # O restringirlo a una cierta IP
    sshd: 192.168.0.1

    # O restringirlo a un rago de IPs
    sshd: 10.0.0.0/255.255.255.0

    # O restringir una coincidencia IP
    sshd: 192.168.1.

Ahora deberías revisar tu `/etc/hosts.deny` para la siguiente línea y asegurarte de que tenga este aspecto:

    ALL: ALL

Eso es todo. Puedes conectarte mediante SSH hacia algun equipo asi como tambien permitir a otros conectarse a tu equipo :).

Para comenzar a usar la nueva configuración, reinicia el demonio (como root):

    # /etc/rc.d/sshd restart

## Gestion del Demonio SSHD

Puedes iniciar el demonio sshd con el siguiente comando:

     # systemctl start sshd

Para activar el demonio sshd al iniciar el sistema ejecute el siguiente comando:

     # systemctl enable sshd.service

Advertencia: Systemd inicia los procesos de manera asincrona. Si se amarra el demonio SSH a una dirección IP específica `ListenAddress 192.168.1.100` puede ser que no cargue al arranque porque por defecto el archivo sshd.service no depende de que se hayan habilitado las interfaces de red. Cuando se amarre a una dirección IP, es necesario agregar `After=network.target` a un archivo personalizado de sshd.service. Ver Systemd#Editing provided unit files (en inglés).

Opcionalmente puede activar el socket de SSH Daemon de forma que el demonio se active de forma automática al recibir la primera conexión:

     # systemctl enable sshd.socket

Si usa un puerto diferente al 22, debe definir "ListenStream" en el archivo correspondiente. Copie /lib/systemd/system/sshd.socket a /etc/systemd/system/sshd.socket para evitar que su archivo de systemd se sobreescibia al actualizar el sistema. En /etc/systemd/system/sshd.socket cambie "ListenStream" al puerto apropiado.

Advertencia: Al usar sshd.socket se inhabilita la opción `ListenAddress`, así que al usar el sshd.socket includio permitirá conexiones desde cualquier dirección. Para lograr el efecto de definir `ListenAddress`, debe crear un archivo personalizado y modificar ListenStream (ej. `ListenStream=192.168.1.100:22` es equivalente a `ListenAddress 192.168.1.100`). Además debes agregar `FreeBind=true` bajo `[Socket]` o de lo contrario definir una dirección IP tendra el mismo efecto de definir `ListenAddress`:el socket no iniciara si la red no está lista.

## Conectandose a el servidor

Para conectarse a un servidor, ejecuta:

    $ ssh -p port user@server-address

# Trucos y sugerencias

## Túneles cifrados

Este tipo de conexión es muy útil para usuarios de equipos portátiles conectados a varias conexiones inalámbricas no seguras. Lo unico que necesitas es un servidor SSH corriendo en algún lugar seguro, como tu casa o tu trabajo. Puede ser útil usar un servicio de DNS dinámico como DynDNS para no tener que recordar la dirección IP a la que desea conectarse..

### Paso 1: Iniciar la conexión

Lo único que tienes que hacer es ejecutar este comando en tu terminal favorita para iniciar la conexión:

    $ ssh -ND 4711 user@host

donde `"user"` es tu nombre de usuario en el servidor SSH que se está ejecutando en el `"host"`. Preguntará por tu contraseña, y luego estarás conectado! La `"N"` flag desactiva el prompt interactivo, y la D `"D"` especifica el puerto local en el cual escuchar (puedes elegir el numero de puerto que quieras).

Una forma de hacer esto facilmente es agregar un alias en tu archivo `~/.bashrc` como lo siguiente:

    alias sshtunnel="ssh -ND 4711 -v user@host"

### Paso 2: Configurar tu navegador (u otros programas)

El paso anterior es inútil si no configura el navegador web (u otros programas) para su uso con el túnel que acaba de crear. Debido a que la version actual de SSH soporta SOCKS4 y SOCKS5, se puede usar cualquiera de ellos.

- Para Firefox: Editar → Preferencias → Avanzadas → Red → Conexión → Configuración:

  Marca la casilla "configuración manual de proxy" , y escribe "localhost" en el campo "servidor SOCKS " , y luego escribe tu número de puerto en el siguiente campo de texto.

- Para Chromium: Se pueden setear las configuraciones de SOCKS como variables de entorno o como opciones en linea de comandos. Es recomendable agregar una de las siguientes funciones a `.bashrc`:

    function secure_chromium() {
        port=4711
        export SOCKS_SERVER=localhost:$port
        export SOCKS_VERSION=5
        chromium &
        exit
    }

O

    function secure_chromium {
        port=4343
        chromium --proxy-server="socks://localhost:$port" &
        exit
    }

Ahora solo queda abrir una terminal y escribir:

    $ secure_chromium

Listo. Disfruta tu tunel seguro!

## X11 Forwarding

Para ejecutar programas gráficos a través de una conexión SSH puedes habilitarX11 forwarding. Esta opción deber ser especificada en el archivo de configuración del servidor y del cliente (entiéndase "cliente" como su equipo en el cual su servidor X11 es ejecutado, y correras aplicaciones X en el "servidor").

Instalar xorg-xauth en el servidor:

    # pacman -S xorg-xauth

- Habilitar la opción AllowTcpForwarding en `sshd_config` en el server.
- Habilitar la opción X11Forwarding en `sshd_config` en el server.
- Habilitar la opción X11DisplayOffset en `sshd_config` en el server to 10.
- Habilitar la opción X11UseLocalhost en `sshd_config` en el server.

- Habilitar la opción ForwardX11 en `ssh_config` en el client.

Para usar el forwarding, acceder al servidor a través de ssh:

    # ssh -X -p port user@server-address

Si recibes errores intentando ejecutar aplicaciones gráficas prueba con trusted forwarding :

    # ssh -Y -p port user@server-address

Ahora puedes iniciar cualquier aplicacion X en el servidor remoto, la salida será enviada a tu sesión local:

    # xclock

## Acelerando SSH

Al cambiar los valores utilizados por SSH a una menor demanda de recursos puede aumentar la velocidad de la CPU. En este aspecto, las mejores opciones son arcfour y blowfish-cbc. Para usarlas ejecuta SSH con el sufijo `"c"` , de la siguiente manera:

    # ssh -c arcfour,blowfish-cbc user@server-address

Para usarlo de forma permanente agrega esta línea bajo el abajo del host adecuado en `/etc/ssh/ssh_config`:

    Ciphers arcfour,blowfish-cbc

Otra opción para mejorar la velocidad es habilitar la compresión con el sufijo `"C"` . Una solución permanente es agregar esta linea debajo del host correcto en `/etc/ssh/ssh_config`:

    Compression yes

El tiempo de inicio de sesión puede ser acortado usando el sufijo `"4"`,que saltea la búsqueda IPv6. Esto puede hacerse permanente añadiendo esta línea bajo el host correcto en `/etc/ssh/ssh_config`:

    AddressFamily inet

Otra forma de hacer permanentes los cambios es crear un alias en `~/.bashrc`:

    alias ssh='ssh -C4c arcfour,blowfish-cbc'

Por último, puedes hacer todas las sesiones con el mismo servidor utilizando una sola conexión, lo que agiliza el inicio de sesión posterior, añadiendo estas líneas a un host apropiado en `/etc/ssh/ssh_config`:

    ControlMaster auto
    ControlPath ~/.ssh/socket-%r@%h:%p

### Solucionando problemas

Asegurate de que la cadena DISPLAY apunte al servidor remoto:

    ssh -X user@server-address
    server$ echo $DISPLAY
    localhost:10.0
    server$ telnet localhost 6010
    localhost/6010: lookup failure: Temporary failure in name resolution

puede ser solucionado agregando localhost a `/etc/hosts`.

## Montando un Sistema de archivos Remoto con SSHFS

Instalando sshfs

    # pacman -S sshfs

Cargar el módulo Fuse

    # modprobe fuse

Agrega fuse a la cadena modules en `/etc/rc.conf` para ejecutarlo en cada inicio del sistema.

Montar la carpeta remota usando sshfs

    # mkdir ~/remote_folder
    # sshfs USER@remote_server:/tmp ~/remote_folder

El comando anterior hará que la carpeta /tmp en el servidor remoto sea montada como ~/carpeta_remota en la maquina local. La copia de cualquier archivo en esta carpeta dará lugar a una copia transparente sobre la red red utilizando SFTP. La misma se refiere también a la edición directa de archivos, la creación o eliminación.

Una vez finalizado el trabajo con el sistema de archivos remoto, podemos desmontar la carpeta remota mediante el siguiente comando:

    # fusermount -u ~/remote_folder

Si trabajamos con esta carpeta a diario, es recomendable agregarlo a la tabla `/etc/fstab` . De esta forma se puede montar de forma automática en el arranque o manualmente (si se elige la opción `noauto`), sin la necesidad de especificar la ubicación remota en todo momento. Aquí hay una entrada de ejemplo en la tabla:

    sshfs#USER@remote_server:/tmp /full/path/to/directory fuse    defaults,auto,allow_other    0 0

### Mantener vivo

Tu sesion ssh sera automáticamente desconectada si ésta se encuentra inactiva. Para mantener activa la conexión agrega esto a `~/.ssh/config` o a `/etc/ssh/ssh_config` en el cliente.

    ServerAliveInterval 5

Esto enviará la señal "mantener vivo" al servidor cada 5 segundos. Usualmente puedes incrementar este intervalo, y usar 120.

# Ver también

- Using SSH Keys
- Pam_abl

# Links & References

- A Cure for the Common SSH Login Attack
- Defending against brute force ssh attacks

Category:

- Secure Shell (Español)