Cara membatasi shell pengguna yang memungkinkan untuk menjalankan program shell

9

Apakah mungkin untuk mencegah pengguna untuk tidak menggunakan perintah seperti ls, rm dan perintah sistem lainnya yang dapat membahayakan sistem. Tetapi para pengguna harus dapat menjalankan program shell.

Hulk
sumber
Mengapa Anda ingin melakukan ini? Tidak bisakah Anda menulis sebuah program yang mereka berinteraksi?
Joe
Program shell seperti apa yang harus mereka jalankan?
Mike
Apakah yang Anda maksud "menjalankan program shell ciptaan mereka sendiri", yang memiliki masalah keamanan jelas ..
pjc50
13
Oh, tidak, bukan lsperintah berbahaya !
womble

Jawaban:

11

Pertanyaan Anda seharusnya:

Saya tidak mempercayai pengguna saya. Yang bodoh melihat sesuatu di internet dan mencobanya tanpa memahami apa yang dilakukannya. Yang licik suka mengintip dan melihat file orang lain dan mencuri ide-ide mereka. Dan yang malas, jangan mulai saya yang malas.

Bagaimana cara melindungi sistem saya dan pengguna saya dari pengguna saya?


Pertama, unix memiliki sistem perizinan filesystem yang sangat komprehensif. Ini tampaknya menjadi tutorial yang layak tentang izin sistem file unix . Inti dari hal ini adalah direktori dapat diatur sedemikian rupa sehingga pengguna dapat masuk ke direktori dan dapat menjalankan program dari direktori tersebut tetapi tidak dapat melihat isi direktori tersebut. Jika Anda melakukan ini, misalnya, di / home, jika pengguna menjalankan ls on / home, mereka akan mendapatkan izin yang ditolak kesalahannya.

Jika Anda benar-benar takut pada pengguna Anda dan ingin memasukkan mereka ke dalam jenis lingkungan terbatas supermax , gunakan sesuatu seperti penjara freebsd atau zona solaris - setiap pengguna mendapatkan lingkungan buatan mereka sendiri. Untuk poin tambahan gunakan ZFS sehingga Anda dapat mengambil snapshot dari lingkungan saat mereka masuk sehingga jika mereka menghapus file mereka, Anda bisa menariknya keluar dari snapshot.

chris
sumber
9

Ada tiga hal yang perlu dilakukan untuk sepenuhnya melakukan apa yang Anda minta:

  1. Shell khusus yang tidak memiliki perintah yang Anda minati . Ini adalah hal yang sulit didapat, tetapi jika Anda benar-benar tidak ingin pengguna memiliki akses ke beberapa shell primitif, ini adalah satu-satunya cara untuk menghapusnya.
  2. Atur izin file dengan benar . Tidak ingin pengguna merusak sistem? Tetapkan izin sehingga mereka tidak dapat merusak sistem bahkan jika mereka memiliki alat yang tepat. Dari ketiga langkah ini, ini adalah langkah yang paling mudah.
  3. Gunakan technoloy kontrol akses wajib seperti AppArmor . MAC seperti AppArmor dan SELinux menanamkan izin di kernel. Ini mencegah pengguna menjalankan alat yang tepat bahkan jika mereka menemukannya di suatu tempat (dan seperti izin file, mencegah mereka menggunakannya di luar kotak terlarang).

Belt, suspender, dan staple-gun untuk ukuran yang baik. Sulit salah di sana.

AppArmor menarik karena MAC untuk executable tertentu diwarisi oleh semua anak-anaknya. Atur login pengguna menjadi /bin/bash-bob, atur profil AppArmor untuk hak biner spesifik itu, dan satu-satunya cara mereka keluar dari penjara izin itu adalah melalui eksploitasi kernel. Jika beberapa skrip pemasangan malas dibiarkan /var/opt/vendor/tmpdapat ditulisi secara global karena alasan bodoh, pengguna yang menggunakan /bin/bash-bobshell tidak akan dapat menulis di sana . Atur profil bash-bob hanya mengizinkan penulisan ke direktori home mereka dan /tmp, dan kesalahan izin tersebut tidak dapat ditingkatkan. Bahkan jika mereka entah bagaimana menemukan kata sandi root, profil AppArmor untuk /bin/bash-bobakan tetap berlaku bahkan setelah mereka subangun sudan bashproses yang ditimbulkannya adalah anak-anak /bin/bash-bob.

