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ó
- Contrasenyes: La forma més comuna d'autenticació. Els usuaris proporcionen una contrasenya que es compara amb la que està emmagatzemada al sistema.
- 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.
- Certificats Digitals: Utilitzen criptografia per verificar la identitat d'un usuari o dispositiu.
- 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ó
- Control d'Accés Basat en Rols (RBAC): Assigna permisos a rols específics i després assigna usuaris a aquests rols.
- Control d'Accés Basat en Atributs (ABAC): Utilitza atributs d'usuaris, recursos i entorns per determinar els permisos.
- 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
- Crea una funció que emmagatzemi contrasenyes de manera segura utilitzant hashing.
- Crea una funció que verifiqui les contrasenyes proporcionades pels usuaris.
Exercici 2: Implementar Autorització amb ACL
- Defineix una estructura de dades per a les ACL.
- 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
- No utilitzar hashing per a contrasenyes: Emmagatzemar contrasenyes en text pla és un error greu. Utilitza sempre hashing amb salts per emmagatzemar contrasenyes.
- No renovar tokens: Els tokens d'autenticació haurien de tenir una caducitat i ser renovats periòdicament per millorar la seguretat.
- 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
- Conceptes Bàsics d'Arquitectura de Sistemes
- Importància d'una Bona Arquitectura
- Tipus d'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
- Cas d'Estudi: Arquitectura d'un Sistema de Comerç Electrònic
- Cas d'Estudi: Arquitectura d'una Aplicació de Xarxes Socials
- Exercicis Pràctics