Câu hỏi Làm thế nào để tránh sử dụng sudo khi làm việc trong / var / www?


Tôi muốn ngừng sử dụng sudo mỗi lần tôi làm việc /var/www. Làm thế nào tôi có thể làm điều đó? Tôi chỉ muốn đặt tất cả các trang web của mình vào thư mục này và làm việc với chúng mà không cần quá nhiều đau đớn.


162
2018-06-01 03:43


gốc


Bạn đang sử dụng apache? - Rinzwind
Sau khi đọc ở đây, điều này cũng có thể giúp trong phần cho phép: askubuntu.com/questions/20105/… - Luis Alvarado♦
Một cách khác để có được sự an toàn là tiếp tục sử dụng sudo -u www-data nhưng hạn chế bản thân trong sudoers để chỉ có thể sudo www-data (và không phải là sudo root). Xem serverfault.com/questions/295429/… - Simon Woodside


Các câu trả lời:


Hầu hết các câu trả lời ở đây không được viết với sự bảo mật. Thật tốt khi có cảm giác chạy sudo mỗi lần không phải là rất khôn ngoan. Nếu bạn mắc lỗi đánh máy (ví dụ:không thi hành) sudo rm -rf / var/www/dir), bạn có thể làm hỏng hệ thống của mình.

Chú thích: Bắt đầu với Apache 2.4.7 / Ubuntu 14.04, /var/www đã được chuyển đến /var/www/html Điều chỉnh các lệnh trong câu trả lời này cho phù hợp.

Xem:

Ý tưởng tồi:

  • chmod 777 (sagarchalise) - điều này cho phép bất cứ ai có quyền truy cập vào hệ thống của bạn ghi vào các thư mục và tệp và do đó cho phép kẻ xâm nhập thực thi bất kỳ mã nào theo www-data người dùng
  • chgrp -R www-data $HOME (cob) - điều này cho phép www-data để đọc hoặc viết bất kỳ tệp nào trong thư mục chính. Điều này không giữ nguyên quy tắc Least Privilege
  • chown -R $USER:$USER /var/www (kv1dr) - trừ khi thế giới đã đọc quyền trên /var/www, máy chủ web chạy dưới www-data sẽ không thể đọc (phục vụ) các tệp. Nếu tệp là tài liệu HTML thuần túy có thể truy cập công cộng, có thể đó không phải là vấn đề nếu thế giới có thể đọc tệp. Nhưng nếu tập tin là một tập tin PHP có chứa mật khẩu, nó được.

CHÚ THÍCH: trong các giải pháp dưới đây, tôi đã được cấp www-data viết đặc quyền. Tuy nhiên, /usr/share/doc/base-passwd/users-and-groups.txt.gz tiểu bang:

dữ liệu www

Một số máy chủ web chạy dưới dạng www-data. Nội dung web không được sở hữu bởi điều này     người dùng hoặc một máy chủ web bị xâm phạm sẽ có thể viết lại một trang web. Dữ liệu     được viết bởi các máy chủ web sẽ được sở hữu bởi dữ liệu www.

Nếu có thể, hãy làm không phải cấp quyền ghi cho www-data nhóm. www-data chỉ cần có khả năng đọc các tệp để máy chủ web có thể phục vụ. Trường hợp duy nhất www-data cần quyền ghi là dành cho các thư mục lưu trữ video tải lên và các vị trí khác cần phải được viết.

Giải pháp 1

Thêm chính bạn vào www-data nhóm và đặt bit setgid trên /var/www thư mục sao cho tất cả các tệp mới được tạo cũng kế thừa nhóm này.

sudo gpasswd -a "$USER" www-data