Bagian yang sulit adalah membangun profil AppArmor itu.

  1. Buat profil AppArmor untuk / bin / bash-bob dan atur ke mode audit
  2. Atur shell-login Bob ke / bin / bash-bob
  3. Masuk sebagai Bob. Lakukan semua yang Anda inginkan agar dapat dilakukan Bob.
  4. Gunakan auditlog untuk membangun profil AppArmor (SUSE memiliki alat untuk ini, tidak yakin tentang distro Linux lainnya). Ini sangat membosankan, tetapi perlu terjadi jika Anda membutuhkan tingkat keamanan ini.
    1. Anda akan melakukan hal-hal seperti:
      • Menyetujui akses baca ke sebagian besar pustaka sistem
      • Menyetujui hak baca dan eksekusi untuk beberapa perintah sistem yang diizinkan yang dipilih
      • Menyetujui akses tulis ke ruang temp
      • Menyetujui pembuatan soket, jika perlu
  5. Tetapkan kebijakan untuk ditegakkan.
  6. Masuk sebagai Bob, lakukan sesuatu.
  7. Buat penyesuaian.

Menurut pendapat saya, Anda hanya perlu langkah 2 dan 3, karena dalam kombinasi keduanya mencegah kemampuan untuk melakukan sesuatu yang berbahaya di luar kotak yang dibangun dengan hati-hati yang Anda siapkan di kedua langkah itu.

sysadmin1138
sumber
4

Nah, Anda dapat mengatur shell pengguna ke program yang Anda tulis yang hanya memungkinkan mereka menjalankan skrip shell tertentu.

Tentu saja ini hanya akan seaman program dan skrip shell; dalam praktiknya, shell terbatas semacam ini biasanya tidak aman terhadap penyerang pintar.


sumber
3

Jangan coba dan batasi perintah, batasi izin file. Secara praktis Anda tidak dapat membatasi akses orang ke panggilan sys, jadi semua yang perlu dilakukan seseorang adalah memberikan salinan sendiri dari perintah "berbahaya" apa pun yang tidak ingin Anda jalankan, dan Anda kenyang.

womble
sumber
2

Jika Anda ingin pengguna hanya dapat menjalankan skrip / binari tertentu, Anda dapat menggunakan shell terbatas . Ini (seperti yang disebutkan dalam artikel Wikipedia) tidak sepenuhnya aman, tetapi jika Anda dapat menjamin bahwa tidak ada aplikasi yang diizinkan untuk menjalankan dapat mengeksekusi shell baru maka itu adalah alternatif yang baik.

Untuk mengatur shell yang dibatasi pengguna, atur /bin/rbash(atau yang serupa, kebanyakan shell memasuki mode terbatas ketika biner bernama r *** *) sebagai shell pengguna. Kemudian, edit **. Bashrc (atau yang setara) dan atur $PATHke direktori tempat semua binari / skrip yang diizinkan disimpan.

Mikael S
sumber
1

Ya, itu mungkin, tetapi dalam praktiknya akan membutuhkan banyak pekerjaan dan perencanaan. Anda dapat membuat skrip dan menjalankannya sebagai penggunaan khusus, lalu hapus semua hak istimewa dari pengguna yang dimaksud. Atau, Anda dapat mengatur shell pengguna ke sesuatu buatan Anda sendiri yang memungkinkan mereka melakukan apa yang Anda izinkan secara eksplisit.

Namun, izin standar di linux membuatnya hampir mustahil bagi pengguna normal untuk "membahayakan sistem". Jenis kerusakan apa yang Anda coba cegah? Ini sepele untuk mencegah pengguna menginstal perangkat lunak atau menjalankan program di luar direktori home mereka, dan Anda dapat menggunakan chroot untuk mengunci sistem lebih jauh.

