私はユーザーを認証するために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を処理することができたけれども、それはしません。私が考えることができる他のことは、構成を含むコードが必要であるが、なぜそれが何かを必要とするのかわからないということです。
--- 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つのフォームが受け入れられます。
$6$
_で始まります)$5$
_で始まります)$1$
_で始まります)システムを呼び出す方法はいくつかあります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をサポートしていないためです。