Masalah izin dengan / var / www / html dan direktori home saya sendiri untuk root dokumen situs web

34

Saya mencoba untuk tidak memberikan izin 777 di /var/www/htmlfolder saya , tetapi saya ingin mengedit file saya tanpa sudo. Jadi saya pikir dalam membuat symlink folder di direktori home saya di dalamnya /var/www/html. Saya membuatnya menggunakan sudo ln -sT /home/andre/www/moodle/ moodle, dan ls -lahasilnya adalah ini:

andre@andre-270E5G:/var/www/html$ ls -la
total 8
drwxr-xr-x 2 root root 4096 Mai  4 10:20 .
drwxr-xr-x 4 root root 4096 Abr 29 14:29 ..
lrwxrwxrwx 1 root root   23 Mai  4 10:20 moodle -> /home/andre/www/moodle/

Jadi, folder moodle saya telah membaca, menulis, dan mengeksekusi izin untuk semua orang, dan bukan itu yang saya inginkan. Saya menggunakan perintah yang sudo chmod -R 775 moodle/mencoba mengubahnya, tetapi tetap dengan membaca, menulis, dan mengeksekusi izin untuk semua. Saya mencoba hal yang sama dengan folder moodle /home/andre/www/moodle, tetapi tetap sama. Output dari ls -ladalam /home/andre/www/adalah:

andre@andre-270E5G:~/www$ ls -la
total 28
drwxrwxr-x  3 andre andre  4096 Mai  4 10:02 .
drwx------ 49 andre andre 20480 Mai  4 10:01 ..
drwxrwxr-x 41 andre andre  4096 Mai  4 10:02 moodle

Jadi folder moodledalam /home/andre/www/memiliki izin yang saya inginkan.

Sebagai masalah tambahan, ketika saya mengakses localhost/moodlesaya mendapatkan 403 kesalahan terlarang.

Apa yang saya lakukan salah di sini?

André Carvalho
sumber

Jawaban:

63

Anda seharusnya tidak perlu menjalankan situs web dari dalam direktori home Anda . PERNAH. Anda sebaliknya harus memberikan server web kemampuan untuk melintasi/home/untuk melihat struktur direktori, tetapi juga ke/home/$USER/(direktori home pengguna Anda, di mana kami dapat mencoba dan melihat apa lagi yang ada di direktori pengguna Anda), serta subfolder lainnya. di sana. Server web yang tidak terkonfigurasi atau salah konfigurasi atau tidak ditambal dapat menyebabkan kebocoran data besar-besaran dengan cara ini, atau hilangnya kredensial dan semacamnya yang akan menempatkan data pribadi Anda dan login pada hal-hal yang berbeda berisiko. Pendekatan symlink yang Anda gunakan tidak membantu karena alasan yang sama dengan mencoba memberikan izin kepada Apache untuk membaca/home/andre/www/moodle- server web harus dapat menelusuri direktori home Anda untuk sampai ke lokasi yang /var/www/htmlditunjuk symlink , yang masih mengandung risiko keamanan tersebut.

Pertama, gunakan sudo cp -r /home/andre/www/moodle/ /var/www/html/. Ini akan menyalin file Anda ke /var/www/html, dan menjauhkannya dari direktori home Anda sendiri. Kami kemudian akan mengulangi izin sehingga Anda dan server web dapat mengakses semua yang ada di direktori itu, dan memberikan pengguna Anda baca / tulis penuh untuk semua file dan direktori. Kemudian, Anda hanya perlu bekerja /var/www/htmluntuk situs Anda.

Ini berlaku, empat langkah, setelah Anda menyalin kembali data Anda ke /var/www/html:

  1. Berikan akses Apache ke folder dan file, sehingga dapat melayani situs tanpa 403 kesalahan.
  2. Berikan 'pemilik' kepada pengguna Anda di atas file dan folder, dan beri diri Anda baca / tulis pada semua file dan folder, serta kemampuan untuk menelusuri direktori.
  3. (Opsional tetapi disarankan) Atur sedemikian rupa sehingga semua file atau folder yang dibuat dari sini dalam keseluruhan struktur direktori memiliki kelompok yang ditetapkan www-data.
  4. (Opsional) Pembersihan keamanan akhir, tempat kami mengatur izin sehingga Anda dan server web dapat melihat data situs, tetapi pengguna lain tidak dapat mengakses file atau struktur direktori untuk situs tersebut.

(1) Izinkan Apache mengakses folder dan file.

sudo chgrp -R www-data /var/www/html
sudo find /var/www/html -type d -exec chmod g+rx {} +
sudo find /var/www/html -type f -exec chmod g+r {} +

