私は次のようにssh経由で(root権限で)パスワードを持つユーザーを作成しようとしました:
ssh [email protected] useradd -p $(openssl passwd -1 1234) newuser
そうすることで、newuser
という名前のアカウントを正常に作成できましたが、予想されるパスワード(1234
)でログインできませんでした
二重引用符を追加しても違いはありません。
ssh [email protected] "useradd -p $(openssl passwd -1 1234) newuser"
そして、ハッシュされたパスワードを生成し、それを変数としてローカルに保存できるが、それでも運がないのではないかと思っていました。
password=$(openssl passwd -1 1234)
ssh [email protected] "useradd -p $password newuser"
見逃しているものはありますか?前もって感謝します!
これは古典的な引用の問題です。
問題:コマンド置換($()
)および変数展開(openssl
によって返されるハッシュ化されたパスワードの$
sは、引用符または二重引用符なしで扱われます。変数インジケータ)は、リモートシェルではなくローカル環境で実行されます。
Solution:ローカルシェルでuseradd
とともに使用されるssh
コマンドを単一引用符で囲んで、ローカル環境でのコマンドの置換と変数の展開を防ぎ、展開をリモートの非ログイン、非対話型シェル:
ssh [email protected] 'useradd -p "$(openssl passwd -1 1234)" newuser'
引用に注意してください。
セキュリティの問題:
SSH root
ログインを無効にする必要があります。有効にする必要がある場合は、キーベースの認証のみを許可する必要があります
MD5はすでに壊れており、ソルトがないと、単純なレインボーテーブル攻撃を受けます(ブルートフォース/辞書攻撃さえ必要ありません)。ただし、openssl passwd
はランダムなソルトを生成します。とにかく、あなたは本当に塩漬けでSHA-2を使用することを考慮すべきです
コマンドに引数として渡されたパスワードは、(リモート)システム内の他のプロセスから見える場合があります。これは、procfs
のマウント方法(hidepid
を見る)と、コマンドがそれ自体を書き換えているかどうかによって異なります(この場合はおそらくそうではありません)
@heemaylが指摘したように、MD5パスワードハッシュアルゴリズムは古くなっており、現在のシステムでは、カスタマイズ可能な作業要素を持つ新しいSHA-2ベースのパスワードハッシュが使用されています。しかし、OpenSSLコマンドラインツールはそれらをサポートしていないようです。
chpasswd
ユーティリティ では、システム設定に従ってユーザーのパスワードを変更できます。
これにより、リモートエンドで新しいユーザーを作成し、パスワードを変更できるようになります。
echo "newuser:newpass" | ssh [email protected] 'useradd newuser; chpasswd'
chpasswd
は、コマンドラインではなく、stdinからユーザー名とパスワードを取得します。これは、コマンドライン引数がシステム上の他のすべてのプロセスに対して表示されるため、実際には利点です。したがって、リモートでopenssl passwd
を実行すると、システム上のすべてのプロセスに対してパスワードが一時的に表示されます。
システムcrypt(3)
関数によって知られているパスワードハッシュを生成するための既製のコマンドラインユーティリティがあるかどうかはわかりません。 Perlには crypt
関数 が組み込まれていますが、適切なソルトを生成する必要があります。