Batasi pengguna Linux ke file yang dimilikinya

24

Bayangkan pengaturan server dari perusahaan webhosting bersama di mana banyak (~ 100) pelanggan memiliki akses shell ke satu server.

Banyak "perangkat lunak" web merekomendasikan untuk chmod file 0777 . Saya khawatir tentang pelanggan kami yang secara tidak bijaksana mengikuti tutorial ini, membuka file mereka untuk pelanggan kami yang lain. (Saya tentu saja tidak menggunakan cmod 0777sendiri secara tidak perlu!) Apakah ada metode untuk memastikan bahwa pelanggan hanya dapat mengakses file mereka sendiri dan mencegah mereka mengakses file yang dapat dibaca dunia dari pengguna lain?

Saya melihat ke AppArmor , tapi itu sangat erat dengan proses, yang tampaknya gagal di lingkungan itu.

Phillipp
sumber
12
Saya benar-benar akan mempertimbangkan apakah rekomendasi dari "perangkat lunak web" untuk chmod files 0777benar-benar diperlukan, yaitu mengatasi akar penyebab masalah, daripada gejala bahwa, dengan melakukan itu, siapa pun dapat membaca file orang lain. Sering kali rekomendasi semua akses memungkinkan hanya cara murah untuk menghindari panggilan dukungan, atau kurangnya kecakapan teknis untuk dapat mengatur izin dengan benar. Dalam hampir tidak ada kasus saya harus mengatur file 0777atau memberikan aplikasi akses root penuh ketika diminta. Pendidikan pengguna dan / atau vendor sangat membantu di sini.
Cosmic Ossifrage
3
@CosmicOssifrage, pengguna tidak dapat dididik dengan mudah, mereka tidak ingin membaca instruksi atau manual.
Cristian Ciupitu
12
"Perangkat lunak web" apa pun yang masih merekomendasikan 777 izin harus dikeluarkan dan diambil . Gunakan suexecatau mpm_itkatau serupa.
Shadur
3
@ CosmicOssifrage Saya tidak berpikir Phillipp memberitahu atau memaksa pengguna ke chmod 0777file mereka. Saya pikir dia gugup tentang mereka pergi loltoturialz.com/php_problemsdan mengatur chmod 0777sendiri sambil membabi buta mengikuti artikel yang ditulis dengan buruk. Benar-benar tidak ada cara untuk mencegah mereka melakukannya, atau mencegah mereka dari kesal ketika seseorang mencuri barang-barang mereka.
Kevin - Reinstate Monica
2
@kevin - itulah mengapa garansi dibatalkan dibuat. Saya hampir tidak pernah melihat alat yang serius (baik itu perangkat lunak yang dikompilasi, banyak skrip atau apa pun) tanpa klausa seperti itu. Dan percaya atau tidak - di sebagian besar lingkungan perusahaan pengguna menyadari hal ini
Dani_l

Jawaban:

34

Letakkan direktori yang terbatas dan tidak dapat diubah antara dunia luar dan file yang dilindungi, mis

/
 ├─ bin
 ├─ home
 │  └─ joe <===== restricted and immutable
 │     └─ joe <== regular home directory

atau /home/joe/restricted/public_html.

Dibatasi artinya hanya pengguna dan mungkin server web yang dapat membacanya (mis. Mode 0700/ 0750atau ACL ).

Kekekalan dapat dilakukan dengan chattr +iatau dengan mengubah kepemilikan menjadi sesuatu seperti root:joe.

Cara mudah untuk menciptakan hirarki pada Ubuntu akan mengedit /etc/adduser.confdan set GROUPHOMESke yes.

Cristian Ciupitu
sumber
15

Ada opsi yang mungkin ingin Anda pertimbangkan (tergantung seberapa banyak pekerjaan yang ingin Anda lakukan untuk itu).

Seperti yang sudah diposkan orang lain, "biasanya" Anda tidak dapat mencegah seseorang dengan akses shell untuk membaca file yang dapat dibaca dunia.

