Blokir Perintah Tertentu di Linux untuk pengguna Tertentu

27

Bagaimana cara memblokir perintah, misalkan mkdiruntuk pengguna tertentu?

Apa yang saya lakukan hanya membuat fungsi read-only dan menyimpannya di profil pengguna ~/.bashrc

/bin/mkdir() {
        echo "mkdir command not allow for you"

}

mkdir() {
        echo "mkdir command not allow for you"

}
./mkdir() {

        echo "mkdir command not allow for you"
}

readonly -f /bin/mkdir
readonly -f mkdir
readonly -f ./mkdir

Uji:

rahul@ubuntu:~$ cd /bin/
rahul@ubuntu:/bin$ ./mkdir /home/rahul/ggg
mkdir command not allow for you
rahul@ubuntu:/bin$ cd
rahul@ubuntu:~$ mkdir testing
mkdir command not allow for you
rahul@ubuntu:~$ /bin/mkdir testing
mkdir command not allow for you

Jadi pertanyaan saya adalah Apa yang harus menjadi cara untuk mencapai ini? apakah ada alat untuk ini?

Perbarui 1 # Tetapi jika pengguna cerdas, ia bisa menyalin biner mkdir dan mengganti nama dan menggunakannya. Lantas bagaimana cara mencapainya?