Ini secara rekursif menetapkan 'grup' www-datauntuk folder dan file. Ini kemudian memberikan izin server web untuk recurse dan mendapatkan akses ke struktur direktori root dokumen situs ( +xhanya untuk direktori). Ini kemudian juga memastikan server web telah membaca izin untuk semua file, sehingga data situs dapat diterima.

Mungkin ada beberapa kasus di mana Anda harus memberikan izin menulis server web ke file, atau ke direktori - ini dapat dicapai dengan melakukan sudo chmod g+w /var/www/html/PATH(di mana PATHpath ke file atau folder dalam struktur direktori di mana Anda perlu menerapkan tulis izin untuk server web).

PEMBERITAHUAN : Ada banyak kasus di mana hal ini dapat memaparkan informasi 'aman' tentang konfigurasi situs (seperti kredensial akses basis data, dll.), Dan Anda harus menghapus izin akses 'lain' untuk data tersebut pada masing-masing file atau direktori dengan berikut ini: sudo chmod o-rwx /var/www/html/FILEPATH(mengganti FILEPATHdengan path relatif ke /var/www/htmlfolder untuk file).

Perhatikan juga bahwa Anda mungkin harus menjalankan kembali perintah ini di masa mendatang jika 'file baru' mendapatkan 403 masalah, untuk memberikan izin yang benar ke server web agar tetap dapat mengakses file dan folder yang dibuat atau disalin dan tidak www-datamengatur grup dengan benar.


(2) Berikan pemilik Anda hak baca / tulis ke folder dan file, dan mengizinkan akses folder untuk melintasi struktur direktori.

sudo chown -R USER /var/www/html/
sudo find /var/www/html -type d -exec chmod u+rwx {} +
sudo find /var/www/html -type f -exec chmod u+rw {} +

Ganti USERdalam perintah pertama dengan nama pengguna Anda sendiri!

Kami melakukan tiga hal di sini. Pertama, kami menetapkan pengguna Anda untuk menjadi "Pemilik" semua file dan direktori di /var/www/html. Selanjutnya, kami menetapkan izin baca dan tulis pada folder, dan memungkinkan Anda untuk mengakses folder untuk masuk ke dalamnya ( +xitem pada item direktori). Kami kemudian mengatur semua file untuk memiliki izin baca / tulis untuk pemilik, yang baru saja kami atur.


(3) (Opsional) Pastikan setiap file baru setelah ini dibuat dengan www-datasebagai pengguna 'akses'.

sudo find /var/www/html -type d -exec chmod g+s {} +

Ini menetapkan bit "set gid" untuk grup pada direktori. File dan folder yang dibuat di dalam direktori ini akan selalu memiliki www-datasebagai grup, yang memungkinkan akses server web.


(4) (Opsional) Pembersihan keamanan akhir, jika Anda tidak ingin pengguna lain dapat melihat data

Kami membutuhkan pengguna Anda untuk melihat direktori dan file. Kami membutuhkan server web untuk melakukannya juga. Kami mungkin tidak ingin pengguna sistem lain (kecuali root) melihat data. Jadi jangan biarkan mereka memberikan akses itu, dan buatlah itu sehingga hanya pengguna dan server web Anda yang dapat melihat data.

sudo chmod -R o-rwx /var/www/html/

CATATAN: Anda tidak perlu menjalankannya kembali di lain waktu, atau mengedit izin untuk kategori izin 'lain' di sini. Jika pengguna 'lain' tidak dapat mengakses /var/www/html/(mereka tidak memiliki +xbit yang diperlukan /var/www/htmluntuk melintasi struktur filestruktur dan direktori, atau +rbit untuk membaca daftar file), maka izin pada item di bawah direktori itu untuk pengguna lain atau kelompok tidak akan terlalu berarti.


Ada solusi yang sedikit kurang invasif untuk ini, juga, meskipun itu tidak dijamin untuk semua file baru, juga tidak dijamin untuk bekerja pada semua sistem file , yang melibatkan daftar kontrol akses file. Ini memungkinkan Anda meninggalkan kepemilikan file www-datauntuk hal-hal, tetapi memberi Anda hak pemilik yang efektif, untuk semua maksud dan tujuan, meskipun Anda tidak memiliki file secara pribadi.

Solusi ini sedikit kurang invasif, dan memungkinkan Anda memiliki direktori dan semua file yang dimiliki oleh www-data:www-dataatau root:www-datatetapi juga memberi Anda akses. Ini menggunakan Daftar Kontrol Akses , yang memungkinkan Anda memiliki beberapa pengguna memiliki izin tanpa mengatur masing-masing grup. Ini juga memungkinkan pengguna sistem rootatau www-datamemiliki file, tetapi juga memungkinkan Anda menambahkan izin tambahan berdasarkan kasus per kasus, dan menyempurnakan izin untuk pengguna tertentu sehingga mereka dapat membaca sesuatu tetapi tidak mengedit, dan semacamnya.

