SSH. Un poco de seguridad Parte 5

En esta ocasión generaremos un par de claves (publica/privada) para conectarnos a nuestra maquina sin necesidad de introducir nuestra contraseña, aunque esto también tiene sus riesgos,  por eso daremos unos consejos para una utilización segura de este sistema de acceso.

Primero generamos un par de claves de protocolo 2 con ssh-keygen -t RSA , donde RSA puede ser sustituido por RSA1 para el protocolo 1, o DSA  para el protocolo 2,  también las podemos generar indicando el numero de bits (-b 1024,-b 2048,-b 4096)

mrpako@ecorp$ ssh-keygen -t RSA
Generating public/private rsa key pair.
Enter file in which to save the key (/home/mrpako/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):***************************
Enter same passphrase again:***************************
Your identification has been saved in /home/mrpako/.ssh/id_rsa.
Your public key has been saved in /home/mrpako/.ssh/id_rsa.pub.

Esto crea dos archivos, id.rsa (clave privada) e id.rsa.pub (clave publica) este ultimo debemos incluirlo en el archivo /home/mrpako/.ssh/authorized_keys.

mrpako@ecorp$ echo `cat ~/id.rsa.pub` >> ~/.ssh/authorized_keys
Y después procedemos a su eliminación.
mrpako@ecorp$ rm /home/mrpako/id.rsa.pub

Y para finalizar configuramos el archivo /etc/ssh/sshd_config , deshabilitaremos  el acceso como root, según se indica en la parte 1 de esta serie, y podemos añadir algo mas de seguridad siguiendo las indicaciones de la parte  2.

Ahora debemos proteger y distribuir por un canal seguro la clave privada y reiniciar el servicio con service sshd restart, y ya podemos proceder a conectarnos desde cualquier otra ubicación que disponga de la llave con israelgmo@umbrellacorp$ ssh -i id.rsa mrpako@192.251.68.254

 

Guía Hardening – Configuración de redes y Firewall – IPtables Parte 2

En la primera parte de esta entrada se vio como funcionaba muy básicamente IPtables, y para ver el potencial y funcionamiento de un Firewall con IPtables, hemos decidido coger un script que teníamos a mano, y así poder ver de una manera mas completa el potencial de IPtables. Tenéis que tener en cuenta que este FW se ha puesto como ejemplo, no es que se haya realizado super securizado, es simplemente para que veáis algunos ejemplos de lo que se puede hacer con iptables.

ESQUEMA DE RED

Mr.Pako = KALI
FIREWALL = CERBERO
ECORP = eth2 Debian
UMBRELLA = eth0 Win

ARCHIVO INTERFACE

up /etc/fw.sh start
down /etc/fw.sh stop

ARCHIVO BLACKLIST

Este es un simple archivo de texto en el que para el ejemplo hemos decidido incluir  direcciones URL de sitios web a bloquear, se puede utilizar este mismo ejemplo para otros menesteres,  se invoca desde el script al inicio, por ejemplo.

Variables

BLACKLIST="/etc/blacklist"

ejemplo de contenido:

---- inicio archivo blacklist ----
marca.es
elmundo.es
elpais.com
etc.
--- fin archivo blacklist ----

SCRIPT Firewall

He decidido crear un script e iniciarlo al arrancar el equipo, personalmente me gusta hacerlo así, pero bueno aquí cada cual que elija el método que más le guste.

Hemos comentado todo el script, además consideramos que es auto explicativo. Vamos al tajo.

1.- Stop, borrado de reglas y Start
La primera parte del script elimina todas las reglas anteriormente creadas, de este modo evitamos posibles conflictos con alguna regla existente, para esta tarea utilizamos la opción –flush o -F, acompañada de -X (borra todas las cadenas) y -Z (pone a cero los contadores de paquetes) y finalizamos poniendo todas las políticas por defecto en ACCEPT y aplicando reglas para el Firewall.

 

========= INICIO SCRIPT ==========

#!/bin/sh
#
#
# Variables
BLACKLIST="/etc/blacklist"

stop(){
# Eliminamos reglas (flush)

echo -ne "[.] Eliminando reglas anteriores "
iptables --flush
iptables -X
iptables -Z
iptables --table nat --flush
iptables --table mangle --flush

# Ponemos las politicas por defecto en ACCEPT.

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
echo -ne " -> [ OK ]\n "
}

