Izin SFTP ditolak pada file yang dimiliki oleh www-data

23

Saya memiliki server standar cantik yang menjalankan Apache dan PHP. Aplikasi yang saya jalankan membuat file dan ini dimiliki oleh pengguna Apache www-data. File yang saya unggah melalui SFTP dimiliki oleh pengguna saya sendiri charlesr. Semua file adalah bagian dari www-datagrup. Masalah saya adalah bahwa saya tidak dapat memodifikasi atau menimpa file apa pun melalui SFTP yang dimiliki oleh www-data, meskipun charlesrmerupakan bagian dari www-datagrup. Saya dapat memodifikasi file tanpa masalah melalui sesi SSH.

Jadi saya tidak yakin apa yang harus saya lakukan. Bagaimana cara saya memberikan izin sesi SFTP saya untuk memodifikasi www-datafile yang dimiliki?

Untuk sedikit latar belakang, ini adalah catatan yang saya tulis sendiri ketika mengatur server:

Now set up permissions on `/var/www` where your files are served from by
default:

$ sudo adduser $USER www-data
$ sudo chgrp -R www-data /var/www
$ sudo chmod -R g+rw /var/www
$ sudo chmod -R g+s /var/www

Now log out and log in again to make the changes take hold.

The previous set of commands does the following:

1. adds the current user ($USER) to the `www-data` group;
2. changes `/var/www` to belong to the `www-data` group;
3. adds read/write permissions to the group that `/var/www` belongs to;
4. sets the SGID bit on `/var/www`; this final point bears some explaining.

Dan kemudian saya menjelaskan kepada diri saya sendiri apa arti pengaturan bit SGID (yaitu semua file yang dibuat /var/wwwmenjadi bagian dari www-datagrup secara otomatis).


MEMPERBARUI

Tampaknya masalah itu disebabkan oleh aplikasi itu sendiri atau, lebih khusus, kerangka kerja aplikasi ( Kohana ) mengatur file-file tertentu yang ditulisnya ke 0644 (rw-r - r--); yaitu tidak dapat ditulis kelompok. Ini, ditambah dengan fakta bahwa file-file tersebut juga dimiliki oleh www-databerarti bahwa saya tidak dapat mengedit file melalui SFTP ketika login sebagai charlesr. Saya tidak yakin mengapa saya bisa mengedit file melalui SSH. Dugaan saya adalah bahwa saya harus menggunakan sudo.

Berikut ini adalah strategi perizinan yang saya gunakan sekarang berkat bantuan tak kenal lelah dari Marty Fried , yang menunjukkan kelemahan dalam strategi saya sebelumnya dan juga membantu saya merendam dalam dunia perizinan Linux sampai akhirnya saya mengerti. Marty terima kasih!

Ikhtisar

  • File dan direktori di /var/wwwharus dimiliki olehroot:webmasters
  • Semua dev harus menjadi anggota webmastersgrup
  • Semua direktori di /var/wwwharus diatur ke: 2775atau u=rwx,g=rwxs,o=rx(rwxrwx-rx)
  • Semua file di /var/wwwharus diatur ke: 0664atau ug=rw,o=r(rw-rw-r--)

Yang berikut harus dimiliki oleh www-data:webmasters(yaitu ini adalah direktori yang harus dapat ditulis oleh Apache):

  • aplikasi / cache
  • aplikasi / log
  • unggah
  • client_helpers / unggah

HOWTO

Untuk mengatur izin /var/wwwtempat file Anda dilayani secara default:

  1. sudo addgroup webmasters
  2. sudo adduser $USER webmasters
  3. sudo chown -R root:webmasters /var/www
  4. sudo find /var/www -type f -exec chmod 664 {} \;
  5. sudo find /var/www -type d -exec chmod 775 {} \;
  6. sudo find /var/www -type d -exec chmod g+s {} \;
  7. sudo chown -R www-data:webmasters application/cache/ [dll ...]

Sekarang, logout dan masuk lagi untuk melakukan perubahan.

