Configuración basica de un servidor para producción

Vamos a repasar como poner un servidor en producción para acceder de forma medianamente segura a él.

Requisitos
  • También voy a obviar que sabes utilizar una consola bash, terminal, un cliente putty o similares.
  • Que en el servidor tienes una distribución ubuntu o debian.
  • Por último voy a obviar que conoces los datos de conexión a tú servidor.
Sobre el artículo
  • Lo que yo pongo aquí no es una verdad absoluta y puede diferir dependiendo de la versión de linux.
  • A la fecha de escribir este artículo estoy usando Mac OS X 10.11.6 como SO local y Ubuntu 16.04.1 LTS como SO remoto.
  • Puedo dejarme algo sin decir o aclarar porque lo obvie o por que se me haya olvidado ya que escribo este artículo a posteriori tras llevar a cabo todo lo escrito. Además las configuraciones son algo muy personal en muchos aspectos.
  • Cuando escribo un comando bash con el prompt (lo que aparece primero) como # (almohadilla significa que es un usuario normal, cuando lo hago con el prompt $ (símbolo de dolar) lo hago como usuario root, por lo que si no estás usando el prompt del root debes hacer sudo o si quieres acceder a ese prompt usar sudo -i.
  • Virgulilla (~) es tú directorio home de usuario por lo que si tecleas cd ~/Desktop en Mac o Ubuntu, por ejemplo, te llevara a tú Escritorio.
Primer login

Lo primero es hacer login por primera vez para lo cual debes abrir una consola de comandos (Terminal, Putty…).

# ssh root@your-server.example.com

Obviamente no es NADA RECOMENDABLE poder hacer algo así (hacer login con el usuario root o cualquier usuario administrador). Por lo que vamos a hacer las siguientes cosas:

    1. Añadir un usuario.
$ adduser myuser

Tendrás que aceptar una serie de pasos.

    1. 2. Darle permisos para “sudar” (hacer `sudo`

?

    ) y login ssh.
$ usermod -aG sudo sudo myuser
$ usermod -aG sudo ssh myuser

Recomiendo que abran otro terminal paralelo y hagan login con el usuario y comprueben que les deja hacer sudo.

    3. Añadir nuestra llave publica

Ahora para evitar tener que hacer login con un usuario y contraseña (opción que más adelante deshabilitaremos por defecto) vamos a crear una llave RSA para el usuario con el que iniciamos sesión.
Voy a obviar que estás usando OS X, linux, freebsd, etc. Si usas windows, aquí te ayudan a crear una llave.

RECUERDA: Esto lo haces en tú ordenador local

# ssh-keygen -t rsa

Ahora copiamos la llave publica, si no estáis en Mac OS X (El Capitán; otras versiones puede diferir) obviar lo que hay a partir del | (pipe) o usar xclip1 para pasarlo directamente al portapapeles sino, Seleccionar > Ctrl + c, de toda la vida:

# cat ~/.ssh/id_rsa.pub | pbcopy
    4. Añadir nuestra llave publica como autorizada en nuestro servidor.

Ahora vamos al terminal con la sesión ssh remota. Lo primero será ya que estamos como root ir a la shell de nuestro usuario para iniciar sesión.

$ su myuser

Ahora entre las dobles comillas pegamos la llave publica que copiamos antes.

# echo "aqui mi llave" >> ~/.ssh/authorized_keys

Te recomiendo que ahora abras otro terminal y pruebes si puedes iniciar la sesión

    5. Configurar nuestro servidor ssh cambiando algunos parámetros en el archivo `/etc/ssh/sshd_config`. Deberéis buscar las líneas concretas y cambiarlas (para evitar que ponga aquí un chorro enorme de cosas que ya vienen por defecto).
# Por defecto 22, es buena idea cambiarlo.
# Por debajo de 1024 como recomendación personal pero, insisto, es solo una recomendación vale cualquier otro.
Port 1022  
Protocol 2

# Authentication:
LoginGraceTime 120  
PermitRootLogin no  
StrictModes yes

# To enable empty passwords, change to yes (NOT RECOMMENDED)
PermitEmptyPasswords no

# Change to no to disable tunnelled clear text passwords
PasswordAuthentication no  

Esto es opcional y yo lo he puesto al final.

# Denegar a toda costa el usuario de producción (más adelante lo crearemos)
DenyUsers production  
# Permitir login con contraseña solo a uno o varios, podéis poner uno distinto y modificando sudoers podéis hacer que pueda restablecer iptables por ejemplo y reiniciar, por ejemplo.
Match User myuser myotherpassworduser  
    PasswordAuthentication yes

Más información (en inglés) sobre restringir autenticaciones de usuarios.

Existen alternativas como, por ejemplo, configurar ListenAddress 0.0.0.0 con una ip local y haciendo una conexión por VPN permitir usar el ssh solo cuando se hace la conexión a la red local. Si estáis interesados en esta opción pero no os apetece hacer un despliegue OpenVPN de forma manual podéis probar OpenVPN-Install.

    6. Añadir un usuario para producción, tendremos que hacer `sudo` para establecernos como root desde nuestro usuario y luego usar `su` para identificarse con el usuario de producción.
$ adduser --disabled-login production

Existen muchas formas de hacerlo, incluso hay personas que le deshabilitan la consola bash. En mi caso creo que es suficiente ya que luego me gusta tener bajo la home del usuario que uso para ejecutar la aplicación web la estructura de directorios. No me gusta ponerlo en /var/lib ni /.

    7. Actualizaciones y reiniciar el servicio ssh.
$ apt-get update
$ apt-get upgrade
$ service ssh restart

No estoy seguro pero un service ssh reload debería ser suficiente ya que la diferencia es que restart reinicia el servicio y reload vuelve a cargar los archivos de configuración.

    8. Actualizaciones automáticas de seguridad
$ dpkg-reconfigure --priority=low unattended-upgrades
    9. Accediendo facilmente al servidor (Crear un alias)

La verdad que a mi me da bastante por el saco acordarme de la ip, por eso suelo configurar primero un DNS pero aún así me sigue dando por el saco escribir todo el chorro del dominio.

Por esa misma razón suelo coger un nombre molón, normalmente cojo o una letra griega, o un nombre vikingo o uno celta por afinidad o admiración. Por ejemplo en el día que escribo estas líneas ester servidor lo he llamado Tristán (pero sin acento). Y para acceder a el me he creado un alias[^2].
Un alias, es eso mismo, una manera de personalizar, acortar o renombrar comandos. En este caso vamos a acortar para no tener que teclear cada vez:

# ssh -p 1022 myuser@myserver.mydomain.tdl

Los alias se pueden crear en la sesión terminal actual tecleando:

# alias mialias="touch crearfichero && echo "Soy tú alias que crea un fichero""

Si tecleas solo alias puedes ver todos los alias actuales.

Pero es efímero y queremos que sea permanente por lo que debemos agregarlo al fichero ~/.bashrc (en linux) o ~/.bash_profile en Mac OS X. Para ello seguimos los siguientes pasos:

Primero abrimos el fichero .bashrc o .bash_profile y comprobamos si tenemos las siguientes lineas:

if [ -f ~/.bash_aliases ]; then  
. ~/.bash_aliases
fi  

Si no lo añadimos, así conseguimos separar los alias del resto de cosas, lo cual nos será más interesante más adelante para crear un “guardador” de alias. Así cuando añadamos un alias lo hacemos en el prompt actual, guardamos los alias y así disponemos del alias en la sesión actual, de la otra manera (creandolo directamente en el archivo) el alias no estaría cargado ya que esos archivos solo se leen al iniciar la sesión en el terminal.

# alias myserver="ssh -p 1022 myuser@mymachine.domain.tdl"
# alias save_alias="alias > ~/.bash_aliases"
# save_alias

Y hasta aquí por hoy, es un tema largo y complejo desplegar un servidor.