GNU/Linux >> Belajar Linux >  >> Linux

Bedakan setiap pengguna apache dan berikan izin

Jika saya memahami pertanyaan Anda dengan benar, masalah Anda dimulai dengan struktur kerangka kerja izin/pengguna linux. Dengan demikian, proses Apache yang memiliki pengguna adalah yang membuat dir dan file saat menjalankan skrip Anda.

Jika Anda memerlukan pemisahan pengguna untuk skrip, misalnya:Anda memiliki direktori yang berbeda untuk host (virtual) yang berbeda di server Anda dan Anda tidak ingin skrip dari satu host bekerja pada data dari host yang berbeda di server (apache) yang sama, maka Anda harus menggunakan 'mpm_itk_module' daripada apache 'mpm-prefork' yang lebih umum.

Dengan menggunakan ini, Anda dapat pergi dan menentukan pengguna/grup yang digunakan apache saat menjalankan skrip apa pun dan mis. membuat direktori hanya dengan perintah ini untuk setiap entri host virtual di httpd.conf:

<IfModule mpm_itk_module>
AssignUserId USER GROUP
</IfModule>

Jika Anda benar-benar ingin membuat direktori berbeda dari SATU eksekusi skrip, Anda memerlukan proses apache untuk dimiliki oleh root.root, lalu skrip perlu menyetel izin dan pemilik untuk setiap direktori seperti yang Anda inginkan.

Namun, menjalankan skrip terbaik di server web sebagai root bukanlah ide yang baik, karena Anda mungkin gagal memikirkan risiko apa pun.

Pemisahan pengguna/hak oleh vhosts tampaknya merupakan cara yang jauh lebih hemat menurut saya.

Hal lain - PHP saja - adalah suPHP -> http://www.suphp.org

EDIT:

Oke, saya telah melihat situs Anda dan meskipun saya tidak dapat berbicara bahasa Spanyol, sepertinya Anda hanya memiliki satu situs web, bertindak untuk pengguna berbeda yang selalu datang melalui halaman web ini. Jadi di mana perlunya pemisahan pengguna pada izin sistem file linux? Anda dapat membatasi semuanya dengan aplikasi Anda tanpa perlu pengguna sistem file. Bahkan jika Anda memberi mis. akses ftp tambahan - batasi mis. dengan proftpd ia memiliki mekanisme chroot sendiri untuk pengguna yang berbeda.

Anda harus memperhatikan hak sistem file hanya jika Anda tidak dapat mengontrol siapa yang mengeksekusi apa. Itu adalah masalah umum pada host multidomain yang dapat Anda selesaikan dengan mpm_itk_module yang saya sebutkan.

Mungkin Anda harus lebih menjelaskan situasi Anda?

EDIT 2:

Seperti yang disarankan dalam komentar, jika Anda HANYA menggunakan apache untuk memberi pengguna akses ke file untuk diunggah/dimanipulasi, maka letakkan saja file di luar (!) Pohon documentroot dari apache dan buat database sederhana untuk mengetahui file mana yang dimiliki oleh yang mana pengguna:

user a | file parentdir/filename

Ini bisa menjadi tabel yang mudah dan kode php Anda memberikan daftar kepada pengguna dari database file mana yang dapat dilihat/dimanipulasi dan kode Anda berfungsi sebagaimana dimaksud oleh tindakan pengguna.

Selama Anda tidak memberi pengguna akses ke file oleh layanan lain (ftp, ssh, dll.), TIDAK perlu bekerja dengan hak pengguna linux sama sekali. Berhati-hatilah untuk menempatkan file di luar documentroot server sehingga hanya kode php Anda yang memiliki akses ke file dengan hak pengguna apache server Anda.

EDIT 3:

Haha, sekarang akhirnya saya mendapatkan masalah Anda setelah saya membaca posting Anda yang serupa:(Bagaimana pengguna Apache dapat menulis file ketika memiliki izin untuk melakukannya?) Dalam hal ini (dengan pengguna yang BENAR-BENAR anonim di halaman web Anda) Anda TIDAK memiliki kesempatan untuk memecahkan ini sama sekali. Setiap pengunjung ditangani sebagai pengunjung yang sama tanpa autentikasi. Dan seperti yang saya asumsikan dalam EDIT terakhir saya dan berkomentar di pos serupa:sama sekali tidak perlu menangani izin file linux.

