Bagaimana cara menghindari menggunakan sudo ketika bekerja di / var / www?

173

Saya ingin berhenti harus menggunakan sudosetiap kali saya bekerja di /var/www. Bagaimana saya bisa melakukan itu? Saya hanya ingin memasukkan semua situs saya ke direktori ini dan bekerja dengannya tanpa terlalu banyak kesulitan.

TaylorOtwell
sumber
3
Apakah Anda menggunakan apache?
Rinzwind
1
Setelah membaca di sini, ini juga dapat membantu di bagian izin: askubuntu.com/questions/20105/…
Luis Alvarado
2
Cara lain untuk mendapatkan keamanan adalah dengan terus menggunakan sudo -u www-datatetapi membatasi diri Anda dalam sudoersfile hanya untuk dapat sudo www-data(dan bukan sudo root). Lihat serverfault.com/questions/295429/...
Simon Woodside

Jawaban:

250

Sebagian besar jawaban di sini tidak ditulis dengan mempertimbangkan keamanan. Adalah baik untuk mendapatkan perasaan bahwa berlari sudosetiap waktu bukanlah hal yang bijaksana. Jika Anda membuat kesalahan ketik (misalnya spasi tunggal putih di tempat yang salah: sudo rm -rf / var/www/dir jangan jalankan! ), Anda mungkin membuang sistem Anda.

Catatan: Dimulai dengan Apache 2.4.7 / Ubuntu 14.04, /var/wwwtelah dipindahkan untuk /var/www/htmlMenyesuaikan perintah dalam jawaban ini sesuai.

Lihat:

Ide buruk:

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

CATATAN : dalam solusi di bawah ini, saya telah memberikan www-datahak istimewa menulis. Namun, /usr/share/doc/base-passwd/users-and-groups.txt.gznyatakan:

www-data

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

Bila memungkinkan, jangan tidak memberikan hak akses menulis ke www-datagrup. www-datahanya perlu dapat membaca file sehingga server web dapat menyajikannya. Satu-satunya kasus di mana www-dataperlu menulis izin adalah untuk direktori menyimpan unggahan dan lokasi lain yang perlu ditulis.

Solusi 1

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

sudo gpasswd -a "$USER" www-data

