Subido por maria galindo esquerdo

SD - Guía 05 - BackEnd - WS API Restful por HTTPS Seguridad II

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