Pertanyaan Bagaimana cara menghindari penggunaan sudo saat bekerja di / var / www?


Saya ingin berhenti menggunakannya sudo setiap kali saya bekerja di /var/www. Bagaimana saya bisa melakukannya? Saya hanya ingin menempatkan semua situs saya ke dalam direktori ini dan bekerja dengan mereka tanpa terlalu banyak rasa sakit.


162
2018-06-01 03:43


asal


Apakah Anda menggunakan apache? - Rinzwind
Setelah membaca di sini, ini juga dapat membantu di bagian izin: askubuntu.com/questions/20105/… - Luis Alvarado♦
Cara lain untuk mendapatkan keamanan adalah terus digunakan sudo -u www-data tetapi batasi diri Anda di sudoers file hanya bisa sudo www-data (dan bukan sudo root). Lihat serverfault.com/questions/295429/… - Simon Woodside


Jawaban:


Sebagian besar jawaban di sini tidak ditulis dengan keamanan dalam pikiran. Ini baik untuk mendapatkan perasaan yang berjalan sudo setiap kali sangat tidak bijaksana. Jika Anda salah ketik (mis. (jangan mengeksekusi) sudo rm -rf / var/www/dir), Anda mungkin merusak sistem Anda.

catatan: Dimulai dengan Apache 2.4.7 / Ubuntu 14.04, /var/www telah dipindahkan ke /var/www/html Atur perintah dalam jawaban ini.

Lihat:

Gagasan buruk:

  • chmod 777 (sagarchalise) - ini memungkinkan siapa pun dengan akses ke sistem Anda menulis ke direktori dan file dan dengan demikian memungkinkan penyusup untuk mengeksekusi kode apa pun di bawah www-data pengguna
  • chgrp -R www-data $HOME (tongkol) - ini memungkinkan www-data untuk membaca atau menulis file apa pun di direktori home. Ini tidak mengingat aturan Least Privilege
  • chown -R $USER:$USER /var/www (kv1dr) - kecuali dunia telah membaca izin /var/www, server web berjalan di bawah www-data tidak akan dapat membaca (melayani) file. Jika file tersebut adalah dokumen HTML biasa yang dapat diakses publik, itu mungkin tidak menjadi masalah jika dunia dapat membaca file tersebut. Tetapi jika file tersebut adalah file PHP yang mengandung kata sandi, itu adalah.

CATATAN: dalam solusi di bawah ini, saya sudah diberikan www-data tuliskan hak istimewa. Namun, /usr/share/doc/base-passwd/users-and-groups.txt.gz menyatakan:

www-data

Beberapa server web dijalankan sebagai data-www. Konten web tidak boleh dimiliki oleh ini     pengguna, atau server web yang diretas akan dapat menulis ulang situs web. Data     ditulis oleh server web akan dimiliki oleh data-www.

Di mana mungkin, lakukan tidak berikan izin menulis ke www-data kelompok. www-data hanya perlu bisa Baca baca file sehingga webserver dapat menyajikannya. Satu-satunya kasus di mana www-data perlu izin menulis untuk direktori yang menyimpan unggahan dan lokasi lain yang perlu ditulis.

Solusi 1

Tambahkan diri Anda ke www-data grup dan atur bit setgid pada /var/www direktori sehingga semua file yang baru dibuat mewarisi grup ini juga.

sudo gpasswd -a "$USER" www-data

Perbaiki file yang dibuat sebelumnya (dengan asumsi Anda adalah satu-satunya pengguna /var/www):

sudo chown -R "$USER":www-data /var/www
find /var/www -type f -exec chmod 0660 {} \;
sudo find /var/www -type d -exec chmod 2770 {} \;

(bahkan lebih aman: gunakan 640 atau 2750 dan secara manual chmod g+w file-or-dir yang perlu ditulis oleh server web)

Solusi 2

Buat symlink untuk setiap proyek ke direktori home Anda. Katakanlah proyek Anda berada di ~/projects/foo dan Anda ingin memilikinya terletak di /var/www/foo, jalankan:

sudo ln -sT ~/projects/foo /var/www/foo

Jika direktori home Anda tidak memiliki bit eksekusi (turun) diatur untuk other (untuk alasan keamanan), ubah grup menjadi www-data, tapi atur bit eksekusi saja (tidak ada baca / tulis). Lakukan hal yang sama untuk ~/projectsfolder karena mungkin berisi proyek lain selain www. (Kamu tidak perlu sudo jika sebelumnya Anda telah menambahkan pengguna ke www-data kelompok.)

