¿Cómo administramos nuestros servidores de forma segura?

Jeison Samir Castro S.
devStories
Published in
9 min readAug 3, 2016

En este post vamos hablar sobre una manera bastante común y segura de poder administrar nuestros servidores sin importar la plataforma, sin embargo por experiencia propia hacerlo sobre plataformas UNIX es mucho mejor.

Cuando nos encontramos creando nuestras app, por lo general al final viene a la mente la necesidad de ponerlo a producción para que todos puedan acceder a nuestro servicio y con ello es común pensar en algún servidor de pago que almacene nuestra información o, en el mejor de los casos, nosotros mismos disponer de nuestro servidor que aloje todos nuestros contenidos y hacerlo público por la red.

Pero ¿cómo sacamos el máximo provecho de nuestra red y sin necesidad de movilizarnos para realizar alguna actividad?, es allí donde les tengo que mencionar a SSH, si bien es un protocolo muy popular existen otros como filezilla, los cuales hacen cosas básicas como subir archivos, eliminar, editar, pero en este campo SSH nos da una gama de simples líneas de comandos hasta complejas funciones como crear túneles en la red y ser de apoyo a muchas herramientas sobre seguridad, como poder crear las famosas “puertas traseras ” en red.

Y si con todo esto hablamos un momento de Linux, y el uso de ssh, sshfs, sftp, etc veremos que junto a nuestra robusta terminal hacemos cosas muy geniales :).

La seguridad de nuestros datos es un tema muy prioritario y

Si usar la potencia de SSH queremos, tenerlo bien configurado debemos.

Empecemos …

Primero definamos que es SSH, sus siglas corresponden Secure SHell y sirve para acceder a máquinas remotas, igual como lo haría telnet, pero de una forma segura ya que la conexión va cifrada. El transporte se hace con TCP lo cual da garantía de que nuestras órdenes van a llegar a su destino.

La popularidad de SSH ha llegado a tal punto que el servicio telnet prácticamente no se utiliza, por lo que muchos recomiendan no utilizar telnet y utilizar SSH en su lugar.

SSH no sólo sirve para usar comandos en máquinas remotas, sino para transferencias de ficheros de forma segura ya sea por SCP o sFTP y servicios de escritorio remoto.

Instalación en Linux

Para la instalación solo tenemos que ingresar unas líneas de comando, lo primero que haremos es actualizar nuestro sistema con:

$ sudo apt-get update

Ahora instalaremos ssh el cual incluirá el ssh cliente y servidor

$ sudo apt-get install openssh-server

Para poder iniciar o reiniciar el servidor SSH hacemos un

$ sudo /etc/init.d/ssh restart
$ sudo /etc/init.d/ssh stop

Una vez instalado SSH no hay que perder de vista los archivos de configuración los cuales son:

/etc/ssh/ssh_config : Archivo de configuración del cliente ssh/etc/ssh/sshd_config : Archivo de configuración del servidor ssh

Instalación en Windows

Una buena herramienta muy buena que encontramos por Internet es PuTTy el cual lo podemos descargar desde su pagina http://www.putty.org/ ; nos vamos a la parte que dice Download PuTTY y le damos click en here y escogemos el ejecutable.

Vamos a configurar nuestro servidor SSH

Podemos abrir las líneas de configuración usando nuestro editor favorito, como Vim, Nano o algo mas gráfico como Gedit.

En este ejemplo usaré Gedit, los lugares o espacios en donde hagamos cambios los comentare con un #- -comentarios .

Vamos hacer una prueba básica e intentar conectarnos a una máquina en nuestra red, lógicamente en este caso conocemos el usuario o el hostname del equipo, recordemos que SSH no nos mostrará los usuarios de nuestra red, pero para ello podemos usar Kali o algún exploit para mapear todos nuestros equipos en red incluidos sus hostnames.

En mi caso me conectaré a una máquina virtual con Linux Mint.

Lo que debemos de ingresar es:

$ ssh usuario@ip
$ ssh usuario@servidor.dominio.es

Si en caso hayamos modificado el puerto en el archivo de configuración.

$ ssh -p [port] usuario@ip
$ ssh jeison@192.168.1.122

Si haces esto por primera vez es probablemente te salga un error, el cual dirá que no es posible conectarse al host remoto esto lo corregimos básicamente ingresando lo siguiente:

$ ssh-keygen -R hostname

Lo que hará será asignarnos una llave o clave segura y darle permisos a nuestro cliente para conectarnos a dicho host.

Como ven es sencillo solo tenemos que escribir yes y darle intro.

Y listo estamos dentro de nuestro equipo remoto en este caso Linux Mint, esto es aplicable a equipos de escritorio o servidores. El principio es el mismo.

También recordemos que SSH viene con sFTP y lo que hace es transferir archivos entre máquinas de forma interactiva y segura.

Lo único que debemos escribir es:

$ sftp usuario1@servidor.dominio.eso en tal caso$ sftp usuario@[ip]

y loguearnos como en el ejemplo anterior.

En mi caso un comando que uso mucho para Transferir archivos ya sean .txt o script enteros de base de datos como MYSQL o PostgreSQL es el comando SCP.

El comando scp permite copiar ficheros entre dos máquinas. Utiliza ssh para la transmisión de la información, por lo que ofrece la misma seguridad que el ssh. De la misma manera utiliza los métodos de autenticación de ssh. Este comando reemplaza al rcp, ftp.

Vamos a usar scp, para ello les mostrare con un ejemplo práctico escribiéndolo en mi terminal.

$  scp -P 22 -r jeison.sh jeison@192.168.1.122:/home/jeison

En primer lugar ingresamos el comando seguido de -P este -P se refiere al puerto por el cual estará escuchando nuestro remoto y si se dan cuenta seguido del -P está el 22, recuerdan que les dije que en la configuración de ssh el puerto de escucha podía ser modificado por nosotros, pues bien en esta linea uso el 22 por que lo había dejado por defecto .Seguidamente colocamos el archivo o la ruta del archivo que queremos transferir en mi caso es jeison.sh (un simple script) pero puede ser también /var/www/html/jeison.sh

$  scp -P 22 -r /var/www/html/jeison.sh jeison@192.168.1.122:/home/jeison

Luego continuamos con lo que ya conocemos, ingresar el usuario y la IP del host al que queremos pasar nuestro archivo pero sin olvidar los ‘:’ esto indica la ruta en donde se va a guardar en este ejemplo es /home/jeison.

La transferencia ha sido exitosa lo comprobaré ingresando también por ssh a mi Linux Mint.

Como observamos nuestro archivo jeison.sh esta en el /home de nuestro Linux Mint :).

Probamos un túnel de red con SSH

Hacer esto tiene sus beneficios supongamos que estamos configurando un servidor de manera remota y la dirección es http://localhost:9090 es decir se nos muestra una pagina web en esa dirección y nosotros queremos acceder a ella ver la página e interactuar con ella pero por un puerto distinto. Bien eso es posible gracias a SSH y sus comandos como el siguiente.

$ ssh -N -L2002:localhost:80 jeison@192.168.1.122

En ambos equipos tengo apache corriendo, pero en Linux Mint también lo tengo, supongamos que bueno tiene una pagina web corriendo, y queremos ver esa misma página en nuestro entorno local.

Con el -N -L2002 indicamos el puerto que queremos ingresar en nuestro equipo local y ver lo que contiene el localhost:80 de nuestro equipo remoto y luego de ello ya conocen el resto solo ingresar el usuario y la dirección o el dominio.

Tenemos acceso al localhost de nuestro Linux Mint, en nuestro localhost con el puerto 2002 (suena enredado pero hablar de SSH es un tema realmente extenso).

Se percataron que es incómodo que en cada Session que deseamos hacer, tenemos que escribir las contraseñas una y otra vez.