Sửa các tệp đã tạo trước đó (giả sử bạn là người dùng duy nhất của /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 {} \;

(thậm chí an toàn hơn: sử dụng 640 hoặc là 2750 và thủ công chmod g+w file-or-dir cần phải được máy chủ web ghi)

Giải pháp 2

Tạo liên kết tượng trưng cho từng dự án vào thư mục chính của bạn. Giả sử dự án của bạn nằm ở ~/projects/foo và bạn muốn có nó ở /var/www/foo, chạy:

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

Nếu thư mục chính của bạn không có bit thực thi (được đặt) cho other (vì lý do bảo mật), thay đổi nhóm thành www-data, nhưng chỉ thiết lập bit thực thi (không đọc / ghi). Làm tương tự cho ~/projectsthư mục vì nó có thể chứa các dự án khác ngoài www. (Bạn không cần sudo nếu trước đây bạn đã thêm người dùng của mình vào www-data nhóm.)

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

Đặt nhóm thành www-data trên ~/projects/foo và cho phép máy chủ web đọc và ghi vào tệp và tệp + thư mục và đi sâu vào các thư mục:

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

Thậm chí an toàn hơn: sử dụng 640 và 2750 theo mặc định và chmod thủ công các tệp và thư mục cần người dùng máy chủ web có thể ghi. Bit setgid chỉ nên được thêm nếu bạn muốn mọi tệp mới được tạo trong ~/projects/foo để có thể truy cập được bởi nhóm.

Từ bây giờ, bạn có thể truy cập trang web của mình tại http://localhost/foo và chỉnh sửa các tệp dự án của bạn trong ~/projects/foo.

Xem thêm


229
2018-06-01 09:48



Bạn nghĩ gì về một phiên www trong một thiết bị đầu cuối bởi sudo su www-data? Kết hợp với một dấu nhắc màu khác nhau, để làm cho nó rõ ràng hơn rằng nó là vỏ của một người dùng khác, và một chính sách luôn luôn đặt xterm tương ứng trên - ví dụ - desktop ảo 4, để bạn quen với nó, tránh nhầm lẫn? - user unknown
@user không xác định: nếu bạn làm mọi thứ trong thiết bị đầu cuối tốt như bạn đã tách biệt rõ ràng giữa các tài khoản người dùng. Nhưng nó sẽ không hoạt động nếu bạn sử dụng một chương trình GUI như gedit. Tôi chưa bao giờ nghiên cứu xem việc chạy một chương trình GUI dưới một người dùng khác trong phiên hiện tại có an toàn hay không, nó sẽ là một câu hỏi thú vị. - Lekensteyn
@imaginaryRobots: nếu tôi sẽ đăng các giải pháp khác nhau cho mỗi câu hỏi, Askubuntu sẽ có đầy đủ các câu trả lời của ba dòng. Tôi sẽ giữ nó như là trừ khi bạn có thể thuyết phục tôi chia nó ra. - Lekensteyn
@berbt setfacl -d u::rwX,g::rX /var/www có hiệu ứng hài hước là chế độ mặc định trở thành 0750 (hoặc 0640) ngay cả khi umask là zero. Nó có thể là một ý tưởng tốt nếu bạn muốn tránh các tập tin có thể ghi trên thế giới, nhưng nếu /var/www đã không thể tiếp cận được bởi thế giới, nó không cần thiết. - Lekensteyn
Có một vấn đề với đảo ngược quá trình trong giải pháp 1? Ý tôi là, /var/www/app01 có quyền sở hữu app01:app01, và sau đó www-data  người dùng được thêm vào app01  nhóm? Hay điều đó sẽ phá vỡ một cái gì đó? - Jack_Hu


Thay vì lưu trữ các trang web của tôi trong / var / www tôi đặt liên kết đến các trang web được đặt trong thư mục chính của tôi. Tôi có thể tự do chỉnh sửa hoặc thêm trang vào trang web của mình. Khi tôi hài lòng với những thay đổi sau đó tôi FTP cho một công ty lưu trữ, nơi tên miền của tôi liên kết.


7
2018-06-01 07:06



Đây là một ý tưởng hợp lý. - thomasrutter


Nếu bạn thực hiện / var / www có thể ghi bởi nhóm của nó và thêm chính bạn vào nhóm, bạn sẽ không phải sử dụng sudo trong khi vẫn còn khá an toàn. Thử cái này:

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

Sau đó, bạn có thể chỉnh sửa /var/www/ các tệp không gặp rắc rối.

Dòng đầu tiên thêm bạn vào www-data nhóm, dòng thứ hai xóa bất kỳ tệp nào có quyền sở hữu sai lầm và thứ ba tạo ra nó để tất cả người dùng là thành viên của www-data nhóm có thể đọc và ghi tất cả các tệp trong /var/www.


6
2017-07-01 00:41



Đây là một ý tưởng rất tồi tệ về an ninh và không nên theo lời khuyên này, vì những lý do được giải thích trong các câu trả lời khác. www-data được cho là một không có đặc quyền nhóm, không có quyền ghi. - thomasrutter


Không

  • Không đặt quyền đối với tệp 777 (có thể ghi trên thế giới)

    Đây là một lỗ hổng bảo mật đáng kể, đặc biệt là nếu bạn cho phép kịch bản phía máy chủ chẳng hạn như PHP. Các quá trình không có đặc quyền sẽ không thể ghi vào các tệp có thể ảnh hưởng đến trang web hoặc, trong trường hợp kịch bản phía máy chủ đang được sử dụng, hãy thực thi mã tùy ý.

  • Đừng thêm bản thân làm thành viên của dữ liệu www nhóm và cung cấp cho nó quyền ghi

    Mục đích của nhóm đó là nó là một không có đặc quyền nhóm rằng quy trình máy chủ chạy như. Họ chỉ nên đọc quyền truy cập vào các tệp trang web nếu có thể, với cùng lý do như trên.

  • Không thay đổi quyền của các quy trình Apache

    Các tiến trình con của Apache chạy như www-data người dùng và nhóm theo mặc định và điều này sẽ không bị thay đổi. Đây chỉ là một cách để cho họ không có quyền ghi vào hệ thống tập tin.

    Trong một số trường hợp, bạn muốn tập lệnh phía máy chủ của mình có thể ghi vào tệp, trong trường hợp đó chỉ có những tệp đó phải được ghi bởi www-data và chăm sóc cần phải được thực hiện để đảm bảo an ninh.

Dos

  • Đặt các tệp được sở hữu bởi chính bạn

    Nếu bạn là người duy nhất, hoặc người bình thường, để sửa đổi một số tập tin trên trang web, sau đó nó làm cho ý nghĩa tổng chỉ để có quyền sở hữu các tập tin đó. Đặt chủ sở hữu của họ thành <your username>.

    Bạn không phải sửa đổi quyền của máy chủ cho điều này, vì máy chủ sẽ tiếp tục nhận quyền truy cập chỉ đọc ngay cả khi các tệp được sở hữu bởi bạn.

  • Chọn một nơi hợp lý để chứa các tệp (sử dụng DocumentRoot)

    Nếu /var/www không có ý nghĩa, bạn có thể đặt chúng ở nơi khác. Nếu chúng được cụ thể để phát triển hoặc thử nghiệm của riêng bạn, bạn có thể đặt chúng trong thư mục chính của bạn. Hoặc bạn có thể thiết lập một số thư mục trong /srv.

  • Nếu bạn muốn cho nhóm viết quyền truy cập, tạo Mới nhóm cho mục đích

    Không sử dụng lại nhóm hệ thống vì chúng thường được thiết kế để có quyền truy cập mà họ hiện có và không còn nữa vì lý do bảo mật.


5
2017-11-23 23:43





Thật đơn giản. Bạn không cần phải kích hoạt 'UserDir' apache '(không được khuyến nghị) cũng như không gây rối với nhóm' www-data '(nhóm apache trong trường hợp trên Fedora)

Chỉ cần tạo thư mục dự án của bạn bên trong /var/www/html

cd /var/www/html
sudo mkdir my_project

Sau đó, chỉ cần gọi thư mục dự án cho người dùng của bạn.

sudo chown your_username my_project

Bây giờ bạn có thể bắt đầu làm việc trên thư mục dự án của bạn như một người dùng thông thường với bất kỳ trình soạn thảo, IDE nào mà bạn chọn. Không còn nữa sudos :)