Bryan Oakley
sumber
Saya mencoba untuk mencegah kemungkinan perintah seperti rm -rf / bin, ls / home / *, rm -rf / usr / bin, ls / .................... .....
2
Anda dapat mencegah mereka yang menggunakan hak akses file standar linux ...
ChristopheD
1

Anda mungkin ingin mencoba [lshell] [1] (shell terbatas).

lshell adalah shell yang dikodekan dalam Python, yang memungkinkan Anda membatasi lingkungan pengguna ke set perintah terbatas, memilih untuk mengaktifkan / menonaktifkan perintah apa pun di atas SSH (mis. SCP, SFTP, rsync, dll.), mencatat perintah pengguna, mengimplementasikan pembatasan waktu, dan lainnya.

[1]: http://lshell.ghantoos.org/Overview lshell


sumber
1

Cara saya biasanya menerapkan pembatasan semacam ini mengharuskan beberapa kondisi terpenuhi, jika tidak, pembatasan dapat dengan mudah dielakkan:

  • Pengguna bukan milik wheelgrup, satu-satunya yang diizinkan untuk menggunakan su(diberlakukan melalui PAM).
  • Pengguna diberikan pengamanan yang benar rbash dengan read-only yang PATHmenunjuk ke pribadi ~/bin, ~/bin/direktori ini berisi tautan ke utilitas sederhana:

    $ ll ~/bin
    total 0
    lrwxrwxrwx. 1 root dawud 14 Sep 17 08:58 clear -> /usr/bin/clear*
    lrwxrwxrwx. 1 root dawud  7 Sep 17 08:58 df -> /bin/df*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 egrep -> /bin/egrep*
    lrwxrwxrwx. 1 root dawud  8 Sep 17 08:58 env -> /bin/env*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 fgrep -> /bin/fgrep*
    lrwxrwxrwx. 1 root dawud  9 Sep 17 08:58 grep -> /bin/grep*
    lrwxrwxrwx. 1 root dawud 10 Sep 17 08:58 rview -> /bin/rview*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 rvim -> /usr/bin/rvim*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 sudo -> /usr/bin/sudo*
    lrwxrwxrwx. 1 root dawud 17 Sep 17 08:58 sudoedit -> /usr/bin/sudoedit*
    lrwxrwxrwx. 1 root dawud 13 Sep 17 08:58 tail -> /usr/bin/tail*
    lrwxrwxrwx. 1 root dawud 11 Sep 17 08:58 wc -> /usr/bin/wc*
    
  • pengguna diberikan terbatas, read-only lingkungan (memikirkan hal-hal seperti LESSSECURE, TMOUT, HISTFILEvariabel).

  • pengguna dipetakan ke pengguna SELinux staff_udan diberikan hak untuk mengeksekusi perintah sebagai pengguna lain sebagaimana disyaratkan melalui sudo.
  • pengguna /home, /tmpdan mungkin /var/tmpdipolisi melalui /etc/security/namespace.conf:

    /tmp       /tmp/.inst/tmp.inst-$USER-     tmpdir:create   root
    /var/tmp   /tmp/.inst/var-tmp.inst-$USER- tmpdir:create   root
    $HOME      $HOME/$USER.inst/              tmpdir:create   root
    

    Juga, /etc/security/namespace.initbuat semua file kerangka hanya dibaca untuk pengguna dan dimiliki oleh root.

Dengan cara ini Anda dapat memilih apakah $USERdapat menjalankan perintah apa pun atas namanya sendiri (melalui tautan di ~/bindirektori pribadi , disediakan melalui /etc/skel, sebagaimana dijelaskan di atas), atas nama pengguna lain (via sudo) atau tidak sama sekali.

dawud
sumber
0

Ya, ubah saja izin pada perintah ini.

Anda mungkin memiliki kesempatan bertarung yang lebih baik dengan menulis perintah shell yang berlaku untuk kebutuhan Anda.

Apa yang tidak sesuai dengan izin default untuk pengguna normal di Linux?

jldupont
sumber