Bueno evitemos esto y configuremos nuestros equipos.

$ ssh-keygen -b 4096 -t rsa

Este comando que acabo de escribir nos va a generar una llave pública ¿llave pública? Si, quiere decir que en nuestro equipo, en mi caso con Xubuntu ingresándole el comando obtengo esto por la terminal.

Una clave encriptada, es decir nuestra llave personal; pero si queremos acceder a cuanto host nos de la gana entonces vamos a tener que compartir nuestra llave personal para poder ingresar.

En mi otro equipo el cual es un Linux Mint será en donde alojaré esta llave ¿cómo lo hacemos?

Con el siguiente comando:

$ ssh-copy-id jeison@192.168.1.122

Nos mostrará unos 3 mensajes a los que solo damos enter, con esto hacemos un copy de nuestra llave al equipo que deseamos, luego de esto nos pedirá la contraseña de nuestro equipo remoto, esto lo haremos por última vez, luego ya no tendremos que preocuparnos mas por ello.

Montando nuestras carpetas con sshfs

Ubuntu trae fuse instalado por defecto, por lo que no es necesario instalarlo. Lo que sí debes hacer es verificar que formas parte del grupo fuse. Puedes agregarte a este grupo escribiendo el terminal:

$ sudo gpasswd -a $USER fuse

$USER será interpretado por el sistema por el nombre de usuario que utilizas. El siguiente paso es instalar sshfs:

$ sudo apt-get install sshfs

Y listo, ahora lo único que necesitas es montar la carpeta remota. Suponiendo que deseas montar la carpeta de tu equipo remoto llamada ~/Videos (es una buena idea utilizar sshfs para acceder remotamente a tu colección de música). Para ello creas una carpeta en tu equipo local llamada ~/Colecciondevideo. Luego en el terminal escribes:

$ sshfs nombre_usuario@direccion_equipo_remoto:~/Musica~/Conlecciondevideo

Si utilizamos los datos anteriormente propuestos quedaría así:

sshfs jeison@192.168.1.122:~/Musica ~/Colecciondevideo -p2002

Nuevamente, si el puerto no ha sido modificado no es necesario incluirlo. A partir de este momento es posible, a través de tu carpeta local ~/Colecciondevideo, al contenido de tu carpeta remota ~/Colecciondevideo y, lo mejor de todo, es que lo harás a través de SSH.

En caso de que desees desconectarte puedes utilizar el siguiente comando:

$ fusermount -u ~/Colecciondevideo

Bueno esto es un pequeño aporte al uso de SSH, pero SSH es mucho mucho más, aquí les dejaré algunos comandos que también se pueden hacer con SSH.

Como por ejemplo, conectar un micrófono a un equipo remoto:

$ dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp

Nos permite comunicar nuestro micrófono con la salida de audio del equipo remoto

Conexión SSH con un host intermedio:

$ ssh -t reachable_host ssh unreachable_host

Podemos acceder a un equipo inaccesible desde nuestra red, pero que es accesible desde une red remota. Hacemos una conexión con un intermediario que nos permite acceder.

Copiar de host1 a host2 mediante el equipo local:

$ ssh root@host1 “cd /somedir/tocopy/ && tar -cf – .” | ssh root@host2 “cd /samedir/tocopyto/ && tar -xf -”

Útil cuando dos equipos no pueden conectarse en forma directa, utilizamos nuestro equipo como intermediario.

Copiar una base de datos MySQL a un servidor nuevo

$ mysqldump –add-drop-table –extended-insert –force –log-error=error.log -uUSER -pPASS OLD_DB_NAME | ssh -C user@newhost “mysql -uUSER -pPASS NEW_DB_NAME”

Ejecutar programas de entorno gráfico en forma remota

$ ssh -fX <user>@<host> <program>

El servidor SSH requiere de la siguiente configuración:

X11Forwarding yes # default en Debian

Espero que este artículo sea de tu agrado y si te gustó dale click en el ❤, gracias.

--

--