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


173

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


3
Bạn đang sử dụng apache?
Rinzwind

1
Sau khi đọc ở đây, điều này cũng có thể giúp đỡ trong phần cấp phép: Askubfox.com/questions/20105/ Khăn
Luis Alvarado

2
Một cách khác để có được sự an toàn là tiếp tục sử dụng sudo -u www-datanhưng giới hạn bản thân trong sudoerstệp để chỉ có thể sudo www-data(và không sudo root). Xem serverfault.com/questions/295429/ từ
Simon Woodside

Câu trả lời:


250

Hầu hết các câu trả lời ở đây không được viết với sự an toàn trong tâm trí. Thật tốt khi có cảm giác rằng chạy sudomỗ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ụ: một khoảng trắng ở một vị trí sai: sudo rm -rf / var/www/dir không thực thi! ), Bạn có thể làm hỏng hệ thống của mình.

Lưu ý: Bắt đầu với Apache 2.4.7 / Ubuntu 14.04, /var/wwwđã được chuyển sang /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 kỳ 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-datangười dùng
  • chgrp -R www-data $HOME(cob) - điều này cho phép www-datađọc hoặc ghi bất kỳ tệp nào trong thư mục chính. Điều này không giữ nguyên tắc đặc quyền tối thiểu
  • chown -R $USER:$USER /var/www(kv1dr) - trừ khi thế giới có quyền đọc /var/www, máy chủ web chạy bên dưới www-datasẽ không thể đọc (phục vụ) các tệp. Nếu tệp là một tài liệu HTML đơn giản có thể truy cập công khai, thì đó 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 là một tệp PHP chứa mật khẩu, thì nó là.

LƯU Ý : trong các giải pháp dưới đây, tôi đã cấp www-datađặc quyền ghi. Tuy nhiên, /usr/share/doc/base-passwd/users-and-groups.txt.gztiểu bang:

dữ liệu www

Một số máy chủ web chạy dưới dạng dữ liệu www. Nội dung web không nên thuộc sở hữu của người dùng này hoặc máy chủ web bị xâm nhập 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ể, không cấp quyền ghi cho www-datanhóm. www-datachỉ cần có khả năng đọc các tệp để máy chủ web có thể phục vụ nó. Trường hợp duy nhất khi www-datacần quyền ghi là cho các thư mục lưu trữ tải lên và các vị trí khác cần được ghi.

Giải pháp 1

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

sudo gpasswd -a "$USER" www-data

Sửa các tệp được tạo trước đó (giả sử bạn là người dùng duy nhất /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 640hoặc 2750thủ công chmod g+w file-or-dirmà máy chủ web có thể ghi được)

Giải pháp 2

Tạo một liên kết tượng trưng cho từng dự án vào thư mục nhà của bạn. Giả sử dự án của bạn được đặt tại ~/projects/foovà bạn muốn đặt nó tại /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 (giảm dần) được đặt cho other(vì lý do bảo mật), hãy thay đổi nhóm của nó thành www-data, nhưng chỉ đặt 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 sudonếu trước đó bạn đã thêm người dùng của mình vào www-datanhóm.)

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

Đặt nhóm thành www-databật ~/projects/foovà cho phép máy chủ web đọc và ghi vào tệp và tệp + thư mục và xuống 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à các tệp và thư mục chmod theo cách thủ công mà người dùng máy chủ web có thể ghi được. Chỉ nên thêm bit setgid nếu bạn muốn mọi tập tin mới tạo ~/projects/foođược truy cập vào nhóm.

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

Xem thêm


Bạn nghĩ gì về một phiên www trong một thiết bị đầu cuối bằng cách sudo su www-data? Kết hợp với một dấu nhắc có màu khác nhau, để làm rõ hơn rằng đó là vỏ của một người dùng khác và chính sách luôn đặt xterm tương ứng - ví dụ - máy tính để bàn ảo 4, để bạn quen với nó, tránh nhầm lẫn?
người dùng không xác định

