martuan / ESP32-INTI-Electronica

Sistema IoT para diversas aplicaciones en INTI con capacidad de enviar datos a la nube y acceder a ellos con cualquier dispositivo conectado a la red.
0 stars 1 forks source link

Aplicar medidas para evitar ataques de ciberseguridad #5

Open martuan opened 2 years ago

lunamg commented 2 years ago

En MQTT, la medida más básica es aplicar usuario y clave en el envío/recepción de mensajes. Es una medida que no brinda mayor seguridad ya que el usuario y clave viajan en texto plano. De todas maneras, podemos hacer una prueba para ver cómo funciona. El servidor usado hasta ahora (“broker.hivemq.com”) creo que no tiene posibilidad de validar usuario y clave (no encontré nada en la web). El servidor “test.mosquitto.org” tiene esa posibilidad. Los datos son los siguientes: • Comunicarse al puerto 1884 • Publicar/suscribirse con distintos niveles de usario y clave según acción deseada: rw / readwrite : read/write access to the # topic hierarchy ro / readonly : read only access to the # topic hierarchy wo / writeonly : write only access to the # topic hierarchy

Ejemplo de publicación con usuario “rw”: $ mosquitto_pub -h test.mosquitto.org -p 1884 -t "INTI/Electronica/esp32/sensor_1" -m "mensaje" -u rw -P readwrite

Ejemplo de suscripción usuario “ro”: $ mosquitto_sub -h test.mosquitto.org -p 1884 -t "INTI/Electronica/esp32/sensor_1" -u ro -P readonly

Como segundo paso podríamos probar en el servidor de INTI “telemetría.inti.gob.ar”. Allí hay que configurar un archivo de usuarios y claves en el servidor.

También hay que ver (algunos items son a configurar en broker): -QoS a implementar. -ACLs -TLS/SSL -Last will message -Desahilitar uso de wildcards

lunamg commented 2 years ago

Prueba de uso de usuario/clave para luego probar en server “telemetría.inti.gob.ar”.

Se instalacó Mosquitto en Linux (Ubuntu) 1) Agregar el repositorio oficial de Mosquitto:

$ sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa

2) Si la actualización del índice del paquete no comenienza sola, actualízarla.

$ sudo apt-get update

3) Instalación:

$ sudo apt-get install mosquitto

4) Instalar Clientes Mosquitto:

$ sudo apt-get install mosquitto-clients

5) Verificar si Mosquitto está activo:

$ sudo service mosquitto status

6) Accediendo desde otra pc (con Win10) de la misma red, arrojó siguiente error: "Error: No se puede establecer una conexion ya que el equipo de destino denegó expresamente dicha conexión"

Solución: Cuando Mosquitto se ejecuta sin un archivo de configuración, o sin configurar ningún listener, ahora se vinculará a las interfaces de loopback 127.0.0.1 y / o :: 1. Esto significa que solo serán posibles las conexiones desde el host local.

La ejecución del broker con un listener definido se vinculará de forma predeterminada a 0.0.0.0 / :: y, por lo tanto, será accesible desde cualquier interfaz.

Para que Mosquitto pueda escuchar en todas las IPs, ejecutar $ sudo nano /etc/mosquitto/mosquitto.conf

y añadir las líneas: "# Note that this will not allow anonymous access by default." "listener 1883"

7) En intento siguiente de conexión se tiene error: "Connection error: Connection Refused: not authorised."

Solución: Todos los listener tienen el valor predeterminado allow_anonymous false a menos que se establezca explícitamente como verdadero en el archivo de configuración. Al configurar el listener, se debe configurar un método de control de acceso y autenticación, o establecer allow_anonymous como true. Inicialmente se establece al anónimo como TRUE.

Agregar línea en archivo mosquitto.conf: allow_anonymous true

8) Crear archivo de usuario y passwaord para autenticar y deshabilitar la conexión de usuarios anónimos. Crear archivo txt con usuario y clave según formato:

user1:clave1 user2:clave2

Luego encriptar archivo con comando: $sudo mosquitto_passwd -U nombre_de_archivo.txt

Luego agregar y modificar archivo mosquitto.conf las siguientes líneas: allow_anonymous false (modificación) password_file etc/mosquitto/nombre_de_archivo.txt (agregado)

La conexión se logra concretar. Archivos adjuntos: captura de trama (se ve cómo viaja en texto plano los datos). mqtt topic - captura trama mqtt usuario - captura trama

martuan commented 2 years ago

Métodos para robustecer la protección de datos entre publicador y suscriptor:

  1. ACL (Whitelist/Blacklist: por IP o por MAC)

  2. TLS (encriptación)

  3. Autenticación por usuario y contraseña

  4. Filtrar por longitud del paquete de datos esperado

  5. Filtrar por paquetes de datos enviados de forma sincrónica (en un determinado tiempo esperado; los que no entran en esa ventana serán descartados).

lunamg commented 2 years ago

Instalar Broker MQTT Mosquitto en Raspberry Pi

1) Comprobar la versión de SO instalada (en este caso es la Buster):

$ lsb_release -a

2) Acceder al repositorio importando la llave:

$ wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key

$ sudo apt-key add mosquitto-repo.gpg.key

$ cd /etc/apt/sources.list.d/