Namun Anda dapat mem-chrootnya ke rumah mereka sendiri, pada dasarnya membatasi akses shell ke, pertama, hanya direktori root yang Anda inginkan (AKA direktori home) dan, kedua, mencegah pengguna untuk mengeksekusi semua yang Anda tidak ingin mereka lakukan.

Saya melakukan pendekatan serupa ketika saya memiliki satu pengguna untuk memiliki akses ke file web, tetapi saya tidak ingin dia melihat file lain di luar folder web.

Ini memang memiliki banyak overhead, berantakan untuk diatur, dan setiap kali saya memperbarui sesuatu, itu rusak.

Tetapi untuk hari ini saya pikir Anda dapat mencapainya dengan mudah dengan opsi chroot OpenSSH :

WikiBooks OpenSSH

Dennis Nolte
sumber
chroot untuk SFTP mudah diimplementasikan, tapi saya tidak yakin itu mudah untuk akses shell. Anda harus mengatur chroot dengan semua binari dan pustaka untuk setiap pengguna.
Cristian Ciupitu
2
Itu implementasi spesifik. ARCHLINUX memiliki perintah arch-chroot tertentu yang menangani semua ikatan bind tambahan dll. Wiki.archlinux.org/index.php/Change_Root#Change_root
Dani_l
@CristianCiupitu itulah yang saya lakukan, hanya memperbolehkan subset spesifik dari perintah untuk menghubungkan semua pustaka nessesary, itu sebabnya saya mengatakan itu berantakan :) Dani_l benar, setup saya adalah server debian, saya tidak pernah punya waktu untuk check in gentoo dengan sedih .
Dennis Nolte
@Dani_l: bagaimana dengan paket yang diinstal? The arch-chrootperintah tampaknya tidak menutupi itu. Dan kemudian ada juga masalah ruang disk yang terbuang dengan semua duplikat. Saya tidak mengatakan itu tidak mungkin untuk dilakukan, hanya saja itu mungkin sedikit lebih rumit saat ini.
Cristian Ciupitu
1
Sesuatu untuk membuat ini -lot- lebih mudah adalah dengan menggunakan UnionFS untuk chroot pengguna ke dalam gabungan khusus dari rootfs dalam mode read only dan direktori home read read, ini berarti mereka melihat semua paket sistem dan binari tetapi penulisan secara otomatis dilakukan pada folder rumah mereka. ini-harus-digabungkan dengan membuat semua direktori home 700 izin pengguna lain tetap dapat membaca file dari pengguna lain.
Vality
11

Saya telah menemukan Daftar Kontrol Akses POSIX memungkinkan Anda, sebagai administrator sistem, untuk melindungi pengguna Anda dari yang terburuk dari ketidaktahuan mereka sendiri, dengan mengesampingkan izin sistem file grup-pengguna-lainnya yang biasa, tanpa banyak peluang untuk memecahkan sesuatu yang penting .

Mereka dapat sangat berguna jika Anda (fi) membutuhkan direktori home agar dapat diakses dunia karena konten web harus dapat diakses untuk apache di ~/public_html/. (Meskipun dengan ACL sekarang Anda dapat melakukan sebaliknya, hapus akses untuk semua dan gunakan ACL efektif spesifik untuk pengguna apache.)

Ya, pengguna yang berpengetahuan dapat menghapus / menimpa mereka lagi, hanya cukup biasa bahwa itu tidak mungkin, dan para pengguna yang biasanya tidak mudah untuk chmod -R 777 ~/melakukannya, kan?

Anda perlu me-mount sistem file dengan aclopsi mount:

 mount -o remount,acl /home

Dalam banyak distribusi, standarnya adalah untuk membuat grup pengguna, setiap pengguna memiliki grup utama mereka, dan saya telah menetapkan semua pengguna dalam grup sekunder dengan nama tidak imajinatif users.

Menggunakan ACL sekarang sepele untuk mencegah pengguna lain mengakses direktori home:

Sebelum:

 chmod 0777 /home/user* 

 ls -l /home/user*
 drwxrwxrwx.  2 user1  user1  4096 Jul 11 15:40 user1
 drwxrwxrwx.  2 user2  user2  4096 Jul 11 15:24 user2