Dengan asumsi kami masih bekerja dengan /var/www/html/, dan kami tidak ingin mengintai pengguna selain kami dan sistem (dan tentu saja root) untuk melihat data kami, kami harus melakukan hal-hal berikut:

  1. Berikan kepemilikan kembali kepada pengguna sistem server web www-data.
sudo chown -R www-data: www-data / var / www / html
  1. Secara rekursif memberi Anda membaca / menulis pada file, sementara memberi pengguna lain (tidak termasuk www-datadan roottentu saja) tidak ada akses ke file.
sudo find / var / www / html -type f -exec setfacl -mu: YOURUSERNAME: rw -m other :: --- {} \;
  1. Secara rekursif beri diri Anda baca / tulis / lintasi direktori, hapus akses ke folder untuk pengguna lain (tidak termasuk www-datadan root) dan tetapkan ini sebagai ACL 'default' untuk file baru di direktori.
sudo find / var / www / html -type d -exec setfacl -d -mu: YOURUSERNAME: rwx -mo :: --- {} \;
  1. Kita juga perlu mengatur setgidbit untuk semua direktori, sehingga jika Anda membuat file server web masih dapat mengaksesnya www-datamelalui izin grup.
sudo find / var / www / html -type d -exec chmod g + x {} \;

Dan sekarang Anda sudah memiliki akses ke semua direktori, dan Anda tidak perlu mengambil akses dari www-datayang membantu karena server web masih dapat membuat file di mana saja seperti yang diperlukan (seperti antarmuka berbasis PHP yang memiliki direktori cache sendiri dan semacamnya. perlu dibuat dan ditulis untuk operasi yang tepat).

Satu-satunya peringatan: Jika Anda secara manual membuat file baru, Anda perlu chown sesuai dengan itu untuk memberikan kepemilikan kepada server web. Itu sederhana sudo chown www-data:www-data filename, dan daftar kontrol akses harus tetap membiarkan Anda memiliki hak pemilik yang efektif untuk file tersebut.

Ada beberapa kasus di mana saya harus melakukan ini sebagai sysadmin untuk beberapa jenis akses non-standar tanpa mengubah pemilik file yang diberikan. Ini berfungsi, tetapi memiliki sakit kepala sendiri, karena tidak setiap sistem file mendukung daftar akses file.

Thomas Ward
sumber
2
@ AndréCarvalho +xke file akan memberikan izin yang dapat dieksekusi, dan kami tidak ingin file PHP dieksekusi, tentu saja, melalui baris perintah PHP atau sebagai yang dapat dieksekusi di server itu sendiri - kami ingin mereka diproses oleh parser PHP di server web (dan kami tidak perlu file PHP untuk memiliki +xparser PHP untuk membaca dan memprosesnya). Direktori perlu +xuntuk mengizinkan traversal melalui direktori - yaitu, jika direktori tidak +xdan saya tidak root, saya tidak bisa masuk ke direktori, yang merupakan masalah Anda dengan Apache tidak bekerja dengan symlink dan rumah Anda direktori.
Thomas Ward
1
@ AndréCarvalho www-dataadalah grup sistem - ini bukan grup untuk pengguna standar.
Thomas Ward
1
@JunaidQadirShekhanzai Tidak mungkin menyediakan karena pengaturan orang sangat berbeda dari lingkungan yang mereka butuhkan, dan banyak faktor lainnya. 'File shell' seperti itu tidak mungkin dihasilkan mengingat ada komponen opsional . Saya dapat mencoba dan membuat skrip Python yang dapat melakukan ini, tetapi kami masih mengalami hal-hal seperti pembatasan sistem, tugas opsional, jalur yang bervariasi, dll.
Thomas Ward
1
@ T.Todua bukan itu yang saya katakan. Saya mengatakan bahwa Anda tidak boleh menjalankan situs dari (baca: dari dalam) direktori "rumah" Anda - yaitu, Anda tidak boleh menjalankan apa pun di /home/USER/...server web. Anda salah membaca dan salah mengerti arti kata yang saya gunakan. /var/www/*adalah tempat yang relatif 'aman' untuk menjalankan situs web karena itu adalah folder / ruang khusus untuk itu. Namun, /var/www/htmlBUKAN aman karena itu ditulis oleh webservers saat dipasang dan semacamnya, dan mengarah pada penghancuran data penting (jadi gunakan /var/www/SUBDIRECTORYdengan masing-masing subdir situs)
Thomas Ward
1
Saya telah menyesuaikan kata-kata untuk kejelasan.
Thomas Ward
2

Seluruh gagasan menggunakan symlink untuk memecahkan masalah izin cacat dan tidak bisa berfungsi. Izin yang ditampilkan untuk symlink itu sendiri sebagian besar tidak relevan, mereka tidak dapat digunakan untuk menghindari izin direktori "nyata". Membuat symlink dari /var/www/html/moodleke /home/andre/www/moodle/tidak menghindari izin untuk /home/andre/www/moodle/. Siapa pun, yang ingin melakukan hal-hal /var/www/html/moodlehanya dapat melakukannya, jika ia telah mendapatkan izin yang diperlukan /home/andre/www/moodle/.

Eksekusi Anda sudo chmod -R 775 moodle/benar-benar melakukan memiliki efek, tetapi berbeda dari apa yang Anda pikir itu tidak mengubah izin dari symlink, tapi dari target symlink /home/andre/www/moodle/.

Kesalahan 403 yang Anda dapatkan di server web mungkin karena server web Anda tidak memiliki izin yang diperlukan untuk masuk /home/andre. Ini bukan "masalah tambahan", tetapi karena masalah izin yang sama.

Jadi, alih-alih menggunakan symlink, Anda harus mencari izin yang memungkinkan Anda untuk mengedit file dan server web untuk mengaksesnya (atau bahkan mengeditnya, itu tergantung pada aplikasi). Apa sebenarnya izin itu, tergantung pada kasus penggunaan persis Anda (konfigurasi aplikasi dan server Anda).

Secara umum saya pikir itu ide yang baik bahwa Anda memiliki file dan memiliki izin rw, server web hanya membaca akses ke file melalui izin grup, dan semua pengguna lain tidak memiliki akses sama sekali.

Contoh izin (yang mungkin tidak berfungsi untuk kasus penggunaan Anda karena informasi yang hilang):

andre@fermat:/var/www/html$ ls -al moodle/
total 0
drwxr-x--- 2 andre www-data 60 mai  4 16:20 .
drwxr-xr-x 3 root  root     80 mai  4 16:20 ..
-rw-r----- 1 andre www-data  0 mai  4 16:20 index.html

Anda dapat melihat bahwa direktori memiliki akses yang cukup bagi Anda sebagai pemilik untuk memasukkannya dan memodifikasi kontennya, server web (dalam grup www-data) dapat masuk dan membaca. File-file itu sendiri dapat dibaca dan ditulis untuk Anda (pemilik) dan dapat dibaca ke server web (dalam grup www-data). Semua pengguna lain tidak memiliki akses apa pun.

Sekali lagi, tolong ambil ini hanya sebagai contoh. Pengguna / grup yang tepat dari server web Anda tergantung pada konfigurasi Anda. Dan aplikasi Anda (moodle) mungkin memerlukan izin berbeda, Anda harus membaca dokumentasinya.

mastov
sumber
Setuju, tetapi ini tidak terlalu membantu jika mereka tidak tahu cara mengatur izin dengan benar, dan mereka akan mengalami masalah lain juga.
Thomas Ward
@ ThomasW .: Maka pertanyaan tentang cara mengatur izin dengan benar harus menjadi pertanyaan baru, termasuk informasi yang diperlukan, seperti konfigurasi server web, cara yang diinginkan untuk mengedit file dan kebutuhan aplikasi.
mastov
atau ditulis sebagai jawaban yang benar - yang sedang saya lakukan sekarang. Anda juga sebaiknya tidak pernah menjalankan apa pun dari / home / USER / untuk situs web, ia juga memiliki akses ke banyak data 'pengguna' lainnya jika server web tidak ditambal atau dikonfigurasi dengan benar.
Thomas Ward
@ Mastov Mengerti. Anda memecahkan banyak pertanyaan yang saya miliki dengan penjelasan Anda.
André Carvalho
2

Jawaban luar biasa oleh Thomas ward https://askubuntu.com/a/767534/717860

Anda dapat melakukan semua langkah yang disarankan hanya dalam 3 perintah, bukan 8 perintah:

3 perintah:

sudo chown -R ubuntu:www-data /var/www
sudo find /var/www -type d -exec chmod 2750 {} \+
sudo find /var/www -type f -exec chmod 640 {} \+

lakukan pekerjaan yang sama dengan 8 perintah berikut:

sudo chgrp -R www-data /var/www
sudo find /var/www -type d -exec chmod g+rx {} +
sudo find /var/www -type f -exec chmod g+r {} +
sudo chown -R ubuntu /var/www/
sudo find /var/www -type d -exec chmod u+rwx {} +
sudo find /var/www -type f -exec chmod u+rw {} +
sudo find /var/www -type d -exec chmod g+s {} +
sudo chmod -R o-rwx /var/www/
vipin mehta
sumber