¿Cómo construí este sitio?

Como lo comenté en las generalidades acerca de este blog, uno de mis obejtivos es enseñar las cosas que he aprendido y sobre las que me vaya formando.

La existencia de este espacio obedece a algo sobre lo que he ido estudiando: el proyecto docker y también a la época de cuarentena por los estragos que causó el COVID-19 (A la fecha en la que escribo esta entrada, aún nos encontramos en cuarentena). Hace un tiempo había oído hablar del proyecto Docker, pero nunca había despertado en mí ningún tipo de interés.

Un día me encontraba buscando la forma de realizar transmisiones en vivo a múltiples plataformas en mi faceta como DJ y hallé una solución que significaba bajar una imagen de Docker y correrla en un contenedor, no entendía muy bien de lo que me estaban hablando así que me dispuse a aprender en el camino y voilá, fracasé rotundamente, no lograba hacer correr la aplicación que necesitaba.

Yo siempre he sido alguien de la vieja escuela, fanático de las máquinas virtuales y los entornos de pruebas, no concebía que alguien me ahorrara todo el trabajo de instalar requerimientos, configurarlos y poner a andar la aplicación tan sólo con unas cuantas de líneas de comando. Finalmente después de mucho investigar, logré poner a andar el servidor que necesitaba, claro no sin antes descargar la ISO del sistema operativo, instalar la máquina virtual, configurar repositorios, actualizar el sistema base, instalar la aplicación, bajar los módulos adiciones. Con mi aplicación ya corriendo, estaba feliz, sin embargo, me quedó el mal sabor de boca del fracaso con Docker.

Otro buen día, estaba buscando una documentación acerca de una solución que estaba implementando en el lugar donde trabajo y me encontré con que tenía una imagen en Docker, pero esta vez era diferente, porque había un paso a paso muy completo descrito por Pelado Nerd en su canal de youtube. Y no sólo eso, explorando sus vídeos encontré un completísimo curso de introducción a Docker, que en últimas es lo que hizo posible que construyera este sitio.

No entraré en muchos detalles acerca de la instalación de Docker y Docker compose, ni su uso, el Pelado nerd ya lo hizo y no creo que sea capaz de superar su explicación, así que sin más preambulo, vamos a la obra.

Decidí usar como motor de base de datos mariadb y como CMS wordpress, junto con un certificado SSL generado por letsencrypt, así que el archivo docker-compose en YAML se ve más o menos así:

docker-compose.yaml
version: "2"
services:
#Todos los servicios que se monten están detrás del proxy
 nginx-proxy:
  image: jwilder/nginx-proxy
  restart: always
  ports:
   - "80:80"
   - "443:443"
  volumes:
  #Socket de docker y volúmenes necesarios para el proxy
   - /var/run/docker.sock:/tmp/docker.sock:ro
   - /ruta/de/certificados:/etc/nginx/certs:ro
   - /etc/nginx/vhost.d
   - /usr/share/nginx/html
  #Etiquetas  
  labels:
   - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy
#Imagen para generar los certificados gratuitos con letsencrypt
 letsencrypt:
  image: jrcs/letsencrypt-nginx-proxy-companion
  restart: always
  volumes:
   - /ruta/de/certificados:/etc/nginx/certs:rw
   - /var/run/docker.sock:/var/run/docker.sock:ro
  volumes_from:
   - nginx-proxy:rw
#Motor de la base de datos
 db:
  image: mariadb:10.5.2
  volumes:
   - /ruta/de/basedatos:/var/lib/mysql
  restart: always
  environment:
   MYSQL_ROOT_PASSWORD: XXXXX
   MYSQL_DATABASE: nombre_base_datos
   MYSQL_USER: usuario_wordpress
   MYSQL_PASSWORD: password_usuario
#CMS del blog
 wordpress:
  depends_on:
   - db
  image: wordpress:php7.4-apache
  expose:
   - "80"
   - "443"
  restart: always
  environment:
   WORDPRESS_DB_HOST: db:3306
   WORDPRESS_DB_USER: usuario_wordpress
   WORDPRESS_DB_PASSWORD: password_usuario
   WORDPRESS_DB_NAME: nombre_base_datos
  volumes:
   - /ruta/de/archivos/cms:/var/www/html/
#Variables de entorno para el proxy y letsencrypt
  environment:
   - VIRTUAL_HOST=computadoresycafe.com,www.computadoresycafe.com
   - LETSENCRYPT_HOST=computadoresycafe.com,www.computadoresycafe.com
   - [email protected]

Y ya está, luego de editar el archivo, corremos el docker-compose con el siguiente comando:

Sin título
docker-compose up -d

Y ya con esto tenemos una copia de wordpress lista para trabajar con mariadb en menos de 20 minutos, solo basta con que accedan desde el navegador al dominio del sitio, finalicen las configuraciones requeridas.

Al ingresar por primeza vez a la URL del sitio vermos algo así

Espero haya sido bastante constructiva esta entrada, nos vemos en la próxima.

Inyección SQL

Una inyección SQL o en inglés SQL Injection es una de las vulnerabiliades web más explotadas según el top 10 de OWASP la cual consiste en manipular una sentencia SQL legítima aprovechando alguna vulnerabilidad o incorrecta validación de consultas para ejecutar otro tipo de comandos sobre la base de datos, por ejemplo, modificar su contenido, borrarla completamente o acceder a datos sensibles como usuarios, contraseñas y números de tarjetas de crédito, incluso ejecutar comandos sobre el sistema operativo, lo que la convierte en una técnica con un nivel de criticidad bastante alto.

Aunque se podría llegar a pensar que se necesitan altos conocimientos de lenguaje SQL, en la actualidad herramientas como sqlmap permiten realizar ataques automatizados con conocimientos mínimos.

Con esta pequeña información nos veremos en próximas entradas, donde estudiaremos en un laboratorio práctico y controlado, cómo se realizan este tipo de ataques y cómo se pueden mitigar.

¿Qué es YAML?

YAML es un lenguaje de marcado de documentos relativamente joven, creado en 2011 y que permite organizar y leer los datos contenidos de manera fácil, ya que uno de sus objetivos es tener un estándar amigable y de compresión rápida. Se caracteriza por tener una estructura en árbol e identada con espacios.

A continuación veremos un ejemplo bastante simple de cómo se ve una estructura en YAML:

Sin título
#Así lucen los comenatarios en YAML.

#Esto es una llave, se compone del nombre 
#de la llave y separado con un espacio, su valor.
llave: valor
otrallave: valor

#Esto es un mapa. 
hola_soy_un_mapa:
 #Dentro de los mapas podemos anidar elementos, identados 
 #con un espacio
  llave_identada: valor
  #También se pueden construir mapas dentro de un mapa
  mapa_numero_2:
  #Y podemos agregar secuencias a las llaves
   llave_secuenciada:
    - valor_1
    - valor_2
    - valor_3

Probablemente se preguntarán ¿Para qué sirve esto? Bueno en palabras de Mickey Mouse:

Hasta pronto.