Sekarang atur izin direktori yang efektif untuk anggota usersgrup menjadi 0tidak baca, tulis atau akses:

 setfacl setfacl -m g:users:0 /home/user*

 ls -l 
 drwxrwxrwx+  2 user1  user1  4096 Jul 11 15:40 user1
 drwxrwxrwx+  2 user2  user2  4096 Jul 11 15:24 user2

The +tanda menunjukkan kehadiran pengaturan ACL sana. Dan getfacldapat mengkonfirmasi bahwa:

getfacl /home/user1
getfacl: Removing leading '/' from absolute path names
# file: home/user1
# owner: user1
# group: user1
user::rwx
group::rwx
group:users:---
mask::rwx
other::rwx

The group:users:---menunjukkan bahwa kelompok efektif tidak memiliki hak akses, meskipun izin reguler untuk makhluk lainother::rwx

Dan pengujian sebagai user1:

[user1@access ~]$ ls -la /home/user2
ls: cannot open directory /home/user2: Permission denied

Solusi umum kedua pada sistem bersama adalah memiliki direktori home mount automounter atas permintaan server yang didedikasikan untuk akses shell. Itu jauh dari bukti bodoh, tetapi biasanya hanya segelintir pengguna akan login bersamaan yang berarti hanya direktori home dari para pengguna yang terlihat dan dapat diakses.

HBruijn
sumber
5
Apa itu "fi" ? Saya tidak akan merekomendasikan menggunakan akronim atau singkatan kecuali mereka yang klasik seperti "misalnya", "yaitu", "dll" dan mungkin OP.
Cristian Ciupitu
3

Linux Containers (LXC) dapat menjadi kombinasi terbaik dari chroot dan sistem terpisah.

  1. Mereka lebih seperti chroot canggih, bukan virtualisasi, tetapi Anda bisa menggabungkan sistem operasi yang berbeda dalam satu server.

  2. Anda dapat memberikan pengguna sistem operasi yang lengkap dan chroot di sana, jadi ketika pengguna masuk, ia pergi ke wadahnya. Dan Anda juga dapat membatasi penggunaan prosesor dan memori di sana.

Stéphane Graber, penulis LXC, memiliki tutorial yang bagus untuk membantu Anda memulai.

maniaque
sumber
Anda tidak dapat benar-benar menggabungkan sistem operasi yang berbeda, karena semuanya perlu menggunakan kernel Linux , tetapi Anda dapat menggunakan distribusi yang berbeda .
Cristian Ciupitu
1
Terima kasih :) Ya, sistem operasi berbasis kernel linux berbeda.
maniaque
@CristianCiupitu maksud Anda kernel Linux identik yang sama? atau maksud Anda setiap wadah dapat memiliki versi kernel yang berbeda?
agks mehx
@agksmehx, semua wadah LXC berbagi kernel dari host . Hanya aplikasi dan pustaka yang digunakan. Jadi misalnya jika Anda memiliki host RHEL 7 dengan wadah Ubuntu 14.04, kernel RHEL (3.10.0-123) akan digunakan, sedangkan yang Ubuntu (3.13.0-24.46) tidak akan digunakan; baca juga komentar ini dari tutorial. By the way, karena kernel dari wadah tidak digunakan, mungkin ide yang baik untuk menghapusnya untuk menghemat ruang disk.
Cristian Ciupitu
@CristianCiupitu itulah yang saya pikir. tidak jelas dari jawaban atau komentar, jadi saya ingin mengklarifikasi.
agks mehx
3

Misalnya, jika Anda ingin pengguna hanya memiliki akses ke homedirektori sendiri , Anda harus melakukan:

cd /home
sudo chmod 700 *

Sekarang /home/usernamehanya dapat dilihat oleh pemiliknya. Untuk menjadikan ini default untuk semua pengguna baru, edit /etc/adduser.confdan atur DIR_MODEke 0700sebagai ganti 0755default.

Tentu saja jika Anda ingin mengubah DIR_MODE default, itu tergantung pada distribusi Anda, yang saya posting berfungsi Ubuntu.

sunting