5
2017-08-06 07:49



+1 Đó là những gì tôi làm: thay đổi quyền sở hữu không /var/www chính nó, nhưng của các thư mục con. - fkraiem


chmod trong / var trên www để cho phép chủ sở hữu truy cập, và chown để đảm bảo rằng bạn sở hữu nó. Có lẽ là một ý tưởng ngu ngốc, nhưng nó chắc chắn sẽ hoạt động.


1
2018-06-01 03:59



Không phải là một ý tưởng ngu ngốc, đó là một ý tưởng hợp lý về bảo mật. Lưu ý: Bạn không cần (và không nên) thay đổi quyền /var, chỉ /var/www và / hoặc nội dung của nó. - thomasrutter


Bạn có thể bắt đầu một phiên www trong một thiết bị đầu cuối bởi

sudo su www-data

Kết hợp với một dấu nhắc màu khác nhau *, để làm cho nó rõ ràng hơn rằng nó là vỏ của một người dùng khác, và một chính sách luôn luôn đặt xterm tương ứng (và trình soạn thảo và như vậy) trên - ví dụ - máy ảo 4, để bạn quen với nó, để tránh nhầm lẫn.

*) Đối với một dấu nhắc màu khác với ký tự differnt, hãy tạo một tệp / etc / prompt như sau:

# 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

và nguồn từ /etc/bash.bashrc ví dụ.

Là công cụ bổ sung để giúp phân biệt, bạn luôn có thể chỉnh sửa tệp của mình bằng bí danh 'chỉnh sửa' hoặc liên kết tượng trưng, ​​điểm này tùy thuộc vào danh tính của bạn (taylor / www-data) hoặc gedit hoặc mousepad, vim hoặc pico. Hoặc bạn có thể sử dụng các hồ sơ trình chỉnh sửa khác nhau, ít nhất là trong gedit, bạn có thể đặt tùy chọn của mình thành văn bản màu đen trên nền trắng hoặc văn bản màu trắng trên nền đen chẳng hạn.

Tôi chỉ có một chính sách như vậy để làm việc như người chủ, vì vậy tôi không chắc nó sẽ phù hợp để làm việc với dữ liệu www như thế nào. Kết hợp với ssh-session với các host khác nhau, có nhắc nhở riêng của nó, nó không ngăn cản tôi đôi khi sai, nhưng nếu nó xảy ra, tôi nhận ra nhanh, điều gì sai, và nó hiếm khi xảy ra.

lưu ý: Dấu nhắc lệnh là một phần bản sao của manpage của bash.


1
2018-06-01 15:49



Điều này sẽ làm việc, và sẽ không (nếu được sử dụng cẩn thận) tác động tiêu cực đến an ninh, nhưng có thể không phải là giải pháp đơn giản nhất. Đó là một giải pháp hợp lệ cho một số người mặc dù. - thomasrutter


Trên trang này của trang web của tôi Tôi bao gồm các lệnh để thay đổi quyền trong /var/www giữa apache và người dùng pi nhưng điều cần thiết của nó

sudo chown -R pi /var/www

sau đó khởi động lại apache

sudo service apache2 restart

-1
2017-11-23 23:27



Liên kết hiện hoạt động - Gadgetroid