En aquest tema, explorarem les tècniques i pràctiques per assegurar la comunicació entre microserveis. La seguretat en la comunicació és crucial per protegir les dades i garantir la integritat i confidencialitat de la informació que es transmet entre els serveis.

Conceptes Clau

  1. Xifrat de Dades en Trànsit

El xifrat de dades en trànsit és essencial per protegir la informació mentre es mou entre microserveis. Això es pot aconseguir utilitzant protocols segurs com HTTPS i TLS.

HTTPS i TLS

  • HTTPS (HyperText Transfer Protocol Secure): És una versió segura de HTTP que utilitza TLS (Transport Layer Security) per xifrar les dades.
  • TLS (Transport Layer Security): Proporciona xifrat, integritat de dades i autenticació entre aplicacions i serveis.

Implementació

Per implementar HTTPS i TLS:

  1. Certificats SSL/TLS: Obteniu i configureu certificats SSL/TLS per als vostres serveis.
  2. Configuració del Servidor: Configureu els servidors per utilitzar HTTPS. Això implica actualitzar les configuracions del servidor web (com Nginx o Apache) per utilitzar els certificats SSL/TLS.
server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/cert.key;

    location / {
        proxy_pass http://backend_service;
    }
}

  1. Autenticació i Autorització

Assegurar que només els serveis autoritzats poden comunicar-se entre si és fonamental per mantenir la seguretat.

OAuth2 i JWT

  • OAuth2: És un protocol d'autenticació i autorització que permet a les aplicacions obtenir accés limitat als recursos d'un usuari.
  • JWT (JSON Web Tokens): S'utilitzen per transmetre informació de manera segura entre les parts com un objecte JSON.

Implementació

  1. Servidor d'Autenticació: Configureu un servidor d'autenticació que emeti tokens JWT.
  2. Validació de Tokens: Cada microservei ha de validar els tokens JWT abans de processar les sol·licituds.
import jwt

def validate_jwt(token):
    try:
        decoded = jwt.decode(token, 'secret_key', algorithms=['HS256'])
        return decoded
    except jwt.InvalidTokenError:
        return None

  1. Seguretat en la Missatgeria Asíncrona

Quan utilitzeu missatgeria asíncrona (com Kafka o RabbitMQ), és important assegurar que els missatges són segurs.

Xifrat de Missatges

  • Xifrat de Missatges: Xifreu els missatges abans d'enviar-los i desencripteu-los en rebre'ls.

Implementació

  1. Xifrat: Utilitzeu biblioteques de xifrat per xifrar els missatges abans d'enviar-los.
  2. Desxifrat: Desxifreu els missatges en el moment de la recepció.
from cryptography.fernet import Fernet

# Generar una clau
key = Fernet.generate_key()
cipher_suite = Fernet(key)

# Xifrar un missatge
message = "Hello, World!"
cipher_text = cipher_suite.encrypt(message.encode())

# Desxifrar el missatge
plain_text = cipher_suite.decrypt(cipher_text).decode()

Exercicis Pràctics

Exercici 1: Configuració de HTTPS

  1. Obteniu un certificat SSL/TLS per al vostre servidor.
  2. Configureu el vostre servidor web (Nginx o Apache) per utilitzar HTTPS.

Exercici 2: Implementació de JWT

  1. Configureu un servidor d'autenticació que emeti tokens JWT.
  2. Modifiqueu un microservei per validar els tokens JWT abans de processar les sol·licituds.

Exercici 3: Xifrat de Missatges

  1. Utilitzeu una biblioteca de xifrat per xifrar els missatges abans d'enviar-los a través d'un sistema de missatgeria asíncrona.
  2. Desxifreu els missatges en el moment de la recepció.

Solucions

Solució a l'Exercici 1

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/cert.key;

    location / {
        proxy_pass http://backend_service;
    }
}

Solució a l'Exercici 2

import jwt
from flask import Flask, request, jsonify

app = Flask(__name__)

def validate_jwt(token):
    try:
        decoded = jwt.decode(token, 'secret_key', algorithms=['HS256'])
        return decoded
    except jwt.InvalidTokenError:
        return None

@app.route('/protected')
def protected():
    token = request.headers.get('Authorization').split()[1]
    user = validate_jwt(token)
    if user:
        return jsonify(message="Access granted"), 200
    else:
        return jsonify(message="Access denied"), 401

if __name__ == '__main__':
    app.run()

Solució a l'Exercici 3

from cryptography.fernet import Fernet

# Generar una clau
key = Fernet.generate_key()
cipher_suite = Fernet(key)

# Xifrar un missatge
message = "Hello, World!"
cipher_text = cipher_suite.encrypt(message.encode())

# Enviar el missatge xifrat (simulat)
received_cipher_text = cipher_text

# Desxifrar el missatge
plain_text = cipher_suite.decrypt(received_cipher_text).decode()
print(plain_text)  # Output: Hello, World!

Conclusió

En aquesta secció, hem après sobre la importància de la seguretat en la comunicació entre microserveis. Hem explorat tècniques com el xifrat de dades en trànsit, l'autenticació i autorització amb JWT, i la seguretat en la missatgeria asíncrona. Aquests conceptes i pràctiques són essencials per garantir que les dades es transmetin de manera segura i que només els serveis autoritzats puguin accedir-hi.

© Copyright 2024. Tots els drets reservats