web-dev-qa-db-ja.com

MySQLを使用したPure-ftpd-Crypt()がハッシュされたパスワードでログインしない

私はユーザーを認証するためにmysqlでpure-ftpdを使用しています。

これが私のmysql.confです

MYSQLServer     localhost
MYSQLPort       3306
MYSQLSocket     /var/run/mysqld/mysqld.sock
MYSQLUser       user
MYSQLPassword   pwd
MYSQLDatabase   my_db
MYSQLCrypt      crypt()
MYSQLGetPW      SELECT password FROM ftp_users WHERE login="\L"
MYSQLGetUID     SELECT u_id FROM ftp_users WHERE login="\L"
MYSQLGetGID     SELECT g_id FROM ftp_users WHERE login="\L"
MYSQLGetDir     SELECT dir FROM ftp_users WHERE login="\L"
MySQLGetQTAFS   SELECT quota_files FROM ftp_users WHERE login="\L"
MySQLGetQTASZ  SELECT quota_size FROM ftp_users WHERE login="\L"
MySQLGetRatioUL SELECT ul_ratio FROM ftp_users WHERE login="\L"
MySQLGetRatioDL SELECT dl_ratio FROM ftp_users WHERE login="\L"
MySQLGetBandwidthUL SELECT ul_bandwidth FROM ftp_users WHERE login="\L"
MySQLGetBandwidthDL SELECT dl_bandwidth FROM ftp_users WHERE login="\L"

次に、pure-ftpd-mysqlとpure-ftpdを再起動してみました

私のテーブルには、pwdが次のようなフィールドがあります

password    varchar(255)

プレーンテキストのpwdを使用してユーザーを挿入すると、ログインとパスワードの両方で正常にログインできます。 SHA512やBCryptハッシュなどの「lol」を含むハッシュを挿入すると。 pwd'lol 'でログインできません。

BCrypt $2a$06$JrvxpMAvi6MnRSIvZQMMxOffIDLtEP7lrKNe0k0CTsK51v4zujfpS
SHA512 3DD28C5A23F780659D83DD99981E2DCB82BD4C4BDC8D97A7DA50AE84C7A7229A6DC0AE8AE4748640A4CC07CCC2D55DBDC023A99B3EF72BC6CE49E30B84253DAE

ただし、ハッシュを貼り付けると、プレーンテキスト値として取得されると想定しているため、正常にログインできます。

Mysql.confをに変更してみました

MYSQLCrypt      crypt

しかし、これはそれを完全に壊します。 cryptを使用すると言っているサイトはたくさんありますが、私の構成ファイルのコメントには、オプションの1つとしてcrypt()がリストされています。

私は多くの投稿やフォーラムを読みましたが、私が見つけた最も近いものはこれでした。これはまったく機能しません。

https://serverfault.com/a/630806/302696

これがpure-ftpdの始まりです

Starting ftp server: Running: /usr/sbin/pure-ftpd-mysql -l mysql:/etc/pure-ftpd/db/mysql.conf -l puredb:/etc/pure-ftpd/pureftpd.pdb -l puredb:/etc/pure-ftpd/pureftpd.pdb -E -F /etc/pure-ftpd/fortunes.txt -j -H -J ALL:!aNULL:!SSLv3 -u 1000 -8 UTF-8 -A -O clf:/var/log/pure-ftpd/transfer.log -B

つまり、基本的にcryptを使用していないか、正しく使用していません。私はそれがmysqlでネイティブにSHA512を処理することができたけれども、それはしません。私が考えることができる他のことは、構成を含むコードが必要であるが、なぜそれが何かを必要とするのかわからないということです。

1

--- BEGIN tl; dr ---

Pure-FTPdがglibc2.7以降を搭載したLinuxホストで実行されていると仮定します。

  • _MySQLCrypt crypt_ –括弧なしを使用する
  • Pure-FTPdが実行されているのと同じシステムで次のPython 3ワンライナーを実行します。

    _python3 -c 'import sys, crypt, getpass; print(crypt.crypt(getpass.getpass("Password: "), crypt.METHOD_SHA512))'
    _
  • 希望のパスワードを入力します。

  • 暗号化されたパスワード(_$6$_で始まる)をコピーしてデータベースに貼り付けます。

--- END tl; dr ---

非プレーンテキストMySQLCryptの背後にある考え方は、プレーンテキストのパスワードを完全に無効にすることです。括弧で囲まれたMySQLCrypt crypt()は、ハッシュをプレーンテキストパスワードとして引き続き受け入れます。これは、Pure-FTPdが文字列crypt()を不明な暗号化メソッドとして扱い、プレーンテキストのデフォルトの暗号化メソッドを使用してディレクティブを完全に無視したことを示しています。代わりに。括弧で囲まれていない_MySQLCrypt crypt_平文ログインを「壊す」ことは、実際には正しい方向への一歩です。平文ログインを無効にし、データベース内のパスワードを暗号化されたものとしてのみ扱い始めました。

ここで問題となるのは、パスワードを適切にハッシュして受け入れ可能な形式にする方法です。 Pure-FTPdの_src/mysql.c_によると、_MySQLCrypt crypt_により、crypt()関数が使用されます。この関数の受け入れ可能な形式は 実装によって異なります です。たとえば、glibc 2.7以降を搭載したLinuxマシンでPure-FTPdを実行している場合、次の4つのフォームが受け入れられます。

  • SHA-512(_$6$_で始まります)
  • SHA-256(_$5$_で始まります)
  • MD5(_$1$_で始まります)
  • 従来のDES(英数字で始まる);おそらく避けるべきですが

システムを呼び出す方法はいくつかありますcrypt();私の好みの方法はPython 3の組み込み crypt モジュールです。この短いスクリプトで入札を行います。

_import sys
from crypt import crypt, METHOD_SHA512
from getpass import getpass

print(crypt(getpass("Password: "), METHOD_SHA512))
_

または、トリプルクリック可能でコピーアンドペーストに適したワンライナーを好む場合:

_python3 -c 'import sys, crypt, getpass; print(crypt.crypt(getpass.getpass("Password: "), crypt.METHOD_SHA512))'
_

サンプル実行:

_root@ip-172-16-16-117:~# python3 -c 'import sys, crypt, getpass; print(crypt.crypt(getpass.getpass("Password: "), crypt.METHOD_SHA512))'
Password: 
$6$vTbR62VMHKQNqnEk$TmfeMj/Q6G62RM.hi7liD0IrEvtUp2.jgXbfVRPone/sFTeOwJKftTrrW9j8Hd8.kJsF36OKwP4xHrnURGZTo/
_

同じcrypt()実装を使用するには、Pure-FTPdが実行されているのと同じホストでこのコマンドを実行する必要があります。

_$6$_で始まる長い行は、暗号化されたパスワードです。 _$6$_プレフィックス自体は、SHA-512を使用してハッシュされたパスワードをマークします。システムcrypt()がSHA-512をサポートしていない場合、出力は開始されません_$6$_;この場合、別のアルゴリズムを使用する必要があります。たとえば、macOSでは、可能な出力は_$6UCLzI8sPv16_です。非常に短く、_$6_の後にドル記号がないことに注意してください。これは、crypt()のmacOS実装がSHA-512をサポートしていないためです。

4
astralblue