2 votes

Migration des hachages de mots de passe de glftpd 2.01 (PKCS5_PBKDF2_HMAC_SHA1) vers proftpd + mod_sql_passwd

Pour migrer de la source fermée glftpd 2.01 vers proftpd, j'ai besoin de migrer les hachages de mots de passe des comptes utilisateurs de glftpd vers proftpd. En lisant sur le sujet, je me suis dit que mod_sql_passwd devrait faire l'affaire.

J'ai donc configuré mon serveur proftpd comme ceci :

<global>
    SQLBackend              mysql
    SQLAuthTypes            Crypt
    SQLAuthenticate         users groups

    SQLConnectInfo  testdbuser@testdbhost testdb

    SQLUserInfo     ftpuser userid passwd uid gid homedir shell
    SQLGroupInfo    ftpgroup groupname gid members
    SQLMinID        500
    CreateHome on

[...]

    RootLogin off
    RequireValidShell off
    DefaultRoot ~
</global>

DefaultServer                   off
ServerType                      standalone

<VirtualHost 0.0.0.0>
    Port 21
    PassivePorts 10000 10250
    MasqueradeAddress 123.123.123.123

    SQLAuthTypes pbkdf2
    SQLPasswordPBKDF2 sha1 100 40

    SQLNamedQuery get-user-salt SELECT "salt FROM ftpuser WHERE userid = '%{0}'"
    SQLPasswordUserSalt sql:/get-user-salt Prepend
</VirtualHost>

Les hashs dans le passwd de glftpd ressemblent à ceci :

$7e8ab0c7$bf044082ab83875eeb3a2158cd6253f8e88f40cf

La base de données ressemble à ceci (représentation CSV) :

"id","userid","passwd","salt","uid","gid","homedir","shell","count","accessed","modified"
"1","test","bf044082ab83875eeb3a2158cd6253f8e88f40cf","7e8ab0c7","5500","5500","/data/test","/sbin/nologin","20","2020-03-31 20:02:45","2020-03-25 16:30:49"

Toutes les configurations effectuées jusqu'à présent ont pour résultat :

USER test (Login failed): No such user found

Alors qu'en fait l'utilisateur existe et en changeant le hachage en un hachage de type Crypt() Bcrypt, une connexion réussit.

Questions/problèmes :

  • il n'est pas clair combien d'itérations sont utilisées pour les hachages de glftpd à partir du peu de source disponible de glftpd, une valeur d'itération de 100 peut être déduite
  • il n'est pas clair si le signe dollar doit être ajouté au sel et aux valeurs de hachage ou pas
  • proftpd avec DebugLevel 10 ne donne aucune autre information que "USER test (Login failed) : No such user found", bien que, avec un hachage normal de type Crypt() Bcrypt, cela fonctionne parfaitement (voir le haut de la configuration).
  • La façon dont les hachages de glftpd 2.01 sont construits n'est pas claire. SQLPasswordOptions HashPassword HashSalt qui semblait le plus logique, sans succès [²].

Il serait formidable d'entendre quelqu'un qui a eu une tâche similaire et qui a acquis une certaine expérience de ce type de migration. Des indices supplémentaires permettant de résoudre ce sujet sont également les bienvenus.

[¹] https://glftpd.io/files/glftpd-LNX_2.01.tgz (bin/sources/PassChk/passhk.c) glftpd 2.01 "passchk.c" :

    PKCS5_PBKDF2_HMAC_SHA1(pwd, strlen(pwd), real_salt, SHA_SALT_LEN, 100,
               mdlen, md);

[²] http://www.proftpd.org/docs/contrib/mod_sql_passwd.html#Transformations

1voto

M. Schmidt Points 163

Résolu :

<global>
    SQLBackend              mysql
    SQLAuthTypes            Crypt
    SQLAuthenticate         users groups

    SQLConnectInfo  testdbuser@testdbhost testdb

    SQLUserInfo     ftpuser userid passwd uid gid homedir shell
    SQLGroupInfo    ftpgroup groupname gid members
    SQLMinID        500
    CreateHome on

[...]

    RootLogin off
    RequireValidShell off
    DefaultRoot ~
</global>

DefaultServer                   off
ServerType                      standalone
Port 0

<VirtualHost 0.0.0.0>
    Port 21
    PassivePorts 10000 10250
    MasqueradeAddress 123.123.123.123

    SQLPasswordEngine on

    SQLAuthTypes pbkdf2
    SQLPasswordPBKDF2 sha1 100 20

    SQLNamedQuery get-user-salt SELECT "salt FROM ftpuser WHERE userid = '%{0}'"
    SQLPasswordUserSalt sql:/get-user-salt Prepend

    SQLPasswordEncoding hex
    SQLPasswordSaltEncoding hex

    SQLPasswordOptions HashEncodeSalt HashEncodePassword
</VirtualHost>

J'ai dû

  • définir l'encodage hexagonal des caractères minuscules avec SQLPasswordEncoding y SQLPasswordSaltEncoding
  • corriger la longueur de la sortie de 40 à 20 octets avec SQLPasswordPBKDF2
  • ajouter le SQLPasswordOptions pour demander au module de décoder d'abord les valeurs hexadécimales puis d'utiliser les hachages
  • activer le SQLPasswordEngine

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X