Apakah / usr / sbin / nologin sebagai shell login melayani tujuan keamanan?

78

Dalam /etc/passwdfile saya , saya dapat melihat bahwa www-datapengguna yang digunakan oleh Apache, serta semua jenis pengguna sistem, memiliki salah satu /usr/sbin/nologinatau /bin/falsesebagai shell login mereka. Sebagai contoh, berikut adalah pilihan garis:

daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
games:x:5:60:games:/usr/games:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
syslog:x:101:104::/home/syslog:/bin/false
whoopsie:x:109:116::/nonexistent:/bin/false
mark:x:1000:1000:mark,,,:/home/mark:/bin/bash

Akibatnya, jika saya mencoba untuk menukar dengan salah satu pengguna ini (yang kadang-kadang saya ingin lakukan untuk memeriksa pemahaman saya tentang izin mereka, dan yang mungkin ada setidaknya alasan masuk akal setengah jalan untuk), saya gagal:

mark@lunchbox:~$ sudo su www-data
This account is currently not available.
mark@lunchbox:~$ sudo su syslog
mark@lunchbox:~$ 

Tentu saja, ini bukan masalah, karena saya masih bisa meluncurkan shell untuk mereka melalui metode seperti ini:

mark@lunchbox:~$ sudo -u www-data /bin/bash
www-data@lunchbox:~$ 

Tapi itu hanya membuat saya bertanya-tanya apa tujuan dilayani dengan menolak pengguna ini sebuah shell login. Melihat-lihat penjelasan di internet, banyak orang mengklaim bahwa ini ada hubungannya dengan keamanan, dan semua orang tampaknya setuju bahwa itu adalah ide yang buruk untuk mengubah kulit login dari para pengguna ini. Berikut kumpulan kutipan:

Mengatur shell pengguna Apache ke sesuatu yang non-interaktif umumnya merupakan praktik keamanan yang baik (benar-benar semua pengguna layanan yang tidak harus login secara interaktif harus mengatur shell mereka ke sesuatu yang non-interaktif).

- https://serverfault.com/a/559315/147556

shell untuk pengguna www-data diatur ke / usr / sbin / nologin, dan itu diatur untuk alasan yang sangat bagus.

- https://askubuntu.com/a/486661/119754

[akun sistem] dapat menjadi lubang keamanan , terutama jika shell diaktifkan:

  • Buruk

    bin:x:1:1:bin:/bin:/bin/sh
  • Baik

    bin:x:1:1:bin:/bin:/sbin/nologin

- https://unix.stackexchange.com/a/78996/29001

Demi keamanan, saya membuat akun pengguna tanpa shell login untuk menjalankan server Tomcat:

# groupadd tomcat
# useradd -g tomcat -s /usr/sbin/nologin -m -d /home/tomcat tomcat

- http://www.puschitz.com/InstallingTomcat.html

Sementara posting ini berada dalam perjanjian dengan suara bulat bahwa tidak memberikan pengguna sistem shell login yang sebenarnya baik untuk keamanan, tidak satu pun dari mereka membenarkan klaim ini, dan saya tidak dapat menemukan penjelasannya di mana pun.

Serangan apa yang kami coba lindungi dengan tidak memberikan shell login nyata kepada pengguna ini?

Mark Amery
sumber

Jawaban:

51

Jika Anda melihat nologinhalaman manual Anda akan melihat deskripsi berikut.

kutipan

nologin menampilkan pesan bahwa akun tidak tersedia dan keluar bukan nol. Ini dimaksudkan sebagai bidang shell pengganti untuk menolak akses masuk ke akun.

Jika file /etc/nologin.txtada, nologintampilkan isinya kepada pengguna alih-alih pesan default.

Kode keluar yang dikembalikan nologinselalu 1.

Jadi maksud sebenarnya nologinadalah agar ketika pengguna mencoba masuk dengan akun yang memanfaatkannya /etc/passwdadalah agar mereka disajikan dengan pesan yang ramah pengguna, dan bahwa setiap skrip / perintah yang berupaya memanfaatkan login ini menerima kode keluar 1.

Keamanan