@user không xác định: nếu bạn làm mọi thứ trong thiết bị đầu cuối tốt vì 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 chương trình GUI như thế nào gedit. Tôi chưa bao giờ nghiên cứu liệu chạy 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, đó sẽ là một câu hỏi thú vị.
Lekensteyn

1
@imaginaryRobots: nếu tôi định đăng các giải pháp khác nhau cho mọi câu hỏi, Askubfox sẽ có đầy đủ các câu trả lời của ba dòng. Tôi sẽ giữ nó như vậy trừ khi bạn có thể thuyết phục tôi chia nó.
Lekensteyn

1
@berbt setfacl -d u::rwX,g::rX /var/wwwcó hiệu ứng vui là chế độ mặc định trở thành 0750 (hoặc 0640) ngay cả khi ô bằng không. Nó có thể là một ý tưởng tốt nếu bạn muốn tránh các tệp có thể ghi trên thế giới, nhưng nếu /var/wwwthế giới không thể truy cập được thì không cần thiết.
Lekensteyn

1
Có vấn đề gì với việc đảo ngược quá trình trong giải pháp 1 không? Ý tôi là, /var/www/app01có 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

9

Thay vì lưu trữ các trang web của tôi trong / var / www, tôi đặt các liên kết ở đó đến các trang web nằm trong thư mục 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.


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

7

Nếu bạn tạo / var / www có thể ghi được 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 khá an toàn. Thử đi:

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 tin mà không gặp rắc rối.

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


4
Đây là một ý tưởng rất tồi cho bảo mật và lời khuyên này không nên được tuân theo, vì những lý do được giải thích trong các câu trả lời khác. dữ liệu www được coi là một nhóm không có đặc quyền , không có quyền truy cập ghi.
thomasrutter

5

Không

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

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

  • Đừng tự thêm mình là thành viên của nhóm dữ liệu www và cấp cho nó quyền viết

    Mục đích của nhóm đó là một nhóm không có đặc quyền mà các máy chủ xử lý chạy như. Họ chỉ nên có quyền truy cập đọc vào các tệp trang web nếu có thể, vì những lý do tương tự 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 theo www-datangười dùng và nhóm theo mặc định và điều này không nên 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 nhất định, bạn muốn các tập lệnh phía máy chủ của bạn có thể ghi vào các tệp, trong trường hợp đó chỉ các tệp đó phải được ghi www-datavà cần phải cẩn thận để đảm bảo an ninh.

Liều dùng

  • Đặ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 là người bình thường, sửa đổi một số tệp nhất định trên trang web, thì việc nắm quyền sở hữu các tệp đó sẽ hoàn toàn hợp lý. Đặt chủ sở hữu của họ để <your username>.

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

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

    Nếu /var/wwwkhông có ý nghĩa, bạn có thể đặt chúng ở nơi khác. Nếu chúng là cụ thể cho sự 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 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 cấp quyền truy cập ghi nhóm , hãy tạo một nhóm mới cho mục đích này

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


5

Thật đơn giản. Bạn không cần phải kích hoạt apache 'UserDir' (không được khuyến nghị) cũng như không gây rối với các nhóm 'dữ liệu www' (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 chown 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 mình 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 bạn chọn. Không còn sudos :)


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

2

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


2
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 của /var, chỉ /var/wwwvà / hoặc nội dung của nó.
thomasrutter

1

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

sudo su www-data

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

*) Đối với lời nhắc có màu khác với ký tự differnt, hãy tạo tệp / etc / prompt như thế này:

# 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à lấy nguồn từ /etc/bash.bashrcví dụ.

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

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

lưu ý: Tập lệnh nhắc nhở một phần là bản sao của trang bash.


Điều này sẽ hoạt động và sẽ không (nếu được sử dụng cẩn thận) ảnh hưởng tiêu cực đến bảo mật, 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.