start(){
clear 
echo -ne "***** Aplicando Reglas de Firewall *****\n"
 
# Politicas por defecto (drop) 
# creo las politicas por defecto en drop para que 
# lo deniege todo, excepto el PRE Y POSTROUTING.

echo -ne "[.] Estableciendo POLITICAS (DROP) por defecto"
iptables --policy INPUT DROP
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP
iptables --table nat --policy PREROUTING ACCEPT
iptables --table nat --policy POSTROUTING ACCEPT
echo -ne " -> [ OK ]\n "

2.- Protección
Para protegernos frente a algunos ataques comunes debemos habilitar varios módulos, esto lo hacemos con echo 1  >  seguido del modulo que queremos activar, además añadimos protección para 3 tipos de escaneo de red comunes.

# Ahora hacemos enmascaramiento de la red local y activamos el BIT 
# DE FORWARDING (imprescindible)
echo -ne "[.] Estableciendo MASQUERADE Y FORWARD para la red local"
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
echo -ne " -> [ OK ]\n "

# Habilitamos protección broadcast echo.
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# Habilitamos protección tcp_syn cookie.
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# Protecciones a 3 tipos de escaneo 
# NULL, XMAS, SYN-FIN-scan
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

# Permitir hacer pings al servidor
echo -ne "[.] Permitiendo ping al FW desde la LAN y desde Internet"
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A INPUT -i eth2 -p icmp -j ACCEPT
iptables -A INPUT -i eth0 -p icmp -j ACCEPT
iptables -A INPUT -i eth1 -p icmp -j ACCEPT 
echo -ne " -> [ OK ]\n "

3.- SSH
Para poder trabajar a través de SSH debemos indicarle al firewall las direcciones de origen y puertos que se utilizaran normalmente para conectarse utilizando SSH, además podemos indicarle la mac address del equipo para brindar un poco mas de seguridad en la conexiones.

# Reglas para poder acceder al servidor por ssh
echo -ne "[.] Permitiendo ACCESO SSH hacia CERBERO desde puesto de trabajo y laptop Mr.Pako"
iptables -A INPUT -i eth2 -s IP ORIGEN -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -s IP ORIGEN.46 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth2 -s IP ORIGEN.179 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -s IP ORIGEN.179 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth2 -s IP ORIGEN.46 -p udp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -s IP ORIGEN.46 -p udp --dport 22 -j ACCEPT
#iptables -A INPUT -m mac --mac 00:00:00:00:00:00 -p tcp --dport 22 -j ACCEPT
#iptables -A INPUT -m mac --mac 00:00:00:00:00:00 -p udp --dport 22 -j ACCEPT
#iptables -A INPUT -m mac --mac 00:00:00:00:00:11 -p tcp --dport 22 -j ACCEPT
#iptables -A INPUT -m mac --mac 00:00:00:00:00:11 -p udp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -s IP ORIGEN.80.1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o eth2 -s IP ORIGEN.1 -m state --state ESTABLISHED,RELATED -j ACCEPT
echo -ne " -> [ OK ]\n "

 

# ntp 
iptables -A FORWARD -p udp --dport 123 -j ACCEPT
iptables -A FORWARD -p tcp --dport 123 -j ACCEPT 
 
# Reglas para el DNS local
echo -ne "[.] Permitiendo peticiones DNS desde ECORP hacia inet" 
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
echo -ne " -> [ OK ]\n " 
 
echo -ne "[.] Permitiendo peticiones DNS desde Lan hacia ECORP" 
iptables -A INPUT -i eth2 -p tcp --dport 53 -d IP DESTINO/24 -j ACCEPT
iptables -A INPUT -i eth2 -p udp --dport 53 -d IP DESTINO/24 -j ACCEPT
iptables -A OUTPUT -o eth2 -m state --state ESTABLISHED,RELATED -j ACCEPT
echo -ne " -> [ OK ]\n "

 

4 – VPN, RDP, WEB, VozIP, CITRIX, FTP

 

# Reglas para conexiones VPN desde INTERNET
echo -ne "[.] Permitiendo conexiones vpn desde inet" 
iptables -t nat -A PREROUTING -i eth0 -p 47 -s 0/0 -j DNAT --to IP DESTINO
iptables -t nat -A PREROUTING -i eth0 -p tcp -s 0/0 --dport 1723 -j DNAT --to IP DESTINO:1723
iptables -A FORWARD -i eth0 -o eth2 -d IP DESTINO -p 47 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth2 -d IP DESTINO -p tcp --dport 1723 -j ACCEPT
echo -ne " -> [ OK ]\n "

# Regla para permitir pptp (VPN)
echo -ne "[.] Activando reglas FORWARD para conexion vpn desde el SERVIDOR DE ECORP hacia otros destinos"
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 1723 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p 47 -o eth0 -j ACCEPT
echo -ne " -> [ OK ]\n "

# Permito RDP 3389.
echo -ne "[.] Permitiendo conexiones RDP a laptop Mr.Pako" 
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 3389 -s IP ORIGEN -j DNAT --to IP DESTINO:3389
iptables -t nat -A PREROUTING -i eth0 -m mac --mac 00:00:00:00:00:00 -p tcp --dport 3389 -j DNAT --to IP DESTINO:3389
iptables -A FORWARD -i eth0 -s IP ORIGEN -o eth2 -d IP DESTINO -p tcp --dport 3389 -j ACCEPT 
iptables -A FORWARD -i eth0 -m mac --mac 00:00:00:00:00:00 -p tcp --dport 3389 -j ACCEPT
echo -ne " -> [ OK ]\n "

# Reglas para permitir al equipo 51 y 57 salir por el puerto 3390 y 3391 por rdp.
echo -ne "[.] Activando reglas FORWARD para conexión RDP"
iptables -A FORWARD -i eth2 -s IP ORIGEN.51 -p tcp --dport 3390:3391 -o eth0 -d IP DESTINO -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN.57 -p tcp --dport 3390:3391 -o eth0 -d IP DESTINO -j ACCEPT
echo -ne " -> [ OK ]\n "

# Regla para navegación web.
echo -ne "[.] Activando reglas FORWARD para www y https"
iptables -A FORWARD -i eth0 -o eth2 -m state --state ESTABLISHED,RELATED -j ACCEPT 
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 80 -m state --state NEW -o eth0 -j ULOG --ulog-prefix="WEB: -->"
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 80 -m state --state NEW -o eth0 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 443 -m state --state NEW -o eth0 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p udp --dport 443 -m state --state NEW -o eth0 -j ACCEPT
echo -ne " -> [ OK ]\n "

# Regla para permitir el pop3.
echo -ne "[.] Activando reglas FORWARD para pop3"
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 110 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p udp --dport 110 -o eth0 -j ACCEPT
echo -ne " -> [ OK ]\n "

# Regla para permitir el smtp.
echo -ne "[.] Activando reglas FORWARD para smtp"
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 25 -o eth0 -j ACCEPT
echo -ne " -> [ OK ]\n "

# Reglas para la VOIP.
echo -ne "[.] Activando reglas FORWARD para la VozIP"
iptables -A FORWARD -i eth0 -s IP ORIGEN/24 -p tcp --dport 5060:5081 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -s IP ORIGEN/24 -p udp --dport 5060:5081 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -s IP ORIGEN/24 -p tcp --dport 6060:6061 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -s IP ORIGEN/24 -p udp --dport 6060:6061 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -s IP ORIGEN/24 -p tcp --dport 34567 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -s IP ORIGEN/24 -p udp --dport 34567 -o eth0 -j ACCEPT
echo -ne " -> [ OK ]\n "

# Reglas para acceder por CITRIX a los servidores de UMBRELLA CORPORATION.
echo -ne "[.] Activando reglas FORWARD para conectar por CITRIX a UMBRELLA CORPORATION"
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 1494 -o eth0 -d IP DESTINO.230 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 1494 -o eth0 -d IP DESTINO.234 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 1494 -o eth0 -d IP DESTINO.235 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p udp --dport 1604 -o eth0 -d IP DESTINO.230 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p udp --dport 1604 -o eth0 -d IP DESTINO.234 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p udp --dport 1604 -o eth0 -d IP DESTINO.235 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 2598 -o eth0 -d IP DESTINO.230 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 2598 -o eth0 -d IP DESTINO.234 -j ACCEPT
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 2598 -o eth0 -d IP DESTINO.235 -j ACCEPT
echo -ne " ->[ OK ]\n "

# Regla para permitir FTP a los servidores.
echo -ne "[.] Activando reglas FORWARD para ftp a la IP de eth2"
iptables -A FORWARD -i eth2 -s IP ORIGEN/24 -p tcp --dport 20:21 -o eth0 -d IP DESTINO -j ACCEPT
echo -ne " -> [ OK ]\n "

iptables -A FORWARD -i eth2 -o eth0 -s 192.168.0.0/24 -m state --state ESTABLISHED,RELATED -j ACCEPT }
Lines=0
cat $BLACKLIST | while read line;
do {
 echo -ne "[.]Denegando acceso a $line"
 iptables -A FORWARD -d $line -p tcp --dport 80-j DROP
 echo -ne "-> [ OK ]\n"
 ((Lines++))
   }
