在/ var / www中工作时如何避免使用sudo?


172

我不想在sudo每次工作时都必须使用/var/www。我怎样才能做到这一点?我只是想将我所有的站点都放到该目录中并与它们一起工作,而不会太费劲。


3
您正在使用apache吗?
Rinzwind'6

1
在这里阅读后,这也可以在许可部分提供帮助:askubuntu.com/questions/20105/…–
Luis Alvarado

2
获得安全性的另一种方法是继续使用sudo -u www-data但将自己限制在sudoers文件中只能sudo www-data(而不是sudo root)使用。见serverfault.com/questions/295429/...
西蒙·伍德赛德

Answers:


249

这里的大多数答案在编写时都没有考虑安全性。感觉sudo每次运行都不是很明智,这是很好的。如果输入错误(例如,在错误的地方放了一个空白:sudo rm -rf / var/www/dir 请勿执行!),则可能会破坏系统。

注意:从Apache 2.4.7 / Ubuntu 14.04开始,/var/www已被移动以相应地/var/www/html调整此答案中的命令。

看到:

坏主意:

  • chmod 777(sagarchalise)-这允许有权访问您的系统的任何人写入目录和文件,从而允许入侵者在www-data用户下执行任何代码
  • chgrp -R www-data $HOME(cob)-这允许www-data读取或写入主目录中的任何文件。这没有牢记最低特权规则
  • chown -R $USER:$USER /var/www(kv1dr)-除非全世界都具有的读取权限/var/www,否则运行下的Web服务器www-data将无法读取(提供)文件。如果文件是公共可访问的纯HTML文档,那么世界上可以读取该文件可能就不是问题。但是,如果该文件是包含密码的PHP文件,则为。

注意:在以下解决方案中,我已授予www-data写权限。但是,/usr/share/doc/base-passwd/users-and-groups.txt.gz声明:

www数据

某些Web服务器作为www-data运行。Web内容不应归该用户所有,否则受感染的Web服务器将能够重写网站。Web服务器写出的数据将归www-data所有。

如果可能的话,也没有授予写权限的www-data组。www-data只需要能够读取文件,网络服务器就可以提供文件。www-data需要写入权限的唯一情况是用于存储上载内容的目录以及其他需要写入的位置。

解决方案1

将您自己添加到该www-data组中,并在/var/www目录上设置setgid位,以使所有新创建的文件也继承该组。

sudo gpasswd -a "$USER" www-data

