为了从 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
解决:
必须
SQLPasswordEncoding
用和定义小写字符十六进制编码SQLPasswordSaltEncoding
SQLPasswordPBKDF2
SQLPasswordOptions
以指示模块首先解码十六进制值,然后使用散列SQLPasswordEngine