Parlarem de la seguretat lògica (software) i activa (preventiva) associats al desenvolupament de programari.
Un sistema es pot considerar segur si ens cuidem dels següents aspectes, de més a menys significatius:
Dins de la programació, i en referència a la seguretat, parlarem dels següents aspectes:
El control d'accés inclou les activitats de registre, autenticació i autorització d'usuaris.
El registre d'usuaris té associat l'emmagatzematge d'aquella informació necessària per poder autenticar-los posteriorment. És important evitar deixar la informació en clar en fitxers o bases de dades, per estalviar-nos problemes de seguretat. També, evitar encriptar els passwords.
Un esquema habitual és l'ús de resums o hash. Si guardem el hash a la BBDD, no sabrem quin és el password, però podem comparar el que entra l'usuari amb el hash guardat, i dir si és el mateix.
Això només té un problema: hi ha taules preconstruïdes per a cercar les correspondències entre hash i password. Això ens obliga a afegir un string random (salt) abans o després del password, i llavors el hash de tot plegat no és sempre el mateix per al mateix password. Aquest salt no ha de ser privat, compleix l'objectiu de fer inútils les tàctiques habituals per esbrinar passwords, i per tant es pot guardar en clar a la BBDD.
A l'hora de fer l'autenticació només haurem de fer la comparació entre el hash emmagatzemat i el calculat.
Un exemple:
resum := salt + ":" + hash(salt + password)
L'autenticació implica, habitualment, recollir la identificació de l'usuari per tal de comprovar la seva autenticitat.
Un cop tenim l'usuari autenticat, aquest pot rebre un identificador generat pel servidor i que el client haurà de fer arribar cada petició al servidor per tal de confirmar que està autenticat.
Les aplicacions client / servidor es poden diferenciar en dos tipus: stateful i stateless: amb i sense estat. Això es refereix al fet que el servidor emmagatzemi o no dades associades a l'usuari autenticat, el que s'anomena sessió.
En el cas de les aplicacions web, el fet que un usuari està autenticat es reflecteix amb algun tipus de dada emmagatzemada en el navegador. Poden ser de dos tipus, principalment: cookies i web storage.
Aquestes dues tecnologies podrien emmagatzemar identificacions per accedir a aplicacions. Les cookies envien la informació directament al servidor, mentre el web storage permet gestionar la informació al client, exclusivament.
En el cas que l'identificador no estigui xifrat, és important que no sigui fàcilment deduïble per evitar que es puguin construir maliciosament (ID aleatori i llarg). JWT proporciona l'opció de xifrar la informació d'accés i autorització.
A continuació, es comenten alguns possibles esquemes web d'autenticació.
HTTP Basic Authentication utilitza una capçalera del tipus:
Authorization: Basic base64(username:password)
Les cookies són el mètode més clàssic, i permeten dos headers especials, un del servidor:
Set-Cookie: sessionId=shakiaNg0Leechiequaifuo6Hoochoh; path=/; Secure; HttpOnly; SameSite
i un altre des del client:
Cookie: sessionId=shakiaNg0Leechiequaifuo6Hoochoh
Els tokens (bearer) es passen utilitzant una capçalera:
Authorization: Bearer ujoomieHe2ZahC5b
Els tokens solen tenir un límit de validesa, i s'utilitzen sovint amb aplicacions stateless.
Les firmes (signatures) signen i envien les dades significatives de la petició en format formulari. Per exemple: API AWS.
Els certificats de client TLS realitzen un handshake abans de cap petició HTTP.
L'autenticació es pot fer a partir d'alguna cosa que l'usuari sap, té o és. Podem tenir un sol factor d'autenticació, o combinar-los. És habitual tenir un doble factor d'autenticació en serveis més segurs.
Un segon factor habitual és el One-Time Password (OTP). Es poden basar en sincronització de temps o algorismes matemàtics que generen cadenes. Hi ha dues implementacions: HOTP (HMAC) i TOTP (Time). La diferència és què compateixen per generar la contrasenya: un comptador o el temps (Google Authenticator).
La generació es fa amb aquesta fòrmula:
Un cop l'usuari ha estat autenticat, hi ha un nombre de permisos que se li assignen en funció del seu rol dins de l'aplicació. Hi ha diferents formes d'assignar-los:
Un cop assignats els permisos, és important fer-los efectius en cadascuna de les interaccions de l'usuari amb el sistema. Això pot fer-se tant stateless (exemple: autoritzacions dins de JWT) com stateful (emmagatzematge a la sessió del servidor).
Autenticació amb sessió
Autenticació amb token
La seguretat ha de ser una preocupació, no una funcionalitat.
Aquesta és una llista de possibles criteris a tenir en compte per a dissenyar codi segur:
Aspectes tècnics que potencien la seguretat del codi:
addExact
, multiplyExact
, decrementExact
).Tenim eines dinàmiques (que executen el codi) i estàtiques (analitzen el codi sense executar-lo).
Dinàmic:
Estàtic:
Segons OWASP 2018, aquest és el TOP 10 dels controls que hauria de fer un desenvolupador:
Segons OWASP 2017:
Webauthn (Web Authentication) és un estàndar web (W3C) especificat per la FIDO Alliance que defineix una interfície per autenticar usuaris a aplicacions web i serveis mitjançant criptografia de clau pública. En el client, es pot implementar de diverses formes: purament en software, o bé mitjançant un gadget hardware, com per exemple un dispositiu USB. També Android està certificat.
El procediment té dues parts:
Registre de credencials
Autenticació
OAuth és un protocol web d'autorització per concedir als llocs web l'accés a algunes de les vostres dades personals o drets d'accés a algun sistema.
L'objectiu és obtenir un token d'accés per a accedir a un recurs protegit. Hi ha quatre modalitats:
Aquests dos servidors se solen anomenar "API del servei".
Hi ha dos conceptes relacionats amb OAuth:
JWT ens permet fer autorització. És un estàndar obert basat en JSON que permet crear tokens d'accés per a propagar identitat i afirmacions (claims). El token és compacte i pot ser enviat en l'entorn web perquè es pugui emmagatzemar al client. El token està signat pel servidor (amb una clau privada), per la qual cosa tant el servidor com el client poden verificar que és legítim.
Les afirmacions estàndar són:
L'autenticació basada en token es pot utilitzar per habilitar una arquitectura stateless, però també es pot utilitzar en arquitectures stateful. Per exemple, un JWT pot contenir totes les dades de sessió necessàries, codificades directament al token, en aquest cas suporta una arquitectura stateless. JWT també es pot utilitzar per emmagatzemar una referència o ID per a la sessió; en aquest cas, les dades de sessió s’ha d’emmagatzemar del costat del servidor, fent que l’arquitectura sigui stateful.
Un esquema de funcionament habitual és el d'access token/refresh token:
Seguretat:
Autenticació / autorització: