我不想在sudo
每次工作时都必须使用/var/www
。我怎样才能做到这一点?我只是想将我所有的站点都放到该目录中并与它们一起工作,而不会太费劲。
sudo -u www-data
但将自己限制在sudoers
文件中只能sudo www-data
(而不是sudo root)使用。见serverfault.com/questions/295429/...
我不想在sudo
每次工作时都必须使用/var/www
。我怎样才能做到这一点?我只是想将我所有的站点都放到该目录中并与它们一起工作,而不会太费劲。
sudo -u www-data
但将自己限制在sudoers
文件中只能sudo www-data
(而不是sudo root)使用。见serverfault.com/questions/295429/...
Answers:
这里的大多数答案在编写时都没有考虑安全性。感觉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
需要写入权限的唯一情况是用于存储上载内容的目录以及其他需要写入的位置。
将您自己添加到该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服务器写的使用640
或2750
和手动chmod g+w file-or-dir
)
为每个项目创建一个符号链接到您的主目录。假设您的项目位于,~/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-data
on,~/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
。
sudo su www-data
?结合使用不同颜色的提示,以使其更清楚地表明它是不同用户的外壳,并始终采用一种策略将相应的xterm放置在虚拟桌面4上,以便您习惯使用避免混乱?
gedit
。我从未研究过在当前会话中在其他用户下运行GUI程序是否安全,这将是一个有趣的问题。
setfacl -d u::rwX,g::rX /var/www
具有有趣的效果,即使umask为零,默认模式也变为0750(或0640)。如果您想避免可写入世界的文件,这可能是一个好主意,但是如果/var/www
世界已经无法访问它,则不需要它。
/var/www/app01
拥有所有权app01:app01
,然后将www-data
用户添加到app01
组中?还是会破坏某些东西?
与其将我的网站存储在/ var / www中,不如将其链接到位于我的主文件夹中的网站。我可以自由编辑页面或将页面添加到我的网站。当我对更改感到满意时,我便通过FTP连接到托管我的域名的托管公司。
如果使/ 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
。
不要将文件权限设置为777(世界可写)
这是一个重大的安全漏洞,尤其是在启用服务器端脚本(例如PHP)的情况下。非特权进程不应写可能影响网站的文件,或者在使用服务器端脚本的情况下,应执行任意代码。
不要将自己添加为www-data组的成员并为其授予写权限
该组的目的在于,它是服务器进程运行时所使用的非特权组。出于与上述相同的原因,他们仅应在可能的情况下对网站文件具有读取权限。
不要更改Apache进程的权限
www-data
默认情况下,Apache子进程以用户和组的身份运行,并且不应更改。这只是不给他们文件系统写权限的一种方式。
在某些情况下,您希望服务器端脚本能够写入文件,在这种情况下,仅应使那些文件可写,www-data
并且需要格外小心以确保安全性。
将文件设置为自己拥有
如果您是修改网站上某些文件的唯一(或通常)文件,那么仅拥有这些文件的所有权是很有意义的。将其所有者设置为<your username>
。
您无需为此修改服务器权限,因为即使文件归您所有,服务器仍将继续获得只读访问权限。
选择一个合适的位置来存放文件(使用DocumentRoot)
如果/var/www
没有任何意义,欢迎您将其放置在其他位置。如果它们特定于您自己的开发或测试,则可以将它们放在主目录中。或者,您可以在中设置一些目录/srv
。
如果要授予组写访问权限,请为此目的创建一个新组
不要重复使用系统组,因为出于安全原因,这些组通常设计为具有当前拥有的访问权限,并且不再具有访问权限。
就这么简单。您既不需要启用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:)
/var/www
自己,而是子目录。
www上的/ var中的chmod以允许所有者访问,而chown以确保您拥有它。可能是个愚蠢的主意,但绝对可以。
/var
,/var/www
和/或其内容的权限。
您可以通过以下方式在终端中启动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联机帮助页的副本。