Perbaiki file yang dibuat sebelumnya (dengan asumsi Anda menjadi 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 {} \;

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

Solusi 2

Buat symlink untuk setiap proyek ke direktori home Anda. Katakanlah proyek Anda berlokasi di ~/projects/foodan Anda ingin menempatkannya di /var/www/foo, jalankan:

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

Jika direktori home Anda tidak memiliki bit eksekusi (turun) ditetapkan untuk other(karena alasan keamanan), ubah grup itu www-data, tetapi atur bit eksekusi saja (tanpa baca / tulis). Lakukan hal yang sama untuk ~/projectsfolder karena mungkin berisi proyek lain selain www. (Anda tidak perlu sudojika sebelumnya Anda menambahkan pengguna ke www-datagrup.)

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

Setel grup menjadi www-dataaktif ~/projects/foodan biarkan server web 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 server web. Bit setgid harus ditambahkan hanya jika Anda ingin setiap file yang baru dibuat ~/projects/foodapat diakses oleh grup.

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

Lihat juga

Lekensteyn
sumber
Bagaimana menurut Anda tentang sesi www di terminal 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 meletakkan xterm yang sesuai pada - misalnya - desktop virtual 4, sehingga Anda terbiasa, untuk menghindari kebingungan?
pengguna tidak diketahui
@ pengguna tidak diketahui: jika Anda melakukan segalanya di terminal dengan baik karena Anda memiliki pemisahan yang jelas antara akun pengguna. Tapi itu tidak akan berhasil jika Anda menggunakan program GUI seperti gedit. Saya tidak pernah meneliti apakah menjalankan program GUI di bawah pengguna lain di sesi saat ini aman atau tidak, itu akan menjadi pertanyaan yang menarik.
Lekensteyn
1
@imaginaryRobots: jika saya akan memposting solusi yang berbeda untuk setiap pertanyaan, Askubuntu akan penuh dengan jawaban dari tiga baris. Saya akan menyimpannya apa adanya kecuali Anda bisa meyakinkan saya untuk membaginya.
Lekensteyn
1
@berbt setfacl -d u::rwX,g::rX /var/wwwmemiliki efek lucu bahwa mode default menjadi 0750 (atau 0640) bahkan jika umask adalah nol. Ini mungkin ide yang baik jika Anda ingin menghindari file yang dapat ditulis oleh dunia, tetapi jika /var/wwwsudah tidak dapat diakses oleh dunia, itu tidak diperlukan.
Lekensteyn
1
Apakah ada masalah dengan membalikkan proses dalam solusi 1? Maksud saya, /var/www/app01sudah memiliki kepemilikan app01:app01, dan kemudian www-data pengguna ditambahkan ke app01 grup ? Atau akankah itu menghancurkan sesuatu?
Jack_Hu
9

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.

frago
sumber
Ini ide yang masuk akal.
thomasrutter
7

Jika Anda membuat / var / www dapat ditulis oleh grupnya dan menambahkan diri Anda ke grup, Anda tidak harus 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 dapat mengedit /var/www/file tanpa kerumitan.

Baris pertama menambahkan Anda ke www-datagrup, baris kedua membersihkan semua file dengan kepemilikan yang kacau, dan yang ketiga membuatnya agar semua pengguna yang merupakan anggota www-datagrup dapat membaca dan menulis semua file /var/www.

Azendale
sumber
4
Ini adalah ide yang sangat buruk untuk keamanan dan saran ini tidak boleh diikuti, karena alasan yang dijelaskan dalam jawaban lain. www-data seharusnya merupakan kelompok yang tidak terjangkau , tanpa akses tulis.
thomasrutter
5

Larangan

  • Jangan atur izin file ke 777 (dapat ditulis oleh dunia)

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

  • Jangan tambahkan diri Anda sebagai anggota grup data-www dan berikan izin menulis

    Tujuan dari grup itu adalah bahwa itu adalah grup yang tidak terjangkau yang proses servernya jalankan. Mereka seharusnya hanya memiliki akses baca ke file situs web jika memungkinkan, dengan alasan yang sama seperti di atas.

  • Jangan mengubah izin proses Apache

    Proses anak Apache dijalankan sebagai www-datapengguna dan grup secara default, dan ini tidak boleh diubah. Ini hanya cara untuk tidak memberi mereka izin menulis ke sistem file.

    Dalam keadaan tertentu Anda ingin skrip sisi server Anda dapat menulis ke file, dalam hal ini hanya file-file yang harus dibuat dapat ditulis oleh www-datadan perawatan harus diambil untuk memastikan keamanan.

Dos

  • Atur file untuk dimiliki oleh Anda sendiri

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

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

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

    Jika /var/wwwtidak masuk akal, Anda dapat menempatkannya di tempat lain. Jika mereka khusus untuk pengembangan atau pengujian Anda sendiri, Anda bisa menempatkannya di direktori home Anda. Atau Anda dapat mengatur beberapa direktori di /srv.

  • Jika Anda ingin memberikan akses tulis grup , buat grup baru untuk tujuan itu

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

thomasrutter
sumber
5

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

Cukup buat direktori proyek Anda di dalam /var/www/html

cd /var/www/html
sudo mkdir my_project

Kemudian cukup beri tahu direktori proyek kepada pengguna Anda.

sudo chown your_username my_project

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

Gayan Weerakutti
sumber
1
+1 Itulah yang saya lakukan: mengubah kepemilikan bukan dari /var/wwwdirinya sendiri, tetapi dari subdirektori.
fkraiem
2

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

Daniel
sumber
2
Bukan ide yang bodoh, itu ide yang masuk akal untuk keamanan. Catatan: Anda tidak perlu (dan tidak seharusnya) mengubah izin /var, adil /var/wwwdan / atau isinya.
thomasrutter
1

Anda dapat memulai sesi www di terminal dengan

sudo su www-data

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

*) Untuk prompt berwarna berbeda dengan karakter berbeda, 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 sumber dari /etc/bash.bashrcmisalnya.

Sebagai alat tambahan untuk membantu perbedaan, Anda selalu dapat mengedit file Anda dengan alias 'edit' atau symlink, yang menunjuk, tergantung pada identitas Anda (data taylor / www) ke gedit atau mousepad, vim atau pico. Atau Anda dapat 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 bagusnya bekerja dengan data-www. Dikombinasikan dengan ssh-sesi untuk host yang berbeda, yang memiliki prompt sendiri, itu tidak menghentikan saya dari kadang-kadang salah, tetapi jika itu terjadi, saya menyadari dengan cepat, apa yang salah, dan itu jarang terjadi.

catatan: skrip cepat sebagian merupakan salinan halaman manual bash.

Pengguna tidak diketahui
sumber
Ini akan berhasil, 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 sebagian orang.
thomasrutter