DISEÑO E IMPLEMENTACIÓN DE SISTEMAS DISTRIBUIDOS Guía 5. HTTPS y Certificados Digitales. Seguridad (II) A pesar de que hemos preparado nuestro servicio para que pueda ser más privado, todavía quedan muchos temas por resolver en el ámbito de la seguridad: 1. Utilizar canales de comunicación seguros con HTTPS sobre SSL/TLS y uso de certificados digitales. 2. Revisar y evitar diferentes vulnerabilidades conocidas: Helmet. 3. Utilizar una estrategia de Registro, Identificación y Autorización basada en Access Token sin estado: Hash, Salt, JWT, OAuth Esta guía se centrará en los dos primeros apartados y una introducción al tercer apartado que se desarrollará en la siguiente guía. A diferencia de las anteriores, esta guía se desarrollará a través de un conjunto de materiales accesibles a través de enlaces con documentos muy interesantes que abordan diferentes aspectos que hemos visto en clase o que veremos las próximas semanas acerca de la seguridad de nuestro sistema. Estos enlaces permiten entender y profundizar más en cada uno de los aspectos abordados. El trabajo consistirá en agregar estas características de seguridad en nuestro Servicio Web (API CRUD): crear certificados, establecer un canal seguro a través de https mediante los certificados creados, incorporar las funcionalidades varias de seguridad que proporciona la librería Helmet, probar todas las rutas con Postman (exportando nuevamente la colección actualizada), actualizar el archivo README.md con las nuevas funcionalidades, actualizar la Memoria 3 (como memoria3.rev2.pdf), subir al repositorio la versión 3.2.0 del proyecto (etiquetando adecuadamente package.json), realizar la entrega de la memoria cuando se indique por parte del profesor, y investigar acerca de los conceptos Hash, Salt, Token, JWT y OAuth Material de referencia • • • • • https://linuxconfig.org/how-to-generate-a-self-signed-ssl-certificate-on-linux https://www.jacobsoft.com.mx/es_mx/como-crear-un-servidor-https-con-node-js-y-express/ https://expressjs.com/es/advanced/best-practice-security.html https://www.paradigmadigital.com/dev/oauth-2-0-equilibrio-y-usabilidad-en-la-securizacion-deapis/ https://ahorasomos.izertis.com/solidgear/refresh-token-autenticacion-jwt-implementacion-nodejs/ Veamos a continuación uno por uno: https://linuxconfig.org/how-to-generate-a-self-signed-ssl-certificate-on-linux En este enlace se ve fácilmente cómo crear los certificados AUTOFIRMADOS: 50 DISEÑO E IMPLEMENTACIÓN DE SISTEMAS DISTRIBUIDOS <Ctrl+Alt+T> $ cd node/api-rest $ mkdir cert $ cd cert $ $ $ $ openssl genrsa -out key.pem openssl req -new -key key.pem -out csr.pem openssl x509 -req -days 9999 -in csr.pem -signkey key.pem -out cert.pem rm csr.pem $ cd .. Las cuatro instrucciones importantes se pueden resumir en: 1. Creamos una clave privada (key.pem) 2. Creamos una solicitud o formulario de solicitud de certificado digital (csr.pem) 3. Creamos el certificado digital (cert.pem) firmado por nosotros mismos (en lugar de por una Autoridad Certificadora). 4. Finalmente eliminamos el formulario de solicitud (csr.pem) que ya no vale para nada. https://www.jacobsoft.com.mx/es_mx/como-crear-un-servidor-https-con-node-js-y-express/ En el segundo enlace se asegura una canal Express (pero no se explica muy bien la creación de los certificados). //archivo index.js var express = require('express'); var fs = require('fs'); var https = require('https'); var app = express(); const PUERTO = 443; https.createServer({ cert: fs.readFileSync('./cert/cert.pem'), key: fs.readFileSync('./cert/key.pem') },app).listen(PUERTO, function(){ console.log('Servidor https correindo en el puerto 443'); }); app.get('/', function(req, res){ res.send('Hola, estas en la pagina inicial'); console.log('Se recibio una petición get a través de https'); }); https://expressjs.com/es/advanced/best-practice-security.html Buenas prácticas de seguridad en producción… • • • • • • • • No utilizar versiones en desuso o vulnerables de Express Utilizar TLS Utilizar Helmet Utilizar cookies de forma segura Prevenir ataques de fuerza bruta a la autenticación Asegurarse de que las dependencias sean seguras Evitar otras vulnerabilidades conocidas Consideraciones adicionales 51 DISEÑO E IMPLEMENTACIÓN DE SISTEMAS DISTRIBUIDOS Helmet Para utilizar Helmet lo mejor es buscar la ayuda en npm. Aunque básicamente se puede resumir en los siguientes pasos: 1. Instalamos Helmet en nuestro proyecto <Ctrl+Alt+T> $ npm install --save helmet 2. Incorporamos las siguientes líneas en nuestro código: ... // Importaciones var helmet = require('helmet'); // Middlewares app.use(helmet()); ... https://www.paradigmadigital.com/dev/oauth-2-0-equilibrio-y-usabilidad-en-la-securizacion-deapis/ Explica diferentes formas de aplicar OAuth (muy completo y teórico) https://ahorasomos.izertis.com/solidgear/refresh-token-autenticacion-jwt-implementacionnodejs/ Sencillos ejemplos de autenticación con token JWT. Nota: para finalizar, recordemos modificar la versión del código a v3.2.0 (editando el archivos package.json) y subir una copia etiquetada al repositorio remoto: $ $ $ $ $ git git git git git add . commit -m "API REST CRUD con MongoDB: https y helmet (guía 5)" push tag v3.2.0 push --tags Es importante detallar en la memoria (memoria3.rev2.pdf), adecuadamente y mediante capturas, un conjunto de pruebas lo más completa posible del canal HTTPS. Recordemos que al final de la memoria debe estar incluido el repositorio del proyecto y la contraseña de acceso. Referencias adicionales Finalmente, se propone una serie de referencias adicionales que pueden ayudar a profundizar más en los diferentes temas. • https://davidinformatico.com/seguridad-express-js/ • https://jasonwatmore.com/post/2020/06/17/nodejs-mongodb-api-jwt-authentication-with-refreshtokens • https://jasonwatmore.com/post/2020/07/25/angular-10-jwt-authentication-with-refresh-tokens • https://nodejs.org/en/knowledge/HTTP/servers/how-to-create-a-HTTPS-server/ 52 DISEÑO E IMPLEMENTACIÓN DE SISTEMAS DISTRIBUIDOS • • • • • • • https://programarivm.com/pon-en-marcha-un-servidor-https-en-node-js-con-express/ https://expressjs.com/es/advanced/best-practice-security.html https://davidinformatico.com/seguridad-express-js/ https://www.paradigmadigital.com/dev/oauth-2-0-equilibrio-y-usabilidad-en-la-securizacion-deapis/ https://solidgeargroup.com/refresh-token-autenticacion-jwt-implementacion-nodejs/ https://jasonwatmore.com/post/2020/06/17/nodejs-mongodb-api-jwt-authentication-with-refreshtokens https://jasonwatmore.com/post/2020/07/25/angular-10-jwt-authentication-with-refresh-tokens 53