Apa perbedaan antara / sbin / nologin dan / bin / false?

69

Saya sering mendengarnya merekomendasikan bahwa akun pengguna harus dinonaktifkan dengan mengatur cangkangnya /bin/false. Tetapi, pada sistem Linux saya yang ada, saya melihat bahwa sejumlah besar akun yang ada (semuanya akun layanan) memiliki cangkang /sbin/nologinsebagai gantinya.

Saya melihat dari halaman manual yang /sbin/nologinmencetak pesan ke pengguna yang mengatakan akun dinonaktifkan, dan kemudian keluar. Agaknya /bin/falsetidak mau mencetak apa pun.

Saya juga melihat yang /sbin/nologinterdaftar /etc/shells, sementara /bin/falsetidak.

Halaman manual mengatakan bahwa FTP akan menonaktifkan akses untuk pengguna dengan shell yang tidak terdaftar /etc/shellsdan menyiratkan bahwa program lain dapat melakukan hal yang sama. Apakah itu berarti seseorang dapat masuk dengan akun yang memiliki /sbin/nologinshell?

Apa bedanya di sini? Yang mana dari ini yang harus saya gunakan untuk menonaktifkan akun pengguna, dan dalam keadaan apa? Apa efek lain yang /etc/shellsdimiliki listing ?

Michael Hampton
sumber
1
Sebagai informasi umum yang berfungsi. Saya sedang berpikir khusus dari perspektif administrasi sistem.
Michael Hampton
Dimaksudkan sebagai latar belakang.
dmourati

Jawaban:

70

/bin/falseadalah program utilitas, pendamping /bin/true, yang berguna dalam arti abstrak untuk memastikan bahwa unix adalah fitur-lengkap. Namun, tujuan yang muncul untuk program-program ini telah ditemukan; pertimbangkan pernyataan BASH /some/program || /bin/true, yang akan selalu mengevaluasi boolean menjadi true ( $? = 0) tidak peduli kembalinya /some/program.

Penggunaan yang muncul dari /bin/false, seperti yang Anda identifikasi, adalah sebagai shell nol untuk pengguna yang tidak diizinkan untuk masuk. Sistem dalam kasus ini akan berperilaku persis seolah-olah shell gagal dijalankan.

POSIX (walaupun saya mungkin salah dan mungkin SUS) membatasi kedua perintah ini untuk melakukan apa pun selain mengembalikan nilai boolean yang sesuai.

/sbin/nologinadalah utilitas BSD yang memiliki perilaku yang mirip dengan /bin/false(mengembalikan boolean false), tetapi mencetak output juga, seperti /bin/falseyang dilarang dilakukan. Ini dimaksudkan untuk membantu pengguna memahami apa yang terjadi, meskipun dalam praktiknya banyak emulator terminal akan menutup begitu saja ketika shell berakhir, membuat pesan tetap tidak dapat dibaca dalam beberapa kasus.

Ada sedikit tujuan untuk listing /sbin/nologindi /etc/shells. Efek standar dari /etc/shellsadalah untuk mendaftar program yang diizinkan untuk digunakan dengan chshketika pengguna mengubah shell mereka sendiri (dan tidak ada alasan yang kredibel untuk mengubah shell Anda sendiri /sbin/nologin). Pengguna super dapat mengubah shell siapa pun menjadi apa pun. Namun, Anda mungkin ingin membuat daftar keduanya /sbin/nologindan /bin/falsedalam /etc/rsh, yang akan melarang pengguna dengan shell ini dari mengubah shell mereka menggunakan chshdalam acara yang disayangkan bahwa mereka mendapatkan shell.

Daemon FTP dapat melarang akses ke pengguna dengan shell yang tidak ada di / etc / shells, atau mereka dapat menggunakan logika apa pun yang mereka inginkan. Menjalankan FTP harus dihindari karena sftp(yang menyediakan fungsi serupa) serupa tetapi aman. Beberapa situs menggunakan /sbin/nologinuntuk menonaktifkan akses shell sambil memungkinkan akses sftp dengan memasukkannya /etc/shells. Ini dapat membuka backdoor jika pengguna diizinkan untuk membuat cronjobs.

Dalam kedua kasus, scptidak akan beroperasi dengan shell yang tidak valid. scponlydapat digunakan sebagai shell dalam hal ini.

Selain itu, pilihan shell mempengaruhi operasi su -(AKA su -l). Khususnya, output dari /sbin/nologinakan dicetak ke stdout jika itu adalah shell; tidak demikian halnya dengan /bin/false. Dalam kedua kasus, perintah yang dijalankan dengan su -clakan gagal.

Akhirnya, jawabannya:

