El 17 de junio de 2017 se publicó la versión estable de Debian 9, por lo que me decidí a reinstalar un servidor y a migrar unos WordPress, a la vez que añadía SSL con Let’s Encrypt. A lo largo de varios posts voy a explicar todo el proceso de instalación.
Esta es la primera entrada de un conjunto de entradas relacionadas, en las que explico cómo instalar un servidor web LEMP con WordPress y Let’s Encrypt en Debian 9 Stretch.
- Instalación y configuración del sistema operativo.
- Instalación y configuración del MySQL, nginx y PHP.
- Migración de WordPress desde el servidor antiguo al nuevo.
- Obtención y configuración de un certificado SSL/TLS de Let’s Encrypt.
La idea es realizar la siguiente instalación:
- Debian 9.
- nginx 1.10.3-1.
- MySQL 5.7.
- PHP 7.0.
En un servidor físico de gama baja, con las siguientes características de hardware:
- Intel(R) Atom(TM) CPU N2800 @ 1.86GHz (2 núcleos, 4 hilos).
- 2 GB RAM.
- HD de 500GB SATA.
Esta misma instalación puede ser replicada en cualquier servidor físico, VPS,…
Una vez que tenga la instalación base, lo que voy a hacer es configurar dos instalaciones WordPress y gestionar sus certificados SSL. Las denominaré example.com y subdominio.example.com, por lo que los DNS apuntarán a la IP v4 del servidor.
Table of Contents
Convenciones
# – indica que el comando que viene a continuación tiene que ser ejecutado con permisos de root directamente con el usuario root o mediante el comando sudo.
$ – indica que el comando que viene a continuación puede ser ejecutado por un usuario normal sin privilegios de administración.
Instalación base
La empresa donde tengo alquilado el servidor proporciona un método muy sencillo de instalación y reinstalación a través de un panel de control web.
En el primer paso del asistente selecciono la distribución Linux que quiero instalar (Debian 9 Stretch 64 bits), el idioma de instalación (siempre está todo más actualizado y depurado en inglés) y la instalación personalizada, para poder configurar las particiones y el kernel que usaré.
Este es el esquema del particiones por defecto que plantea el instalador web.
No voy a usar partición de arranque (boot). Más información de por qué en este enlace.
Voy a tener, por comodidad, 2 particiones: la raíz (/) y la de swap. Es importante controlar el espacio de disco, ya que con esta configuración, si los logs, una web, un usuario,… llenan el espacio del disco, el servidor dejará de responder o lo hará con anomalías. Lo hago de esta forma porque este servidor es propio, sin acceso por terceros que puedan llenar el disco de una forma brusca.
Otra opción, que no voy a usar, aunque es más segura ante esta problemática, es configurar una partición raíz (/) para el sistema y otra para /var, donde se encuentran las webs, los logs,… De esta forma, si se llena el espacio existente en /var el sistema va a seguir respondiendo.
Respecto al tamaño de la partición de swap podrás leer muchas opiniones, y cada administrador tiene su teoría. Yo me remito a las guías de RedHat y de Ubuntu. Como mi servidor tiene 2GB de RAM, voy a usar 4GB para la partición de swap.
Por lo tanto, el esquema de particiones queda de la siguiente forma:
- Una partición de swap de 4 GB, el doble que la memoria RAM.
- Una partición de tipo ext4 para el resto del sistema.
A continuación personalizo el hostname y selecciono que se use el núcleo de la distribución, no el que proporciona el ISP para esta instalación.
Se inicia la instalación, que puedo seguir a través del panel de control y, tras unos minutos, recibo las credenciales de acceso por SSH a la máquina por correo electrónico.
Acceso
Me conecto a la máquina por SSH como root, con las credenciales que acabo de recibir, y actualizo el sistema
# apt-get update && apt-get upgrade
Instalación de paquetes básicos
Instalo una serie de paquetes básicos:
# apt-get update && apt-get install git sudo htop ntp needrestart lsb-release curl zip unzip net-tools
A continuación describo los paquetes
- git. Sistema de control de versiones. Más información en este enlace.
- sudo. Aplicación que permite ejecutar programas con permisos especiales, normalmente de superusuario. Más información en este enlace.
- htop. Es un visor de procesos. Más información en este enlace.
- ntp. Cliente para mantener actualizada la hora del sistema. Más información en este enlace.
- needrestart. Aplicación que comprueba que servicios necesitan un reinicio tras actualiaciones. Más información en este enlace.
- lsb-release. Herramienta que permite obtener información sobre la instalación Linux que se ejecuta. Más información en este enlace.
- curl. Herramienta que permite transferir datos. Más información en este enlace.
- zip y unzip. Paquetes de compresión y descompresión de ficheros.
Creación de usuario
Creo un usuario, que será el que use para tareas de administración, de tal forma que cuando me conecte a la máquina lo haré con este usuario, ya que en breve voy a desactivar el acceso por SSH al usuario root.
# adduser amieiro Adding user `amieiro' ... Adding new group `amieiro' (1000) ... Adding new user `amieiro' (1000) with group `amieiro' ... Creating home directory `/home/amieiro' ... Copying files from `/etc/skel' ... Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for amieiro Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n] Y
Con esto queda creado el usuario y su espacio de trabajo (/home/amieiro).
Agrego el usuario a los sudoers
A continuación agrego este usuario al archivo /etc/sudoers, de tal forma que pueda convertirse en superusuario y ejecutar cualquier comando. Para ello ejecuto
# sudo visudo
Y edito el archivo. Donde aparecen las siguientes líneas
# User privilege specification root ALL=(ALL:ALL) ALL
lo que hago es añadir una para el nuevo usuario, que va a permitir convertirse en superusuario a este usuario.
# User privilege specification root ALL=(ALL:ALL) ALL amieiro ALL=(ALL:ALL) ALL
La ventaja de ejecutar este comando
# sudo visudo
y no editarlo mediante
# nano /etc/sudoers
es que al tratar de guardar el archivo va a validar la sintaxis del archivo, por si he cometido algún error.
Securización del SSH
Lo siguiente que voy a hacer es deshabilitar el acceso por SSH al usuario root y habilitarlo al usuario que acabo de crear. Para ello edito el archivo /etc/ssh/sshd_config
# nano /etc/ssh/sshd_config
Cambio la línea
PermitRootLogin yes
por
PermitRootLogin no
para que el usuario root no se pueda conectar remotamente.
A continuación habilito el acceso al usuario creado. Para ello, en ese mismo archivo, cambio
PasswordAuthentication yes
por
PasswordAuthentication no Match User amieiro PasswordAuthentication yes
De esta forma el usuario amieiro se pueda conectar remotamente mediante usuario/contraseña. Para una mejor protección debería de habilitar el acceso mediante clave pública.
Reinicio el servicio para aplicar los cambios
# systemctl restart sshd.service
Sin cerrar la conexión SSH actual (con root), por si hubiera algún problema en la nueva configuración SSH y quedara sin conexión al servidor, pruebo desde mi equipo de escritorio el acceso SSH con el usuario nuevo
$ ssh amieiro@example.com
Una vez que estoy conectado con el nuevo usuario pruebo que me permite convertirme en superusuario
$ sudo su
y también que no me permite abrir una sesión con el usuario root.
$ ssh root@example.com
Cambio el color del bash
Lo siguiente que voy a hacer es cambiar el color del bash, de tal forma que cuando estoy con el usuario amieiro el bash está en color verde, mientras que cuando escalo privilegios el bash aparece en color rojo, para advertirme de los peligros de usar de forma habitual el superusuario.
Para el usuario amieiro edito su archivo de configuración .bashrc
$ cd /home/amieiro $ nano .bashrc
Descomento la línea
#force_color_prompt=yes
quedando
force_color_prompt=yes
Recargo la configuración para que se aplique
$ source ~/.bashrc
Hago lo mismo para el usuario root, poniendo el cursor en color rojo
# cd /root # nano .bashrc
con lo que tengo que añadir la siguiente línea
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
Recargo la configuración para que se aplique
# source ~/.bashrc
De esta forma, cuando esté logueado con el usuario amieiro el prompt aparecerá en verde, pero cuando haga sudo, el prompt cambiará a rojo, para alertarme de que estoy con usuario con permisos especiales.
Configuro el editor por defecto
En mi caso voy a seleccionar nano. Para ello ejecuto
# update-alternatives --config editor There are 3 choices for the alternative editor (providing /usr/bin/editor). Selection Path Priority Status ------------------------------------------------------------ * 0 /bin/nano 40 auto mode 1 /bin/nano 40 manual mode 2 /usr/bin/vim.basic 30 manual mode 3 /usr/bin/vim.tiny 15 manual mode
Ya está seleccionado por defecto, con lo que pulso Enter y continuo.
Configuro el editor nano para que muestre la línea en la que estoy. Para ello ejecuto
$ echo 'set constantshow' > ~/.nanorc $ source ~/.nanorc
Con estas instrucciones ya tengo instalado el sistema base.
En la siguiente entrada voy a explicar cómo instalar y configurar los servidores y demás software que necesito ejecutar: MySQL, nginx y PHP.
Actualizaciones
A veces he tenido algún problema para usar los repositorios de Debian, debido a que el cliente apt usa IPv6 por defecto.
Lo que hago es forzar a IPv4 para evitar este problema. Para ello creo un archivo con el contenido indicado en el siguiente comando
# echo 'Acquire::ForceIPv4 "true";' | sudo tee /etc/apt/apt.conf.d/99force-ipv4
A continuación ya puedo ejecutar
# apt-get update && apt-get upgrade
Como es un comando largo y que ejecuto periódicamente, lo que hago es un alias.
Para ello edito el .bashrc del root
# nano /root/.bashrc
Y añado la línea
alias dale='apt-get update && apt-get upgrade'
Las próximas veces que inicie la sesión con root o mediante sudo se cargará este alias y solo tendré que ejecutar
# dale
Para cargar en esta misma sesión el alias, ejecuto
# source /root/.bashrc
4 comments