![doble factor OTP a Drupal 10](/sites/default/files/styles/imatge_articles/public/2024-07/doble-factor-OTP-a-drupal.png?itok=zl7VloUm)
El meu projecte Drupal actual identifica als usuaris validant-los via LDAP contra l'Active Directory. Ara, per mesures de seguretat, també he implementat el doble factor que obliga al fet que escriguen el codi que els arriba al telèfon.
A la feina tenim necessitats de seguretat d'alt nivell i des del CCN, el Centre Criptològic Nacional ens estan assessorant i dirigint per a aplicar directives de seguretat avançades per tal de complir l'Esquema Nacional de Seguretat. I una d'aquestes bones pràctiques a implantar és el doble factor en l'autenticació d'usuaris a totes les nostres aplicacions web, d'aquesta manera encara que un intrús aconseguisca accés a l'ordinador de l'organització o endevine la contrasenya d'algú, no podrà acccedir.
A Drupal 10 tenim el mòdul Two-factor Authentication (TFA): https://www.drupal.org/project/tfa , però té uns quants requeriments que cal instal·lar i configurar prèviament.
COMENCEM LA INSTAL·LACIÓ DE MÒDULS PREVIS
Primer de tot, requereix el mòdul Encrypt, per tant, cal instal·lar-ho.
El mòdul Encrypt té una API, però no inclou mètodes de cifrat. Així doncs, necessitem també instal·lar un mòdul de cifrat al Drupal. Instal·larem el mòdul Real AES.
Però quan anem a instal·lar el mòdul Real AES veurem que també té uns requisits que ens mostra Drupal en un warning superior de color negre dient-nos que necessita la llibreria PHP-Encryption i que cal instal·lar-la amb composer:
Aleshores, instal·larem PHP-Encryption amb composer de la següent manera:
$ composer require defuse/php-encryption
També necessitem instal·lar la llibreria de l'OTP, ho farem amb composer també:
$ composer require christian-riesen/otp
Finalment, ja podremprocedir a fer la instal·lació del mòdul RealAES en Drupal:
També requereix el mòdul key, aleshores cal instal·lar-ho.
I per últim, també és necessari instal·lar (sembla que no acabem mai d'instal·lar requisits, però ja estem acabant!) la llibreria PHP-QR Code, que ens servirà per a llegir i generar codis QR. Instal·larem aquesta llibreria amb:
$ composer require chillerlan/php-qrcode
CONFIGURACIÓ DEL DOBLE FACTOR
Doncs bé, una vegada hem instal·lat el mòdul tfa, el mòdul encrypt i el mòdul key, tindrem 3 noves opcions en la part d'administració del nostre Drupal:
Començarem configurant una clau, des del mòdul Key, que després farem servir amb el mòdul Encrypt. Començarem anant a "Keys" i crearem una clau nova:
Ficarem les següents dades:
- Key name: key
- Descripció: key para TFA
- Key type: Encryption
- Key size: 128
- Key provider: Configuración
- Key value: fiquem una clau aleatòria que generem amb alguna web generadora de claus.
- Marquem el checkbox de "Base64-encoded"
I guardem:
Ara anem al segon pas, entrarem en Encryption profiles i crearem un nou perfil fent click en Add a profile:
Omplirem les dades Etiqueta, Encryption Method i en l'opció "Encryption Key" li direm "key", que és la clau que hem creat en el pas nº 1:
I una vegada desem la informació, hem d'anar a la pestanyeta de "Configuració" i marcar el checkbox que diu que també acceptem mòduls 'deprecated':
I bé, com que ja tenim el pas nº 1 (la clau) i el pas nº 2 (l'encriptació), ja podem configurar el pas nº 3, el TFA o Two Factor Authenticator des de la part d'administració de Drupal.
Marcarem tots els rols individuals que vullguem o, si volem obligar a tots els usuaris a autenticar-se també amb doble factor, marcarem la primera opció "Usuari autenticat":
En el meu projecte, al final no he marcat eixa primera opció, i he marcat els altres rols, ja que tots els meus usuaris tenen un rol, i així puc fer proves de desenvolupament amb algun usuari que no tinga rol sense necessitat d'autenticar-me amb doble factor.
En Allowed Validation plugins marquem: TFA Time-based one-time password (TOTP).
En Encryption Profile marquem: Perfil de encriptación.
En Skip Validation marquem: 3. (Podem configurar el número d'intents que vullguem, clar).
Marcarem el checkbox de Flood Control With UID Only i ficarem el número 300.
En TFA Flood Threshold, li direm: 6.
I després he fet la traducció de tots els textos:
UN ÚLTIM HACK ABANS D'ACABAR
El meu projecte Drupal 10 és especial, ja que l'autenticació dels usuaris no la faig contra la base de dades local de Drupal, sinó que la faig amb els usuaris que tinc en l'Active Directory de la meua organització autenticant els usuaris via LDAP, tal i com vaig detallar en l'article "Instal·lant el mòdul LDAP a Drupal 10 per una autenticació d'usuaris centralitzada".
Doncs bé, resulta que per defecte el mòdul tfa falla autenticant a usuaris perquè cerca la contrasenya en la base de dades local de Drupal 10 i no en l'Active Directory que tenim a un altre servidor.
Aleshores, per tal que la meua web funcione bé i agafe la contrasenya de l'Active Directory, comentarem les següents línies del fitxer /src/Form/TfaSetupForm.php del mòdul de tfa:
$current_pass = $this->passwordChecker->check(trim($form_state->getValue('current_pass')), $account->getPassword());
//if (!$current_pass) {
//$form_state->setErrorByName('current_pass', $this->t("Incorrect password."));
//}
return;
(Vist als fòrums de Drupal https://www.drupal.org/project/tfa/issues/2855394)
I bé, amb això l'usuari ja podrà accedir ficant la seua contrasenya de l'Active Directory i, a continuació, ja podrà escanejar el codi QR i verificar el doble factor OTP en la web de Drupal.