Rails en producción - Parte 2 - Configuración del servidor debian

ruby, rails, sysadmin Deja un comentario

La versión de Debian GNU/Linux con la que trabajaremos es la 4.0 etch.

Los pasos para instalar el sistema operativo dependerán de nuestro proveedor de hosting. Normalmente, dispondremos de un panel de control para poder instalar nuestro servidor. Partiremos, por lo tanto, de una instalación totalmente nueva y operativa, de la que tendremos la password de root y la dirección IP para poder conectarnos por SSH.

Nos conectamos a la máquina recien instalada. Lo primero que haremos, por seguridad, será cambiar la contraseña de root:

# passwd

Creación de un usuario no privilegiado

Creamos un usuario no privilegiado, el cual ejecutará el servidor web y los servidores de aplicaciones:

# useradd -d /home/usuario -s /bin/bash usuario
# mkdir /home/usuario
# chown usuario:usuario /home/usuario
# passwd usuario

Por comodidad, instalaremos la herramienta sudo y le daremos a nuestro usuario privilegios para poder utilizarla:

# apt-get install sudo
# export EDITOR=vi
# visudo

Y añadimos al final del fichero:

usuario ALL=(ALL) ALL

Podemos crear un fichero ~/.bash_profile para el usuario. Podemos utilizar como ejemplo:

PS1='\[\033[035m\]\u\[\033[033m\] \w\[\033[00m\]$ '
EDITOR=vi
RAILS_ENV=production
export PS1 EDITOR RAILS_ENV

Configuración de SSH

Editamos el fichero de configuración de SSH, /etc/ssh/sshd_config, de manera que:

  • por seguridad, cambiamos el puerto TCP 22 por otro no estándar, por ejemplo el 30000.
  • nos aseguramos de que la versión del protocolo es la 2.
  • no será posible conectarse directamente como root.
  • permitiremos la autenticación mediante password (a menos que definamos una relación de confianza).
  • no permitiremos X11Forwarding.
  • deshabilitaremos la autenticación vía PAM.
  • deshabilitaremos las resoluciones inversas de DNS.
  • permitiremos solamente el acceso por SSH al usuario que hemos creado anteriormente.

Es decir, en el fichero /etc/ssh/sshd_config deberemos comprobar las siguiente líneas:

Port 30000
Protocol 2
PermitRootLogin no
PasswordAuthentication yes
X11Forwarding no
UsePAM no
UseDNS no
AllowUsers usuario

Una vez editado, le indicamos al demonio sshd que lo relea:

# /etc/init.d/ssh reload

Antes de desconectarnos como root, deberemos probar a conectarnos con el usuario no privilegiado que hemos creado, ya que si no hemos editado correctamente el fichero de configuración de SSH podríamos peder el acceso a la máquina:

$ ssh -l usuario IP -p 30000

Configuración del firewall iptables

Si acabamos de instalar debian, la tabla de reglas del firewall estará vacia:

$ sudo -i
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Editamos el fichero /etc/iptables.test.rules y pegamos:

*filter
 
 
#  Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -i ! lo -d 127.0.0.0/8 -j REJECT
 
 
#  Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
 
 
#  Allows all outbound traffic
#  You can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT
 
 
# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
 
 
#  Allows SSH connections
#
# THE -dport NUMBER IS THE SAME ONE YOU SET UP IN THE SSHD_CONFIG FILE
#
-A INPUT -p tcp -m state --state NEW --dport 30000 -j ACCEPT
 
 
# Allow ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
 
 
# log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
 
 
# Reject all other inbound - default deny unless explicitly allowed policy
-A INPUT -j REJECT
-A FORWARD -j REJECT
 
COMMIT

Si hemos elegido para el demonio sshd un puerto diferente al 30000, tendremos que editar la línea del fichero que permite las conexiones SSH entrantes.

Cargamos el firewall con las nuevas reglas:

# iptables-restore < /etc/iptables.test.rules

Comprobamos que las reglas se han cargado correctamente.

# iptables -L

Comprobamos también que podemos conectarnos de nuevo por SSH. En caso afirmativo, podemos guardar las reglas:

# iptables-save > /etc/iptables.up.rules

Para que los cambios sean tenidos en cuenta al rearrancar la máquina, deberemos editar el fichero /etc/network/interfaces. Después de las líneas:

# The loopback network interface
auto lo
iface lo inet loopback

añadiremos:

pre-up iptables-restore < /etc/iptables.up.rules

Para comprobar que todo ha ido bien, rearracamos la máquina:

# shutdown -r now

Actualizaciones

Una vez conectados de nuevo, realizaremos una actualización de los paquetes de la distribución debian. Tendremos en cuenta que la lista de repositorios en los que se buscan las actualizaciones está en /etc/apt/sources.list. En principio no será necesario cambiar la lista de repositorios.

Actualizamos la lista de paquetes disponibles en el repositorio:

$ sudo aptitude update

Reconfiguramos los paquetes de locales. Para ello, editamos el fichero /etc/environment:

LANG=es_ES.UTF-8

y ejecutamos:

$ sudo aptitude install locales
$ sudo dpkg-reconfigure locales

Nos aparecerá un menú donde tendremos que seleccionar los locales:

es_ES.UTF-8 UTF-8

Como veis, he escogido el español de España (es_ES). Cada uno puede elegir el locale que le interese.

Ahora sí, actualizamos los paquetes de nuestra máquina (esto puede tardar un rato):

$ sudo aptitude upgrade
$ sudo aptitude dist-upgrade

Rearracamos:

$ sudo shutdown -r now

Y por último, instalamos los paquetes necesarios para la compilación, ya que los necesitaremos más adelante:

$ sudo aptitude install build-essential

Tutorial completo

Deja un comentario