Apa cara terbaik untuk menangani izin untuk www-data pengguna Apache 2 di / var / www?

215

Adakah yang punya solusi yang bagus untuk menangani file /var/www? Kami menjalankan Host Berbasis Virtual Berbasis Nama dan pengguna Apache 2 adalah www-data .

Kami memiliki dua pengguna biasa & root. Jadi ketika mengacaukan file /var/www, daripada harus ...

chown -R www-data:www-data

... sepanjang waktu, apa cara yang baik untuk menangani ini?

Pertanyaan tambahan: Seberapa keras Anda kemudian pergi pada izin?

Yang ini selalu menjadi masalah di lingkungan pengembangan kolaboratif.

Gareth
sumber

Jawaban:

206

Mencoba untuk memperluas jawaban @ Zoredache , karena saya sendiri yang mencobanya:

  • Buat grup baru (www-pub) dan tambahkan pengguna ke grup itu

    groupadd www-pub

    usermod -a -G www-pub usera ## harus menggunakan -a untuk menambahkan ke grup yang ada

    usermod -a -G www-pub userb

    groups usera ## grup tampilan untuk pengguna

  • Ubah kepemilikan segala sesuatu di bawah / var / www menjadi root: www-pub

    chown -R root:www-pub /var/www ## -R untuk rekursif

  • Ubah izin semua folder menjadi 2775

    chmod 2775 /var/www ## 2 = set id grup, 7 = rwx untuk pemilik (root), 7 = rwx untuk grup (www-pub), 5 = rx untuk dunia (termasuk apache www-data pengguna)

    Set ID grup ( SETGID ) bit (2) menyebabkan grup (www-pub) disalin ke semua file / folder baru yang dibuat dalam folder itu. Pilihan lainnya adalah SETUID (4) untuk menyalin id pengguna, dan STICKY (1) yang saya pikir hanya memungkinkan pemiliknya menghapus file.

    Ada -Ropsi rekursif, tetapi itu tidak akan membedakan antara file dan folder, jadi Anda harus menggunakan find , seperti:

    find /var/www -type d -exec chmod 2775 {} +

  • Ubah semua file menjadi 0664

    find /var/www -type f -exec chmod 0664 {} +

  • Ubah umask untuk pengguna Anda menjadi 0002

    Umask mengontrol izin pembuatan file default, 0002 berarti file akan memiliki 664 dan direktori 775. Pengaturan ini (dengan mengedit umaskbaris di bagian bawah /etc/profiledalam kasus saya) berarti file yang dibuat oleh satu pengguna akan dapat ditulis oleh pengguna lain di www- kelompok tanpa perlu chmodmereka.

Uji semua ini dengan membuat file dan direktori serta memverifikasi pemilik, grup, dan izin ls -l.

Catatan: Anda harus keluar / masuk agar perubahan pada grup Anda berlaku!

Tom
sumber
6
@ Tom Hebat untuk melihat bahwa Anda merekomendasikan menggunakan findperintah untuk ini. Satu tip kinerja kecil yang akan saya berikan jika Anda memiliki banyak file / direktori dan Anda menggunakan GNU find adalah menggunakan +alih-alih \;sehingga perintah akan beroperasi pada banyak file karena "lebih cepat untuk menjalankan perintah pada sebanyak mungkin file pada suatu waktu, daripada sekali per file. Melakukan ini menghemat waktu yang diperlukan untuk memulai perintah setiap kali. " Juga, lebih mudah untuk mengetik karena tidak perlu backslash.
aculich
2
Diperbarui dengan saran @ aculich untuk menggunakan + not \;
Tom
1
@ SunnyJ. coba ini (tanpa tanda kutip luar): "find / var / www -type f -exec chmod 0664 '{}' \ +" Cobalah. Ada spasi antara '{}' dan \ +.
Buttle Butkus
1
mengapa kita perlu memberikan izin kepada orang lain untuk melihat dan mengeksekusi.
Kevin Parker 8-12
1
@ Tom- cara untuk memecahnya, terima kasih. Hanya sebuah catatan - saya pikir "SETUID (4) untuk menyalin id pengguna" seperti yang dimasukkan dalam jawaban Anda salah - SETUID diabaikan ketika diterapkan ke direktori di Linux / Unix - Ref
Yarin
60

