在决定使用什么权限时,您需要确切地知道您的用户是谁以及他们需要什么。Web服务器与两种类型的用户进行交互。
经过身份验证的用户在服务器上拥有一个用户帐户,并且可以提供特定的特权。这通常包括系统管理员,开发人员和服务帐户。他们通常使用SSH或SFTP对系统进行更改。
匿名用户是您网站的访问者。尽管他们没有直接访问文件的权限,但是他们可以请求一个网页,并且Web服务器代表他们进行操作。您可以通过注意Web服务器进程具有的权限来限制匿名用户的访问。在许多Linux发行版中,Apache以www-data
用户身份运行,但可以不同。使用ps aux | grep httpd
或ps aux | grep apache
查看Apache在系统上使用的用户。
关于Linux权限的说明
Linux和其他POSIX兼容系统使用传统的Unix权限。Wikipedia上有一篇关于文件系统权限的出色文章,因此在此我将不再赘述。但是,您需要注意一些事项。
执行位
解释脚本(例如Ruby,PHP)无需执行许可就可以正常工作。只有二进制文件和Shell脚本需要执行位。为了遍历(输入)目录,您需要对该目录具有执行权限。Web服务器需要此权限才能列出目录或在其中提供任何文件。
默认的新文件权限
创建文件后,通常会继承创建该文件的人的组ID。但是有时您希望新文件继承创建它们的文件夹的组ID,因此您将在父文件夹上启用SGID位。
默认权限值取决于您的umask。umask会从新创建的文件中减去权限,因此022的公共值会导致使用755创建文件。与组协作时,将umask更改为002很有用,以便您可以由组成员修改创建的文件。而且,如果要自定义上传文件的权限,则需要更改apache的umask或在文件上传后运行chmod。
777的问题
当chmod 777
您访问网站时,就没有任何安全性。系统上的任何用户都可以更改或删除您网站中的任何文件。但更重要的是,请记住,Web服务器代表您网站的访问者行事,现在,Web服务器可以更改正在执行的文件。如果您的网站中存在任何编程漏洞,它们可能会被利用来破坏您的网站,插入网络钓鱼攻击或从服务器中窃取信息,而您却一无所知。
此外,如果您的服务器运行在众所周知的端口上(应该防止非root用户生成世界可访问的监听服务),则这意味着您的服务器必须由root启动(尽管任何正常的服务器都会立即掉线)绑定端口后,将其分配给特权较低的帐户)。换句话说,如果您正在运行一个Web服务器,其中主要可执行文件是版本控制的一部分(例如CGI应用程序),则保留其权限(或者就此而言,包含目录的权限,因为用户可以重命名) 777)允许任何用户以root 用户身份运行任何可执行文件。
定义要求
- 开发人员需要对文件具有读/写访问权限,以便他们可以更新网站
- 开发人员需要对目录进行读/写/执行,以便可以浏览
- Apache需要对文件和解释脚本的读取权限
- Apache需要对可服务目录的读取/执行访问权限
- Apache需要对目录进行读/写/执行访问以获取上载内容
由一个用户维护
如果只有一个用户负责维护站点,请将其设置为网站目录上的用户所有者,并为该用户提供完全的rwx权限。Apache仍然需要访问权限,以便它可以提供文件,因此将www-data设置为组所有者,并授予组rx权限。
在您的情况下,夏娃(其用户名可能为eve
)是唯一维护contoso.com
以下内容的用户:
chown -R eve contoso.com/
chgrp -R www-data contoso.com/
chmod -R 750 contoso.com/
chmod g+s contoso.com/
ls -l
drwxr-s--- 2 eve www-data 4096 Feb 5 22:52 contoso.com
如果您有需要Apache写入的文件夹,则可以只修改组所有者的权限值,以便www-data具有写访问权限。
chmod g+w uploads
ls -l
drwxrws--- 2 eve www-data 4096 Feb 5 22:52 uploads
这种配置的好处是,系统上的其他用户很难窥探(但并非不可能*),因为只有用户和组所有者才能浏览您的网站目录。如果配置文件中包含机密数据,这将很有用。注意您的蒙版!如果您在此处创建新文件,则权限值可能默认为755。您可以运行umask 027
以使新文件的默认值为640(rw- r-- ---
)。
由一组用户维护
如果负责维护站点的用户不止一个,则需要创建一个组来分配权限。最好为每个网站创建一个单独的组,并以该网站命名。
groupadd dev-fabrikam
usermod -a -G dev-fabrikam alice
usermod -a -G dev-fabrikam bob
在前面的示例中,我们使用组所有者为Apache授予特权,但现在将其用于开发人员组。由于用户所有者不再对我们有用,因此将其设置为root是确保没有特权泄漏的简单方法。Apache仍然需要访问权限,因此我们向世界其他地方提供了读取访问权限。
chown -R root fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 775 fabrikam.com
chmod g+s fabrikam.com
ls -l
drwxrwxr-x 2 root dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
如果您有需要Apache写入的文件夹,则可以将Apache设置为用户所有者或组所有者。无论哪种方式,它都将具有所需的所有访问权限。就个人而言,我更希望使其成为用户所有者,以便开发人员仍可以浏览和修改上传文件夹的内容。
chown -R www-data uploads
ls -l
drwxrwxr-x 2 www-data dev-fabrikam 4096 Feb 5 22:52 uploads
尽管这是一种常见的方法,但也有一个缺点。由于系统上的所有其他用户都对您的网站具有与Apache相同的特权,因此其他用户很容易浏览您的站点并读取可能包含机密数据的文件,例如配置文件。
你也可以吃蛋糕
这可以进一步改进。拥有者拥有比组更少的特权是完全合法的,因此,与其通过将用户分配给root来浪费用户拥有者,我们还可以使Apache成为您网站中目录和文件上的用户拥有者。这是单一维护者方案的逆转,但效果同样好。
chown -R www-data fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 570 fabrikam.com
chmod g+s fabrikam.com
ls -l
dr-xrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
如果您有需要Apache写入的文件夹,则可以只修改用户所有者的权限值,以便www-data具有写访问权限。
chmod u+w uploads
ls -l
drwxrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
此解决方案要注意的一件事是,新文件的用户所有者将与创建者匹配,而不是被设置为www-data。因此,您创建的任何新文件在被chown之前都不会被Apache读取。
* Apache权限分离
前面我提到过,无论您使用哪种特权,其他用户实际上都有可能窥探您的网站。默认情况下,所有Apache进程都以同一www-data用户身份运行,因此任何Apache进程都可以从同一服务器上配置的所有其他网站读取文件,有时甚至可以进行更改。任何可以使Apache运行脚本的用户都可以获得与Apache本身相同的访问权限。
为了解决这个问题,Apache中有多种方法来进行权限分离。但是,每种方法都具有各种性能和安全性缺点。我认为,任何对安全性有更高要求的站点都应在专用服务器上运行,而不是在共享服务器上使用VirtualHosts。
其他注意事项
我之前没有提到过,但是让开发人员直接编辑网站通常是一个不好的做法。对于较大的站点,最好使用某种版本的发布系统从版本控制系统的内容更新Web服务器。单一维护者方法可能是理想的选择,但是您没有人,而是拥有自动化软件。
如果您的网站允许上传不需要上传的内容,则这些上传内容应存储在网络根目录之外的某个位置。否则,您可能会发现人们正在下载旨在保密的文件。例如,如果您允许学生提交作业,则应将其保存到Apache不在的目录中。对于包含机密的配置文件,这也是一种好方法。
对于具有更复杂要求的网站,您可能需要研究访问控制列表的使用。这些使特权的控制更加复杂。
如果您的网站有复杂的要求,则可能需要编写一个脚本来设置所有权限。对其进行彻底的测试,然后确保其安全。如果您由于某种原因需要重建自己的网站,那么用黄金来衡量它可能是值得的。