sudo chgrp www-data ~ ~/projects
chmod 710 ~ ~/projects

Setel grup ke www-data di ~/projects/foo dan memungkinkan webserver membaca dan menulis ke file dan file + direktori dan turun ke direktori:

sudo chgrp www-data ~/projects/foo
find ~/projects/foo -type f -exec chmod 660 {} \;
find ~/projects/foo -type d -exec chmod 2770 {} \;

Bahkan lebih aman: gunakan 640 dan 2750 secara default dan secara manual file chmod dan direktori yang perlu ditulis oleh pengguna webserver. Bit setgid harus ditambahkan hanya jika Anda ingin setiap file yang baru dibuat masuk ~/projects/foo agar dapat diakses oleh kelompok.

Mulai sekarang, Anda dapat mengakses situs Anda di http://localhost/foo dan edit file proyek Anda di ~/projects/foo.

Lihat juga


229
2018-06-01 09:48



Apa pendapat Anda tentang sesi-www di terminal oleh sudo su www-data? Dikombinasikan dengan prompt berwarna berbeda, untuk membuatnya lebih jelas bahwa itu adalah shell dari pengguna yang berbeda, dan kebijakan selalu untuk menempatkan xterm yang sesuai - misalnya - virtual desktop 4, sehingga Anda terbiasa, untuk menghindari kebingungan? - user unknown
@user unknown: jika Anda melakukan semuanya di terminal karena Anda memiliki pemisahan yang jelas antara akun pengguna. Tapi itu tidak akan berhasil jika Anda menggunakan program GUI seperti gedit. Saya belum pernah meneliti apakah menjalankan program GUI di bawah pengguna lain di sesi saat ini aman atau tidak, itu akan menjadi pertanyaan yang menarik. - Lekensteyn
@imaginaryRobots: jika saya akan memposting solusi yang berbeda untuk setiap pertanyaan, Askubuntu akan penuh dengan jawaban dari tiga baris. Saya akan menyimpannya kecuali Anda dapat meyakinkan saya untuk membaginya. - Lekensteyn
@berbt setfacl -d u::rwX,g::rX /var/www memiliki efek lucu bahwa mode default menjadi 0750 (atau 0640) bahkan jika umask adalah nol. Mungkin ide yang bagus jika Anda ingin menghindari file-file yang dapat ditulis oleh dunia, tetapi jika /var/www sudah tidak dapat diakses oleh dunia itu tidak diperlukan. - Lekensteyn
Apakah ada masalah dengan membalik proses dalam solusi 1? Maksud saya, /var/www/app01 memiliki kepemilikan app01:app01, dan kemudian www-data  pengguna ditambahkan ke app01  kelompok? Atau apakah itu akan merusak sesuatu? - Jack_Hu


Daripada menyimpan situs web saya di / var / www, saya menempatkan tautan di sana ke situs-situs yang terletak di folder rumah saya. Saya dapat dengan bebas mengedit, atau menambahkan halaman ke situs saya. Ketika saya senang dengan perubahan, saya kemudian FTP ke perusahaan hosting tempat tautan nama domain saya.


7
2018-06-01 07:06



Ini adalah ide yang masuk akal. - thomasrutter


Jika Anda membuat / var / www dapat ditulisi oleh grupnya dan menambahkan diri Anda ke grup, Anda tidak perlu menggunakan sudo saat masih cukup aman. Coba ini:

sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rw /var/www

Anda kemudian harus dapat mengedit /var/www/ file tanpa repot.

Baris pertama menambahkan Anda ke www-data grup, baris kedua membersihkan file apa pun dengan mengacaukan kepemilikan, dan yang ketiga membuatnya sehingga semua pengguna yang menjadi anggota dari www-data grup dapat membaca dan menulis semua file di /var/www.


6
2017-07-01 00:41



Ini adalah ide yang sangat buruk untuk keamanan dan saran ini tidak boleh diikuti, karena alasan yang dijelaskan dalam jawaban lain. www-data seharusnya menjadi tidak merasa prihatin grup, tanpa akses tulis. - thomasrutter


