GNU/Linux >> Belajar Linux >  >> Linux

Izin apa yang harus dimiliki file/folder situs web saya di server web Linux?

Solusi 1:

Saat memutuskan izin apa yang akan digunakan, Anda perlu tahu persis siapa pengguna Anda dan apa yang mereka butuhkan. Server web berinteraksi dengan dua jenis pengguna.

Diautentikasi pengguna memiliki akun pengguna di server dan dapat diberikan hak khusus. Ini biasanya mencakup administrator sistem, pengembang, dan akun layanan. Mereka biasanya melakukan perubahan pada sistem menggunakan SSH atau SFTP.

Anonim pengguna adalah pengunjung situs web Anda. Meskipun mereka tidak memiliki izin untuk mengakses file secara langsung, mereka dapat meminta halaman web dan server web bertindak atas nama mereka. Anda dapat membatasi akses pengguna anonim dengan berhati-hati tentang izin yang dimiliki proses server web. Pada banyak distribusi Linux, Apache dijalankan sebagai www-data pengguna tetapi bisa berbeda. Gunakan ps aux | grep httpd atau ps aux | grep apache untuk melihat pengguna apa yang digunakan Apache di sistem Anda.

Catatan tentang izin linux

Linux dan sistem yang sesuai dengan POSIX lainnya menggunakan izin unix tradisional. Ada artikel bagus di Wikipedia tentang izin Filesystem, jadi saya tidak akan mengulangi semuanya di sini. Namun ada beberapa hal yang harus Anda ketahui.

Bit eksekusi
Skrip yang ditafsirkan (mis. Ruby, PHP) berfungsi dengan baik tanpa izin eksekusi. Hanya skrip biner dan shell yang memerlukan bit eksekusi. Untuk melintasi (memasuki) direktori, Anda harus memiliki izin eksekusi pada direktori itu. Server web memerlukan izin ini untuk mencantumkan direktori atau menayangkan file apa pun di dalamnya.

Izin file baru default
Saat sebuah file dibuat, biasanya file tersebut mewarisi id grup dari siapa pun yang membuatnya. Namun terkadang Anda ingin file baru mewarisi id grup folder tempatnya dibuat, jadi Anda harus mengaktifkan bit SGID di folder induk.

Nilai izin default bergantung pada umask Anda. Umask mengurangi izin dari file yang baru dibuat, sehingga nilai umum 022 menghasilkan file yang dibuat dengan 755. Saat berkolaborasi dengan grup, ada gunanya mengubah umask Anda menjadi 002 sehingga file yang Anda buat dapat dimodifikasi oleh anggota grup. Dan jika Anda ingin menyesuaikan izin file yang diunggah, Anda perlu mengubah umask untuk apache atau menjalankan chmod setelah file diunggah.

Masalah dengan 777

Saat Anda chmod 777 situs web Anda, Anda tidak memiliki keamanan apa pun. Setiap pengguna di sistem dapat mengubah atau menghapus file apa pun di situs web Anda. Namun yang lebih serius, ingatlah bahwa server web bertindak atas nama pengunjung situs web Anda, dan sekarang server web dapat mengubah file yang sama dengan yang dijalankannya. Jika ada kerentanan pemrograman di situs web Anda, kerentanan tersebut dapat dimanfaatkan untuk merusak situs web, memasukkan serangan phishing, atau mencuri informasi dari server tanpa sepengetahuan Anda.

Selain itu, jika server Anda berjalan pada port yang terkenal (yang seharusnya mencegah pengguna non-root menelurkan layanan mendengarkan yang dapat diakses dunia), itu berarti server Anda harus dimulai oleh root (walaupun server waras mana pun akan segera berhenti ke akun yang kurang istimewa setelah port terikat). Dengan kata lain, jika Anda menjalankan server web tempat eksekusi utama adalah bagian dari kontrol versi (misalnya aplikasi CGI), meninggalkan izinnya (atau, dalam hal ini, izin dari direktori yang memuatnya, karena pengguna dapat mengganti nama yang dapat dieksekusi) di 777 mengizinkan apa saja pengguna untuk menjalankan apa saja dapat dieksekusi sebagai root.