Saya tidak sepenuhnya yakin bagaimana Anda ingin mengkonfigurasi izin, tetapi ini mungkin memberi Anda titik awal. Mungkin ada cara yang lebih baik. Saya berasumsi Anda ingin kedua pengguna dapat mengubah apa pun di bawah / var / www /

  • Buat grup baru (www-pub) dan tambahkan pengguna ke grup itu.
  • Ubah kepemilikan semua yang ada di bawah / var / www menjadi root: www-pub.
  • Ubah izin semua folder menjadi 2775
  • Ubah semua file menjadi 0664.
  • Ubah umask untuk pengguna Anda menjadi 0002

Ini berarti setiap file baru yang dibuat oleh salah satu pengguna Anda harus nama pengguna: www-pub 0664 dan direktori apa pun yang dibuat akan menjadi nama pengguna: www-pub 2775. Apache akan mendapatkan akses baca ke segala sesuatu melalui komponen 'pengguna lain'. Bit SETGID pada direktori akan memaksa semua file yang dibuat dimiliki oleh grup yang memiliki folder. Menyesuaikan umask diperlukan untuk memastikan bahwa bit tulis diatur sehingga siapa pun dalam grup akan dapat mengedit file.

Adapun seberapa keras saya pergi pada izin. Ini sepenuhnya tergantung pada situs / server. Jika hanya ada 1-2 editor dan saya hanya perlu menjaga mereka dari melanggar hal-hal yang terlalu buruk maka saya akan mudah. Jika bisnis membutuhkan sesuatu yang lebih kompleks maka saya akan membuat sesuatu yang lebih kompleks.

Sakit kepala
sumber
1
Kemungkinan penambahan - setel cache / unggah direktori yang perlu ditulis oleh server web ke www-data: www-data dan 775.
gacrux
Apakah akan berhasil juga menambahkan pengguna ke grup apache alih-alih mengandalkan izin 'lain'? Jika semua yang Anda lakukan adalah mengunggah file dan file-file itu harus dapat dibaca oleh apache, grup ke-3 tampaknya hanya berguna jika Anda perlu mengedit file-file itu.
Simurr
1
Apakah ada kemungkinan Anda bisa sedikit memperluas @Zoredache ini? Saya grok penggunaan dasar bit rwx, chmod, chown, adduser, usermod, tetapi Anda telah kehilangan saya dengan digit pertama ekstra pada izin oktal, umasks dan semua itu. Beberapa perintah sampel yang menggambarkan pendekatan Anda akan sangat dihargai.
Tom
1
Dengan cara ini setiap pengguna dapat mengakses setiap file pengguna lainnya! Ini berarti userA dapat membaca config.php dari userB ... menghapus kredensial mysql-nya, misalnya
drAlberT
1
Menggunakan acl Anda dapat menangani keamanan dan kolaborasi :)
drAlberT
39

Saya pikir Anda mungkin menemukan POSIX ACL (daftar kontrol akses) untuk membantu. Mereka memungkinkan model izin berbutir halus dibandingkan dengan pengguna: grup: model lain. Saya telah menemukan mereka lebih mudah untuk tetap lurus di kepala saya karena saya bisa lebih eksplisit dan juga dapat mengatur perilaku "default" untuk cabang dari sistem file.

Misalnya, Anda dapat menentukan izin setiap pengguna secara eksplisit:

setfacl -Rm d:u:userA:rwX,u:userA:rwX /var/www
setfacl -Rm d:u:userB:rwX,u:userB:rwX /var/www

Atau Anda dapat melakukannya berdasarkan pada beberapa grup bersama:

setfacl -Rm d:g:groupA:rwX,u:groupA:rwX /var/www

Dan mungkin Anda ingin menjadikan pengguna Apache Anda hanya-baca

setfacl -Rm d:u:www-data:rX,u:www-data:rX /var/www

Halaman manual:

Tutorial