Rahul Patil
sumber
7
Contoh Anda akan gagal karena pengguna dapat mengkompilasi sendiri mkdirdan mengganti namanya, atau bahkan hanya menyalin dan mengganti nama biner yang ada. Juga, ada shell bawaan untuk mengganti alias dan fungsi.
strugee
hmm itu benar, jadi apa ada?
Rahul Patil
juga pengguna tidak perlu mengkompilasi dia dapat dengan mudah menyalin cp /bin/mkdir mkdir2kemudian menggunakannya :(
Rahul Patil
Membuat direktori adalah tugas yang umum / mendasar sehingga ada beberapa cara untuk melakukannya, dan hampir tidak mungkin untuk memblokir semuanya (kecuali dengan tidak membiarkan pengguna membuat file; yaitu, melindungi semua direktori terhadapnya terhadap penulisan). Misalnya, cp -r /usr/local/lib gggakan membuat direktori yang disebut ggg(berisi salinan konten /usr/local/lib, jika ada, yang kemudian bisa dihapus oleh pengguna). Anda dapat menggunakan find / -type d -emptyuntuk menemukan direktori kosong untuk disalin.
G-Man Mengatakan 'Reinstate Monica'

Jawaban:

21

Saya tidak tahu bagaimana cara melakukannya dengan bash, tapi saya tahu shell lain yang membatasi lingkungan pengguna: lshell (shell terbatas) .

Ikhtisar konfigurasi yang cepat

Lshell dikonfigurasi melalui file INI. Secara default, ia memegang daftar putih dari perintah yang diizinkan, tetapi dapat dengan mudah dikonfigurasikan untuk melarang pengguna menggunakan perintah tertentu.

Konfigurasi ini (konfigurasi default /etc/lshell.conf) melarang pengguna foountuk menggunakan mkdir:

[foo]
allowed = 'all' - ['mkdir', 'bash', 'sh', 'csh', 'dash', 'env']

Untuk mengonfigurasi akun pengguna agar menggunakan lshell secara default, Anda harus:

 chsh -s /usr/bin/lshell foo

Lshell dapat berbuat lebih banyak, seperti:

  • 3 tingkat perincian: pengguna, grup, semua.
  • Dapat membatasi akses ke jalur tertentu dalam sistem.
  • Dapat membatasi penggunaan karakter tertentu (seperti |).
  • Dapat membatasi penggunaan perintah tertentu hanya di atas SSH.

Dan lagi.

Perbarui 1 # Ditambahkan Hasil Uji:

rahul:~$ which bash
/bin/bash
rahul:~$ dd if=$(which bash) of=my_bash
*** forbidden syntax: dd if=$(which bash) of=my_bash
rahul:~$ bash
*** forbidden command: bash
rahul:~$ cp /bin/bash my_bash
*** forbidden path: /bin/bash
rahul:~$ /bin/bash
*** forbidden command: /bin/bash
rahul:~$ sh
*** forbidden command: sh
rahul:~$ dash
*** forbidden command: dash
rahul:~$ env bash
*** forbidden command: env
rahul:~$ cp /bin/mkdir mycreatedir
*** forbidden path: /bin/mkdir
rahmu
sumber
3
dengan allowed = 'all' - ['mkdir'], tidak bisakah Anda menjalankan bashdan tidak dibatasi lagi?
dawud
3
Hanya bersikap sombong, maaf, tetapi masih ada banyak cara untuk menghindari pembatasan yang diberlakukan oleh daftar itu, misalnya dd if=$(which bash) of=my_bash && chmod u+x my_bash && ./my_bash. Saya pikir masalahnya adalah kurangnya kebijakan default yang membatasi, yaitu, dalam skenario ini Anda memberikan izin secara default, kemudian MENYANGKAL izin berdasarkan daftar, ketika itu harus sebaliknya: MENYANGKAL secara default, kemudian MENYERAHKAN berdasarkan kebijakan .
dawud
1
@ Dawud: Saya setuju bahwa mempertahankan daftar putih dari perintah yang diizinkan adalah pendekatan yang lebih baik daripada memiliki daftar hitam dan berharap pengguna tidak akan mengelak dengan keluar-pandai admin.
rahmu
2
@ Marsco, periksa contoh yang diberikan dalam jawaban saya. Saya memberikan daftar putih dari perintah yang diizinkan, dan dalam skenario itu, pengguna tidak bisa hanya cpbiner ke PATH-nya ( rootdirektori yang dimiliki, rxuntuk pengguna), dan rbashmencegah dari mengeksekusi ./executables. Apakah itu menjawab pertanyaan Anda?
dawud
2
@ Dawud Memang, memang. Saya melewatkan direktori bin baca-saja.
Marco
15

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 diberi diamankan rbashdengan benar dengan PATH read-only yang menunjuk 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 mengeksekusi mkdiratas namanya sendiri (melalui tautan di ~/bindirektori pribadi , disediakan melalui /etc/skel, seperti dijelaskan di atas), atas nama pengguna lain (via sudo) atau tidak sama sekali.

dawud
sumber
4

Tambahkan grup dummy, tambahkan pengguna ke grup itu chown root:somegroup /bin/mkdir,, chmod g-x /bin/mkdir. Perhatikan bahwa ini bergantung pada pengguna yang tidak dapat memodifikasi grup mereka. IIRC ini benar di GNU / Linux tetapi tidak di beberapa Unix lainnya.

strugee
sumber
2
Pada kebanyakan sistem file, Anda juga dapat menggunakan ACL yang diperluas untuk kontrol berbutir halus - jumlah grup yang dibutuhkan akan bertambah secara eksponensial dengan jumlah pengguna (karena kemungkinan kombinasi), belum lagi masalah penamaan.
peterph
2
menambahkan satu poin lagi, juga menghapus izin baca dari pengguna lain 710, jadi pengguna tidak dapat menyalin dan mengganti nama biner itu bukan?
Rahul Patil
1
@RahulPatil ya, dan tentu saja Anda perlu membatasi penggunaan kompiler juga.
peterph
1

Yang terbaik seperti yang telah saya uji adalah dengan menggunakan Profile.d cara terbaik & teraman

Langkah # 1 (Buat File Alias)

[root@newrbe ~]# vim /etc/customalias.sh

Tambahkan baris di bawah ini:

alias rm="echo remove contenet is restricted"
alias poweroff="echo Poweroff is restricted"
alias chmod="echo Change Permission is restristed"

Simpan & keluar

Langkah # 2 (Buat pemuat Profil)

/etc/profile.d/ lokasi ini berisi file untuk penyelesaian bash

[root@newrbe ~]# vim /etc/profile.d/customsource.sh

Tambahkan baris di bawah ini di bawah file, baris ini akan memblokir perintah yang disebutkan untuk pengguna di bawah ini

if [ `whoami` == "user1" ] && [ `whoami` == "user2" ]; then
    source /etc/customalias.sh
fi

Simpan dan keluar

Sekarang Keluar dan masuk kembali

Salam, -Mansur

Mansur Ali
sumber
/etc/profile.d/bukan untuk bashpenyelesaian , itu tempat untuk menempatkan penyesuaian sesi login untuk pengguna yang menggunakan shell login mirip-POSIX, jadi biasanya bukan tempat bashalias kustomisasi (yang lebih suka masuk /etc/bash.bashrc) akan pergi dan itu harus memiliki sintaks shell POSIX (jadi biasanya, .sebagai gantinya dari sourcedan =bukannya ==).
Stéphane Chazelas
-1

instal sudoers dan coba konfigurasikan di sana pengguna dan perintah apa.

mark.praktisero
sumber
4
Selamat datang di SX. Harap tambahkan detail ke jawaban Anda; OP, atau siapa pun yang membaca pertanyaan ini di masa depan, mungkin tidak menyadarinya sudo.
Joseph R.
Jawaban ini jelas salah
kiltek