Set perintah sebelumnya melakukan hal berikut:

  1. Buat grup baru bernama webmasters; semua pengguna yang membutuhkan akses tulis ke file aplikasi akan ditambahkan ke grup ini.
  2. menambahkan pengguna saat ini ( $USER) ke webmastersgrup.
  3. mengubah pemilik /var/wwwke rootdan grup ke webmastersgrup.
  4. menambahkan 664 izin (-rw-rw-r--) ke semua file di /var/www.
  5. menambahkan 775 izin (drwxrwxr-x) ke semua direktori di /var/www.
  6. mengaktifkan bit SGID /var/www dan semua direktori di dalamnya; poin terakhir ini memuat beberapa penjelasan. Perhatikan juga bahwa Anda juga dapat meletakkan angka 2 di depan oktal chmod Anda (mis. 2644) untuk melakukan hal yang sama.
  7. set pemilik ke www-data(pengguna Apache) dan kelompok direktori yang disediakan untuk webmaster. Ini memastikan direktori dapat ditulis oleh Apache dan siapa pun dalam webmastersgrup. Lakukan hal yang sama untuk semua direktori lain yang perlu ditulis.
Charles Roper
sumber

Jawaban:

10

Ubuntu.com memiliki panduan server yang cukup bagus, seperti panduan Apache . Dari mana Anda mendapatkan prosedur yang Anda tulis dengan sangat hati-hati? Saya tidak pernah mengalami masalah sebanyak itu untuk server mana pun yang telah saya atur, walaupun saya terbuka untuk kemungkinan bahwa saya belum melakukannya dengan benar - juga, saya belum menginstal server untuk apa pun yang sangat umum, atau sangat besar, sehingga mungkin ada celah keamanan yang tidak saya ketahui.

Namun, saya tidak pernah perlu menjadi anggota grup data-www, dan tidak ada file sumber di www yang dimiliki oleh data-www. Pemahaman saya adalah bahwa ini digunakan oleh Apache hanya untuk file sendiri, dan itu tidak akan memiliki izin menulis ke file lain itu sendiri, karena secara teori, tidak ada file penting yang akan memungkinkan www-data memiliki izin menulis. Saya kira file-file yang dimiliki oleh www-data akan memberikan izin hanya-baca untuk semua orang, dan tidak seorang pun boleh menulis izin untuk file-nya. Tentu saja saya bisa benar-benar salah, dan jika saya benar, saya berharap seseorang akan memberi tahu saya dan mengarahkan saya ke dokumentasi aktual yang menjelaskan secara berbeda (bukan ke forum di mana pengguna internet acak seperti saya telah menghasilkan instruksi yang berfungsi untuknya).

Mungkin saya melewatkan sesuatu, tetapi masalah Anda seharusnya cukup jelas. Pengguna yang login menggunakan sftp harus menjadi anggota grup www-data, dan file yang Anda coba modifikasi harus memiliki izin menulis untuk grup www-data. Tidak masuk akal bagi saya bahwa Anda dapat memodifikasi file menggunakan ssh, tetapi tidak menggunakan sftp; Anda yakin masuk ke akun yang sama untuk keduanya? Di sftp, Anda dapat memasukkan perintah seperti !groupsuntuk membuat daftar grup Anda, atau !whoamiuntuk memeriksa nama login yang Anda gunakan. Hasilnya harus sesuai dengan apa yang Anda lihat menggunakan ssh (dengan perintah yang sama minus tanda seru).

Anda juga harus dapat menggunakan chmod, chown, chgrp dari sftp jika Anda memiliki izin untuk melakukannya.

Omong-omong, saya pikir daftar Anda memiliki setidaknya satu perintah yang sangat buruk:

sudo chmod -R g+rw /var/www

Ini memberi dunia izin menulis ke setiap file dan folder di / var / www. Ini sepertinya ide yang buruk. Biasanya, hanya root yang memiliki izin menulis ke direktori ini, kecuali yang spesifik memerlukan lebih banyak izin, biasanya hanya direktori tunggal.