Tidak boleh

  • Jangan tetapkan izin file 777 (dapat ditulis dunia)

    Ini adalah celah keamanan yang signifikan, terutama jika Anda mengaktifkan scripting sisi server seperti PHP. Proses yang tidak pantas seharusnya tidak dapat menulis ke file yang akan mempengaruhi situs web atau, dalam kasus scripting sisi server yang digunakan, jalankan kode arbitrer.

  • Jangan tambahkan diri Anda sebagai anggota www-data kelompok dan beri izin menulis

    Tujuan dari kelompok itu adalah bahwa itu adalah sebuah tidak merasa prihatin kelompok yang proses server jalankan sebagai. Mereka seharusnya hanya membaca akses ke file situs web jika mungkin, untuk alasan yang sama seperti di atas.

  • Jangan mengubah izin dari proses Apache

    Proses anak Apache berjalan sebagai www-data pengguna dan grup secara default, dan ini tidak boleh diubah. Ini hanya cara memberi mereka izin menulis ke filesystem.

    Dalam keadaan tertentu Anda ingin skrip sisi server Anda dapat menulis ke file, dalam hal ini hanya file-file itu harus dibuat bisa ditulis oleh www-data dan perhatian harus diambil untuk memastikan keamanan.

Dos

  • Atur file yang akan dimiliki oleh Anda sendiri

    Jika Anda adalah satu-satunya, atau yang biasa, untuk memodifikasi file tertentu di situs web, maka masuk akal hanya untuk mengambil kepemilikan file-file tersebut. Tetapkan pemiliknya <your username>.

    Anda tidak perlu mengubah izin server untuk ini, karena server akan terus mendapatkan akses hanya-baca bahkan ketika file dimiliki oleh Anda.

  • Pilih tempat yang masuk akal untuk menyimpan file (menggunakan DocumentRoot)

    Jika /var/www tidak masuk akal, Anda dipersilakan untuk menempatkannya di tempat lain. Jika mereka spesifik untuk pengembangan atau pengujian Anda sendiri, Anda dapat menempatkannya di direktori home Anda. Atau Anda dapat mengatur beberapa direktori di /srv.

  • Jika Anda ingin memberi kelompok akses tulis, buat a baru kelompok untuk tujuan tersebut

    Jangan gunakan kembali grup sistem, karena ini biasanya dirancang untuk memiliki akses yang saat ini mereka miliki, dan tidak lebih, untuk alasan keamanan.


5
2017-11-23 23:43





Sesederhana ini. Anda tidak perlu mengaktifkan apache 'UserDir' (tidak disarankan) atau mengacaukan grup 'www-data' (grup apache dalam kasus di Fedora)

Buat saja direktori proyek Anda di dalam /var/www/html

cd /var/www/html
sudo mkdir my_project

Kemudian hanya chown direktori proyek ke pengguna Anda.

sudo chown your_username my_project

Sekarang Anda dapat mulai bekerja di folder proyek Anda sebagai pengguna biasa dengan editor apa pun, IDE pilihan Anda. Tidak lagi sudos :)


5
2017-08-06 07:49



+1 Itulah yang saya lakukan: mengubah kepemilikan bukan dari /var/www sendiri, tetapi dari subdirektori. - fkraiem


chmod in / var di www untuk mengizinkan akses pemilik, dan chown untuk memastikan Anda memilikinya. Mungkin ide yang bodoh, tetapi itu pasti akan berhasil.


1
2018-06-01 03:59



Bukan ide bodoh, itu ide bijaksana yang bijaksana. Catatan: Anda tidak perlu (dan tidak perlu) mengubah izin /var, hanya /var/www dan / atau isinya. - thomasrutter


Anda bisa memulai sesi-www di terminal oleh

sudo su www-data

Dikombinasikan dengan prompt berwarna berbeda *, untuk membuatnya lebih jelas bahwa itu adalah shell dari pengguna yang berbeda, dan kebijakan selalu untuk menempatkan xterm (dan editor dan semacamnya) pada - misalnya - virtual desktop 4, sehingga Anda terbiasa, untuk menghindari kebingungan.

*) Untuk prompt berwarna berbeda dengan karakter differnt, buat file / etc / prompt seperti ini:

