migración

This commit is contained in:
Roberto Rodríguez 2024-10-24 00:51:46 +02:00
parent 5eeaafb407
commit d0bf63166b
8 changed files with 1355 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

View File

@ -0,0 +1,388 @@
---
title: Redes Privadas Virtuales con WireGuard
published: 2023-01-26
image: "./featured.png"
tags: ["VPN", "WireGuard"]
category: Documentación
draft: false
---
## Caso C: VPN de acceso remoto con WireGuard
Monta una VPN de acceso remoto usando Wireguard. Intenta probarla con clientes Windows, Linux y Android. Documenta el proceso adecuadamente y compáralo con el del apartado A.
El Escenario es el siguiente:
![escenario1](https://i.imgur.com/vob221j.png)
Vamos a utilizar un VagrantFile igual al utilizado en el caso A para montar la infraestructura necesaria para la práctica:
```ruby
Vagrant.configure("2") do |config|
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.define :cliente3 do |cliente3|
cliente3.vm.box = "debian/bullseye64"
cliente3.vm.hostname = "cliente3"
cliente3.vm.network :private_network,
:libvirt__network_name => "red-externa3",
:libvirt__dhcp_enabled => false,
:ip => "192.168.0.20",
:libvirt__netmask => '255.255.255.0',
:libvirt__forward_mode => "veryisolated"
end
config.vm.define :servidor3 do |servidor3|
servidor3.vm.box = "debian/bullseye64"
servidor3.vm.hostname = "servidor3"
servidor3.vm.network :private_network,
:libvirt__network_name => "red-externa3",
:libvirt__dhcp_enabled => false,
:ip => "192.168.0.10",
:libvirt__netmask => '255.255.255.0',
:libvirt__forward_mode => "veryisolated"
servidor3.vm.network :private_network,
:libvirt__network_name => "red-interna3",
:libvirt__dhcp_enabled => false,
:ip => "192.168.1.10",
:libvirt__netmask => '255.255.255.0',
:libvirt__forward_mode => "veryisolated"
end
config.vm.define :maquina3 do |maquina3|
maquina3.vm.box = "debian/bullseye64"
maquina3.vm.hostname = "maquina3"
maquina3.vm.network :private_network,
:libvirt__network_name => "red-interna3",
:libvirt__dhcp_enabled => false,
:ip => "192.168.1.30",
:libvirt__netmask => '255.255.255.0',
:libvirt__forward_mode => "veryisolated"
end
end
```
Ahora vamos a configurar las máquinas:
### Servidor
Instalamos wireguard:
```bash
sudo apt update
sudo apt install wireguard
```
Activamos el bit de forwarding en el servidor editando el fichero `/etc/sysctl.conf` y descomentando la siguiente línea:
```bash
net.ipv4.ip_forward=1
```
y hacemos los cambios efectivos:
```bash
sudo sysctl -p
```
Ahora vamos a generar los pares de claves para el servidor (como usuario root):
```bash
wg genkey | tee /etc/wireguard/server_private.key | wg pubkey | tee /etc/wireguard/server_public.key
```
Ahora vamos a crear el fichero de configuración del servidor en `/etc/wireguard/wg0.conf`, utilizando las claves que hemos generado en el paso anterior:
```bash
[Interface]
Address = 10.99.99.1/24
ListenPort = 51820
PrivateKey = aB9gyJdOH835WVK4bqbb2VqrGeW5wFuOIyHFx7suu1w=
```
Al tratarse de fichero sensibles, tienen que tener permisos de solo lectura, por lo que vamos a cambiar los permisos:
```bash
sudo chmod -R 600 /etc/wireguard/
```
Creamos la interfaz:
```bash
sudo wg-quick up /etc/wireguard/wg0.conf
```
![wgup](https://i.imgur.com/4avm7tC.png)
### Cliente
Instalamos wireguard:
```bash
sudo apt update
sudo apt install wireguard
```
Ahora vamos a generar los pares de claves para el cliente (como usuario root):
```bash
wg genkey | tee /etc/wireguard/client_private.key | wg pubkey | tee /etc/wireguard/client_public.key
```
hora vamos a crear el fichero de configuración del cliente en `/etc/wireguard/wg0.conf`, utilizando la clave privada generada en el paso anterior y la clave pública del servidor:
```bash
[Interface]
Address = 10.99.99.2/24
PrivateKey = 8DFSQc0qbT3P9Dhnbg44bxU+W2uRraXsebB+suQH+nQ=
[Peer]
PublicKey = voKHGdJUz8B6Q6jRYJspzhSWDLmXI4jroPc89VkMCHQ=
AllowedIPs = 0.0.0.0/0
Endpoint = 192.168.0.10:51820
PersistentKeepalive = 25
```
Al tratarse de fichero sensibles, tienen que tener permisos de solo lectura, por lo que vamos a cambiar los permisos:
```bash
sudo chmod -R 600 /etc/wireguard/
```
Creamos la interfaz:
```bash
sudo wg-quick up /etc/wireguard/wg0.conf
```
![wgup2](https://i.imgur.com/hsQTSjy.png)
Una vez hecho esto, tenemos que añadir la clave pública del cliente al fichero de configuración del **servidor**, añadiendo las siguentes líneas:
```bash
[Peer]
PublicKey = eh7Ap8nkBQf5vL60sp2ORzqLtz2YWnbjABbTMrukaCo=
AllowedIPs = 10.99.99.2/32
```
y reiniciamos la interfaz:
```bash
sudo wg-quick down /etc/wireguard/wg0.conf
sudo wg-quick up /etc/wireguard/wg0.conf
```
Podemos ver el estado de la interfez con el comando `wg`:
![wg](https://i.imgur.com/GIJCLAo.png)
### Rutas
Para que los mensajes que se envíen desde la máquina cliente a la máquina servidor, pasen por el túnel VPN, tenemos que cambiar la ruta por defecto para que sea a través del servidor:
```bash
sudo ip route del default
sudo ip route add default via 10.99.99.1
```
Tenemos que cambiar la ruta por defecto también de la máquina interna para que sea a través del servidor:
```bash
sudo ip route del default
sudo ip route add default via 192.168.1.10
```
### Comprobación
Para comprobar que funciona, vamos a hacer un `traceroute` desde la máquina cliente a la máquina servidor:
![traceroute1](https://i.imgur.com/RxFLZJh.png)
## Caso D: VPN sitio a sitio con WireGuard
Configura una VPN sitio a sitio usando WireGuard. Documenta el proceso adecuadamente y compáralo con el del apartado B.
El Escenario es el siguiente:
![escenario2](https://i.imgur.com/VGD6hgl.png)
El escenario es similar al del caso B por lo que utilizaremos el mismo vagrantfile:
```ruby
Vagrant.configure("2") do |config|
config.vm.synced_folder ".", "/vagrant", disabled: true
config.vm.define :maquina1 do |maquina1|
maquina1.vm.box = "debian/bullseye64"
maquina1.vm.hostname = "maquina1"
maquina1.vm.network :private_network,
:libvirt__network_name => "interna1",
:libvirt__dhcp_enabled => false,
:ip => "192.168.0.20",
:libvirt__netmask => '255.255.255.0',
:libvirt__forward_mode => "veryisolated"
end
config.vm.define :cliente do |cliente|
cliente.vm.box = "debian/bullseye64"
cliente.vm.hostname = "cliente"
cliente.vm.network :private_network,
:libvirt__network_name => "interna1",
:libvirt__dhcp_enabled => false,
:ip => "192.168.0.10",
:libvirt__netmask => '255.255.255.0',
:libvirt__forward_mode => "veryisolated"
cliente.vm.network :private_network,
:libvirt__network_name => "internet",
:libvirt__dhcp_enabled => false,
:ip => "10.20.30.1",
:libvirt__netmask => '255.255.255.0',
:libvirt__forward_mode => "veryisolated"
end
config.vm.define :servidor do |servidor|
servidor.vm.box = "debian/bullseye64"
servidor.vm.hostname = "servidor"
servidor.vm.network :private_network,
:libvirt__network_name => "internet",
:libvirt__dhcp_enabled => false,
:ip => "10.20.30.2",
:libvirt__netmask => '255.255.255.0',
:libvirt__forward_mode => "veryisolated"
servidor.vm.network :private_network,
:libvirt__network_name => "interna2",
:libvirt__dhcp_enabled => false,
:ip => "172.22.0.10",
:libvirt__netmask => '255.255.0.0',
:libvirt__forward_mode => "veryisolated"
end
config.vm.define :maquina2 do |maquina2|
maquina2.vm.box = "debian/bullseye64"
maquina2.vm.hostname = "maquina2"
maquina2.vm.network :private_network,
:libvirt__network_name => "interna2",
:libvirt__dhcp_enabled => false,
:ip => "172.22.0.20",
:libvirt__netmask => '255.255.0.0',
:libvirt__forward_mode => "veryisolated"
end
end
```
Ahora vamos a configurar las máquinas:
### Servidor
La configuración es similar a la del caso B, con la diferencia de que el fichero de configuración en `/etc/wireguard/wg0.conf` es el siguiente:
Las claves son:
* privada: `0N0kdHNHajtKY78rAGaI5uHzY8QGvZMCuiyw3WXU0n0=`
* pública: `SC7FuKTw2GnjJmJDmP0GuZGzgr9CBHUbcBOAXKKrCSU=`
```bash
[Interface]
Address = 10.99.99.1
ListenPort = 51820
PrivateKey = 0N0kdHNHajtKY78rAGaI5uHzY8QGvZMCuiyw3WXU0n0=
```
Creamos la interfaz con el siguiente comando:
```bash
sudo wg-quick up wg0
```
### Cliente
La configuración es similar a la del caso B, con la diferencia de que el fichero de configuración en `/etc/wireguard/wg0.conf` es el siguiente:
Las claves son:
* privada: `OLKDIsseCywbzWOwME1gxzIZLhopGljCeyYgibrHwm0=`
* pública: `jwqTMNZ4lQkVk2OLrlMGZGDCkkCLJFmcUjlF7aPvrWc=`
```bash
[Interface]
Address = 10.99.99.2
PrivateKey = OLKDIsseCywbzWOwME1gxzIZLhopGljCeyYgibrHwm0=
ListenPort = 51820
[Peer]
PublicKey = SC7FuKTw2GnjJmJDmP0GuZGzgr9CBHUbcBOAXKKrCSU=
AllowedIPs = 0.0.0.0/0
Endpoint = 10.20.30.2:51820
```
Creamos la interfaz con el siguiente comando:
```bash
sudo wg-quick up wg0
```
Activamos el bit de forwarding en el servidor editando el fichero `/etc/sysctl.conf` y descomentando la siguiente línea:
```bash
net.ipv4.ip_forward=1
```
y hacemos los cambios efectivos:
```bash
sudo sysctl -p
```
Ahora, como tenemos la clave pública del otro servidor, modificamos el fichero `/etc/wireguard/wg0.conf` del servidor para añadir la siguiente sección:
```bash
[Peer]
Publickey = jwqTMNZ4lQkVk2OLrlMGZGDCkkCLJFmcUjlF7aPvrWc=
AllowedIPs = 0.0.0.0/0
PersistentKeepAlive = 25
Endpoint = 10.20.30.1:51820
```
y reiniciamos el servicio:
```bash
sudo wg-quick down wg0
sudo wg-quick up wg0
```
### Máquinas
Ahora vamos a configurar las rutas en las maquinas internas:
Máquina1:
```bash
sudo ip route del default
sudo ip route add default via 192.168.0.10
```
Máquina2:
```bash
sudo ip route del default
sudo ip route add default via 172.22.0.10
```
### Prueba de funcionamiento
traceroute desde maquina1 a maquina2:
![traceroute2](https://i.imgur.com/0HeraM7.png)
traceroute desde maquina2 a maquina1:
![traceroute3](https://i.imgur.com/4WHGAH0.png)
## Conclusión
Utilizando WireGuard la configuración es más sencilla de realizar y tiene menos ficheros, por lo que es más fácil de gestionar y de depurar errores. Aparte de esto, el funcionamiento es el mismo que el de OpenVPN.

Binary file not shown.

After

Width:  |  Height:  |  Size: 516 KiB

View File

@ -0,0 +1,162 @@
---
title: Integridad, firmas y autenticación
published: 2023-01-30
image: "./featured.png"
tags: ["Criptografía", "gnupg"]
category: Documentación
draft: false
---
## Tarea 1: Firmas electrónicas
1. **Manda un documento y la firma electrónica del mismo a un compañero. Verifica la firma que tu has recibido.**
```bash
echo "DOCUMENTO CIFRADO SECRETO" > documento_rober.txt\n
gpg --output firmarober.sig --detach-sig documento_rober.txt
```
Envío los ficheros por correo.
2. **¿Qué significa el mensaje que aparece en el momento de verificar la firma?**
![Firma](https://i.imgur.com/dOFJJTl.png)
Significa que, aunque el fichero está firmado por esa firma, no se puede asegurar que la firma pertenezca a la persona que dice ser.
3. **Vamos a crear un anillo de confianza entre los miembros de nuestra clase, para ello.**
* Tu clave pública debe estar en un servidor de claves
* Escribe tu fingerprint en un papel y dárselo a tu compañero, para que puede descargarse tu clave pública.
* Te debes bajar al menos tres claves públicas de compañeros. Firma estas claves.
* Tu te debes asegurar que tu clave pública es firmada por al menos tres compañeros de la clase.
* Una vez que firmes una clave se la tendrás que devolver a su dueño, para que otra persona se la firme.
* Cuando tengas las tres firmas sube la clave al servidor de claves y rellena tus datos en la tabla Claves públicas PGP 2020-2021
* Asegurate que te vuelves a bajar las claves públicas de tus compañeros que tengan las tres firmas.
4. **Muestra las firmas que tiene tu clave pública.**
Listamos las firmas con el comando `gpg --list-sigs`
![Firmas](https://i.imgur.com/LnWbJLH.png)
5. **Comprueba que ya puedes verificar sin “problemas” una firma recibida por una persona en la que confías.**
Como se puede ver en la imagen anterior, nuestra firma está verificada por **Antonio**, y viceversa. Por lo que podemos verificar sin problemas un documento firmado por **Antonio**.
![Verificación](https://i.imgur.com/LnLceFT.png)
6. **Comprueba que puedes verificar con confianza una firma de una persona en las que no confías, pero sin embargo si confía otra persona en la que tu tienes confianza total.**
Ahora, vamos a utilizar un fichero firmado por **María Jesús**, en la que no confiamos directamente, pero en la que sí tiene confianza plena **Antonio**:
![Verificación 2](https://i.imgur.com/dzHItTJ.png)
## Tarea 3: Integridad de ficheros
Para validar el contenido de la imagen CD, solo asegúrese de usar la herramienta apropiada para sumas de verificación. Para cada versión publicada existen archivos de suma de comprobación con algoritmos fuertes (SHA256 y SHA512); debería usar las herramientas sha256sum o sha512sum para trabajar con ellos.
1. **Verifica que el contenido del hash que has utilizado no ha sido manipulado, usando la firma digital que encontrarás en el repositorio. Puedes encontrar una guía para realizarlo en este artículo: How to verify an authenticity of downloaded Debian ISO images**
```bash
wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-11.6.0-amd64-netinst.iso
wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/SHA256SUMS
sha256sum -c SHA256SUMS 2> /dev/null | grep netinst
```
![Verificación de hash](https://i.imgur.com/aAHo0GB.png)
## Tarea 4: Integridad y autenticidad
Busca información sobre **apt secure** y responde las siguientes preguntas:
1. **¿Qué software utiliza apt secure para realizar la criptografía asimétrica?**
Utiliza **GnuPG** para realizar la criptografía asimétrica.
2. **¿Para que sirve el comando apt-key? ¿Qué muestra el comando apt-key list?**
El comando `apt-key` sirve para administrar las claves de los repositorios de paquetes. El comando `apt-key list` muestra las claves de los repositorios de paquetes.
3. **En que fichero se guarda el anillo de claves que guarda la herramienta apt-key?**
El anillo de claves se guarda en el fichero `/etc/apt/trusted.gpg`.
4. **¿Qué contiene el archivo Release de un repositorio de paquetes?. ¿Y el archivo Release.gpg?. Puedes ver estos archivos en el repositorio http://ftp.debian.org/debian/dists/Debian10.1/. Estos archivos se descargan cuando hacemos un apt update.**
El archivo `Release` contiene la lista de paquetes que contiene el repositorio de paquetes. El archivo `Release.gpg` contiene la firma digital del archivo `Release`.
5. **Explica el proceso por el cual el sistema nos asegura que los ficheros que estamos descargando son legítimos.**
El sistema nos asegura que los ficheros que estamos descargando son legítimos mediante la verificación de la firma digital del fichero `Release` que se encuentra en el repositorio de paquetes.
6. **añade de forma correcta el repositorio de virtualbox añadiendo la clave pública de virtualbox como se indica en la documentación.**
Se hace con los siguientes comandos:
```bash
echo "deb https://download.virtualbox.org/virtualbox/debian buster contrib" >> /etc/apt/sources.list
wget -q https://www.virtualbox.org/download/oracle\_vbox\_2016.asc -O- | apt-key add -
wget -q https://www.virtualbox.org/download/oracle\_vbox.asc -O- | apt-key add -
```
Tras esto, se puede instalar virtualbox con el comando `apt install virtualbox`.
## Tarea 5: Autentificación: ejemplo SSH
1. **Explica los pasos que se producen entre el cliente y el servidor para que el protocolo cifre la información que se transmite? ¿Para qué se utiliza la criptografía simétrica? ¿Y la asimétrica?**
Los pasos que se producen entre el cliente y el servidor para que el protocolo cifre la información que se transmite son los siguientes:
* Se lleva a cabo un 'handshake' (apretón de manos) encriptado para que el cliente pueda verificar que se está comunicando con el servidor correcto
* La capa de transporte de la conexión entre el cliente y la máquina remota es encriptada mediante un código simétrico
* El cliente se autentica ante el servidor.
* El cliente remoto interactua con la máquina remota sobre la conexión encriptada.
La criptografía simétrica se utiliza para encriptar la información que se transmite entre el cliente y el servidor. La criptografía asimétrica se utiliza para autentificar al cliente y al servidor.
2. **Explica los dos métodos principales de autentificación: por contraseña y utilizando un par de claves públicas y privadas.**
Los dos métodos principales de autentificación son:
* Por contraseña: el cliente envía la contraseña al servidor para que este pueda autentificar al cliente.
* Por par de claves públicas y privadas: el cliente envía su clave pública al servidor para que este pueda autentificar al cliente. El cliente envía su clave privada al servidor para que este pueda autentificar al cliente.
3. **En el cliente para que sirve el contenido que se guarda en el fichero ~/.ssh/know_hosts?**
El contenido que se guarda en el fichero ~/.ssh/know_hosts sirve para que el cliente pueda autentificar al servidor.
4. **¿Qué significa este mensaje que aparece la primera vez que nos conectamos a un servidor?**
```bash
$ ssh debian@172.22.200.74
The authenticity of host '172.22.200.74 (172.22.200.74)' can't be established.
ECDSA key fingerprint is SHA256:7ZoNZPCbQTnDso1meVSNoKszn38ZwUI4i6saebbfL4M.
Are you sure you want to continue connecting (yes/no)?
```
Implica que la conexión es nueva y que el cliente no tiene guardada la clave pública del servidor. Por lo tanto, el cliente no puede autentificar al servidor. El cliente pregunta al usuario si quiere continuar con la conexión.
5. **En ocasiones cuando estamos trabajando en el cloud, y reutilizamos una ip flotante nos aparece este mensaje:**
```bash
$ ssh debian@172.22.200.74
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:W05RrybmcnJxD3fbwJOgSNNWATkVftsQl7EzfeKJgNc.
Please contact your system administrator.
Add correct host key in /home/jose/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/jose/.ssh/known_hosts:103
remove with:
ssh-keygen -f "/home/jose/.ssh/known_hosts" -R "172.22.200.74"
ECDSA host key for 172.22.200.74 has changed and you have requested strict checking.
```
Significa que la clave pública que teníamos asociada a esa dirección IP ha cambiado. Por lo tanto, el cliente no puede autentificar al servidor. Por lo que podría implicar que se está suplantando su identidad. Si aún así queremos continuar, hay que ejecutar el comando `ssh-keygen -f "/home/jose/.ssh/known_hosts" -R "172.22.200.74"`
6. **¿Qué guardamos y para qué sirve el fichero en el servidor ~/.ssh/authorized_keys?**
En ese fichero se guardan las claves públicas de los clientes que pueden acceder al servidor. Sirve para que el servidor pueda autentificar a los clientes.

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

View File

@ -0,0 +1,493 @@
---
title: "Práctica: Servidor de correos"
published: 2023-02-07
image: "./featured.png"
tags: ["correo", "autoalojado","vps"]
category: Documentación
draft: false
---
## Gestión de correo desde el servidor
### Tarea 1
Documenta una prueba de funcionamiento, donde envíes desde tu servidor local al exterior. Muestra el log donde se vea el envío. Muestra el correo que has recibido. Muestra el registro SPF.
Creo las siguientes entradas en el DNS de mi dominio:
![MX](https://i.imgur.com/izykpPC.png)
Donde hay un registro MX que apunta a mail.admichin.es, que a su vez es un registro A que apunta a la IP de mi servidor. Además, hay un registro SPF que apunta a la ip de la máquina.
Además, configuro resolución inversa en la configuración de la VPS:
![Reverse](https://i.imgur.com/Q8x5DC1.png)
Ahora, en la VPS instalo los siguientes paquetes:
```bash
apt update
apt install postfix bsd-mailx -y
```
Durante la configuración, selecciono **Internet Site** y **admichin.es**.
Envío un correo a mi cuenta personal:
```bash
mail robertorodriguezmarquez98@gmail.com
Subject: Prueba de funcionamiento
Hola buenos días
Cc:
```
Vemos el log de postfix:
```bash
tail /var/log/mail.log
```
![Log](https://i.imgur.com/lii209w.png)
Y el correo recibido:
![Correo](https://i.imgur.com/FWNO7aB.png)
### Tarea 2
Documenta una prueba de funcionamiento, donde envíes un correo desde el exterior (gmail, hotmail,…) a tu servidor local. Muestra el log donde se vea el envío. Muestra cómo has leído el correo. Muestra el registro MX de tu dominio.
Ahora envío un correo desde mi cuenta personal a mi servidor:
![Correo](https://i.imgur.com/FWNO7aB.png)
Y compruebo que el correo ha llegado a mi servidor:
![Correo](https://i.imgur.com/JWSTUmj.png)
![Correo](https://i.imgur.com/D0xKQDi.png)
Y el log de postfix:
![Log](https://i.imgur.com/pAWEPrP.png)
## Uso de alias y redirecciones
### Tarea 3
**Usos de alias y redirecciones**. Vamos a comprobar como los procesos del servidor pueden mandar correos para informar sobre su estado. Por ejemplo cada vez que se ejecuta una tarea cron podemos enviar un correo informando del resultado. Normalmente estos correos se mandan al usuario `root` del servidor, para ello:
```bash
crontab -e
```
E indico donde se envía el correo:
```bash
MAILTO=root
```
Puedes poner alguna tarea en el cron para ver como se mandan correo.
Posteriormente usando alias y redirecciones podemos hacer llegar esos correos a nuestro correo personal.
Configura el cron para enviar correo al usuario root. Comprueba que están llegando esos correos al root. Crea un nuevo alias para que se manden a un usuario sin privilegios. Comprueban que llegan a ese usuario. Por último crea una redirección para enviar esos correo a tu correo personal (gmail,hotmail,…).
Voy a crear un script que muestre la fecha y el espacio en el disco. Lo guardo en `/root/script-espacio.sh`:
```bash
#!/bin/bash
echo "##################################"
echo "Fecha y hora: $(date)"
echo "##################################"
echo "Espacio en el disco:"
df -h
```
Ahora creamos la tarea de cron para que se ejecute cada 5 minutos:
```bash
crontab -e
```
Y añadimos las siguientes líneas:
```bash
MAILTO = root
*/5 * * * * /root/script-espacio.sh
```
Cuando pasan 5 minutos, recibimos el correo:
![Correo](https://i.imgur.com/XVtl86N.png)
Ahora voy a crear un alias para que se envíen los correos a un usuario sin privilegios (en este caso, calcetines), editando el fichero `/etc/aliases`:
```bash
root: calcetines
```
Y ejecuto el comando `newaliases` para que se actualicen los alias.
Ahora, cuando pasen 5 minutos, recibimos el correo en el usuario sin privilegios:
![Correo](https://i.imgur.com/aogu98o.png)
Ahora voy a crear una redirección para que se envíen los correos a mi correo personal, editando el fichero `/home/calcetines/.forward`:
```bash
robertorodriguezmarquez98@gmail.com
```
Y ahora, cuando pasen 5 minutos, recibimos el correo en mi correo personal:
![Correo](https://i.imgur.com/UdaG5gg.png)
## Para asegurar el envío
### Tarea 4
Configura de manera adecuada DKIM es tu sistema de correos. Comprueba el registro DKIM en la página https://mxtoolbox.com/dkim.aspx. Configura postfix para que firme los correos que envía. Manda un correo y comprueba la verificación de las firmas en ellos.
}
Voy a instalar el paquete `opendkim`:
```bash
apt install opendkim opendkim-tools -y
```
En el fichero `/etc/opendkim.conf`, edito las siguientes líneas:
```bash
Domain admichin.es
Selector default
KeyFile /etc/opendkim/keys/admichin.es/default.private
#Socket local:/run/opendkim/opendkim.sock
Socket local:/var/spool/postfix/opendkim/opendkim.sock
PidFile /run/opendkim/opendkim.pid
TrustAnchorFile /usr/share/dns/root.key
```
Ahora añado el socket en el fichero `/etc/default/opendkim`.
Tras eso, en el fichero `/etc/postfix/main.cf`, añado las siguientes líneas:
```bash
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
```
Ahora genero los ficheros de claves:
```bash
mkdir /etc/opendkim/keys/admichin.es
cd /etc/opendkim/keys/admichin.es
opendkim-genkey -b 2048 -d admichin.es -D /etc/opendkim/keys/admichin.es -s default -v
```
Ahora, utilizando el contenido de `/etc/opendkim/keys/admichin.es/default.txt`, añado un registro TXT en el dominio `admichin.es`:
![Registro](https://i.imgur.com/rWLIaWm.png)
Reinicio los servicios:
```bash
systemctl restart opendkim postfix
```
Ahora, cuando envío un correo, se añade la firma DKIM:
![Correo](https://i.imgur.com/SjhdRvn.png)
Finalmente, compruebo la verificación de la firma en la página **mxtoolbox**:
![Verificación](https://i.imgur.com/leht5mi.png)
## Para luchar contra el spam
## Gestión de correos desde un cliente
### Tarea 8
Configura el buzón de los usuarios de tipo Maildir. Envía un correo a tu usuario y comprueba que el correo se ha guardado en el buzón Maildir del usuario del sistema correspondiente. Recuerda que ese tipo de buzón no se puede leer con la utilidad mail.
Voy a cambiar el tipo de buzón de los usuarios, editando el fichero `/etc/postfix/main.cf`:
```bash
home_mailbox = Maildir/
```
Ahora instalamos el cliente mutt para poder leer los correos:
```bash
apt install mutt -y
systemctl restart postfix
```
Tengo que hacer la siguiente configuración en cada usuario:
```bash
nano ~/.muttrc
```
```bash
set mbox_type=Maildir
set mbox="~/Maildir"
set folder="~/Maildir"
set spoolfile="~/Maildir"
set record="+.Sent"
set postponed="+.Drafts"
set mask="!^\\.[^.]"
```
Podemos ver el contenido del directorio `Maildir`:
![Directorio](https://i.imgur.com/xJmTIsK.png)
Ahora, cuando envío un correo, se guarda en el buzón Maildir del usuario del sistema correspondiente, y lo podemos leer con mutt:
![Correo](https://i.imgur.com/mCg6V9I.png)
### Tarea 9
Instala configura dovecot para ofrecer el protocolo IMAP. Configura dovecot de manera adecuada para ofrecer autentificación y cifrado.
Instalo dovecot:
```bash
apt install dovecot-imapd -y
```
Modifico el fichero `/etc/dovecot/conf.d/10-ssl.conf` para añadir el certificado que generamos con certbot al crear la página, modificando las siguientes líneas:
```bash
ssl_cert = </etc/letsencrypt/live/admichin.es-0001/fullchain.pem
ssl_key = </etc/letsencrypt/live/admichin.es-0001/privkey.pem
```
Ahora cambiamos la localización de los mailbox en el fichero `/etc/dovecot/conf.d/10-mail.conf`:
```bash
mail_location = maildir:~/Maildir
```
### Tarea 10
Instala un webmail (roundcube, horde, rainloop) para gestionar el correo del equipo mediante una interfaz web. Muestra la configuración necesaria y cómo eres capaz de leer los correos que recibe tu usuario.
Voy a instalar **roundcube** utilizando docker:
```bash
apt install docker.io -y
```
Creo una entrada de tipo CNAME con el nombre webmail:
![CNAME](https://i.imgur.com/dLpPCex.png)
Ahora vamos a crear la configuración en un directorio que montaremos posteriormente por medio de bind mount en el docker;
```bash
mkdir /root/cuboredondo
nano -cl /root/cuboredondo/custom.inc.php
```
```php
<?php
$config['mail_domain'] = array(
'mail.admichin.es' => 'admichin.es'
);
?>
```
Ahora creo el contenedor de docker:
```bash
docker run -d --name docker-cuboredondo \
-v /root/cuboredondo/:/var/roundcube/config/ \
-e ROUNDCUBEMAIL_DEFAULT_HOST=ssl://mail.admichin.es \
-e ROUNDCUBEMAIL_SMTP_SERVER=ssl://mail.admichin.es \
-e ROUNDCUBEMAIL_SMTP_PORT=465 \
-e ROUNDCUBEMAIL_DEFAULT_PORT=993 \
-p 8001:80 \
roundcube/roundcubemail
```
o en una sola linea:
```bash
docker run -d --name docker-cuboredondo -v /root/cuboredondo/:/var/roundcube/config/ -e ROUNDCUBEMAIL_DEFAULT_HOST=ssl://mail.admichin.es -e ROUNDCUBEMAIL_SMTP_SERVER=ssl://mail.admichin.es -e ROUNDCUBEMAIL_SMTP_PORT=465 -e ROUNDCUBEMAIL_DEFAULT_PORT=993 -p 8001:80 roundcube/roundcubemail
```
Ahora creo el virtualhost para el dominio en `/etc/nginx/sites-available/webmail.admichin.es`:
```bash
server {
listen 80;
listen [::]:80;
server_name webmail.admichin.es;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
ssl on;
ssl_certificate /etc/letsencrypt/live/admichin.es-0001/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/admichin.es-0001/privkey.pem;
index index.html index.php index.htm index.nginx-debian.html;
server_name webmail.admichin.es;
location / {
proxy_pass http://localhost:8001;
include proxy_params;
}
}
```
Ahora activo el sitio y reinicio nginx:
```bash
ln -s /etc/nginx/sites-available/webmail.admichin.es /etc/nginx/sites-enabled/
systemctl restart nginx
```
Ahora podemos acceder a la instancia de roundcube desde el navegador:
![Roundcube](https://i.imgur.com/CEWcKuI.png)
Como se puede ver acabo de recibir el correo del ejercicio de la tarea del cron. Ahora un correo enviado desde fuera:
![Correo enviado desde fuera](https://i.imgur.com/bqHtnNH.png)
### Tarea 11
Configura de manera adecuada postfix para que podamos mandar un correo desde un cliente remoto. La conexión entre cliente y servidor debe estar autentificada con SASL usando dovecor y además debe estar cifrada. Para cifrar esta comunicación puedes usar dos opciones:
* **ESMTP + STARTTLS**: Usando el puerto 567/tcp enviamos de forma segura el correo al servidor.
* **SMTPS**: Utiliza un puerto no estándar (465) para SMTPS (Simple Mail Transfer Protocol Secure). No es una extensión de smtp. Es muy parecido a HTTPS.
Elige una de las opciones anterior para realizar el cifrado. Y muestra la configuración de un cliente de correo (evolution, thunderbird, …) y muestra como puedes enviar los correos.
Usaré los mismos certificados que he generado antes para cifrar los emails que envío y recibo. Para ello, modifico la configuración de postfix en `/etc/postfix/main.cf`:
```bash
smtpd_tls_cert_file = /etc/letsencrypt/live/admichin.es-0001/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/admichin.es-0001/privkey.pem
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_authenticated_header = yes
broken_sasl_auth_clients = yes
```
Ahora edito `/etc/postfix/master.cf`:
```bash
submission inet n - y - - smtpd
-o content_filter=spamassassin
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_tls_auth_only=yes
-o smtpd_reject_unlisted_recipient=no
-o smtpd_client_restrictions=$mua_client_restrictions
-o smtpd_helo_restrictions=$mua_helo_restrictions
-o smtpd_sender_restrictions=$mua_sender_restrictions
-o smtpd_recipient_restrictions=
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
smtps inet n - y - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_reject_unlisted_recipient=no
-o smtpd_client_restrictions=$mua_client_restrictions
-o smtpd_helo_restrictions=$mua_helo_restrictions
-o smtpd_sender_restrictions=$mua_sender_restrictions
-o smtpd_recipient_restrictions=
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
```
Le indico a dovecot como debe realizar la auntentificación en el fichero `/etc/dovecot/conf.d/10-master.conf`:
```bash
service auth {
...
# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
mode = 0666
}
...
}
```
Ahora hay que abrir los puertos 465 y 993 en la vps. Tras eso, reiniciamos el servicio:
```bash
systemctl restart postfix dovecot
```
Ahora configuramos el cliente de correo **evolution**:
![Configuración de evolution](https://i.imgur.com/pdVsGVt.png)
![Configuración de evolution](https://i.imgur.com/Asvo17x.png)
Tras configurarlo probamos la recepción de un correo:
![Correo recibido](https://i.imgur.com/4g08tu3.png)
Y el envío:
![Correo enviado](https://i.imgur.com/ZBCNpp7.png)
![Correo enviado](https://i.imgur.com/jbV8Ojo.png)
### Tarea 12
Configura el cliente webmail para el envío de correo. Realiza una prueba de envío con el webmail.
Esta tarea consiste en poder enviar correos desde el cliente roundcube, y se han realizado las configuraciones necesarias en la tarea 10. Ahora solo queda probarlo:
![Correo enviado desde roundcube](https://i.imgur.com/CGQ8zuf.png)
![Correo enviado desde roundcube](https://i.imgur.com/miQ63i6.png)
## Comprobación final
### Tarea 13
Prueba de envío de correo. En esta [página](https://www.mail-tester.com/) tenemos una herramienta completa y fácil de usar a la que podemos enviar un correo para que verifique y puntúe el correo que enviamos. Captura la pantalla y muestra la puntuación que has sacado.
Enviamos un correo para comprobar la puntuación:
![Correo enviado para comprobar la puntuación](https://i.imgur.com/pt2pp6m.png)
![Correo enviado para comprobar la puntuación](https://i.imgur.com/X5klV3K.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 546 KiB

View File

@ -0,0 +1,312 @@
---
title: Informática forense
published: 2023-02-08
image: "./featured.png"
tags: ["forense"]
category: Documentación
draft: false
---
## Enunciado
La informática forense es el conjunto de técnicas que nos permite obtener la máxima información posible tras un incidente o delito informático.
En esta práctica, realizarás la fase de toma de evidencias y análisis de las mismas sobre una máquina Linux y otra Windows. Supondremos que pillamos al delincuente in fraganti y las máquinas se encontraban encendidas. Opcionalmente, podéis realizar el análisis de un dispositivo Android.
Sobre cada una de las máquinas debes realizar un volcado de memoria y otro de disco duro, tomando las medidas necesarias para certificar posteriormente la cadena de custodia.
## Apartado A. Máquina Windows
### Volcado de memoria
Para realizar el volcado de memoria he usado la herramienta **FTK Imager**, que permite realizar volcados de disco y memoria. Para ello hago lo siguiente. Utilizo las siguientes opciones:
![ftk4](https://i.imgur.com/tD6w8MG.png)
Ahora, para analizar los datos, utilizo **Volatility** en mi máquina debian; para ello, especifico el fichero que he creado con FTK Imager al utilizar los comandos.
#### 1. Procesos en ejecución
Uso el comando `pslist` para ver los procesos en ejecución:
```bash
python vol.py -f "/media/roberto/usb/memdump.mem" windows.pslist.PsList
```
![vol1](https://i.imgur.com/tMhTGFN.png)
#### 2. Servicios en ejecución
Uso el comando `getservicesids` para ver los servicios en ejecución:
```bash
python vol.py -f "/media/roberto/usb/memdump.mem" windows.getservicesids.GetServiceSIDs
```
![vol2](https://i.imgur.com/BZjmc2d.png)
#### 3. Puertos abiertos
Uso el comando `netstat` para ver los puertos abiertos:
```bash
python vol.py -f "/media/roberto/usb/memdump.mem" windows.netstat.NetStat
```
![vol3](https://i.imgur.com/DnH0We9.png)
#### 4. Conexiones establecidas por la máquina
Uso el comando `netscan` para ver las conexiones establecidas por la máquina:
```bash
python vol.py -f "/media/roberto/usb/memdump.mem" windows.netscan.NetScan
```
![vol4](https://i.imgur.com/7ZrLSg4.png)
#### 5. Sesiones de usuario establecidas remotamente
Uso el comando `sessions` para ver las sesiones de usuario establecidas remotamente:
```bash
python vol.py -f "/media/roberto/usb/memdump.mem" windows.sessions.Sessions
```
![vol5](https://i.imgur.com/YcTjn7U.png)
#### 6. Ficheros transferidos recientemente por NetBios
#### 7. Contenido de la caché DNS
#### 8. Variables de entorno
Para ver las variables de entorno, uso el comando `envars`:
```bash
python vol.py -f "/media/roberto/usb/memdump.mem" windows.envars.Envars
```
![vol6](https://i.imgur.com/IUSyeJ2.png)
### Volcado del registro
Para realizar el volcado de registro he usado también la herramienta **FTK Imager**. Utilizo la opción `Obtain system files`:
![ftk5](https://i.imgur.com/JUcvnmy.png)
Una vez finalizado el volcado, utilizo el programa **Registry Viewer** para analizar los datos obtenidos.
#### 10. Redes wifi utilizadas recientemente
Para ver las redes wifi usadas recientemente, abro el archivo `software`, y ahí sigo la siguiente ruta: `Microsoft/Windows NT/CurrentVersion/NetworkList/Profiles`:
![reg1](https://i.imgur.com/RFzUv61.png)
#### 11. Configuración del firewall de nodo
Para ver la configuración del firewall de nodo, abro el archivo `system`, y ahí sigo la siguiente ruta: `ControlSet001/Services/SharedAccess/Parameters/FirewallPolicy/FirewallRules`:
![reg2](https://i.imgur.com/4b7ZsO1.png)
#### 12. Programas que se ejecutan en el Inicio
Para ver los programas que se ejecutan en el inicio, abro el archivo `software`, y ahí sigo la siguiente ruta: `Microsoft/Windows/CurrentVersion/Run`:
![reg3](https://i.imgur.com/6MsrP73.png)
#### 13. Asociación de extensiones de ficheros y aplicaciones
No he podido encontrar en la aplicación **Registry Viewer** los registros, pero usando regedit en la máquina, se encuentran en la siguiente localización: `Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts`:
![reg4](https://i.imgur.com/Ig5FCUk.png)
### Volcado de disco
Para realizar el volcado de disco he usado la herramienta FTK Imager también:
![ftk1](https://i.imgur.com/tUwr02N.png)
Selecciono **RAW** como tipo de imagen:
![ftk2](https://i.imgur.com/GWoxYEU.png)
Y, como indica la ayuda, en Fragment size pongo 0, además de indicar la ruta y el nombre del fichero:
![ftk3](https://i.imgur.com/cTgXwqp.png)
El resto de los pasos del proceso los dejo con los valores por defecto.
Ahora, para analizar los datos, utilizo Autopsy; para ello, abro el fichero que he creado con FTK Imager, indicamos el direcorio del fichero , y en tipo, selecciono **Disk image or VM file**:
![autopsy1](https://i.imgur.com/JHCRjQ2.png)
Tras finalizar la configuración, empezará a analizar el volcado de disco. Este proceso tarda bastante tiempo en completarse. Una vez acabado podemos analizar los datos obtenidos.
#### 9. Dispositivos USB conectados
Para ver los dispositivos USB conectados, utilizo la opción `USB Device Attached`:
![autopsy8](https://i.imgur.com/1XfoSfH.png)
#### 14. Aplicaciones usadas recientemente
Para ver las aplicaciones usadas recientemente, utilizo la opción `User Activity` del disco duro:
![autopsy9](https://i.imgur.com/vthHo40.png)
#### 15. Ficheros abiertos recientemente
![autopsy9](https://i.imgur.com/ZQtfblE.png)
#### 16. Software Instalado
Para ver el software instalado, utilizo la opción `Installed Programs`:
![autopsy10](https://i.imgur.com/xsFb4yR.png)
#### 18. Cuentas de Usuario
Para ver las cuentas de usuario, utilizo la opción `OS Accounts`:
![autopsy11](https://i.imgur.com/A1Ha5e6.png)
#### 19. Historial de navegación y descargas, cookies
Para ver el historial de navegación, utilizo la opción `Web History`:
![autopsy12](https://i.imgur.com/1EN0RI4.png)
Para ver las cookies utilizo la opción `Web Cookies`:
![autopsy13](https://i.imgur.com/rDaxg3p.png)
Para ver el historial de descargas, utilizo la opción `Web Downloads`:
![autopsy14](https://i.imgur.com/A6x55kE.png)
#### 21. Archivos con extensión cambiada
Los archivos con extensión cambiada aparecen en la sección `Analysis Results/Extension Mismatch Detected`:
![autopsy2](https://i.imgur.com/hmLGaGi.png)
#### 22. Archivos eliminados
Los archivos eliminados aparecen en la sección `Recycle Bin`:
![autopsy3](https://i.imgur.com/XmQIyKC.png)
#### 23. Archivos Ocultos
En la opción para explorar el sistema de archivos, se pueden distinguir los archivos ocultos porque en los metadatos, aparece la etiqueta: `Hidden`:
![autopsy4](https://i.imgur.com/OcIKUYP.png)
#### 24. Archivos que contienen una cadena determinada
Para buscar archivos que contengan una cadena determinada, utilizo la opción `Keyword Search`:
![autopsy5](https://i.imgur.com/B9ezFRy.png)
#### 25. Búsqueda de imágenes por ubicación
Para buscar imágenes por ubicación, utilizo la opción `Geolocation`:
![autopsy6](https://i.imgur.com/G9nTp6h.png)
#### 26. Búsqueda de archivos por autor
Para buscar archivos por autor, utilizo la opción `Metadata`:
![autopsy7](https://i.imgur.com/XcQPTmy.png)
## Apartado B) Máquina Linux
Intenta realizar las mismas operaciones en una máquina Linux para aquellos apartados que tengan sentido y no se realicen de manera idéntica a Windows.
### Volcado de memoria
He realizado el volcado de memoria con **Lime**, que es una herramienta que se utiliza para realizar volcados de memoria en Linux. Para ello, he usado el comando de la siguiente manera (he instalado Lime meadiante su repositorio en github):
```bash
insmod lime-4.19.0-23-amd64.ko "path=/mnt/linux/memorialinux.mem format=lime"
```
Es importante que para realizar el volcado, hay que iniciar el sistema de forma insegura, ya que si no, no permite utilizar el comando.
No he sido capaz de realizar el análisis utilizando volatility, ya que es necesario instalar plugins para interpretar el volcado de memoria, y no los reconoce, por lo que voy a usar los comandos en lugar de trabajar sobre el volcado.
#### 1. Procesos en ejecución
Para ver los procesos en ejecución, utilizo el comando `ps aux`:
![ps1](https://i.imgur.com/I6H5Egn.png)
#### 2. Servicios en ejecución
Para ver los servicios en ejecución, utilizo el comando `systemctl`:
```bash
systemctl list-units --type=service --state=running
```
![systemctl1](https://i.imgur.com/lh2yFCl.png)
#### 3. Puertos abiertos
Para ver los puertos abiertos, utilizo el comando `netstat`, que se encuentra en el paquete `net-tools`:
```bash
apt install net-tools
netstat -tulpn
```
![netstat1](https://i.imgur.com/QmwsCnY.png)
#### 4. Conexiones establecidas por la máquina
Las sesiones se pueden observar en el comando netstat utilizado anteriormente.
#### 5. Sesiones de usuario establecidas remotamente
Para ver las sesiones de usuario establecidas remotamente, utilizo el comando `who`:
```bash
who -a
```
![who1](https://i.imgur.com/m6c6R6z.png)
#### 7. Contenido de la caché DNS
En debian, la caché dns está deshabilitada por defecto. Para habilitarla, voy a instalar el paquete **nscd** (demonio de caché para servicio de nombres), y leer el fichero que genera. El fichero tiene un formato binario, por lo que voy a usar el comando `strings` para ver su contenido:
```bash
strings /var/cache/nscd/hosts
```
![nscd1](https://i.imgur.com/4rfJMeG.png)
#### 8. Variables de entorno
Para ver las variables de entorno, utilizo el comando `env`:
![env1](https://i.imgur.com/O4fIJRT.png)
### Volcado de disco
El volcado de disco en linux lo he realizado con el comando dd, que se utiliza para copiar archivos y volúmenes. Para ello, he usado el comando de la siguiente manera:
```bash
dd if=/dev/vda2 of=/mnt/linux/volcado_linux.001 bs=64K
```
![dd1](https://i.imgur.com/6P6cdSJ.png)
Es imporate que, durante el análisis de la imagen en Autopsy, el tiempo es mucho mayor, y que es de hecho la última fase, cuando ya se encuentra al 100% la que toma más tiempo.
Los apartados rellativos al análisis usando autopsy, o se realizan exactamente igual que en Windows, o no tienen sentido en Linux, por lo que no los están documentados aquí.