Seperti @Dani_l sebutkan dengan benar, jawaban ini benar untuk membuatnya BUKAN dunia dibaca.

Marek
sumber
Mereka disebut "dapat dibaca dunia" karena suatu alasan.
Mark K Cowan
1
@ DennisNolte Sebenarnya, itu membantu, bahkan jika file dapat dibaca dunia, jika mereka berada dalam direktori yang belum Anda baca atau eksekusi, Anda tetap tidak dapat membacanya.
Vality
1
@ Vality benar, menghapus komentar saya karena itu jelas salah.
Dennis Nolte
2

Hanya untuk menjadi bertele-tele - Tidak, tidak ada.
@Marek memberikan jawaban yang benar , tetapi pertanyaan Anda salah - Anda tidak dapat mencegah siapa pun mengakses file "dapat dibaca dunia".
Entah itu bisa dibaca dunia, atau tidak. @ Marek jawaban benar dalam membuat mereka TIDAK dapat dibaca dunia.

Dani_l
sumber
2
salah, chroot / jail pengguna ke subfolder dan dia tidak dapat membaca "biasanya" file yang dapat dibaca dunia.
Dennis Nolte
1
-1 Saya pikir Anda terlalu kritis terhadap pertanyaan OP. Dia ingin memberi pelanggannya jaring pengaman jika mereka tidak pandai tentang izin mereka. Tetapi bagi saya sepertinya OP tidak mengetahui bagaimana cara kerja izin file Unix atau prinsip dasar keamanan.
Kevin - Reinstate Monica
Selain itu, Anda dapat meletakkan file ke direktori di dalam direktori izin 000, maka tidak ada yang dapat mengaksesnya bahkan jika file tersebut dapat dibaca dunia.
Vality
tak seorangpun? bahkan tidak root? ;-)
Dani_l
@Kevin setuju bahwa komentar saya dikritik tidak perlu. Namun, Dani_I tidak boleh menyalahkan bahwa dia pedandik dan beeing salah. Tidak menyatakan bahwa saya tidak setuju dengan sisa jawabannya.
Dennis Nolte
0

Saya tidak melihat 'shell terbatas' dalam jawaban yang diberikan sejauh ini.

ln / bin / bash / bin / rbash

Jadikan ini sebagai shell login mereka.

bbaassssiiee
sumber
0

Jika server web berjalan sebagai pengguna dan grup yang sama untuk setiap domain yang diinangi, sulit (jika bukan tidak mungkin) untuk membuat pengaturan aman.

Anda ingin file tertentu dapat diakses oleh pengguna serta server web, tetapi tidak untuk pengguna lain. Tetapi begitu server web dapat mengaksesnya, pengguna lain dapat membacanya dengan meletakkan symlink ke file di dalam situs web mereka sendiri.

Jika Anda dapat membuat setiap situs web dijalankan sebagai pengguna yang terpisah, maka itu menjadi cukup sederhana. Setiap pelanggan sekarang akan memiliki dua pengguna pada sistem, satu untuk server web dan satu untuk akses shell.

Buat grup yang berisi dua pengguna ini. Sekarang buat direktori dengan grup itu dan root pengguna. Direktori itu harus memiliki izin 750, yang berarti root memiliki akses penuh dan grup telah membaca dan mengeksekusi akses. Di dalam direktori itu Anda bisa membuat direktori home untuk masing-masing dari dua pengguna. Ini berarti direktori home pengguna tidak lagi memiliki formulir /home/username, melainkan sesuatu dengan setidaknya satu komponen direktori lagi. Ini bukan masalah, tidak ada yang membutuhkan direktori home untuk dinamai sesuai dengan konvensi tertentu.

Menjalankan situs web dengan pengguna dan grup yang berbeda mungkin rumit, jika Anda menggunakan vhost berbasis nama. Jika ternyata Anda hanya dapat membuat pemisahan berfungsi dengan vhost berbasis IP, dan Anda tidak memiliki cukup IP untuk setiap situs, Anda dapat meng-host setiap situs web pada alamat IPv6 dan meletakkan proxy terbalik untuk semua itu pada sebuah Alamat IPv4.

kasperd
sumber