Tentukan persyaratan

  • Pengembang memerlukan akses baca/tulis ke file agar mereka dapat memperbarui situs web
  • Pengembang perlu membaca/menulis/mengeksekusi pada direktori agar mereka dapat menjelajah
  • Apache memerlukan akses baca ke file dan skrip yang ditafsirkan
  • Apache memerlukan akses baca/eksekusi ke direktori yang dapat digunakan
  • Apache memerlukan akses baca/tulis/eksekusi ke direktori untuk konten yang diunggah

Dikelola oleh satu pengguna

Jika hanya satu pengguna yang bertanggung jawab untuk memelihara situs, tetapkan mereka sebagai pemilik pengguna di direktori situs web dan berikan izin rwx penuh kepada pengguna. Apache masih memerlukan akses agar dapat menyajikan file, jadi tetapkan www-data sebagai pemilik grup dan berikan izin r-x grup.

Dalam kasus Anda, Eve, yang nama penggunanya mungkin eve , adalah satu-satunya pengguna yang mengelola contoso.com :

chown -R eve contoso.com/
chgrp -R www-data contoso.com/
chmod -R 750 contoso.com/
chmod g+s contoso.com/
ls -l
drwxr-s--- 2 eve      www-data   4096 Feb  5 22:52 contoso.com

Jika Anda memiliki folder yang harus dapat ditulis oleh Apache, Anda dapat mengubah nilai izin untuk pemilik grup sehingga www-data memiliki akses tulis.

chmod g+w uploads
ls -l
drwxrws--- 2 eve      www-data   4096 Feb  5 22:52 uploads

Keuntungan dari konfigurasi ini adalah semakin sulit (tetapi bukan tidak mungkin*) bagi pengguna lain di sistem untuk mengintai, karena hanya pemilik pengguna dan grup yang dapat menjelajahi direktori situs web Anda. Ini berguna jika Anda memiliki data rahasia di file konfigurasi Anda. Berhati-hatilah dengan umask Anda! Jika Anda membuat file baru di sini, nilai izin mungkin defaultnya adalah 755. Anda dapat menjalankan umask 027 sehingga file baru default ke 640 (rw- r-- --- ).

Dikelola oleh sekelompok pengguna

Jika lebih dari satu pengguna bertanggung jawab untuk memelihara situs, Anda perlu membuat grup yang akan digunakan untuk menetapkan izin. Sebaiknya buat grup terpisah untuk setiap situs web, dan beri nama grup dengan nama situs web tersebut.

groupadd dev-fabrikam
usermod -a -G dev-fabrikam alice
usermod -a -G dev-fabrikam bob

Pada contoh sebelumnya, kami menggunakan pemilik grup untuk memberikan hak istimewa ke Apache, tetapi sekarang digunakan untuk grup pengembang. Karena pemilik pengguna tidak lagi berguna bagi kami, menyetelnya ke root adalah cara sederhana untuk memastikan tidak ada hak istimewa yang bocor. Apache masih memerlukan akses, jadi kami memberikan akses baca ke seluruh dunia.

chown -R root fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 775 fabrikam.com
chmod g+s fabrikam.com
ls -l
drwxrwxr-x 2 root     dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

Jika Anda memiliki folder yang perlu ditulis oleh Apache, Anda dapat menjadikan Apache sebagai pemilik pengguna atau pemilik grup. Either way, itu akan memiliki semua akses yang dibutuhkan. Secara pribadi, saya lebih suka menjadikannya sebagai pemilik pengguna sehingga pengembang tetap dapat menjelajahi dan memodifikasi konten folder unggahan.

chown -R www-data uploads
ls -l
drwxrwxr-x 2 www-data     dev-fabrikam   4096 Feb  5 22:52 uploads

Meskipun ini adalah pendekatan yang umum, ada sisi negatifnya. Karena setiap pengguna lain di sistem memiliki hak istimewa yang sama ke situs web Anda seperti halnya Apache, mudah bagi pengguna lain untuk menjelajahi situs Anda dan membaca file yang mungkin berisi data rahasia, seperti file konfigurasi Anda.

Anda dapat memiliki kue dan memakannya juga

