Preseedファイルのpasswd/user-password-crypted
ステートメントに関しては、ほとんどの例でMD5ハッシュを使用しています。例:
# Normal user's password, either in clear text #d-i passwd/user-password password insecure #d-i passwd/user-password-again password insecure # or encrypted using an MD5 hash. #d-i passwd/user-password-crypted password [MD5 hash]
Debianの付録B. preseedingを使用したインストールの自動化 から。
いくつかの情報源は、SHA-512を使用することも可能であることを示しています。
次のようなハッシュ化されたパスワードを使用してみてください。
$ mkpasswd -m sha-512
[...]
そして、あなたのpreseedファイルで:
d-i passwd/user-password-crypted password $6$ONf5M3F1u$bpljc9f1SPy1w4J2br[...]
から AskUbuntuへの事前シードではユーザー作成を自動化できません 。
これはMD5よりも少し優れていますが、ブルートフォースやレインボーテーブルに対してはあまり抵抗しません。
他にどのようなアルゴリズムを使用できますか?たとえば、PBKDF2はサポートされていますか、それとも/etc/shadow
で使用されているアルゴリズム、つまり MD5、Blowfish、SHA-256およびSHA-512 によって制限されていますか?
/ etc/shadowファイルでサポートされているものなら何でも使用できると思います。 preseedファイルで指定された文字列は、/ etc/shadowに配置されるだけです。ソルトされたパスワードを作成してより困難にするためには、skオプション(-S)を指定したmkpasswdを使用するだけです。
mkpasswd -m sha-512 -S $(pwgen -yns 16 1) mypassword
$6$bLyz7jpb8S8gOpkV$FkQSm9YZt6SaMQM7LPhjJw6DFF7uXW.3HDQO.H/HxB83AnFuOCBRhgCK9EkdjtG0AWduRcnc0fI/39BjmL8Ee1
上記のコマンドでは、ソルトはpwgenによって生成されます。
debian-installerソースコード の適切な部分を見ると、ターゲットのchroot内で単に_usermod USER --password=CRYPTED-PASSWORD
_を呼び出していることがわかります。
さらにusermod
のマンページは、_--password
_オプションが「crypt(3)によって返される暗号化されたパスワード」を受け入れることを示唆しています。そして、「パスワードはローカルの/ etc/passwdまたは/ etc/shadowファイルに書き込まれます。」これは、crypt(3)
manページで説明されている暗号化されたパスワード形式のみを使用できることを示唆しています。
しかし、すべての希望が失われるわけではありません。前述のmanページから、crypt
は実際には暗号化されたパスワード文字列にソルトフィールドを含み、形式は_$hash_id$salt$hash
_であることがわかります。したがって、少なくとも原則として、Rainbowテーブルに対して耐性があるはずです。
レインボーテーブル攻撃とは別に、ブルートフォース攻撃を考慮する必要があります。 glibcのcrypt
の実装を見ると、SHA-512の複数のラウンドを使用してパスワードストレッチングを実際に実装していることがわかります。 PBKDF2。
さらに、暗号化されたパスワード(_$rounds=$
_)の追加フィールドを使用して、crypt
によって適用されるハッシュラウンドの数を実際に制御できることがわかります。 mkpasswd(1)
のmanページを見ると、これが_-R
_オプションとして公開されていることがわかります。この機能を使用すると、デフォルトのラウンド数5000(ソースコードの_ROUNDS_DEFAULT
_を参照)を大幅に引き上げることができます。私のマシンでは、計算にかかる時間は数ミリ秒未満であり、たとえば、数百万ドルかかるため、代わりに秒:
_> mkpasswd -R 10000000 -m sha-512 mypassword
$6$rounds=10000000$Rq30Hdd.0LzWq3x$XRXHvd5MnIi5MD2H8Jtn5W0cjvq4siGtUgWUaETc4QZyvuR4iY0Af.DoNfj1E6SvoHaVotAEjIiOPS3GvwJjM0
_
レインボーテーブルとブルートフォースはここでは関係ありません。
Sha-512パスワードはソルトされます。つまり、ハッシュが何であっても、パスワードはソルト値(この場合はONf5M3F1u)で始まります。レインボーテーブルを生成するには、「ONf5M3F1u」で始まるすべての入力可能な文字列のsha-512ハッシュの完全なリストを生成する必要があります。
理論上のハッシュアルゴリズム「CSUM-2」を使用したとします。これは、単純に文字を加算し、最下位ビットから2ビットのハッシュを生成します。 CSUM-2のRainbowテーブルは次のようになります。
0 d
1 a
2 b
3 c
関連するLSBは2つだけなので、実際には4つの塩(d、a、b、c)があることに注意してください。
したがって、ソルトを使用したパスワード「b」の4つのハッシュを想像してみてください。塩が前に付いているので、ハッシュするでしょう。 "db"は "b"だけを取得し、 "ab"は "c"を取得します。
$-1$d$b
$-1$a$c
$-1$b$d
$-1$c$a
Rainbowテーブルを使用してCSUM-2をクラックするには、それぞれ4つのエントリを持つ4つの個別のRainbowテーブルが必要です。
上記のように9文字のソルトでsha-512をクラックするには、62個の完全なRainbowテーブルが必要です。最大9文字の英数字に対応するsha-512 Rainbowテーブルのサイズは864GBです。この種のソルティングでは、62個、つまり52TBのテーブルが必要です。
2 ^ 512は、9文字のパスワードが提供できる以上のものであることに注意してください。 1.3 x 10 ^ 154のハッシュと、1.35 x 10 ^ 19の9文字の英数字のパスワードがあります。パスワードが長いほど、パスワードスペースが大きくなり、エントリが増え、テーブルが大きくなります。これは、塩の数を線形に、塩の長さを指数関数的に乗算します。
誰かがそれらすべてのテーブルを生成して保存する必要があります。
PBKDF2は単に計算を何度も実行します。ただし、PBKDF2出力は常に同じであるため、他のアルゴリズムと同じようにPBKDF2をクラックするRainbowテーブルに戻ります。
PAMはrounds
パラメーターを使用してキーストレッチを実行することもできます。デフォルトは5,000、最小は1,000です。 rounds=65536
は、ログイン試行ごとにSHA-512を2 ^ 16回実行します。これにより、ブルートフォーシングが遅くなりますが、事前に計算されたRainbowテーブルはまだ関係ありません。レインボーテーブルを構築して保管することは、前述のように困難です。