Introducció

En aquest tema, explorarem els conceptes d'autenticació i autorització, que són fonamentals per garantir la seguretat en les arquitectures de sistemes. Aquests processos asseguren que només els usuaris legítims puguin accedir als recursos i que només puguin realitzar accions permeses segons els seus permisos.

Conceptes Clau

Autenticació

L'autenticació és el procés de verificar la identitat d'un usuari o sistema. Aquest procés assegura que l'usuari és qui diu ser.

Mètodes d'Autenticació

  1. Contrasenyes: La forma més comuna d'autenticació. Els usuaris proporcionen una contrasenya que es compara amb la que està emmagatzemada al sistema.
  2. Autenticació de Doble Factor (2FA): Afegeix una capa addicional de seguretat requerint una segona forma de verificació, com un codi enviat al telèfon mòbil.
  3. Certificats Digitals: Utilitzen criptografia per verificar la identitat d'un usuari o dispositiu.
  4. Biometria: Utilitza característiques físiques com empremtes digitals o reconeixement facial.

Autorització

L'autorització és el procés de determinar si un usuari autenticat té permís per accedir a un recurs o realitzar una acció específica.

Models d'Autorització

  1. Control d'Accés Basat en Rols (RBAC): Assigna permisos a rols específics i després assigna usuaris a aquests rols.
  2. Control d'Accés Basat en Atributs (ABAC): Utilitza atributs d'usuaris, recursos i entorns per determinar els permisos.
  3. Llistes de Control d'Accés (ACL): Defineixen permisos específics per a cada usuari o grup d'usuaris per a cada recurs.

Implementació Pràctica

Exemple d'Autenticació amb JWT (JSON Web Tokens)

import jwt
import datetime

# Clau secreta per signar el token
SECRET_KEY = 'clau_secreta'

# Funció per generar un token JWT
def generar_token(usuario_id):
    payload = {
        'usuario_id': usuario_id,
        'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1)
    }
    token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
    return token

# Funció per verificar un token JWT
def verificar_token(token):
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
        return payload['usuario_id']
    except jwt.ExpiredSignatureError:
        return 'Token expirat'
    except jwt.InvalidTokenError:
        return 'Token invàlid'

# Generar un token per a l'usuari amb ID 123
token = generar_token(123)
print(f'Token generat: {token}')

# Verificar el token generat
usuario_id = verificar_token(token)
print(f'ID de l\'usuari verificat: {usuario_id}')

Exemple d'Autorització amb RBAC

# Definició de rols i permisos
ROLS = {
    'admin': ['crear', 'llegir', 'actualitzar', 'eliminar'],
    'usuari': ['llegir']
}

# Assignació d'usuaris a rols
USUARIS = {
    'alice': 'admin',
    'bob': 'usuari'
}

# Funció per verificar permisos
def verificar_permis(usuari, accio):
    rol = USUARIS.get(usuari)
    if rol and accio in ROLS.get(rol, []):
        return True
    return False

# Verificar si 'alice' pot 'crear'
print(verificar_permis('alice', 'crear'))  # True

# Verificar si 'bob' pot 'crear'
print(verificar_permis('bob', 'crear'))  # False

Exercicis Pràctics

Exercici 1: Implementar Autenticació amb Contrasenyes

  1. Crea una funció que emmagatzemi contrasenyes de manera segura utilitzant hashing.
  2. Crea una funció que verifiqui les contrasenyes proporcionades pels usuaris.

Exercici 2: Implementar Autorització amb ACL

  1. Defineix una estructura de dades per a les ACL.
  2. Implementa funcions per afegir, eliminar i verificar permisos en les ACL.

Solucions

Solució a l'Exercici 1

import hashlib

# Funció per emmagatzemar contrasenyes
def emmagatzemar_contrasenya(contrasenya):
    hash_object = hashlib.sha256(contrasenya.encode())
    return hash_object.hexdigest()

# Funció per verificar contrasenyes
def verificar_contrasenya(contrasenya, hash_emmagatzemat):
    hash_object = hashlib.sha256(contrasenya.encode())
    return hash_object.hexdigest() == hash_emmagatzemat

# Emmagatzemar una contrasenya
hash_contrasenya = emmagatzemar_contrasenya('contrasenya_secreta')
print(f'Hash de la contrasenya: {hash_contrasenya}')

# Verificar la contrasenya
print(verificar_contrasenya('contrasenya_secreta', hash_contrasenya))  # True
print(verificar_contrasenya('contrasenya_incorrecta', hash_contrasenya))  # False

Solució a l'Exercici 2

# Estructura de dades per a les ACL
ACL = {
    'recurs1': {
        'alice': ['llegir', 'escriure'],
        'bob': ['llegir']
    },
    'recurs2': {
        'alice': ['llegir']
    }
}

# Funció per afegir permisos
def afegir_permis(recurs, usuari, permis):
    if recurs not in ACL:
        ACL[recurs] = {}
    if usuari not in ACL[recurs]:
        ACL[recurs][usuari] = []
    ACL[recurs][usuari].append(permis)

# Funció per eliminar permisos
def eliminar_permis(recurs, usuari, permis):
    if recurs in ACL and usuari in ACL[recurs]:
        ACL[recurs][usuari].remove(permis)

# Funció per verificar permisos
def verificar_permis_acl(recurs, usuari, permis):
    return permis in ACL.get(recurs, {}).get(usuari, [])

# Afegir un permis
afegir_permis('recurs1', 'charlie', 'llegir')

# Verificar permisos
print(verificar_permis_acl('recurs1', 'alice', 'llegir'))  # True
print(verificar_permis_acl('recurs1', 'bob', 'escriure'))  # False
print(verificar_permis_acl('recurs1', 'charlie', 'llegir'))  # True

# Eliminar un permis
eliminar_permis('recurs1', 'charlie', 'llegir')
print(verificar_permis_acl('recurs1', 'charlie', 'llegir'))  # False

Errors Comuns i Consells

  1. No utilitzar hashing per a contrasenyes: Emmagatzemar contrasenyes en text pla és un error greu. Utilitza sempre hashing amb salts per emmagatzemar contrasenyes.
  2. No renovar tokens: Els tokens d'autenticació haurien de tenir una caducitat i ser renovats periòdicament per millorar la seguretat.
  3. Permisos excessius: Assignar permisos excessius als usuaris pot comprometre la seguretat. Utilitza el principi de menor privilegi.

Conclusió

En aquesta secció, hem explorat els conceptes d'autenticació i autorització, així com les seves implementacions pràctiques. Aquests processos són fonamentals per garantir la seguretat en les arquitectures de sistemes, assegurant que només els usuaris legítims puguin accedir als recursos i realitzar accions permeses. Amb els exercicis pràctics, has tingut l'oportunitat de posar en pràctica aquests conceptes i veure com es poden implementar en un sistema real.

Arquitectures de Sistemes: Principis i Pràctiques per Dissenyar Arquitectures Tecnològiques Robustes i Escalables

Mòdul 1: Introducció a les Arquitectures de Sistemes

Mòdul 2: Principis de Disseny d'Arquitectures

Mòdul 3: Components d'una Arquitectura de Sistemes

Mòdul 4: Escalabilitat i Rendiment

Mòdul 5: Seguretat en Arquitectures de Sistemes

Mòdul 6: Eines i Tecnologies

Mòdul 7: Casos d'Estudi i Exemples Pràctics

Mòdul 8: Tendències i Futur de les Arquitectures de Sistemes

© Copyright 2024. Tots els drets reservats