Mysql

將密碼雜湊從 glftpd 2.01 (PKCS5_PBKDF2_HMAC_SHA1) 遷移到 proftpd + mod_sql_passwd

  • May 16, 2020

為了從 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 樣式散列,但登錄成功。

問題/問題:

  • 從 glftpd 可用的少量資源中不清楚 glftpd 的雜湊使用了多少次迭代,可以得出 100 的迭代值
  • 尚不清楚美元符號是否應添加到鹽和雜湊值之前
  • 帶有 DebugLevel 10 的proftpd 除了“使用者測試(登錄失敗):沒有找到這樣的使用者”之外沒有其他資訊,但是,使用普通的 Crypt() Bcrypt 類型的雜湊它可以完美地工作(參見配置的頂部)
  • 目前還不清楚 glftpd 2.01 雜湊是如何構造的,我嘗試SQLPasswordOptions HashPassword HashSalt了這似乎最合乎邏輯的方法,但沒有成功$$ ² $$

很高興聽到有人有類似的任務並在這種遷移方面取得了一些經驗。也歡迎提供有助於解決此主題的其他線索。

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

引用自:https://serverfault.com/questions/1010310