Ini dapat lebih ditingkatkan. Sangat legal bagi pemilik untuk memiliki lebih sedikit hak istimewa daripada grup, jadi alih-alih menyia-nyiakan pemilik pengguna dengan menugaskannya ke root, kami dapat menjadikan Apache sebagai pemilik pengguna di direktori dan file di situs web Anda. Ini kebalikan dari skenario pengelola tunggal, tetapi bekerja dengan baik.

chown -R www-data fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 570 fabrikam.com
chmod g+s fabrikam.com
ls -l
dr-xrwx--- 2 www-data  dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

Jika Anda memiliki folder yang harus dapat ditulis oleh Apache, Anda dapat mengubah nilai izin untuk pemilik pengguna sehingga www-data memiliki akses tulis.

chmod u+w uploads
ls -l
drwxrwx--- 2 www-data  dev-fabrikam   4096 Feb  5 22:52 fabrikam.com

Satu hal yang perlu diperhatikan dengan solusi ini adalah pemilik pengguna file baru akan cocok dengan pembuatnya alih-alih disetel ke www-data. Jadi setiap file baru yang Anda buat tidak akan dapat dibaca oleh Apache sampai Anda mengunyahnya.

*Pemisahan hak istimewa Apache

Saya sebutkan sebelumnya bahwa sebenarnya mungkin bagi pengguna lain untuk mengintai situs web Anda, apa pun jenis hak istimewa yang Anda gunakan. Secara default, semua proses Apache dijalankan sebagai pengguna data-www yang sama, sehingga setiap proses Apache dapat membaca file dari semua situs web lain yang dikonfigurasi pada server yang sama, dan terkadang bahkan membuat perubahan. Setiap pengguna yang bisa membuat Apache menjalankan skrip bisa mendapatkan akses yang sama dengan yang dimiliki Apache itu sendiri.

Untuk mengatasi masalah ini, ada berbagai pendekatan pemisahan hak istimewa di Apache. Namun, setiap pendekatan dilengkapi dengan berbagai kelemahan kinerja dan keamanan. Menurut pendapat saya, situs mana pun dengan persyaratan keamanan yang lebih tinggi harus dijalankan di server khusus alih-alih menggunakan VirtualHost di server bersama.

Pertimbangan tambahan

Saya tidak menyebutkannya sebelumnya, tetapi biasanya merupakan praktik yang buruk jika pengembang mengedit situs web secara langsung. Untuk situs yang lebih besar, Anda lebih baik memiliki semacam sistem rilis yang memperbarui server web dari konten sistem kontrol versi. Pendekatan pengelola tunggal mungkin ideal, tetapi alih-alih satu orang, Anda memiliki perangkat lunak otomatis.

Jika situs web Anda mengizinkan unggahan yang tidak perlu disajikan, unggahan tersebut harus disimpan di suatu tempat di luar akar web. Jika tidak, Anda mungkin menemukan bahwa orang mengunduh file yang dimaksudkan untuk dirahasiakan. Misalnya, jika Anda mengizinkan siswa mengirimkan tugas, mereka harus disimpan ke dalam direktori yang tidak dilayani oleh Apache. Ini juga merupakan pendekatan yang baik untuk file konfigurasi yang berisi rahasia.

Untuk situs web dengan persyaratan yang lebih kompleks, Anda mungkin ingin melihat penggunaan Daftar Kontrol Akses. Ini memungkinkan kontrol hak istimewa yang jauh lebih canggih.

Jika situs web Anda memiliki persyaratan yang rumit, Anda mungkin ingin menulis skrip yang menyiapkan semua izin. Uji secara menyeluruh, lalu simpan dengan aman. Ini bisa sangat berharga jika Anda merasa perlu membangun kembali situs web Anda karena suatu alasan.

Solusi 2:

Saya bertanya-tanya mengapa begitu banyak orang menggunakan (atau merekomendasikan) bagian "lain" (o) dari hak Linux untuk mengontrol apa yang dapat dilakukan Apache (dan/atau PHP). Dengan menyetel bagian kanan ini ke selain "0", Anda hanya mengizinkan seluruh dunia untuk melakukan sesuatu pada file/direktori.