done


case "$1" in
 start)
 start
 ;;
 
 stop)
 stop
 ;;
 
 restart)
 stop
 start;;
 *)
 echo -ne " Uso: $0 {start | stop | restart } \n"

esac
exit

============== FIN SCRIPT ==================

Las prisas son malas compañeras y durante la redacción de este post, el becario en lugar de guardar le dió a publicar 🙂 , esperamos que este post (algo distinto de lo habitual) os sirva para tener una idea de lo que se puede hacer. Más adelante, veremos como testear las distintas reglas y algún truco más.

Guía Hardening – Gestion de usuarios y grupos

Una de los aspectos más críticos como administrador de sistemas puede ser la gestión de usuarios, y esto depende en muchas ocasiones más por el número de usuarios a gestionar que por su complejidad “técnica”. En un principio en toda instalación se crea habitualmente el usuario Root y un usuario sin privilegios, hasta aquí todo bien, es más se crean automáticamente los grupos de sistema y sus privilegios, por lo que generalmente no solemos encontrar ningún problema con la gestión de usuarios, pero todo esto se convierte en auténticos quebraderos de cabeza cuando el número aumenta e incluso te ves limitado por un $Hyperboss como lo llamaría el maestro wardog.
Como he dicho técnicamente la gestión es sencilla y para el que no tenga mucha idea daré unos ejemplos sencillos a continuación.

