Langkah apa yang dilalui sistem saat menangani koneksi SSH?

9

Langkah apa yang dilalui sistem saat menangani koneksi SSH?

  1. Kami mencoba masuk melalui ssh
  2. sshd mulai modul pam dan pam untuk mengotentikasi kami
  3. Bergantung pada konfigurasi pam, kami perlu memberikan nama pengguna dan kata sandi (pemeriksaan passwddan shadowfile pam )
  4. cek pam untuk hosts.allow/deny, /etc/shellsdan hal-hal lain
  5. Jika semuanya berjalan dengan baik, kami masuk
  6. ???
  7. Shell dimulai

Jadi pertanyaan saya adalah mekanisme apa yang bertanggung jawab untuk memeriksa shell mana yang diberikan kepada pengguna dalam passwdfile mereka (dalam langkah 6)? Apakah pam itu sendiri, modul pam tertentu sshd,, atau yang lain? Saya tahu saya bisa mengganti passwdfile (untuk memeriksa nama pengguna dan kata sandi) dengan menulis modul pam, tetapi bagaimana saya bisa mengganti passwdfile untuk entri shell?

pbm
sumber

Jawaban:

8

Sejauh yang saya tahu, PAM tidak menentukan shell pengguna, ini diserahkan kepada aplikasi. Modul sesi PAM melakukan tindakan umum dan pemeriksaan yang harus dilakukan untuk setiap login menggunakan layanan tertentu. Jika aplikasi kemudian ingin memulai sebuah shell, itu bebas untuk melakukannya, dan biasanya akan mencari shell di database pengguna.

Dengan asumsi pertanyaan Anda adalah tentang OpenSSH , itulah yang dilakukannya: setelah pengguna diautentikasi, dan hal-hal sesi PAM telah selesai (jika dikonfigurasi untuk menggunakan PAM¹), server ssh mencari shell di database pengguna (secara langsung, tidak melalui perpustakaan PAM).

Basis data pengguna tidak terbatas pada /usr/passwddan teman. Di Linux (yang saya anggap sudah Anda gunakan sejak Anda sebutkan shadow), apa yang membentuk database pengguna ditentukan oleh passwdpengaturan di /etc/nsswitch.conf. Dalam pengaturan multi-komputer, penambahan umum ke database lokal adalah NIS dan LDAP . Jika Anda ingin menggunakan shell yang bukan yang ada di /etc/passwddalamnya, ini mungkin yang harus dikonfigurasikan (meskipun akan sedikit aneh, dan mungkin orang dapat menawarkan saran yang lebih baik jika Anda memberi tahu kami apa yang ingin Anda capai).

Jika Anda ingin memiliki pengguna tanpa akses shell penuh, solusi alami adalah mengubah /etc/passwduntuk meletakkan shell terbatas - mungkin rssh untuk memungkinkan hanya beberapa aplikasi tipe penyalin file seperti scp, rsync dan cvs. Anda juga dapat menggunakan perintah paksa di pengguna ~/.ssh/authorized_keysberkas .

Jika Anda ingin melihat jejak apa yang dilakukan server ssh, jalankan daemon sebagai ssh -ddd. Anda juga bisa mendapatkan pandangan klien ssh -vvv, meskipun di sini tampilan server adalah yang paling menarik bagi Anda.

¹ OpenSSH hanya menggunakan PAM jika dikonfigurasi dengan dukungan PAM dan UsePAMarahan diatur ke yesdalam sshd_config. Bahkan ketika menggunakan PAM, ia menawarkan metode otentikasi lain selain PAM; khususnya otentikasi kunci publik tidak melalui PAM.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya ingin mengizinkan pengguna aplikasi saya untuk masuk ke shell sebagai pengguna normal tanpa membuat akun di sistem. Data pengguna (nama pengguna, pass dan shell) akan disimpan dalam sqlite db. Langkah pertama adalah modul pam sqlite yang mengotentikasi pengguna terhadap db. Langkah kedua adalah menyediakan shell yang dibaca dari database. Jadi saya pikir itu bisa dicapai dengan menulis modul nis yang tepat. Terima kasih atas jawabannya ...
pbm
@pbm: Saya tidak berpikir Anda inginkan nis, bukan db(atau mungkin modul kustom).
Gilles 'SO- stop being evil'
itu salah ketik .. Maksud saya "dengan menulis modul nss (custom) yang tepat" ...
pbm