Saya telah menulis skrip Python CGI yang menjalankan bash
perintah, dan perlu menguji agar login berhasil di host.
Bagaimana saya menulis tes untuk itu?
Misalnya, dapatkah saya membuat bash
skrip yang menguji kombinasi nama pengguna dan kata sandi yang diberikan terhadap pengguna terdaftar di host?
login
program.Jawaban:
Menggunakan PAM adalah solusi terbaik. Anda dapat menulis kode C kecil, atau menginstal paket python-pam dan menggunakan skrip python yang datang dengan paket python-pam. Lihat
/usr/share/doc/python-pam/examples/pamtest.py
sumber
/usr/share/doc/packages/python-pam/examples/pamtest.py
Script pamtest.py dapat digunakan untuk menguji kredensial pada sistem menggunakan PAM untuk otentikasi, termasuk dalam paket python-pam (yang membutuhkan python), dan dalam beberapa distribusi path lengkapnya adalah/usr/share/doc/python-pam/examples/pamtest.py
.Pendekatan yang tepat untuk menguji apakah pengguna dapat masuk adalah benar-benar masuk sebagai pengguna itu.
Jadi yang saya rekomendasikan adalah membuat skrip CGI digunakan
expect
untuk menjalankansu
, meneruskan kata sandi dan menjalankan perintah yang harus dijalankan. Berikut adalah konsep skrip ekspektasi yang melakukan hal ini (peringatan: benar-benar belum teruji, dan saya tidak fasih dalam berharap). Mengganti nama pengguna, kata sandi, dan perintah (tempat saya menulisbob
,swordfish
dansomecommand
); pastikan untuk mengutip dengan benar.Jika Anda benar-benar tidak ingin menjalankan perintah melalui lapisan
su
(misalnya karena apa yang Anda lakukan harus dilakukan oleh proses CGI itu sendiri), maka gunakan harapkan untuk menjalankan perintahtrue
dan periksa bahwa status pengembalian adalah 0.Pendekatan lain adalah dengan menggunakan PAM secara langsung dalam aplikasi Anda, melalui pengikatan PAM Python .
sumber
su -c true bob && echo success
sangat memalukan bahwa su tidak menerima kata sandi sebagai argumensu
dari skrip CGI dan perlu terminal agar bisa berfungsi./bin/true
apakah cukup.Untuk menjawab secara lebih spesifik: "Apakah mungkin membuat skrip bash yang akan menguji kombinasi nama pengguna dan kata sandi yang diberikan terhadap pengguna terdaftar di host?"
Iya.
sumber
shadow
grup, yang sangat tidak disarankan untuk CGI: Anda perlu eskalasi lapisan privilege lain. Dan Anda mengasumsikan algoritma hashing kata sandi tertentu (yang didukung oleh openssl) dan lokasi penyimpanan kata sandi (/etc/shadow
sebagai lawan dari NIS atau LDAP) yang mungkin atau mungkin bukan yang sebenarnya digunakan untuk pengguna tertentu.Ada solusi PAM 'C', 'Python' yang dikutip di sini, izinkan saya meletakkan satu perl juga :-)
Sumber: http://search.cpan.org/~nikip/Authen-PAM-0.16/PAM/FAQ.pod#1._Can_I_authenticate_a_user_non_interactively ?
sumber
Jika Anda memiliki akses root, dan menggunakan kata sandi md5, dan Anda hanya perlu membandingkan kata sandi, maka Anda dapat menggunakan modul perl Crypt :: PasswdMD5 . Ambil MD5 Hash dari / etc / shadow, lepas $ 1 $, lalu bagi sisa $. Field 1 = Garam, Field 2 = teks crypted. Lalu masukkan input teks ke dalam CGI Anda, bandingkan dengan teks yang di-crypted, dan Bob, paman Anda.
sumber
shadow
grup, yang sangat tidak disarankan untuk CGI: Anda perlu eskalasi lapisan privilege lain. Dan Anda mengasumsikan algoritma hashing kata sandi tertentu (MD5 dan bukan bcrypt atau algoritma yang disarankan lainnya) dan lokasi penyimpanan kata sandi (/etc/shadow
sebagai lawan dari misalnya NIS atau LDAP) yang mungkin atau mungkin bukan yang benar-benar digunakan untuk pengguna tertentu.Setelah beberapa pencarian saya menulis program C ini yang dapat digunakan dari skrip
Anda mengompilasinya dengan:
Anda dapat menggunakannya sebagai
sumber
shadow
grup, yang sangat tidak disarankan untuk CGI: Anda perlu eskalasi lapisan privilege lain. Dan Anda mengasumsikan algoritma hashing kata sandi tertentu (yang didukung oleh openssl) dan lokasi penyimpanan kata sandi (/etc/shadow
sebagai lawan dari NIS atau LDAP) yang mungkin atau mungkin bukan yang sebenarnya digunakan untuk pengguna tertentu. Gunakan PAM, ia tahu tugasnya.Karena Anda menyebutkan bahwa Anda menggunakan CGI dalam python, mungkin tepat untuk menganggap bahwa Anda menggunakan Apache sebagai server httpd Anda. Jika demikian, biarkan proses otentikasi program Anda ke Apache dan hanya biarkan orang yang diautentikasi mengeksekusi skrip / program cgi Anda.
Ada banyak modul yang dapat melakukan otentikasi untuk Anda di Apache, itu benar-benar tergantung pada jenis mekanisme otentikasi yang Anda cari. Cara Anda mengutip dalam pertanyaan tampaknya terkait dengan otentikasi akun host lokal berdasarkan / etc / passwd, file shadow. Modul yang datang ke pencarian cepat saya tentang ini
mod_auth_shadow
. Keuntungannya adalah Anda mengizinkan seseorang yang berwenang (berjalan pada privilege port 80) untuk mengotentikasi pengguna / kata sandi untuk Anda dan Anda dapat mengandalkan informasi yang diautentikasi dari pengguna untuk menjalankan perintah atas nama pengguna, jika diperlukan.Tautan yang baik untuk memulai:
http://adam.shand.net/archives/2008/apache_tips_and_tricks/#index5h2
http://mod-auth-shadow.sourceforge.net/
http://www.howtoforge.com/apache_mod_auth_shadow_debian_ubuntu
Pendekatan lain adalah dengan menggunakan modul SuEXEc dari Apache, yang mengeksekusi proses (program cgi) atas nama pengguna yang diautentikasi.
sumber
Kode ini menggunakan PAM bekerja untuk saya:
sumber
Hal terbaik yang dapat Anda lakukan, jika Anda memerlukan skrip untuk login ke sebuah host, adalah mengkonfigurasi kunci ssh antara host.
Tautan: http://pkeck.myweb.uga.edu/ssh/
Saya cukup banyak mengangkat ini dari halaman
Pertama, instal OpenSSH pada dua mesin UNIX, cepat dan kekar. Ini berfungsi paling baik menggunakan kunci DSA dan SSH2 secara default sejauh yang saya tahu. Semua HOWTO lain yang saya lihat sepertinya berhubungan dengan kunci RSA dan SSH1, dan instruksi yang tidak mengejutkan gagal untuk bekerja dengan SSH2. Pada setiap mesin ketik ssh somemachine.example.com dan buat koneksi dengan kata sandi Anda yang biasa. Ini akan membuat dir .ssh di direktori home Anda dengan perms yang tepat. Di mesin utama Anda di mana Anda ingin kunci rahasia Anda hidup (katakan saja cepat), ketik
Ini akan meminta Anda untuk frasa sandi rahasia. Jika ini adalah kunci identitas utama Anda, pastikan untuk menggunakan kata sandi yang baik. Jika ini berfungsi dengan baik, Anda akan mendapatkan dua file bernama id_dsa dan id_dsa.pub di dir .ssh Anda. Catatan: dimungkinkan untuk hanya menekan tombol enter saat diminta untuk frasa sandi, yang akan membuat kunci tanpa frasa sandi. Ini adalah Ide Buruk ™ untuk kunci identitas, jadi jangan lakukan itu! Lihat di bawah untuk penggunaan kunci tanpa frasa sandi.
Salin file id_dsa.pub ke direktori .ssh host lain dengan namaotorisasi_keys2. Sekarang burly siap menerima kunci ssh Anda. Bagaimana cara mengetahui kunci mana yang digunakan? Perintah ssh-add akan melakukannya. Untuk tes, ketik
Ini akan memulai ssh-agent, menambahkan identitas default Anda (meminta Anda untuk frasa sandi Anda), dan menelurkan shell bash. Dari shell baru ini Anda harus dapat:
Anda harus bisa masuk
sumber