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')) # FalseExercicis 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)) # FalseSolució 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')) # FalseErrors 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