更正以前创建的文件(假设您是的唯一用户/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 {} \;

(甚至更安全:需要Web服务器写的使用6402750和手动chmod g+w file-or-dir

解决方案2

为每个项目创建一个符号链接到您的主目录。假设您的项目位于,~/projects/foo并且您想要使其位于/var/www/foo,请运行:

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

如果您的主目录other出于安全原因未设置执行位(降序)(出于安全原因),请将其组更改为www-data,而仅设置执行位(不进行读/写)。对~/projects文件夹执行相同操作,因为它可能包含除www之外的其他项目。(sudo如果您以前已将用户添加到www-data组中,则不需要。)

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

将该组设置为www-dataon,~/projects/foo并允许Web服务器读取和写入文件和文件+目录并进入目录:

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

甚至更安全:默认情况下使用640和2750,并手动chmod需要Web服务器用户可写的文件和目录。仅当您希望~/projects/foo组可以访问每个新创建的文件时,才应添加setgid位。

从现在开始,您可以在访问站点,http://localhost/foo并在中编辑项目文件~/projects/foo

也可以看看


您如何看待终端中的www会话sudo su www-data?结合使用不同颜色的提示,以使其更清楚地表明它是不同用户的外壳,并始终采用一种策略将相应的xterm放置在虚拟桌面4上,以便您习惯使用避免混乱?
用户未知

@user未知:如果您在终端中做的一切都很好,因为您清楚地区分了用户帐户。但是,如果您使用的GUI程序,它将无法正常工作gedit。我从未研究过在当前会话中在其他用户下运行GUI程序是否安全,这将是一个有趣的问题。
Lekensteyn 2011年

1
@imaginaryRobots:如果我要为每个问题发布不同的解决方案,那么Askubuntu将充满三行答案。除非您可以说服我将其拆分,否则我将保持原样。
Lekensteyn 2011年

1
@berbt setfacl -d u::rwX,g::rX /var/www具有有趣的效果,即使umask为零,默认模式也变为0750(或0640)。如果您想避免可写入世界的文件,这可能是一个好主意,但是如果/var/www世界已经无法访问它,则不需要它。
Lekensteyn '16

1
反转解决方案1中的过程是否有问题?我的意思是说,/var/www/app01拥有所有权app01:app01,然后将www-data 用户添加到app01 组中?还是会破坏某些东西?
Jack_Hu

9

与其将我的网站存储在/ var / www中,不如将其链接到位于我的主文件夹中的网站。我可以自由编辑页面或将页面添加到我的网站。当我对更改感到满意时,我便通过FTP连接到托管我的域名的托管公司。


这是一个明智的想法。
thomasrutter '16

7

如果使/ var / www的组可写,并将自己添加到该组,则在相当安全的情况下不必使用sudo。尝试这个:

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

这样您就可以轻松编辑/var/www/文件了。

第一行将您添加到www-data组中,第二行将清除所有权混乱的所有文件,第三行将其删除,以便作为该www-data组成员的所有用户都可以在中读写所有文件/var/www


4
对于安全性来说,这是一个非常糟糕的主意,出于其他答案中说明的原因,不应遵循此建议。www-data应该是没有特权的组,没有写访问权限。
thomasrutter

5

不要

  • 不要将文件权限设置为777(世界可写)

    这是一个重大的安全漏洞,尤其是在启用服务器端脚本(例如PHP)的情况下。非特权进程不应写可能影响网站的文件,或者在使用服务器端脚本的情况下,应执行任意代码。

  • 不要将自己添加为www-data组的成员并为其授予写权限

    该组的目的在于,它是服务器进程运行时所使用的非特权组。出于与上述相同的原因,他们仅应在可能的情况下对网站文件具有读取权限。

  • 不要更改Apache进程的权限

    www-data默认情况下,Apache子进程以用户和组的身份运行,并且不应更改。这只是不给他们文件系统写权限的一种方式。

    在某些情况下,您希望服务器端脚本能够写入文件,在这种情况下,应使那些文件可写,www-data并且需要格外小心以确保安全性。

多斯

  • 将文件设置为自己拥有

    如果您是修改网站上某些文件的唯一(或通常)文件,那么仅拥有这些文件的所有权是很有意义的。将其所有者设置为<your username>

    您无需为此修改服务器权限,因为即使文件归您所有,服务器仍将继续获得只读访问权限。

  • 选择一个合适的位置来存放文件(使用DocumentRoot

    如果/var/www没有任何意义,欢迎您将其放置在其他位置。如果它们特定于您自己的开发或测试,则可以将它们放在主目录中。或者,您可以在中设置一些目录/srv

  • 如果要授予写访问权限,请为此目的创建一个

    不要重复使用系统组,因为出于安全原因,这些组通常设计为具有当前拥有的访问权限,并且不再具有访问权限。


5

就这么简单。您既不需要启用apache'UserDir'(不推荐),也不需要弄乱'www-data'组(apache组,以防Fedora)

只需在其中创建项目目录 /var/www/html

cd /var/www/html
sudo mkdir my_project

然后,将项目目录整理给您的用户。

sudo chown your_username my_project

现在,您可以使用任何编辑器(选择的IDE)以普通用户身份开始处理项目文件夹。没有更多sudos:)


1
+1这就是我要做的:更改所有权不是/var/www自己,而是子目录。
fkraiem

2

www上的/ var中的chmod以允许所有者访问,而chown以确保您拥有它。可能是个愚蠢的主意,但绝对可以。


2
这不是一个愚蠢的主意,而是一个明智的安全性主意。注意:您不需要(也不应该)更改/var/var/www和/或其内容的权限。
thomasrutter

1

您可以通过以下方式在终端中启动www会话:

sudo su www-data

结合使用不同颜色的提示*,以使其更清楚地表明它是另一个用户的外壳,并且始终使用策略将相应的xterm(以及编辑器等)放置在例如虚拟桌面4上,以便您已经习惯了,以免造成混淆。

*)对于带有不同字符的颜色不同的提示符,请创建文件/ etc / prompt,如下所示:

# 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

并从中/etc/bash.bashrc获取它。

作为帮助区分的附加工具,您始终可以使用别名“ edit”或符号链接来编辑文件,这些文件根据您的身份(taylor / www-data)指向gedit或mousepad,vim或pico。或者您可以使用不同的编辑器配置文件,至少在gedit中,您可以将首选项设置为白色底色上的黑色文本或例如黑色底色上的白色文本。

我只有这样的策略才能以root用户身份工作,因此我不确定它是否适合与www-data一起工作。结合使用ssh-sessions到不同的主机(它们都有各自的提示),这并不能阻止我有时会出错,但是如果发生这种情况,我很快就会意识到,哪里出了问题,而且很少发生。

注意:提示脚本部分是bash联机帮助页的副本。


这将起作用,并且不会(如果谨慎使用)不会对安全性产生负面影响,但可能不是最直接的解决方案。对于某些人来说,这是一个有效的解决方案。
thomasrutter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.