Pendekatan saya adalah sebagai berikut:

  • Saya membuat dua pengguna terpisah. Satu untuk akses SSH/SFTP (jika diperlukan), yang akan memiliki semua file, dan satu untuk pengguna PHP FastCGI (pengguna situs web akan dijalankan sebagai). Sebut saja masing-masing pengguna ini bob dan bob-www .
  • bob akan memiliki hak penuh (rwx pada folder, rw- pada file), sehingga dia dapat membaca dan mengedit seluruh situs web.
  • Proses PHP FastCGI membutuhkan r-x hak atas folder dan r-- hak atas file, kecuali untuk folder yang sangat spesifik seperti cache/ atau uploads/ , di mana izin "tulis" juga diperlukan. Untuk memberi PHP FastCGI kemampuan ini, itu akan berjalan sebagai bob-www , dan bob-www akan ditambahkan ke bob yang dibuat secara otomatis grup.
  • Kini kami memastikan bahwa pemilik dan grup dari semua direktori dan file adalah bob bob .
  • Ada yang hilang :meskipun kami menggunakan FastCGI, tetapi Apache masih memerlukan akses baca, untuk konten statis, atau file .htaccess yang akan dicoba dibaca jika AllowOverride disetel ke selain None . Untuk menghindari penggunaan o bagian dari hak, saya menambahkan www-data pengguna ke bob grup.

Sekarang:

  • Untuk mengontrol apa yang dapat dilakukan pengembang, kita dapat bermain dengan u bagian dari hak (tetapi ini catatan di bawah).
  • Untuk mengontrol apa yang dapat dilakukan Apache dan PHP, kita dapat bermain dengan g bagian dari hak.
  • The o bagian selalu disetel ke 0, jadi tidak ada orang lain di server yang dapat membaca atau mengedit situs web.
  • Tidak ada masalah saat bob pengguna membuat file baru, karena secara otomatis akan menjadi milik grup utamanya (bob ).

Ini adalah rekap, tetapi dalam situasi ini, bob diizinkan untuk SSH. Jika seharusnya tidak ada pengguna yang diizinkan untuk memodifikasi situs web (misalnya pelanggan hanya memodifikasi situs web melalui panel admin CMS dan tidak memiliki pengetahuan tentang Linux), tetap buat dua pengguna, tetapi berikan /bin/false sebagai shell untuk bob juga, dan nonaktifkan loginnya.

    adduser --home /var/www/bobwebsite --shell /bin/bash bob
    adduser --no-create-home --shell /bin/false --disabled-login --ingroup bob bob-www
    adduser www-data bob
    cd /var/www/bobwebsite
    chown -R bob:bob .
    find -type d -exec chmod 750 {} \;
    find -type f -exec chmod 640 {} \;

Catatan : orang cenderung lupa bahwa membatasi u hak (pemilik) seringkali tidak berguna dan tidak aman, karena pemilik file dapat menjalankan chmod perintah, bahkan haknya adalah 000.

Beri tahu saya jika pendekatan saya memiliki beberapa masalah keamanan, karena saya tidak 100% yakin, tetapi itulah yang saya gunakan.

Saya pikir konfigurasi ini bermasalah:ketika PHP/Apache membuat file baru (mis. Unggah), itu akan menjadi milik bob-www:bob , dan bob hanya akan bisa membacanya. Mungkin setuid pada direktori dapat menyelesaikan masalah.

Solusi 3:

Mengingat peringkat google pada jawaban yang sangat baik di atas, menurut saya ada satu hal yang harus diperhatikan, dan sepertinya saya tidak dapat meninggalkan catatan setelah jawabannya.

Melanjutkan contoh, jika Anda berencana menggunakan www-data sebagai pemilik dan dev-fabrikam sebagai grup dengan izin 570 pada direktori (atau file), penting untuk diperhatikan bahwa Linux mengabaikan setuid , jadi semua file baru akan dimiliki oleh pengguna yang membuatnya. Ini berarti setelah membuat direktori dan file baru, Anda harus menggunakan sesuatu yang mirip dengan:

