Xeo*_*oss 72 linux permissions chmod
/var/www 目录归root:root
其所有,这意味着没有人可以使用它并且完全没有用。既然我们都想要一个实际工作的 Web 服务器(并且没有人应该以“root”身份登录),那么我们需要解决这个问题。
只有两个实体需要访问。
PHP/Perl/Ruby/Python都需要访问文件夹和文件,因为它们创建了许多文件夹和文件(即/uploads/
)。这些脚本语言应该在 nginx 或 apache 下运行(或者甚至是像 FastCGI for PHP 这样的其他东西)。
开发商
他们如何获得访问权限?我知道有人在某个地方以前做过这件事。然而,有数十亿个网站,您会认为会有更多关于此主题的信息。
我知道 777 是所有者/组/其他的完全读/写/执行权限。因此,这似乎不需要正确,因为它为随机用户提供了完全权限。
需要使用哪些权限,/var/www
以便:
所有人都可以在那里读取、创建和运行文件(和目录)吗?
如果我是对的,Ruby 和 PHP 脚本不会直接“执行”-而是传递给解释器。所以不需要对/var/www
...中的文件执行权限?因此,似乎正确的许可chmod -R 1660
将使
这样对吗?
更新 1:我刚刚意识到文件和目录可能需要不同的权限 - 我在上面谈论文件,所以我不确定目录权限需要是什么。
更新 2:文件夹结构/var/www
发生了巨大变化,因为上述四个实体之一总是添加(有时删除)多个级别的文件夹和子文件夹。他们还创建和删除其他 3 个实体可能需要读/写访问权限的文件。因此,权限需要对文件和目录都做上述四件事。由于它们都不需要执行权限(请参阅上面有关 ruby/php 的问题),我认为rw-rw-r--
权限就是所需要的并且是完全安全的,因为这四个实体由受信任的人员(请参阅 #2)和所有其他用户运行系统只有读权限。
更新 3:这是用于个人开发机器和私人公司服务器。没有像共享主机那样随机的“网络客户”。
更新 4: slicehost 的这篇文章似乎最能解释为 www 文件夹设置权限所需的内容。但是,我不确定使用 PHP 或 svn/git 运行的用户或组 apache/nginx 以及如何更改它们。
更新 5:我(我认为)终于找到了让这一切正常工作的方法(答案如下)。但是,我不知道这是否是正确且安全的方法。因此,我开始赏金。拥有保护和管理 www 目录的最佳方法的人获胜。
Xeo*_*oss 51
经过更多研究,似乎另一种(可能更好的方法)来回答这个问题是像这样设置 www 文件夹。
sudo usermod -a -G developer user1
(将每个用户添加到开发者组)sudo chgrp -R developer /var/www/site.com/
以便开发人员可以在那里工作sudo chmod -R 2774 /var/www/site.com/
以便只有开发人员可以创建/编辑文件(其他/世界可以读取)sudo chgrp -R www-data /var/www/site.com/uploads
以便 www-data (apache/nginx) 可以创建上传。由于git
以任何用户调用它的身份运行,因此只要用户在“开发人员”组中,他们就应该能够创建文件夹、编辑 PHP 文件和管理 git 存储库。
注意:在步骤(3)中:2774 中的“2”表示为目录“设置组 ID”。这会导致在其中创建的新文件和子目录继承父目录的组 ID(而不是用户的主要组)参考:http : //en.wikipedia.org/wiki/Setuid#setuid_and_setgid_on_directories
我不确定它是否“正确”,但这是我在服务器上所做的:
请记住,您应该在目录上启用执行位,以便您可以列出内容。
经过更多研究后,似乎 git/svn工具不是问题,因为它们以任何用户使用它们的身份运行。(但是,git/svn 守护进程是另一回事!)我使用 git 创建/克隆的所有内容都有我的权限,并且 git 工具列在/usr/bin
其中适合本论文。
Git权限解决了。
用户权限似乎可以通过将所有需要访问 www 目录的用户添加到www-data
apache(和 nginx)运行的组中来解决。
所以这个问题的一个答案似乎是这样的:
默认情况下/var/www
,归拥有者所有root:root
,没有人可以在那里添加或更改文件。
首先,我们需要将 www 目录组更改为“www-data”而不是“root”组
sudo chgrp -R www-data /var/www
Run Code Online (Sandbox Code Playgroud)
然后我们需要将当前用户(和其他任何人)添加到 www-data 组
sudo usermod -a -G www-data demousername
Run Code Online (Sandbox Code Playgroud)
更改权限,以便只有所有者(root)和“www-data”组中的所有用户可以 rwx(读/写/执行)文件和目录(其他人甚至不能访问它)。
sudo chmod -R 2770 /var/www
Run Code Online (Sandbox Code Playgroud)
现在,任何具有访问权限的用户(即在“www-data”组中)创建的所有文件和目录都可以被 apache 和 php 读取/写入。
这样对吗?PHP/Ruby 创建的文件怎么样 - www-data 用户可以访问它们吗?
粘性不是权限继承。目录上的粘性意味着只有文件的所有者或目录所有者才能重命名或删除目录中的该文件,尽管权限另有说明。因此在 /tmp/ 上是 1777。
在经典 Unix 中,没有基于文件系统的权限继承,仅基于当前进程的 umask。在 *BSD 或目录上带有 setgid 的 Linux 上,新创建的文件的组字段将设置为与父目录相同。更重要的是,您需要查看 ACL,在目录上使用“默认”ACL,这确实让您拥有继承的权限。
您应该首先定义: * 哪些用户可以访问系统 * 您的威胁模型是什么
例如,如果您与多个客户一起进行网络托管,并且您不希望他们看到彼此的文件,那么您可以为所有这些用户使用一个公共组“webcusts”和目录模式 0705。然后文件由网络服务器进程(不在“webcusts”中)将看到其他权限并被允许;客户无法看到彼此的文件,用户可以弄乱自己的文件。但是,这确实意味着当您允许 CGI 或 PHP 时,您必须确保进程以特定用户身份运行(无论如何,对于一台主机上的多个用户,出于问责制,这是一种很好的做法)。否则,客户可能会因为 CGI 这样做而弄乱彼此的文件。
但是,如果网站的运行时用户与网站的所有者相同,那么在脚本中存在安全漏洞的情况下,您确实无法保护内容免受滥用者的侵害。这就是专用主机获胜的地方,这样您就可以拥有一个不同于静态内容所有者的运行时用户,而不必太担心与其他用户的交互。