Creación de usuarios

# adduser nombre de usuario

Modificación de usuarios

# usermod nombre de usuario

Eliminación de usuarios

# deluser nombre de usuario

Cambiar contraseña

# passwd nombre de usuario

Bloquear o desbloquear una cuenta de usuario

# passwd -l nombre de usuario
# passwd -u nombre de usuario

Bloquear cuantas inactivas pasados 30 dias

# useradd -D -f 30

Creación de grupos

# addgroup nombre de grupo

Modificación de grupos

# groupmod nombre de grupo

Eliminación de grupos

# groupdel nombre del grupo

Añadir usuarios a un grupo

# adduser nombre de usuario nombre de grupo

Quitar usuarios de un grupo

# deluser nombre de usuario nombre de grupo

Para todos los ejemplos y comandos citados arriba recomiendo echar un vistazo a su ayuda para ampliar su uso según necesidades, que pueden ser muy variadas y cambiar muchos aspectos de cada usuario, podemos cambiar el home, o la shell con la que interactúa el usuario entre otras muchas opciones.

PERMISOS

Este apartado es algo que debemos tener muy claro y DOCUMENTADO, es muy importante, y según el número de usuarios y grupos con los que trabajemos, las necesidades de cada usuario a la hora de acceder o editar ciertos ficheros, o la entrada y salida de trabajadores, se puede convertir en un aspecto muy variable y siempre se puede topar esta necesidad, con la seguridad, caballo de batalla en el mundo empresarial, que hoy en día todavía cuesta de explicar y hacer entender a ciertas personas.
Cada usuario y grupo de usuarios tiene que tener una política muy clara y concisa sobre sus permisos, esto lo debemos tener muy documentado y actualizado, y es que aquí nos jugamos mucho, no solo por mantener una seguridad externa, si no como en muchas casos a ocurrido, el acceso sin control a cierta documentación o archivos por trabajadores descontentos (con motivo o sin el), pueden acabar en manos de la competencia o en el peor de los casos en manos  de alguien que puede conseguir acceso a nuestros sistemas.
Y aquí es cuando entra en juego CHMOD, necesario para cambiar estos permisos, llegados a este punto todos deberíamos conocer como funciona,  pero si todavía queda algún despistado, aquí una ayuda sobre el comando.
Si ya tenemos unas políticas de usuarios definidas y los permisos de usuarios y grupos al día podemos pasar a verificar posibles vectores de seguridad.

