Logo Reaper

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

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

web oficial.

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

página de registro.

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.

ifconfig.me

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:

  1. Pulsamos en el botón editar, y luego en avanzado.
  2. Descendemos con flechas al subapartado SSH, opción autenticación.
  3. Tabulamos hasta el botón siguiente al primer cuadro de edición que no tiene etiqueta, y lo pulsamos.
  4. En el cuadro de búsqueda de archivo, en el tipo seleccionamos todos y abrimos el archivo id_rsa de la carpeta .ssh.
  5. Aceptamos el cartel que informa la conversión del archivo a formato PPK y pulsamos intro en el cuadro de guardado de archivo.
  6. 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:

Sin embargo cada usuario deberá establecer el nivel de seguridad según sus propios parámetros y el contexto de su flujo de trabajo.


1302 views


/