Назад | Перейти на главную страницу

Миграция хэшей паролей из glftpd 2.01 (PKCS5_PBKDF2_HMAC_SHA1) в proftpd + mod_sql_passwd

Для перехода с закрытого кода de-factor glftpd 2.01 на proftpd мне нужно перенести хэши паролей учетных записей пользователей с glftpd на proftpd. Читая эту тему, я решил, что mod_sql_passwd должен помочь.

Поэтому я настроил свой сервер proftpd следующим образом:

<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>

Хэши в glftpd passwd выглядят так:

$7e8ab0c7$bf044082ab83875eeb3a2158cd6253f8e88f40cf

База данных выглядит так (представление 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"

Все конфигурации на данный момент приводят к:

USER test (Login failed): No such user found

Хотя на самом деле пользователь существует, и путем изменения хеша на хеш в стиле Crypt () Bcrypt, вход в систему проходит успешно.

Вопросы / проблемы:

Было бы здорово услышать от кого-нибудь, как у вас была аналогичная задача и был некоторый опыт в этом виде миграции. Также приветствуются дополнительные подсказки, помогающие решить эту тему.

[¹] 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

Решено:

<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>

Должен был

  • определить шестнадцатеричную кодировку символов нижнего регистра с помощью SQLPasswordEncoding и SQLPasswordSaltEncoding
  • исправить длину вывода с 40 до 20 байт с помощью SQLPasswordPBKDF2
  • добавить SQLPasswordOptions чтобы указать модулю сначала декодировать шестнадцатеричные значения, а затем использовать хеши
  • включить SQLPasswordEngine