Catatan: Ini adalah kesalahan saya. Terima kasih kepada DonalLafferty untuk menunjukkan ini, yang menentukan "g", bukan "a", sehingga hanya mengubah izin grup. Mata saya yang lelah (atau font yang buruk) harus membacanya sebagai "a".

Suntingan untuk klarifikasi

Biasanya, file yang dibuat oleh Apache bersifat read-only untuk grup www-data dan semua pengguna lain, sama seperti file yang dimiliki oleh root di / var / www. Jadi, seharusnya tidak ada alasan untuk membuat siapa pun menjadi anggota www-data. Masalahnya adalah memberikan akses tulis kepada semua orang, yang merupakan kasus yang berbeda. Ini harus dilakukan dengan membuat direktori spesifik yang tersedia di situs Anda, dan ini dilakukan hanya dengan menggunakan chmod, baik dengan sudo, karena mungkin dimiliki oleh root, atau dengan membuat pemilik sendiri dan tidak menggunakan sudo.

Jika Anda memiliki lebih banyak pengembang yang memerlukan akses ke seluruh situs, saat itulah Anda ingin membuat grup pengguna + seperti "webmaster", menjadikannya pemilik situs, memberikan izin menulis ke grup itu, dan menjadikan semua anggota pengembang. dari grup itu. Jadi daftar direktori situs akan menjadi seperti:

drwxrwxr-x  ##  webmasters     webmasters   #### ####-##-## ##:##  mysite.com

Lebih Banyak Pengeditan

Sejak itu saya menyadari bahwa Anda tidak benar-benar perlu membuat pengguna "webmaster", hanya sebuah grup. Kemudian file dapat dimiliki oleh root: webmaster, yaitu root adalah pemilik, tetapi webmaster adalah grup.

Dalam menjawab pertanyaan di bawah ini, file yang ditulis Apache akan dimiliki oleh www-data, dan grup www-data. File-file ini biasanya bukan sesuatu yang Anda tulis, jadi non-anggota www-data mungkin memiliki akses hanya baca - saya pikir itu tergantung pada izin direktori. Jika Anda memang membutuhkan lebih dari akses tulis sesekali, maka menambahkan diri Anda ke grup mungkin berguna. Biasanya Anda membuat direktori spesifik dunia dapat ditulis untuk konten yang disimpan oleh Apache. Pertimbangkan juga bahwa sebagian besar web hosting bersama yang menjalankan Apache tanpa akses shell bahkan tidak memiliki cara untuk mengatur grup.

Tapi, Apache bisa membaca file bahkan dimiliki oleh root. Hampir semua file memiliki akses yang dapat dibaca dunia, hanya saja tidak dapat ditulis. Jadi, kecuali Anda ingin mengubahnya, Apache tidak perlu berada di grup webmaster.

Ini semua pengaturan Linux dasar, bukan benar-benar Apache. Apache hanya peduli tentang akses dari dalam server web, dan itu diatur oleh file konfigurasi. Untuk alasan ini, tautan dokumentasi Ubuntu yang saya sertakan dalam posting saya harus dianggap sebagai sumber yang lebih baik daripada wiki publik.

Omong-omong, O'Reilly Apache Cookbook mengatakan "Direktori dokumen, seperti htdocs, cgi-bin, dan ikon, harus memiliki izin yang diatur dengan cara yang paling masuk akal untuk model pengembangan situs web khusus Anda, tetapi dalam situasi apa pun direktori atau file yang terkandung di dalamnya tidak dapat ditulisi oleh pengguna server web. "

Akhirnya, menggunakan ACL adalah cara yang baik untuk mengatur izin file jika Anda membutuhkan lebih banyak kontrol. Bahkan mungkin cara yang baik untuk mengatur mereka sepanjang waktu, dan merupakan sesuatu yang harus saya selidiki.

