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

评论

您正在使用apache吗?

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

获得安全性的另一种方法是继续使用sudo -u www-data,但将自己限制在sudoers文件中,以便仅能够sudo www-data(而不是sudo root)。请参阅serverfault.com/questions/295429/……

#1 楼

这里的大多数答案在编写时都没有考虑安全性。感觉每次运行sudo都不是很明智的。如果输入错误(例如,在错误的地方输入单个空格,例如递归删除/ var/www/dir,这意味着/var/www/dir,而不是/var/www/dir,请不要尝试输入),则可能会打乱您的系统。
注意:从Apache 2.4.7 / Ubuntu 14.04开始,/var/www已移至/var/www/html。相应地调整此答案中的命令。
请参阅:


我的本地网站的放置位置apache2的2.4.7版本?


为什么apache2 www目录被移至/ var / www / html?


HTTP服务器的默认文档根目录


错误的主意:


chmod 777(sagarchalise)-这允许有权访问您的系统的任何人写入目录和文件,从而允许入侵者在www-data用户下执行任何代码。

chgrp -R www-data $HOME(cob)-这使www-data可以读取或写入主目录中的任何文件。这并没有牢记最低特权规则。

chown -R $USER:$USER /var/www(kv1dr)-除非全世界对/var/www拥有读取权限,否则在www-data下运行的Web服务器将无法读取(提供)文件。如果该文件是可公开访问的纯HTML文档,那么全世界都可以读取该文件可能就不是问题。但是,如果该文件是包含密码的PHP文件,则为。

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

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

在可能的情况下,请勿将写入权限授予www-data组。 www-data仅需要能够读取文件,以便Web服务器可以为其提供服务。 www-data需要写许可权的唯一情况是用于存储上传文件和其他需要写入的位置的目录。
解决方案1 ​​
将自己添加到www-data组中,并将/var/www目录上的setgid位置设置为新创建的文件也将继承该组。
sudo gpasswd -a "$USER" www-data

更正以前创建的文件(假设您是/var/www的唯一用户): 640和需要由Web服务器写入的2750手动)
解决方案2
为每个项目创建到主目录的符号链接。假设您的项目位于chmod g+w file-or-dir,并且您希望其位于~/projects/foo,请运行:
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 {} \;

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

将组设置为www-data上的www-data,并允许Web服务器读取和写入文件和文件+目录。并进入目录:
sudo chgrp www-data ~ ~/projects
chmod 710 ~ ~/projects

更安全:默认情况下使用640和2750,并手动chmod需要Web服务器用户可写的文件和目录。仅当您希望组可以访问~/projects/foo中的每个新创建的文件时,才应添加setgid位。
从现在开始,您可以访问~/projects/foo上的站点并在http://localhost/foo中编辑项目文件。
另请参阅

权限问题:Apache如何访问我的主目录中的文件?
原因/ var / www为什么不应该具有chmod 777


评论


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

–用户未知
2011年6月1日15:18

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

– Lekensteyn
2011年6月1日15:26

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

– Lekensteyn
2011年6月2日,12:32

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

– Lekensteyn
16年2月16日在10:38

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

– Jack_Hu
18年5月31日在18:07



#2 楼

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

评论


这是一个明智的想法。

–胸骨
16年11月23日在23:46

我无法做:( @ @Leekensteyn第二种解决方案对我有好处,但没有起作用

–穆罕默德·泰亚卜
20-10-16在12:58

#3 楼

如果使/ 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中的所有文件。

评论


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

–胸骨
16-11-23在23:45



#4 楼

不要



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

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


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

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


请勿更改Apache进程的权限

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

在某些情况下,您希望服务器端脚本能够写文件,在这种情况下,应仅创建那些文件。由www-data写入,并需要注意确保安全性。


Dos





将文件设置为自己拥有

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

您不必为此修改服务器权限,因为即使文件是您拥有的,服务器也将继续获得只读访问权限。 >

选择一个合理的文件存储位置(使用DocumentRoot)。

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


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

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


评论


但是无论何时,只要将我放置在/ var / www之外,我都会收到“禁止访问403”消息

–穆罕默德·泰亚卜
20-10-16在14:04

这与这个问题无关;这将需要在其他地方询问

–胸骨
20-10-18在13:49

#5 楼

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

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

cd /var/www/html
sudo mkdir my_project


然后将项目目录锁定给您的用户。具有任何编辑器(您选择的IDE)的普通用户。没有更多的sudos:​​)

评论


+1这就是我要做的:更改所有权(不是/ var / www本身,而是子目录)。

–fkraiem
16-10-20在15:33



#6 楼

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

评论


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

–胸骨
16 Nov 23在23:43



#7 楼

您可以通过以下方式在终端中启动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 q4312078q (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或鼠标垫,vim或pico。或者,您可以使用不同的编辑器配置文件,至少在gedit中,您可以将首选项设置为白色底色上的黑色文本或例如黑色底色上的白色文本。

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

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

评论


这将起作用,并且不会(如果谨慎使用)不会对安全性产生负面影响,但可能不是最直接的解决方案。对于某些人来说,这是一个有效的解决方案。

–胸骨
16-11-23在23:47