# PROMPTING
#       When  executing  interactively, bash displays the primary prompt PS1 when it is ready to read a command, and the sec-
#       ondary prompt PS2 when it needs more input to complete a command.  Bash allows these prompt strings to be  customized
#       by inserting a number of backslash-escaped special characters that are decoded as follows:
#              \a     an ASCII bell character (07)
#              \d     the date in "Weekday Month Date" format (e.g., "Tue May 26")
#              \D{format}
#                     the  format is passed to strftime(3) and the result is inserted into the prompt string; an empty format
#                     results in a locale-specific time representation.  The braces are required
#              \e     an ASCII escape character (033)
#              \h     the hostname up to the first `.'
#              \H     the hostname
#              \j     the number of jobs currently managed by the shell
#              \l     the basename of the shell's terminal device name
#              \n     newline
#              \r     carriage return
#              \s     the name of the shell, the basename of $0 (the portion following the final slash)
#              \t     the current time in 24-hour HH:MM:SS format
#              \T     the current time in 12-hour HH:MM:SS format
#              \@     the current time in 12-hour am/pm format
#              \A     the current time in 24-hour HH:MM format
#              \u     the username of the current user
#              \v     the version of bash (e.g., 2.00)
#              \V     the release of bash, version + patchelvel (e.g., 2.00.0)
#              \w     the current working directory
#              \W     the basename of the current working directory
#              \!     the history number of this command
#              \#     the command number of this command
#              \$     if the effective UID is 0, a #, otherwise a $
#              \nnn   the character corresponding to the octal number nnn
#              \\     a backslash
#              \[     begin a sequence of non-printing characters, which could be used to embed a terminal  control  sequence
#                     into the prompt
#              \]     end a sequence of non-printing characters
#
#       The  command  number and the history number are usually different: the history number of a command is its position in
#       the history list, which may include commands restored from the history file (see HISTORY below),  while  the  command
#       number  is  the  position in the sequence of commands executed during the current shell session.  After the string is
#
# colors:
# \[...\]   wird benötigt, damit die shell weiß, daß hier kein printable output ist, und die Umbrüche richtig plaziert.
#
# ANSI COLORS
CRE="\[
[K\]"
NORMAL="\[[0;39m\]"
# RED: Failure or error message
RED="\[[1;31m\]"
# GREEN: Success message
GREEN="\[[1;32m\]"
# YELLOW: Descriptions
YELLOW="\[[1;33m\]"
# BLUE: System messages
BLUE="\[[1;34m\]"
# MAGENTA: Found devices or drivers
MAGENTA="\[[1;35m\]"
# CYAN: Questions
CYAN="\[[1;36m\]"
# BOLD WHITE: Hint
WHITE="\[[1;37m\]"
#
# default:
# postgres, oracle, www-data
#
# PS1=$BLUE"machine]->"$NORMAL\\w"$BLUE ø $NORMAL"
PS1=$BLUE"machine]:"$NORMAL\\w"$BLUE > $NORMAL"
#
# root, stefan:
#
case "$UID" in
    '0')
        PS1=$RED"machine:"$NORMAL\\w"$RED # $NORMAL"
    ;;
    '1000')
    PS1=$GREEN"machine:"$BLUE\\w$YELLOW" > "$NORMAL
    ;;
#    default)
#    ;;
esac

dan sumbernya dari /etc/bash.bashrc contohnya.

Sebagai alat tambahan untuk membantu perbedaan, Anda selalu dapat mengedit file Anda dengan alias 'edit' atau symlink, yang menunjuk, tergantung pada identitas Anda (taylor / www-data) ke gedit atau mousepad, vim atau pico. Atau Anda bisa menggunakan profil editor yang berbeda, setidaknya di gedit Anda dapat mengatur preferensi Anda ke teks hitam di tanah putih atau teks putih di tanah hitam misalnya.

Saya hanya memiliki kebijakan seperti itu untuk bekerja sebagai root, jadi saya tidak yakin seberapa baik itu akan cocok untuk bekerja dengan data-www. Dikombinasikan dengan ssh-session untuk host differnt, yang memiliki petunjuknya sendiri, itu tidak menghentikan saya dari kadang-kadang salah, tetapi jika itu terjadi, saya menyadari cepat, apa yang salah, dan itu jarang terjadi.

Catatan: Skrip-cepat ini sebagian merupakan salinan dari halaman manual bash.


1
2018-06-01 15:49



Ini akan bekerja, dan tidak akan (jika digunakan dengan hati-hati) berdampak negatif terhadap keamanan, tetapi mungkin bukan solusi yang paling mudah. Ini adalah solusi yang valid untuk beberapa orang. - thomasrutter


Di halaman ini dari situs saya Saya menutupi perintah untuk mengubah izin masuk /var/www antara apache dan pengguna pi tetapi yang penting

sudo chown -R pi /var/www

kemudian restart apache

sudo service apache2 restart

-1
2017-11-23 23:27



Tautan sekarang berfungsi - Gadgetroid