Montar un servidor apache en un sistema operativo Debian virtualizado
¿Qué no es esta publicación?
Ni un curso de VMWare o de gestión de sistemas operativos basados en Linux, ni un curso de desarrollo web.
Para realizar lo que más abajo se explica, se requiere tener conocimientos básicos del uso de consolas de comandos, aprender con las herramientas instaladas en esta entrada sobre el uso mínimo de sistemas operativos basados en Linux a través de la consola, y muchas ganas de complementar el conocimiento en las distintas áreas que aquí solo se nombran o se utilizan por encima.
Hoy en día tenemos un aliado fundamental en los distintos modelos de lenguaje como copilot de Microsoft, o Gemini de Google, etcétera. Con ellos podemos consultar comandos, preguntar por problemas con los pasos aquí expresados y con el proceso de aprendizaje de sistemas operativos basados en Linux. Es importantísimo para ello conocer y dominar los comandos del lector de pantallas para leer la ventana de la consola, así como para seleccionar y copiar texto. NVDA es la mejor opción sin dudas, y hay mucho material que explica cómo utilizar las herramientas de revisión de pantalla.
Temario
- Ingredientes
- Instalación del SO y puesta en marcha
- Gestionar sistemas virtualizados con VMRun, configurar WinScp, conexiones por SSH
- Instalar apache y crear un servidor básico
- Configurar un dominio gratuito para que resuelva en la ip de nuestro servidor
- Configurar SSH para establecer conexiones utilizando una clave pública en lugar de una contraseña
- Seguridad en el uso de claves o contraseñas
Los ingredientes necesarios para esta ensalada son los siguientes
VMWare
Este programa brinda la tecnología que permite a los usuarios ejecutar múltiples sistemas operativos en un solo hardware físico, facilitando la consolidación de servidores, la prueba de software y el desarrollo de aplicaciones en entornos aislados.
El siguiente es el link de uno de los encuentros continuos de NVDA, con el título Uso de VMware Workstation Pro. en el que se demuestra la instalación y uso de este programa que ahora es gratuito también en su versión pro para uso personal.
Hay bastante material al respecto en blogs y canales de Youtube, incluyendo una publicación, Virtualización con VMWare de hace algunos años.
WinScp
WinSCP es un cliente de código abierto para Windows que permite la transferencia de archivos entre un sistema local y un servidor remoto utilizando protocolos como SFTP (Secure File Transfer Protocol) y SCP (Secure Copy Protocol). Ofrece una interfaz gráfica fácil de usar, similar al Explorador de Windows, y se puede descargar desde su web de descargas.
GNU/Linux Debian
Debian es un sistema operativo de código abierto basado en GNU/Linux, conocido por su estabilidad, seguridad y amplio soporte de paquetes. Es desarrollado por una comunidad de voluntarios, y es popular en servidores y entornos de escritorio debido a su robustez y filosofía de software libre. El archivo iso para la instalación podemos descargarlo desde su
Instalación del sistema operativo y puesta en marcha
Comando para obtener la ip desde el bash
hostname -I
Loguearse con el usuario root
su -
Apagar el sistema
poweroff
Gestionar sistemas virtualizados con VMRun, configurar WinScp, conectarse con el servidor a través del protocolo SSH
Configurar la consola del símbolo del sistema para una salida limpia y legible.
@echo off
Imprimir el contenido de la variable server
echo %server%
Limpiar consola
cls
Iniciar una máquina virtual en segundo plano
vmrun start "RutaAlArchivoVMX" nogui
Detener una máquina virtual de forma segura
vmrun stop "RutaAlArchivoVMX" slow
Nota: Si cambiamos la opción slow por hard, el apagado es forzado. Solo conveniente cuando hay algún problema con el apagado.
Listar máquinas virtuales en ejecución
vmrun list
Comando para conectarse con el servidor por ssh
ssh usuario@IPDelServidor
Abrir desde el bash un archivo con el editor nano en Debian
nano RutaONombreDelArchivo
Reiniciar el servicio ssh en Debian
systemctl restart ssh
Imprimir el nombre del usuario actual en bash
whoami
Instalar apache y crear un servidor básico
Cargar configuraciones de entorno definidas en el archivo .bashrc
source /home/NombreUsuario/.bashrc
Actualizar la lista de paquetes disponibles desde los repositorios configurados
sudo apt update
Actualizar todos los paquetes instalados a sus versiones más recientes disponibles.
sudo apt upgrade -y
Instalar sudo
apt install sudo
Añadir al usuario gk al grupo root con el usuario root activo
usermod -aG root gk
Listar los grupos a los que pertenece el usuario gk
groups gk
Instalar apache
sudo apt install php libapache2-mod-php
Activar el servicio apache2
sudo systemctl start apache2
Comando scp desde CMD para subir un archivo al servidor
scp NombreArchivo usuario@IPDelServidor:RutaDestino
Comando scp desde CMD para descargar una carpeta desde el servidor en el directorio actual
scp -p user@ip:/ruta/a/la/carpeta .
Obtener la IP pública de nuestra red
curl -s ifconfig.me
Configurar un dominio gratuito para que resuelva en la ip de nuestro servidor
Hay varias páginas que permiten esto, pero la única que he utilizado y conozco es no-ip, por ende la que vamos a configurar. Las interfaces web suelen modificarse, por lo que es probable que los pasos siguientes no sean exactamente iguales a lo explicado.
En primer lugar debemos crear una cuenta en no-ip, para lo que podemos ingresar en su
En la que vamos a completar los campos de correo electrónico y contraseña, para luego pulsar el botón de registro gratuito.
Luego de esto podemos cerrar la web, y verificar nuestro correo electrónico para terminar de activar la cuenta pulsando en el enlace enviado al email registrado en el paso anterior.
Al abrir esta URL se nos abre el panel de nuestra cuenta en el navegador por defecto y en la que se solicitan algunas respuestas, pero que podemos saltar con el enlace correspondiente.
Pulsamos en ir a mi cuenta para configurar nuestro dominio, en donde seleccionamos en el primer cuadro el nombre del subdominio, y debajo podemos verificar los dominios posibles. Los primeros son gratuitos, los que están más abajo ya no lo son. En el segundo cuadro podemos filtrar por dominios, y cuando encontremos el menos peor en los resultados que figuran debajo de este cuadro pulsamos intro sobre él para seleccionarlo, por ejemplo;
NombreElegido.sytes.net
NombreElegido.redirectme.net
NombreElegido.servemp3.com
En el cuadro de edición siguiente debemos especificar la IP a la cual va a resolver este dominio. Generalmente es detectada por la web, pero para asegurarse es mejor escribirla.
puede ser un buen sitio para verificar nuestra IP pública desde el navegador.
Una vez configurados los campos, pulsamos en crear nombre de host. Si el nombre no está en uso, y los campos fueron tomados correctamente debería aparecer nuestro subdominio seguido de la leyenda, activado. Se puede configurar el perfil del usuario y otras cosas pero eso ya será su tarea. Hasta aquí lo que necesitamos de esta web, por lo que podemos cerrar el navegador.
Para verificar que todo sea correcto, podemos abrir un símbolo del sistema y ejecutar el siguiente comando
ping ejemplo.redirectme.net
Lógicamente reemplazamos el dominio por el que hayamos configurado. Si este comando devuelve entre otras cosas la IP pública configurada, ya estamos listos para el siguiente paso.
Script para actualizar la IP dinámica en no-ip
Es bastante probable que el proveedor del servicio de internet les asigne una IP pública dinámica, es decir que va cambiando cada cierto tiempo. Lo que puede ser problemático para configurar un servidor. Sin embargo no-ip tiene algunas apis que nos permiten automatizar el proceso de verificación y reactivación del host. Vamos a utilizar un script para verificar la ip asignada, y actualizarla cuando la misma cambie.
Nos movemos a la raíz del usuario, y creamos un nuevo archivo con el siguiente comando bash
cd ~
nano ip-verify.sh
Dentro del archivo copiamos el contenido siguiente sin el texto inicio y fin del script. Y una vez realizadas las modificaciones de las variables, guardamos cambios con el comando; control + s. Control + x.
# inicio del script 👇
#!/bin/bash
# Datos de la cuenta de no-ip
EMAIL="ejemplo@gmail.com"
PASSWORD="clave"
HOST="ejemplo.dominio.com"
FILE=".last-ip"
if [ ! -e "$FILE" ]; then
echo "0.0.0.0" > "$FILE"
LAST="0.0.0.0"
else
LAST=$(cat "$FILE")
fi
CURRENT="$(curl -s https://api.ipify.org)"
if [ "$CURRENT" != "$LAST" ]; then
echo "$CURRENT" > "$FILE"
curl -s -u "$EMAIL:$PASSWORD" "https://api.no-ip.com/nic/update?hostname=$HOST&myip=$CURRENT"
fi
# fin del script ☝️
Aquí debemos configurar las variables con los datos de nuestra cuenta. Email, contraseña y nombre del host. La variable file podemos dejarla como está, o modificarla a gusto. Una vez modificado el script con sus datos, guardarlo por ejemplo en la raíz del usuario, con el nombre ip-verify.sh
Lo que hace este script es verificar si existe un archivo llamado .last-ip para obtener su contenido, o crearlo en el caso contrario. En el mismo se va a almacenar la última IP registrada en la cuenta. Luego captura nuestra ip actual, y la compara con la obtenida del archivo. En el caso de que no coincidan, actualiza el archivo local y la cuenta de no-ip con la nueva ip.
Lo siguiente es otorgar permisos de ejecución a este script, lo que podemos lograr con el siguiente comando
sudo chmod +x ip-verify.sh
Automatizar la ejecución del script utilizando crontab
crontab es una herramienta en sistemas Linux que permite programar tareas automáticas para que se ejecuten en intervalos específicos, como cada minuto, cada hora, o en días determinados. Se utiliza para ejecutar scripts, comandos o programas sin intervención manual.
El comando para abrir el editor de crontab es el siguiente:
crontab -e
La primera vez que lo ejecuten va a preguntarles con qué editor lo quieren abrir para editar el contenido. Para utilizarlo con nano, escriben 1, y pulsan intro.
Una vez abierto el editor, pegamos al final del archivo las líneas siguientes.
*/10 * * * * ~/ip-verify.sh
Esta línea especifica que se va a ejecutar el script ip-verify.sh cada 10 minutos.
Guardamos cambios con el atajo control + s, y cerramos el editor con control + x. Si todo funciona correctamente, ya podemos olvidarnos de tener que configurar manualmente el cambio dinámico de la "ip". La confirmación obligatoria mensual del host en la cuenta gratuita, llegará al correo configurado en la cuenta para efectuar la renovación y no perder el acceso al subdominio seleccionado.
Configurar SSH para establecer conexiones con una clave pública en lugar de una contraseña
Por defecto, el servicio SSH está configurado para recibir conexiones a través de contraseña. Sin embargo, es posible crear un par de claves para utilizarlas en lugar de la misma, añadiendo así una capa de seguridad a nuestras conexiones.
El proceso para concretar esta conexión implica crear las claves, configurar sus permisos para el usuario, copiarla en el servidor y modificar la configuración de SSH para cambiar el tipo de conexiones. Vamos a ello:
Crear las claves pública y privada
En este caso, utilizaremos el símbolo del sistema, por lo que activamos el menú ejecutar con Windows + R, tipeamos cmd, y pulsamos intro.
Una vez en la consola, vamos a tipear el siguiente comando para crear las claves de tipo RSA con un tamaño de 4096 bits. Pulsamos intro para ejecutar:
ssh-keygen -t rsa -b 4096
Lo que nos debería devolver: Generating public/private rsa key pair. Enter file in which to save the key (RutaDeLosArchivos). Pulsamos intro para continuar, y nos muestra: Enter passphrase (empty for no passphrase).
En este punto podemos añadir una contraseña a las claves, lo que añade otra capa de seguridad extra. Esto implica que en cada conexión con el servidor se nos va a solicitar la misma para poder conectarnos. En el caso de no añadir una contraseña pulsamos intro sin escribir nada.
Enter passphrase (empty for no passphrase) es el mensaje siguiente, donde debemos escribir otra vez la contraseña anterior o pulsar intro sin escribir nada si no se completó el campo anterior, lo que finaliza el proceso e imprime la ruta de los archivos creados.
Cambio de permisos del usuario sobre los archivos de claves
Este protocolo requiere que los archivos de claves tengan permisos exclusivos del usuario que establece la conexión, por lo que vamos a utilizar la herramienta icacls con los siguientes comandos.
Para movernos a la carpeta donde se alojan los archivos de claves y evitar tener que escribir la ruta de los mismos:
cd .ssh
Convertimos los permisos heredados de la carpeta padre en permisos explícitos en los archivos:
icacls id_rsa /inheritance:r
icacls id_rsa.pub /inheritance:r
Otorgamos al usuario los permisos de lectura (R) y/o escritura (W) sobre los archivos. La opción /grant:r asegura que se reemplace cualquier permiso existente. Cambiar user por el usuario correcto en el comando.
icacls id_rsa /grant:r user:(R,W)
icacls id_rsa.pub /grant:r user:R
Para asegurarnos del nombre del usuario configurado en el equipo para los comandos anteriores, podemos ejecutar lo siguiente:
whoami
Este comando devuelve NombreEquipo\NombreUsuario.
Es turno de copiar la clave pública al portapapeles, pasando la salida del primer comando al segundo con un pipe (|):
type id_rsa.pub | clip
Configuración de la clave pública en el servidor
Teniendo la clave en el portapapeles con los pasos anteriores, procedemos a conectarnos con el servidor. Una vez conectados, creamos la carpeta .ssh en el directorio del usuario si no existe e ingresamos en ella:
mkdir -p ~/.ssh && cd ~/.ssh
Utilizamos nano para abrir o crear el archivo authorized_keys:
nano authorized_keys
Si este archivo está vacío, pegamos el contenido del portapapeles con Control + V. Si ya tiene alguna clave, vamos al final de la línea con la tecla fin, pulsamos intro para una nueva línea y pegamos la clave.
Control + S para guardar cambios, Control + X para cerrar el editor nano.
Configuración del servicio SSH para aceptar conexiones por clave pública
Solo resta quitar la autorización de ingreso por contraseña y habilitar el acceso por clave pública. Para ello, editamos el archivo de configuración con el siguiente comando:
sudo nano /etc/ssh/sshd_config
Ya en el editor, buscamos la línea Pubkey y la modificamos para que quede de la siguiente forma:
PubkeyAuthentication yes
Esto activa el ingreso por clave pública. Ahora es el turno de la contraseña, y la línea debe quedar de la siguiente forma:
PasswordAuthentication no
Por defecto el servicio ssh establece la conexión a través del puerto 22, aunque suele ser una buena práctica cambiarlo. Para ello tan solo es necesario buscar la línea
Port 22
Y modificarla por algún número mayor de 10000, por ejemplo
Port 2244
Si cambiamos el puerto, es necesario añadirlo en cada conexión con el servidor
ssh -p 2244 user@ip
Control + S, Control + X para guardar y cerrar. Solo resta reiniciar el servicio:
sudo systemctl restart ssh
Configuración de ssh en Windows para conectarse solo con un nombre de host
Es posible crear o modificar el archivo de configuración de ssh para añadir datos predefinidos y evitar tener que escribirlos en cada conexión.
Para ello creamos un archivo sin extensión llamado config en la carpeta .ssh, con el siguiente contenido:
Host servidor
HostName 192.168.1.69
User mufasa
Port 22
Cambiamos las configuraciones para añadir el nombre del host a elección, el HostName con la IP, el user con el nombre de usuario correcto, y el puerto. Si no se modificó en el archivo sshd_config, el puerto por defecto es el 22. Aunque es una buena práctica cambiarlo por un número alto a elección.
Una vez guardados los cambios, podemos establecer la conexión con el comando:
ssh servidor
Configuración de WinSCP para conexión con claves
Para que este programa se conecte a través de clave pública, realizamos la siguiente configuración:
- Pulsamos en el botón editar, y luego en avanzado.
- Descendemos con flechas al subapartado SSH, opción autenticación.
- Tabulamos hasta el botón siguiente al primer cuadro de edición que no tiene etiqueta, y lo pulsamos.
- En el cuadro de búsqueda de archivo, en el tipo seleccionamos todos y abrimos el archivo id_rsa de la carpeta .ssh.
- Aceptamos el cartel que informa la conversión del archivo a formato PPK y pulsamos intro en el cuadro de guardado de archivo.
- Pulsamos en Aceptar al diálogo, otra vez en aceptar y finalmente en guardar.
En este punto las conexiones con el servidor a través de este programa se harán utilizando claves cifradas en lugar de contraseñas.
Seguridad en el uso de claves o contraseñas
La configuración ideal de cara a la seguridad de las conexiones por SSH requieren lo siguiente:
- Impedir el acceso root al establecer la conexión
- Inhabilitar el acceso por contraseña y utilizar claves RSA para evitar ataques de fuerza bruta
- Colocar una contraseña a las claves para una capa extra de seguridad en caso de robo de las mismas
- Cambiar el puerto por defecto para reducir la exposición a ataques automatizados
- no utilizar archivos de configuración con datos predefinidos
Sin embargo cada usuario deberá establecer el nivel de seguridad según sus propios parámetros y el contexto de su flujo de trabajo.