Sehubungan dengan keamanan, Anda biasanya akan melihat salah satu /sbin/nologinatau kadang-kadang /bin/false, di antara hal-hal lain di bidang itu. Keduanya melayani tujuan yang sama, tetapi /sbin/nologinmungkin metode yang disukai. Bagaimanapun mereka membatasi akses langsung ke shell sebagai akun pengguna khusus ini.

Mengapa ini dianggap berharga sehubungan dengan keamanan?

"Mengapa" sulit untuk sepenuhnya dijelaskan, tetapi nilai dalam membatasi akun pengguna dengan cara ini, adalah bahwa itu menggagalkan akses langsung melalui loginaplikasi ketika Anda mencoba untuk mendapatkan akses menggunakan akun pengguna tersebut.

Menggunakan salah satu nologinatau /bin/falsemenyelesaikan ini. Membatasi permukaan serangan sistem Anda adalah teknik umum di dunia keamanan, baik menonaktifkan layanan pada port tertentu, atau membatasi sifat login pada sistem seseorang.

Masih ada rasionalisasi lain untuk digunakan nologin. Sebagai contoh, scptidak akan lagi bekerja dengan akun pengguna yang tidak menunjuk shell yang sebenarnya, seperti yang dijelaskan dalam Q & A ServerFault ini berjudul: Apa perbedaan antara / sbin / nologin dan / bin / false? .