Joe Holloway
sumber
2
Itulah caranya ! +1
drAlberT
ACL untuk menang +1 ... Untuk lebih lanjut lihat serverfault.com/a/360120/41823
Yarin
1
Saya ingin tahu apakah ada penurunan kinerja untuk ACL vs izin dasar.
Buttle Butkus
2
Sayangnya, ACL terlalu sering hilang pada instalasi / distribusi standar. Menyusahkan untuk mengkompilasi kernel pada setiap server yang saya kelola, atau lebih buruk, kadang-kadang mengubah sistem file. Plus, Anda harus sangat berhati-hati saat membuat cadangan file, terutama jika Anda berpindah server. ACL bagus tetapi dukungan saat ini sangat rendah sehingga saya akan merekomendasikan untuk itu bagi siapa saja yang tidak memiliki kontrol penuh pada segala sesuatu di server dan sekitarnya. Tapi +1 untuk menunjukkan ACL di tempat itu benar-benar masuk akal!
Ninj
Jawaban bagus +1; Catatan tentang mengubah izin baca / tulis proses apache ( www-datamisalnya) menjadi hanya-baca untuk seluruh situs (melalui setfacl atau chmod - atau keduanya) -> Ini jelas akan memblokir semua penulisan (pengunggahan / pembaruan plugin / modul dari sisi browser di kebanyakan CMS misalnya). Saya percaya banyak yang populer juga hanya menguji akses tulis pada tingkat perm pengguna bukan pada tingkat grup. Anda masih dapat memperbarui, tetapi pembaruan harus diterapkan secara manual dan izin kustom apa pun untuk folder tulis (log / temp / unggah / dll). Read-only adalah keamanan yang hebat jika situs Anda bekerja dengannya .. secara umum sebagian besar tidak.
bshea
11

Pertanyaan ini ditanyakan lagi , dan seperti yang dibahas pada meta, praktik terbaik saat ini memberikan pendekatan yang lebih baik daripada yang tersedia pada 2009, ketika ditanya. Jawaban ini mencoba memberikan beberapa solusi saat ini untuk menangani lingkungan pengembangan web kolaboratif dengan aman .


Untuk server web yang aman & pengembangan kolaboratif ada lebih dari sekedar izin file:

  • Memiliki pengguna yang terpisah untuk setiap situs yaitu tidak melayani semua situs menggunakan www-data. Ini penting, karena saat ini Apache jarang melayani hanya file konten statis , tetapi menjalankan situs web yang dinamis . Jawaban ini terkonsentrasi pada PHP karena ini adalah bahasa server-situs yang paling umum , tetapi prinsip yang sama juga berlaku untuk yang lain.

    Jika Anda memiliki masalah keamanan di satu situs, itu dapat menyebar ke setiap situs yang berjalan sebagai pengguna yang sama. Seorang penyerang dapat melihat semua yang dilihat pengguna, termasuk informasi login basis data, dan memodifikasi setiap situs yang memiliki izin tertulis untuk pengguna.

  • Gunakan SSH File Transfer Protocol (SFTP). Meskipun menggunakan FTP harus ditinggalkan untuk keamanan (karena mengirim kata sandi dan konten dalam teks biasa), itu adalah pengganti SFTP yang aman juga memiliki fitur yang merupakan solusi sempurna untuk pengembangan web kolaboratif.

    Setelah Anda mengisolasi situs dan satu pengguna per situs, Anda perlu memberikan akses ke pengembang web Anda, tentang apa semua pertanyaan ini. Daripada memberi mereka kata sandi untuk pengguna situs ini - atau akses ke file situs menggunakan akun pengguna pribadi mereka seperti yang disarankan - Anda dapat menggunakan kunci SSH untuk login.

    Setiap pengembang dapat menghasilkan keypair dan menjaga rahasia kunci pribadi. Kemudian, kunci publik ditambahkan ke ~/.ssh/authorized_keysfile untuk setiap akun pengguna situs web yang sedang dikerjakan pengembang. Ini memiliki banyak keuntungan untuk mengelola kata sandi dan login:

    • Setiap pengembang dapat memiliki akses ke sejumlah situs web tanpa beban untuk mengingat atau menyimpan semua kata sandi yang terlibat dengan pengaturan pengguna per situs.

    • Tidak perlu mengubah & membagikan kata sandi setiap kali seseorang meninggalkan perusahaan.

    • Anda dapat menggunakan kata sandi yang sangat kuat atau menonaktifkan login berbasis kata sandi sama sekali.

  • Gunakan PHP-FPM . Ini adalah pendekatan saat ini untuk menjalankan PHP sebagai pengguna. Buat baru kolam renang untuk setiap pengguna yaitu satu kolam renang per setiap situs. Ini adalah yang terbaik untuk keamanan dan kinerja, karena Anda juga dapat menentukan berapa banyak sumber daya yang dapat dikonsumsi oleh satu situs.

    Lihat misalnya, Jalankan NeverEndingSecurity's php-fpm dengan pengguna / uid dan grup yang terpisah di linux . Ada tutorial seperti HowtoForge's Menggunakan PHP-FPM dengan Apache pada Ubuntu 16.04 yang tidak menggunakan PHP-FPM untuk meningkatkan keamanan melalui pemisahan pengguna, memandu untuk menggunakan soket FPM tunggal di seluruh server.

Esa Jokinen
sumber