chown -R www-data /newdirectory/
chmod -R 570 /newdirectory/

Di Ubuntu 12.04 untuk Rackspace OpenStack, saya mengalami masalah aneh di mana saya tidak bisa mendapatkan izin 570 untuk bekerja sampai saya mem-boot ulang server, yang secara ajaib memperbaiki masalah tersebut. Kerontokan rambut semakin meningkat karena masalah yang tampaknya sederhana itu....

Solusi 4:

Saya menggunakan konfigurasi ini:

  1. Semua direktori kecuali mengunggah satu set ke pemilik root dan grup root , izin untuk 0755 .
  2. Semua file diatur ke pemilik root dan grup root , izin untuk 0644 .
  3. Mengunggah direktori yang disetel ke pemilik root , grup www-data , izin untuk 1770 . Bagian lengket tidak mengizinkan pemilik grup untuk menghapus atau mengganti nama direktori dan file di dalamnya.
  4. Di dalam folder unggahan terdapat direktori baru dengan www-data pengguna dan grup pemilik, dan 0700 izin untuk setiap www-data pengguna yang mengunggah file.
  5. Konfigurasi Apache:

Tolak AllowOverride dan Index di direktori upload, sehingga Apache tidak membaca .htaccess file, dan pengguna Apache tidak dapat mengindeks konten folder unggahan:

<Directory /siteDir>
   Options -Indexes
</Directory>

<Directory /siteDir/uploadDir>
   AllowOverride none
</Directory>

6. php.ini konfigurasi:

open_basedir = /siteDir:/tmp:/usr/share/phpmyadmin
post_max_size = 5M
file_uploads = On
upload_max_filesize = 3M
max_file_uploads = 20

Dengan konfigurasi ini, www-data pengguna tidak akan bisa masuk ke dalam direktori selain siteDir/ /tmp dan /usr/share/phpmyadmin . Anda juga dapat mengontrol ukuran file maksimum, ukuran posting maksimum, dan file maksimum untuk diunggah dalam permintaan yang sama.

Solusi 5:

Ketika Anda memiliki pengguna FTP bernama "leo" perlu mengunggah file ke direktori web example.com dan Anda juga mengharuskan pengguna "apache" Anda untuk dapat membuat file uploa/sesi/cache di direktori cache, lalu lakukan hal berikut:

Perintah ini menetapkan leo sebagai pemilik dan grup sebagai apache ke example.com, pengguna apache adalah bagian dari grup apache sehingga akan mewarisi izin grup apache

chown -R leo:apache example.com

Perintah lain yang memastikan izin yang tepat dan juga memenuhi masalah keamanan.

chmod -R 2774 contoh.com

Di sini nomor 2 pertama adalah untuk direktori dan memastikan setiap file baru yang dibuat akan tetap berada dalam izin grup dan pemilik yang sama. 77 untuk pemilik dan grup berarti mereka memiliki akses penuh. 4 untuk orang lain berarti mereka hanya bisa membaca.

berikut sangat membantu untuk memahami nomor izin

Number  Octal Permission Representation
0   No permission
1   Execute permission
2   Write permission
3   Execute and write permission: 1 (execute) + 2 (write) = 3
4   Read permission
5   Read and execute permission: 4 (read) + 1 (execute) = 5
6   Read and write permission: 4 (read) + 2 (write) = 6
7   All permissions: 4 (read) + 2 (write) + 1 (execute) = 7

Linux
  1. 10 perintah yang harus diketahui setiap pengguna Linux

  2. Apa itu Umask di Linux?

  3. Saya Menambahkan Pengguna Ke Grup, Tetapi Izin Grup Pada File Masih Tidak Berpengaruh?

  1. Linux – Bagaimana Cara Mengatur Izin File Default Untuk Semua Folder / File Di Direktori?

  2. Apa Penyebab File Kehilangan Izin?

  3. Linux – Bisakah Seorang Pengguna Tunggal Memiliki Banyak File Crontab?

  1. Apa itu file jarang di Linux

  2. Linux, Mengapa saya tidak bisa menulis meskipun saya memiliki izin grup?

  3. Apa saja cara berbeda untuk mengatur izin file dll di gnu/linux