slm
sumber
They both serve the same purpose, but /sbin/nologin is probably the preferred method.Dari sudut pandang keamanan, `/ sbin / nologin`` bukan metode yang disukai; itu membuang-buang waktu dan siklus memberikan respons. Meskipun tidak ada yang memberikan keamanan yang sangat baik; itu adalah langkah-langkah pertahanan mendalam, tetapi mereka tidak benar-benar menghentikan seseorang untuk menjalankan perintah sebagai pengguna tertentu.
Parthian Shot
4
@ParthianShot waktu dan siklus yang diperlukan untuk menggaungkan string hardcoded tunggal, relatif terhadap pekerjaan OS apa pun yang dilakukan untuk mencari shell yang akan dieksekusi untuk pengguna, tampaknya tidak mungkin menjadi sangat penting bagi siapa pun yang membangun penolakan layanan. menyerang. slm menyarankan nologinadalah metode yang dipilih untuk alasan UX, bukan yang keamanan - lakukan sudo su someuserdan tidak mengalami apa - apa karena shell login mereka falsemembingungkan. Juga, kedua jangan mencegah seseorang dari menjalankan perintah sebagai user yang diberikan dalam beberapa keadaan, dijelaskan dalam jawabannya di sini.
Mark Amery
28

Jelas itu melayani tujuan keamanan. Misalnya, lihat bug di bawah ini yang diajukan untuk pengguna sistem yang memiliki shell.

Server debian saya terganggu karena akun daemon memiliki shell login yang valid dan memiliki samba terbuka untuk akses internet. Pembobolan dilakukan dengan mengatur kata sandi secara remote melalui samba untuk akun daemon dan masuk melalui ssh. Beberapa exploit root lokal kemudian digunakan untuk SENDIRI server saya.

Saya akan merekomendasikan Anda untuk membaca jawaban yang luar biasa ini oleh Gilles di mana dia juga menyediakan tautan ke beberapa bug.

Ada bug yang diajukan atas masalah ini di Debian (274229, 330882, 581899), saat ini terbuka dan diklasifikasikan sebagai "daftar harapan". Saya cenderung setuju bahwa ini adalah bug dan pengguna sistem harus memiliki / bin / false sebagai shell mereka kecuali jika perlu dilakukan sebaliknya.

Ramesh
sumber
... Saya tidak melihat bagaimana itu sebenarnya tergantung secara spesifik pada shell yang dinyatakan untuk pengguna. Jika penyerang hanya berlari ssh user@site, dan itu berhasil, mereka tidak akan terus mencoba ssh user@site /bin/bash, tapi saya cukup yakin itu akan tetap bekerja terlepas dari shell yang dinyatakan.
Parthian Shot
2
@ParthianShot, bukti anekdotal: di server CentOS saya, ketika shell akun disetel ke / sbin / nologin ssh user@site /bin/bashmengembalikan This account is currently not available.pesan sederhana . Juga, jawaban ini mengatakan nologin melindungi akses SSH
metavida
@ParthianShot berdasarkan pada deskripsi, bukan itu yang terjadi. Apa yang terjadi adalah: Samba salah konfigurasi; penyerang mengkonfigurasi akses ssh melalui Samba; penyerang masuk melalui ssh. Meskipun kasus ini jelas-jelas merupakan kesalahan sysadmin, jika Anda mengganti "Samba yang salah konfigurasi" dengan "layanan yang dapat dieksploitasi", maka mencegah akses masuk masuk akal, karena mengurangi permukaan serangan. tentu saja, jika eksploit memberikan eksekusi lokal, memiliki akses ssh daripada tidak, membuat sedikit perbedaan.
Marcus
18

Untuk menambahkan jawaban @slm dan @ramesh yang luar biasa:

Ya, seperti yang telah Anda tunjukkan, Anda masih dapat beralih ke pengguna dengan nologin sebagai shell default mereka dengan menjalankan sudodengan shell yang ditentukan, tetapi dalam kasus ini, Anda harus:

  1. Masuk sebagai pengguna lain yang memiliki shell yang valid
  2. Apakah sudo izin dikonfigurasi untuk pengguna itu untuk menjalankan superintah, dan
  3. Seandainya usaha su Anda masuk ke log sudoers (tentu saja dengan asumsi bahwa sudo logging diaktifkan).

Para pengguna yang memiliki nologin didefinisikan sebagai shell default mereka sering memiliki hak istimewa yang lebih tinggi / mampu melakukan lebih banyak kerusakan pada sistem daripada pengguna biasa, sehingga membuat mereka tidak dapat login secara langsung mencoba membatasi kerusakan yang dapat diderita oleh pelanggaran sistem Anda. .

Warwick
sumber
7

Selain jawaban luar biasa yang telah diberikan, itu melayani tujuan lain.

Jika Anda menjalankan daemon FTP di server Anda, ia memeriksa shell login pengguna yang mencoba masuk. Jika shell tidak terdaftar /etc/shells, itu tidak memungkinkan mereka untuk masuk. Jadi memberikan akun daemon shell khusus mencegah seseorang dari memodifikasi akun melalui FTP.

Barmar
sumber
7

Di samping jawaban-jawaban hebat yang sudah diberikan, saya bisa memikirkan skenario berikut.

Bug keamanan dalam layanan yang berjalan sebagai pengguna terbatas memungkinkan untuk menulis file sebagai pengguna itu. File ini bisa ~ / .ssh / authorized_keys.

Ini memungkinkan penyerang untuk login langsung di shell yang akan membuatnya lebih mudah untuk mengeksekusi eskalasi hak istimewa.

Menolak shell login akan membuat opsi ini jauh lebih sulit.

Eric Seynaeve
sumber
1

Secara umum saya akan mengatakan / bin / false dan / sbin / nologin adalah sama - tapi saya kira itu tergantung pada server SSH yang Anda gunakan.

Akan lebih bijaksana bagi saya untuk menunjukkan eksploitasi baru-baru ini pada OpenSSH tampaknya mempengaruhi / bin / login palsu tetapi BUKAN / sbin / nologin. Namun ia menyatakan bahwa Dropbear berbeda dalam cara ini (juga exploit yang secara khusus berlaku untuk OpenSSH).

Eksploitasi memengaruhi sebagian besar versi:

7.2p1 dan lebih rendah (semua versi; kembali ~ 20 tahun) Dengan penerusan X11 diaktifkan

https://www.exploit-db.com/exploits/39569/

Jadi berdasarkan ini - saya pribadi akan melakukan / sbin / nologin namun saya tidak yakin apakah ini dapat mempengaruhi layanan yang membuat / bin / entri salah di / etc / passwd. Anda dapat melakukan percobaan dan melihat hasil Anda, tetapi silakan lakukan dengan risiko Anda sendiri! Saya kira kasus terburuk Anda bisa mengubahnya kembali dan memulai kembali layanan yang mempengaruhi. Saya pribadi memiliki beberapa entri menggunakan / bin / false - Tidak yakin apakah saya ingin repot dengan ini karena penerusan X11 bukan sesuatu yang telah saya aktifkan;)

Jika Anda menggunakan OpenSSH (menurut saya banyak orang ...) DAN mengaktifkan penerusan X11 - Anda mungkin ingin mempertimbangkan / sbin / nologin (atau mungkin beralih ke Dropbear).

Gr33k
sumber
0

Biasanya merupakan praktik keamanan yang baik untuk mengatur akun layanan dan aplikasi ke login non-interaktif. Pengguna yang berwenang mungkin masih memiliki akses ke akun tersebut menggunakan SU atau SUDO tetapi semua tindakan mereka dilacak dalam file log Sudoers dan dapat ditelusuri kembali ke pengguna yang menjalankan perintah di bawah hak istimewa akun layanan. Inilah sebabnya mengapa penting untuk menyimpan file log dalam sistem manajemen log terpusat sehingga administrator sistem tidak memiliki akses untuk mengubah file log. Pengguna yang menjalankan perintah di bawah SU atau SUDO sudah diizinkan untuk mengakses sistem.

Di sisi lain pengguna eksternal atau tidak sah ke sistem akan benar-benar tidak memiliki akses untuk masuk menggunakan akun tersebut dan itu adalah langkah pengamanan.

John
sumber
0

Ya, itu melayani tujuan keamanan. Ini ukuran pertahanan yang mendalam.

Alasan intinya melayani tujuan adalah bahwa ada berbagai bit perangkat lunak yang akan memvalidasi beberapa bentuk kredensial login untuk pengguna tertentu dan kemudian menggunakan shell login pengguna tersebut untuk menjalankan perintah. Mungkin contoh yang paling terkenal adalah SSH. Jika Anda berhasil mengotentikasi sebagai pengguna melalui SSH, SSH kemudian meluncurkan shell login pengguna (atau menggunakannya untuk menjalankan perintah yang Anda berikan, jika Anda menggunakan ssh [email protected] 'command to run'sintaks).

Tentu saja, idealnya penyerang tidak akan dapat mengotentikasi sebagai pengguna sama sekali. Tetapi anggaplah situasi berikut terjadi:

  • Server yang Anda kontrol menjalankan layanan web sebagai pengguna yang memiliki direktori home dan shell login
  • Seorang penyerang menemukan kerentanan dalam layanan yang memungkinkan penyerang untuk menulis file ke direktori home pengguna

Sekarang penyerang Anda dapat menulis kunci publik SSH ~/.ssh/authorized_keys, lalu SSH masuk, dan - boom! - mereka punya akses shell ke server Anda.

Jika pengguna memiliki /usr/sbin/nologinshell login mereka, maka bahkan setelah penyerang berhasil menulis kunci publik authorized_keys, itu tidak berguna bagi mereka. Semua itu memungkinkan mereka lakukan adalah lari jarak jauh nologin, yang tidak terlalu berguna. Mereka tidak bisa mendapatkan peluru, dan serangan mereka telah dimitigasi.

Dalam skenario ini tampaknya sangat hipotetis, saya ingin untuk dicatat bahwa saya menjadi sasaran tepatnya serangan ini di beberapa titik pada tahun 2015, sekitar setahun setelah saya mengajukan pertanyaan ini. Seperti orang tolol, saya meninggalkan contoh Redis tanpa kata sandi terbuka untuk dunia. Itu ditargetkan oleh serangan Redis crackit , di mana penyerang memasukkan kunci publik SSH ke dalam database Redis Anda, kemudian mengirimkan perintah yang memberitahu Redis untuk menulis konten database .ssh/authorized_keys, kemudian mencoba masuk ke SSH. Saya diselamatkan dari konsekuensi ketidakmampuan saya sendiri hanya oleh fakta bahwa pengelola redis-serverpaket Apt (yang saya gunakan untuk menginstal Redis) memiliki kebijaksanaan untuk membuatnya menjalankan Redis sebagairedispengguna yang tidak memiliki direktori home atau shell login; kalau bukan karena mereka, server saya kemungkinan akan ditebus atau berakhir sebagai bagian dari botnet beberapa peretas.

Pengalaman itu memberi saya tingkat kerendahan hati dan membuat saya menghargai pentingnya pertahanan secara mendalam , dan, khususnya, tidak memberikan shell login ke akun yang menjalankan server web, database, dan layanan latar belakang lainnya.

Mark Amery
sumber