Untuk menonaktifkan akun, bergantung pada keduanya, tetapi atur shell /sbin/nologinuntuk tujuan informasi (kecuali /sbin/nologinada di /etc/shells, pada titik mana Anda harus menggunakan /bin/false, yang seharusnya tidak). Alih-alih, setel bidang kata sandi /etc/passwdke !, yang dijamin dengan cryptvalid tanpa kata sandi. Pertimbangkan pengaturan hash /etc/shadowdengan cara yang sama untuk menghindari bug. passwd -lakan melakukan ini untukmu.

Cara ketiga untuk menonaktifkan akun adalah dengan menyetel bidang tanggal kedaluwarsa akun ke tanggal kuno (mis. usermod --expiredate 1). Ini akan mencegah login jika pengaturan Anda memungkinkan pengguna untuk mengotentikasi terhadap akun unix mereka tanpa kata sandi dan layanan yang mereka gunakan tidak memerlukan shell.

Falcon Momot
sumber
9
Sementara jawaban ini merangkum sempurna pilihan yang berbeda (dan menjawab pertanyaan), saya merasa perlu untuk menunjuk ke sumber yang berguna untuk kasus penggunaan ini, yang tersedia setidaknya dalam saham repositori Debian, dalam titantoolspaket: noshell. Pseudo-shell ini menyediakan kemampuan audit, masuk ke syslog mencoba menggunakan akun dengan noshellsebagai shell-nya, sementara masih melarang akses.
dawud
1
Ini tidak berarti apokrif, tetapi sebenarnya cukup umum di antara sysadmin dari vintage tertentu (batuk), untuk digunakan /bin/falsesebagai shell login untuk orang-orang yang tidak boleh login.
MadHatter
2
Apocryphal dalam arti bahwa itu bukan penggunaan yang dimaksudkan asli. Saya tidak mengatakan anakronistis; Saya melihatnya setiap hari :)
Falcon Momot
1
Menonaktifkan akun dengan kata sandi yang tidak valid tidak berfungsi dengan baik dengan ssh. Jika pengguna sebelumnya berhasil mengatur otentikasi kunci publik, ia mungkin bisa tetap masuk.
joshudson
3
sshd didokumentasikan untuk memeriksa bahwa akun yang dikunci dengan cara tertentu (hash kata sandi yang dimulai dengan! disebutkan secara khusus) bahkan dengan pubkey auth.
Falcon Momot
13

Setelah melakukan riset tentang ini, metode yang Anda gunakan tergantung pada apa yang harus Anda kunci. Jika pengguna masuk dengan set ini ke shell maka mereka akan mendapatkan pesan yang ditampilkan untuk efek This account is currently unavailable.Note bahwa Anda dapat mengubahnya dengan membuat file /etc/nologin.txtsetidaknya pada turunan RHEL.

Seperti yang Anda tahu /bin/falsebukan shell. Cara kerjanya adalah mengembalikan false yang keluar segera setelah biner keluar. Catatan yang /bin/trueakan mencapai efek yang sama.

Mengenai pertanyaan FTP Anda: Ya, Anda benar karena memiliki shell diatur untuk /sbin/nologinakan memungkinkan pengguna untuk login ke FTP sementara /bin/falseatau /bin/truesepenuhnya akan mencegah pengguna masuk ke layanan apa pun .

Oleh karena itu, /bin/falseatau /bin/trueyang terbaik untuk mencegah pengguna masuk ke layanan apa pun, sementara /sbin/nologinmasih akan memungkinkan pengguna untuk masuk ke layanan selain SSH atau konsol lokal sambil memberikan umpan balik kepada pengguna bahwa akun tidak aktif dan paling baik digunakan ketika hanya SSH / lokal konsol harus dikunci.

Yakub
sumber
2

Um, apakah ada yang mencoba membuktikan bahwa / bin / false akan melarang akses FTP?

Saya baru saja mengganti shell pengguna saya ke / bin / false, dan bisa melakukan FTP dengan baik.

Saya menggunakan / dev / null untuk sepenuhnya mengunci pengguna (well, kecuali email, mereka masih bisa POP3).

Jim Dunn
sumber
Apakah Anda memilikinya /etc/shells? Bagaimana server FTP Anda dikonfigurasi?
Michael Hampton
tidak ada aturan yang mengatakan bahwa pengguna perlu shell untuk masuk ke server FTP.
Petter H
Ini akan melarangnya pada beberapa daemon FTP, dan bukan yang lain. Ada cukup banyak variasi dalam fungsionalitas antara yang berbeda. Implementasi klasik akan melarang akses ke siapa pun yang tidak memiliki shell, tetapi itu tidak berarti semua implementasi harus.
Falcon Momot