Marty Fried
sumber
Hai @ marty-fried, terima kasih atas jawabannya, itu memberi saya banyak untuk dicoba. Kembali. pertanyaan Anda. Saya mengumpulkan informasi tersebut bersama-sama dari berbagai sumber (karenanya saya menuliskannya ke dalam panduan penggunaan saya sendiri) dan tidak dapat mengingat sumber yang tepat. Meskipun saya tidak menggunakan sumber khusus ini (solusi 1) (saya baru saja menemukannya), itu memberikan alasan yang baik untuk keputusan saya. Dalam panduan Apache yang Anda sebutkan, disarankan untuk membuat grup yang disebut 'webmaster', tetapi jika saya melakukan itu, bagaimana Apache akan menulis ke /var/wwwtanpa menambahkannya ke grup itu?
Charles Roper
Dan saya memang perlu memberi pengguna lain akses ke /var/wwwjadi saya pikir memberikan akses grup ke www-datadan membuat semua orang menjadi anggota grup itu akan menjadi solusi yang baik. Saya bisa melihat sekarang masalah Apache bisa menimpa file apa pun di sana. Mengingat hanya 2 pengembang (termasuk saya) yang memiliki akses ke kode, relatif aman dalam jangka pendek.
Charles Roper
1
Terima kasih Marty. Bagian dari Cookbook Apache ini membuat saya tertawa: "Anda harus sadar bahwa jika Anda bertanya kepada 12 orang tentang cara yang benar untuk mengatur izin file di server Apache Anda, Anda akan mendapatkan selusin jawaban berbeda." Anda telah memberi saya semua yang saya butuhkan untuk membuat kemajuan sekarang. Terima kasih banyak atas waktunya. :-)
Charles Roper
1
Saya juga belajar sedikit, itulah sebabnya saya menikmati diskusi mendalam - biasanya membantu memperjelas beberapa bagian yang kabur. Saya terutama seorang programmer yang diminta untuk memperbaiki masalah dan mengatur situs web, jadi saya selalu belajar cara yang lebih baik untuk melakukan sesuatu. Jangan ragu untuk bertanya jika ada pertanyaan lain.
Marty Fried
1
AFAIK, sudo chmod -R g + rw / var / www memberi akses 'grup'. Gunakan 'a + rw' untuk akses dunia.
Donal Lafferty
7

Saya perhatikan Anda belum pernah menggunakan chown.

Untuk mengatur kepemilikan file / folder dengan benar, Anda dapat mengatur seluruh direktori dengan cara ini: chown -R www-data:www-data

Ini menetapkan kepemilikan untuk grup www-datadan penggunawww-data

Anda juga dapat melakukan ini sebagai solusi sementara:

chmod 777 /var/data/<filename> atau chmod 777 /var/data/<foldername>

edit file sesuai kebutuhan, lalu

chmod 644 /var/data/<filename> atau chmod 755 /var/data/<foldername>

Berhati-hatilah menggunakan sakelar "-R", karena ia juga mengubah izin semua sub file dan folder.

664 adalah izin file standar Apache, dan 755 izin folder standar.

Semoga ini membantu :)

Bintang

StarBlessed
sumber
Hai, terima kasih telah meluangkan waktu untuk menjawab, itu sangat dihargai. Namun, itu tidak terlalu membantu. Mengunyah file membuat SEMUA dari mereka tidak dapat dimodifikasi saat menggunakan SFTP (jadi kebalikan dari apa yang saya cari!). Saya tidak bisa menggunakan solusi chmod karena a) Saya tidak punya izin untuk chmod di SFTP; b) Saya tidak benar-benar ingin masuk melalui SSH, mengubah izin, melakukan SFTPing, mengubah kembali, dll .; dan c) beberapa file memiliki izin yang berbeda untuk alasan keamanan, jadi saya tidak dapat chmod secara massal.
Charles Roper
Apa /var/data? Juga, direktori apa yang Anda sarankan agar ia menggunakan perintah chown -R www-data:www-data? Semoga tidak /var/www.
Marty Fried