meniru dan mengisolasi lingkungan pengguna dengan cepat

8

Saya akan menggunakan Ubuntu Linux untuk proyek ini.

Untuk pelatihan aplikasi tertentu di konferensi saya perlu:

  1. Agar setiap siswa dapat ssh ke akun pengguna yang sama di server
  2. Setelah setiap login secara otomatis menempatkan pengguna di lingkungan terisolasi yang terpisah
  3. Setiap lingkungan terisolasi termasuk aplikasi, contoh file config, dan toolset unix standar (misalnya grep, awk, sort, uniq, dll.) Namun, akses ke seluruh sistem file linux baik-baik saja asalkan pengguna hanya dapat merusak sendiri lingkungan terisolasi dan bukan milik orang lain.
  4. Lingkungan virtual harus dimusnahkan ketika sesi SSH pengguna berakhir

Untuk # 1 kami ingin melakukan satu akun pengguna sehingga kami tidak harus berurusan dengan membuat akun untuk setiap siswa dan membagikan nama pengguna dan kata sandi.

Adakah yang tahu bagaimana saya bisa memenuhi sasaran-sasaran ini? Teknologi manakah misalnya LXC, Chroot, dll. Yang terbaik untuk ini? Saya telah mempermainkan gagasan menggunakan .bash_profile dan .bash_logout untuk menangani pembuatan dan penghancuran lingkungan ini, tetapi tidak yakin teknologi mana yang mampu menciptakan lingkungan yang saya butuhkan.

Jonschipp
sumber

Jawaban:

8

Dengan Docker Anda dapat melakukan ini dengan sangat mudah.

docker pull ubuntu

docker run -t -i ubuntu /bin/bash
# make your changes and then log out
docker commit $(docker ps -a -q | head -n 1) sandbox

cat > /usr/local/bin/sandbox <<EOF
#!/bin/sh
exec docker run -t -i --rm=true sandbox /bin/bash
EOF
chmod a+x /usr/local/bin/sandbox

echo /usr/local/bin/sandbox >> /etc/shells

useradd testuser -g docker -s /usr/local/bin/sandbox
passwd testuser

Setiap kali testusermasuk, mereka akan ditempatkan ke wadah terisolasi di mana mereka tidak dapat melihat apa pun di luarnya, bahkan wadah pengguna lain.
Kontainer kemudian akan dihapus secara otomatis ketika mereka logout.


Penjelasan:

docker pull ubuntu

Di sini kita mengambil gambar dasar yang akan kita kerjakan. Docker menyediakan gambar standar, dan ubuntu adalah salah satunya.
 

docker run -t -i ubuntu /bin/bash
# make your changes and then log out

Di sini kami meluncurkan shell dari gambar ubuntu. Setiap perubahan yang Anda lakukan akan dipertahankan untuk pengguna Anda.
Anda juga dapat menggunakan Dockerfile untuk membuat gambar, tetapi untuk satu hal, saya pikir ini lebih sederhana.
 

docker commit $(docker ps -a -q |  head -n 1) sandbox

Di sini kita mengonversi wadah terakhir yang dijalankan ke gambar baru bernama sandbox.
 

cat > /usr/local/bin/sandbox <<EOF
#!/bin/sh
exec docker run -t -i --rm=true sandbox /bin/bash
EOF

Ini akan menjadi shell palsu yang dipaksa dijalankan oleh pengguna saat login. Script akan meluncurkan mereka ke dalam wadah buruh pelabuhan yang akan secara otomatis dibersihkan segera setelah mereka logout.
 

chmod a+x /usr/local/bin/sandbox

Saya harap ini jelas :-)
 

echo /usr/local/bin/sandbox >> /etc/shells

Ini mungkin tidak diperlukan di sistem Anda, tetapi di shell saya tidak bisa menjadi shell login kecuali jika ada di /etc/shells.
 

useradd testuser -g docker -s /usr/local/bin/sandbox

Kami membuat pengguna baru dengan shell yang disetel ke skrip yang akan kami buat. Script akan memaksa mereka untuk meluncurkan ke wadah sandbox. Mereka adalah anggota dockergrup sehingga pengguna dapat meluncurkan wadah baru.
Alternatif untuk menempatkan pengguna dalam grup buruh pelabuhan adalah memberi mereka sudo izin untuk satu perintah.
 

passwd testuser

Saya harap ini juga jelas.
 

Patrick
sumber
2

Anda dapat menggunakan shell yang dibatasi Firejail . Ini pada dasarnya melampirkan mount, PID, IPC, dan namespace jaringan ke sesi bash reguler yang dibuka melalui SSH atau telnet. Lingkungan virtual secara otomatis dihancurkan saat keluar. Ini adalah howto kecil:

Cara Membatasi Shell Login Menggunakan Linux Namespaces

netblue
sumber