Verificar Permisos y propietarios en /etc/passwd.

Verificamos
# ls -l /etc/passwd
 -rw-r--r-- 1 root root 1658 OCT 13 10:50 /etc/passwd
Cambiamos permiso si es necesario
# chmod 644 /etc/passwd
Cambiamos propietario si no es correcto
# chown root:root /etc/passwd

Verificar Permisos  y propietarios /etc/shadow.

# ls -l /etc/shadow
 -rw-r----- 1 root shadow 1061 oct 13 10:50 /etc/shadow
Cambiamos si es necesario
# chmod 640 /etc/shadow
Cambiamos propietario si no es correcto
# chown root:shadow /etc/shadow

Verificar Permisos  y propietarios /etc/group.

# ls -l /etc/group
 -rw-r--r-- 1 root root 885 oct 13 10:50 /etc/group
Cambiamos si es necesario
# chmod 644 /etc/group
Cambiamos propietario si no es correcto
# chown root:root /etc/group

También podemos hacer estas comprobaciones en archivos y carpetas de usuarios.

CONTRASEÑAS

En la primer capítulo de esta guía de hardenig  ya hablamos de la importancia de ella y dimos algunos enlaces para crear nuestras contraseñas, en este punto de la gestión de usuarios y grupos,  debemos tratar con el mismo o mayor cuidado este aspecto, y adaptarnos si así nos lo imponen, ya sabemos que cuanto más complejas sean estas mucho mejor, pero se puede dar el caso de que nos exijan que no superen lo 6 u 8 caracteres y que solo contengan números y letras, si, ya se, pero la vida es así y es lo que toca en muchas ocasiones.
Por otro lado debemos documentar y guardar esta contraseñas, podemos utilizar cualquier plataforma, aplicación o sistema que más nos guste, pero con un mino de seguridad, deben de estar cifradas, protegidas, siempre accesibles y una copia de seguridad de ellas por cualquier imprevisto, a partir de aquí vale todo (excel, keepass, lastpass, 1password, etc, etc…) yo no soy el que te dirá cual es mejor o peor, o cual utilizar.

Otro parte de la gestión, al igual que con usuarios y grupos, es la verificación de las contraseñas y aplicar una política concreta sobre ellas, aquí unos ejemplos.

Asegurar que los campos de contraseña no estén vacíos

Comprobamos si hay algun usuario sin contraseña
# cat /etc/shadow | /usr/bin/awk -F: '($2 == "" ) { print $1 " does not have a password "}'
Bloqueamos usuario hasta comprobar la causa y eliminamos si es necesario
# passwd -l nombre de usuario
# deluser nombre de usuario

 

Establecer días de caducidad de contraseña

Comprobamos
# grep PASS_MAX_DAYS /etc/login.defs 
 PASS_MAX_DAYS 60
# chage --list usuario
 Maximum number of days between password change:    60
Cambiamos si es necesario
# vim /etc/login.defs
PASS_MAX_DAYS 30
# chage --maxdays 30 usuario

Configurar el cambio de contraseña Número mínimo de días

Comprobamos
# grep PASS_MIN_DAYS /etc/login.defs 
 PASS_MIN_DAYS 14
# chage --list usuario
 Minimun number of days between password change:    14
Cambiamos si es necesario
# vim /etc/login.defs
PASS_MIN_DAYS 7
# chage --mindays 7 usuario

Definir días de advertencia de caducidad de la contraseña

# grep PASS_WARN_DAYS /etc/login.defs 
 PASS_MIN_DAYS 14
# chage --list usuario
 Number of days of warning before password expires:    14
Cambiamos si es necesario
# vim /etc/login.defs
PASS_WARN_AGE 7
# chage --warndays 7 usuario


Como hemos visto hoy tener unas políticas, tanto de usuario y grupos como de contraseñas, es una parte muy importante, ya sea en un entorno particular o empresarial, y si a esto le unimos la comprobación y actualización periódica de estas políticas, tendremos un sistema mucho más seguro.

Como regalo dejo aquí un tuit del gran Daboblog, que encontré entre mis notas mientras repasaba para escribir esta entrada, espero que también os sirva de ayuda.

¡¡Hasta la próxima parte de la guía, saludos!!