web-dev-qa-db-ja.com

glftpd 2.01(PKCS5_PBKDF2_HMAC_SHA1)からproftpd + mod_sql_passwdへのパスワードハッシュの移行

デファクターのクローズドソースglftpd2.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>

Glftpdpasswdのハッシュは次のようになります。

$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は、「USER test(Login failed):No such user found」以外の情報を生成しませんが、通常の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

2
M. Schmidt

解決済み:

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

しなければならなかった

  • 小文字の16進エンコーディングをSQLPasswordEncodingおよびSQLPasswordSaltEncodingで定義します
  • SQLPasswordPBKDF2を使用して出力長を40バイトから20バイトに修正します
  • SQLPasswordOptionsを追加して、最初に16進値をデコードし、次にハッシュを使用するようにモジュールに指示します。
  • SQLPasswordEngineを有効にします
1
M. Schmidt