SOLUSI ANDA;) :Anda perlu melakukan manipulasi file dalam satu sesi dengan id sesi saat pengguna mengunjungi halaman Anda. Jadi kode Anda perlu menangani hubungan antara pengunjung (id sesi) dan file yang dia unggah dengan id sesi ini. Menggunakan session-id yang valid selama pengunjung online adalah cara terbaik untuk melakukannya. Dan lagi - tidak perlu izin sistem file....;)

Cara kedua adalah dengan pengguna yang diautentikasi seperti yang disarankan sebelumnya:Buat tabel db dengan pengguna/kata sandi untuk masuk ke halaman web (bukan server) dan tabel lain yang menyimpan relasi pengguna/file. Kemudian, setelah dia masuk ke halaman web, bekerja lagi dengan sesi untuk memungkinkan pengguna mengakses/memanipulasi file yang sudah diunggah.


Saya dapat bahwa Anda menjalankan apache dengan mod_php. Jadi itu berarti instance PHP Anda berfungsi di bawah instance apache dan memiliki USER dan GROUP apache. Anda dapat membuat folder dan dapat mengubah pemilik folder ini tetapi pemilik harus pengguna di sistem Anda (bukan apache atau pengguna virtual yang sama).

Tetapi Anda dapat menyimpan di setiap file direktori misalnya ".permitions" dan memasukkan pemilik virtual ke dalam file itu. Selanjutnya Anda perlu memfilter setiap upaya penulisan (hapus, ganti nama, dll...) ke direktori ini dan bandingkan pengguna virtual Anda dan pengguna yang disimpan dalam file .permitions.

Kelas Sampel (tidak lengkap tetapi lebih dari cukup untuk memahami ide):

class UserDirs {
  private $path='/home/vusers';

  public function mkdir($user){
      $d = $this->path.'/'.md5($user);
      mkdir($d);
      file_put_contents($d."/.owner",$user);
  }

  public function checkOwner($user, $dirname){
       $f = $dirname."/.owner";
       $virtual_owner = file_get_contents($f);
       return $user === $virtual_owner;
  }

}

$d = new UserDirs()
$d->mkdir("foo","bar");
echo $d->checkOwner("foo1","bar") === true ? "OK":"FAIL";
echo $d->checkOwner("foo","bar") === true ? "OK":"FAIL";

Anda dapat mengenkapsulasi semua yang Anda perlukan di kelas ini untuk bekerja dengan UserDirs dan memperluas kelas sesuai kebutuhan Anda.


Pengguna Anda tidak memiliki akun sistem. Mungkin juga tidak layak untuk membuat akun tersebut. Oleh karena itu, saya akan merekomendasikan mengelola semua ini melalui UI Web.

Lanjutkan untuk membuat direktori Anda apa adanya. Izinnya baik-baik saja. Antarmuka pengguna Anda perlu diubah, untuk hanya menampilkan direktori atau file pengguna itu. Saya menganggap Anda memiliki database yang terkait dengan halaman ini. Kaitkan nama pengguna dan nama direktori yang dibuat secara acak dengan pengguna. Jika seseorang mencoba untuk pergi ke jalur langsung dan mereka BUKAN pengguna yang terkait dengan direktori itu, tendang mereka kembali ke layar login.

Sebagai ilustrasi, saya membuat akun bernama test dan mungkin diberi direktori unik. Jika saya keluar, saya seharusnya tidak dapat mengunjungi direktori itu karena kode Anda akan melihatnya

  • Saya belum masuk dan karena itu tidak memiliki akses ke direktori itu

Jika saya login sebagai test2 dan kunjungi direktori test , kode Anda akan melihatnya

  • Saya bukan pemilik direktori yang sedang dikunjungi dan karenanya harus dialihkan seperlunya.

Anda perlu menambahkan fungsi yang memeriksa direktori yang dikunjungi pengguna dan membandingkannya dengan direktori yang terkait dengan pengguna. Jika keduanya cocok, izinkan mereka untuk melanjutkan. Jika tidak cocok, alihkan pengguna.


Linux
  1. Ubuntu – Bagaimana Mengonfigurasi Izin Untuk Mengizinkan Gedit, Apache, Dan Ide Bermain Bersama?

  2. Buat pengguna baru dan berikan izin di MySQL

  3. Cara mengelola Izin/Kepemilikan File dan Direktori di Linux

  1. tumpukan kernel dan tumpukan ruang pengguna

  2. Mempertahankan izin file dan folder dengan rsync

  3. Pasang Drive Jaringan cifs:izin tulis dan chown

  1. Linux chmod and chown – Cara Mengubah Izin dan Kepemilikan File di Linux

  2. Diutamakan Pengguna Dan Pemilik Grup Dalam Izin File?

  3. Ssh Dan Izin Direktori Rumah?