Tidak dapat membuat pengguna dengan kata sandi melalui ssh [ditutup]

13

Saya mencoba membuat pengguna dengan kata sandi melalui ssh (dengan izin root) seperti ini:

ssh [email protected] useradd -p $(openssl passwd -1 1234) newuser

Dengan melakukan itu, saya bisa berhasil membuat akun bernama newuser, tetapi saya tidak bisa masuk dengan kata sandi yang diharapkan (yaitu 1234)

Tidak ada bedanya jika saya menambahkan tanda kutip ganda:

ssh [email protected] "useradd -p $(openssl passwd -1 1234) newuser"

Dan kemudian saya bertanya-tanya apakah saya dapat menghasilkan kata sandi hash dan menyimpannya sebagai variabel secara lokal, tetapi masih tidak berhasil.

password=$(openssl passwd -1 1234)
ssh [email protected] "useradd -p $password newuser"

Apakah ada sesuatu yang saya rindukan? Terima kasih sebelumnya!

amigcamel
sumber
Melewati kata sandi pada baris perintah adalah ide yang buruk karena pengguna lain mungkin melihat argumen baris perintah. Lihat jawaban heemayl untuk itu. Di luar itu, ini terdengar seperti Masalah XY . Apa yang sebenarnya ingin Anda capai? Apa gunanya kata sandi akun yang tidak diketahui siapa pun (atau yang seharusnya diketahui)? Jika intinya adalah untuk membuat akun yang tidak menerima login melalui kata sandi, cukup atur sama sekali tidak ada kata sandi yang akan membuat log-in berbasis kata sandi dinonaktifkan sebagai kebijakan default Ubuntu.
David Foerster

Jawaban:

22

Ini adalah masalah kutipan klasik.

Masalah: Tanpa mengutip atau mengutip dua kali substitusi perintah ( $()) dan ekspansi variabel ( $kata sandi hash yang dikembalikan dengan openssldiperlakukan sebagai indikator variabel) sedang dilakukan di lingkungan lokal, bukan pada shell jarak jauh.

Solusi: gunakan tanda kutip tunggal di sekitar useraddperintah yang digunakan sshpada shell lokal untuk mencegah substitusi perintah dan ekspansi variabel pada lingkungan lokal, biarkan ekspansi berlangsung pada shell remote non-login, non-interaktif:

ssh [email protected] 'useradd -p "$(openssl passwd -1 1234)" newuser'

Perhatikan kutipannya.

Masalah keamanan:

  • rootLogin SSH harus dinonaktifkan, jika Anda harus mengaktifkannya hanya otentikasi berbasis kunci yang diizinkan

  • MD5 sudah rusak, dan tanpa garam Anda menjadi sasaran serangan tabel Rainbow sederhana (bahkan tidak perlu serangan paksa / kamus); openssl passwdtidak menghasilkan garam acak. Bagaimanapun, Anda harus benar-benar mempertimbangkan menggunakan SHA-2 dengan garam

  • Kata sandi yang dikirimkan sebagai argumen untuk perintah mungkin terlihat oleh proses lain dalam sistem (jarak jauh); ini tergantung pada bagaimana Anda di procfs-mount (lihat hidepid), dan jika perintah sedang menulis ulang sendiri (hal ini mungkin tidak)

heemayl
sumber
1
Bekerja seperti pesona, dan terima kasih atas informasi tambahannya!
amigcamel
1
hash kata sandi md5crypt memang memiliki garam ...
ilkkachu
@ilkkachu MD5 bukan hash yang aman. Jika Anda tertarik, jalankan pencarian di Keamanan Informasi . Sebenarnya Anda harus menggunakan algoritma gabungan atau pustaka kriptografi, tetapi SHA-2 secara signifikan lebih baik daripada MD5.
wizzwizz4
1
@ wizzwizz4 ya, itu sudah terkenal, tidak mengubah fakta bahwa informasi dalam jawaban ini salah. :)
hobbs
2
@ wizzwizz4, kata sandi hash ( md5crypt ) yang didukung oleh crypt(3)Linux dan ditandai dengan $1$pengenal tidak sama dengan algoritma hash MD5 biasa, dengan cara yang sama seperti kata sandi$5$ dan $6$ hash tidak polos SHA-256 dan SHA-512. . Metode berbasis MD5 memiliki sejumlah iterasi, yang merupakan masalah terbesar dengannya.
ilkkachu
7

Seperti yang dicatat oleh @heemayl, algoritma hash kata sandi MD5 sudah tua, dan sistem saat ini menggunakan hash kata sandi berbasis SHA-2 yang lebih baru, yang memiliki faktor kerja yang dapat disesuaikan. Tetapi alat baris perintah OpenSSL tampaknya tidak mendukung itu.

The chpasswdutilitas , bagaimanapun, akan memungkinkan Anda untuk mengubah password dari pengguna sesuai dengan pengaturan sistem.

Ini akan memungkinkan Anda untuk membuat pengguna baru dan mengubah kata sandi mereka di ujung jarak jauh.

echo "newuser:newpass" | ssh [email protected] 'useradd newuser; chpasswd' 

chpasswdmengambil nama pengguna dan kata sandi dari stdin, bukan baris perintah. Ini sebenarnya merupakan keuntungan karena argumen baris perintah terlihat untuk semua proses lain pada sistem, jadi jika dijalankan openssl passwdpada remote, kata sandi akan terlihat sementara untuk semua proses pada sistem.

Saya tidak yakin apakah ada utilitas baris perintah yang sudah jadi untuk menghasilkan hash kata sandi yang dikenal dengan crypt(3)fungsi sistem . Perl memiliki cryptfungsi bawaan, tetapi garam yang tepat masih perlu dihasilkan.

ilkkachu
sumber