$ sudo wget http://repo.mosquitto.org/debian/mosquitto-buster.list (es el repositorio para la versión instalada de OS en la placa)

3) Actualizar la base de datos:

$ sudo apt-get update

4) Instalar Mosquitto (server y cliente):

$ sudo apt install mosquitto mosquitto-clients

5) Se ejecuta comando para que servicio se inicie sólo cuando arranque la Raspberry:

$ sudo systemctl enable mosquitto

6) Para que funcione correctamente el servicio se realizan las mismas correcciones que las hechas en la instalación de Mosquitto en Ubuntu. Corregir/agregar en el archivo mosquitto.conf (en /etc/mosquitto/):

listener 1883 allow_anonymous false password_file etc/mosquitto/conf.d/usuarios.txt

El archivo usuarios.txt es el que tiene el listado de usuarios y claves de acceso al broker (archivo encriptado y ubicado en /etc/mosquitto/conf.d/).

7) Luego de cada cambio recordar que hay que parar el servicio y volverlo a iniciar. Se puede chequear luego que el servicio esté corriendo:

$ sudo systemctl stop mosquitto

$ sudo systemctl start mosquitto

$ sudo systemctl status mosquitto

lunamg commented 2 years ago

Configuración de ACL (listas de control de acceso por usuario y permiso) en Raspberry Pi.

1) Generar archivo "acl" en el directorio conf.d con descripción de permisos por usuario y topics:

user user1 topic write prueba/publicaciones/user1 topic read prueba/publicaciones/user2 topic readwrite prueba/publicaciones/comun

user user2 topic write prueba/publicaciones/user2 topic read prueba/publicaciones/user1 topic readwrite prueba/publicaciones/comun

2) Agregar en el archivo mosquitto.conf (en /etc/mosquitto/):

acl_file /etc/mosquitto/conf.d/acl

3) Reiniciar el servicio mosquitto.

Observación: Al realizar pruebas para ver si está funcionando el acceso controlado por ACL el broker no responde cuando se intenta publicar/suscribir a un topic no autorizado. El broker no devuelve mensaje de error, simplemente no hace nada (siempre que se publique/suscriba con usuarios existentes).

martuan commented 2 years ago

Funciona correctamente la comunicación por ACL. Probado con ESP32 como publicador, Raspberry pi como broker y aplicación "mqtt-explorer" como suscriptor. Rechaza conexiones no autorizadas.

lunamg commented 2 years ago

TLS/SSL - Autenticación simple (sólo autentica bróker/servidor)

Hacer que el Raspberry Pi sea Autoridad de Certificación (CA), crear las claves y los certificados. En el bróker MQTT (Mosquitto en Raspberry Pi) ir al directorio /home/pi, crear una carpeta certificados y dentro de ella realizar los siguientes pasos:

1) Crear clave ca.key

openssl genrsa -des3 -out ca.key 2048 Pide clave y confirmación cuando se genera.

2) Crear certificado de seguridad ca.crt. Se usa la llave de CA del paso 1.

openssl req -new -x509 -days 1826 -key ca.key -out ca.crt Se ingresan los siguientes datos (que son obligatorios, el resto quedan en blanco): Country Name: AR Common Name: 10.101.42.55 (IP de la interface WLAN de la Raspberry)

3) Crear clave server.key

openssl genrsa -out server.key 2048 Se crea sin clave.

4) Crear requerimiento de certificado (.csr) para el servidor.

openssl req -new -key server.key -out server.csr Se ingresan los siguientes datos (que son obligatorios, el resto quedan en blanco): Country Name: AR Common Name: rbpi-electronica01-wifi.inti.gob.ar (nombre DNS de la interface WLAN de la Raspberry)

5) Crear y firmar el certificado del servidor server.crt

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 360

6) Copiar las claves y los certificados creados a las carpetas de Mosquitto: En /etc/mosquitto/ca_certificates ubicar archivo ca.crt En /etc/mosquitto/certs ubicar archivos server.crt y server.key Cambiar permisos a los archivos para que los pueda leer otro además de root $ chmod 644 server.key Cambiar owner al archivo ca.crt (debe ser dueño el usuario “mosquitto”).

7) Copiar el certificado de la CA en el cliente (pc). En c:/certificados ca.crt (el directorio puede ser cualquiera)

8) Editar archivo de configuración de Mosquitto (/etc/mosquitto/mosquitto.conf) en el server/broker y agregar las siguientes líneas:

'# Acceso puerto 8883 cifrado listener 8883 cafile /etc/mosquitto/ca_certificates/ca.crt certfile /etc/mosquitto/certs/server.crt keyfile /etc/mosquitto/certs/server.key

9) Reiniciar servicio Mosquitto en el broker.

Prueba desde cliente pc (también puede ser desde la misma Raspberry) hacia bróker Raspberry. Se publica y se suscribe con los siguientes comandos:

$ mosquitto_sub -h rbpi-electronica01-wifi.inti.gob.ar -t "prueba/comun" -u user1 -P clave1 -p 8883 --cafile ca.crt -d

$ mosquitto_pub -h rbpi-electronica01-wifi.inti.gob.ar -t "prueba/comun" -m "hola" -u user1 -P clave1 -p 8883 --cafile ca.crt -d

y publica y se recibe mensaje correctamente.