在Linux服务器上,网站文件/文件夹应该具有哪些权限?

分享于 

16分钟阅读

互联网

 

问题:

这是一个规范问题,关于Linux服务器上的文件权限。

我有一个运行Apache2的Linux网络服务器,它承载多个网站。 每个网站在/var/www/. 中都有自己的文件夹


/var/www/contoso.com/


/var/www/contoso.net/


/var/www/fabrikam.com/



基本目录/var/www/由 root:root 拥有。 Apache正在作为 www-data:www-data 运行。 Fabrikam网站由两个开发人员,Alice和Bob维护。 两个Contoso网站都由一个开发者,Eve维护。 所有网站都允许用户上传图片。 如果网站受到威胁,那么影响应该尽可能的有限。

我想知道设置权限的最佳方法,以便Apache能够服务内容,网站是安全的,开发人员仍然可以更改。 其中一个网站的结构如下:


/var/www/fabrikam.com


/cache


/modules


/styles


/uploads


/index.php



如何在这些目录和文件上设置权限? 我在某个地方读过你不应该在网站上使用 777权限,但是我不知道什么问题可能会导致。 在繁忙期间,网站自动缓存一些页面并将结果存储在缓存文件夹中。 网站访问者提交的所有内容都保存到上传文件夹中。


回答 1:

决定使用哪些权限时,需要确切地知道用户是谁以及他们需要什么。 web服务器与两种类型的用户交互。

经过身份验证的用户拥有服务器上的用户帐户,并且可以提供特定特权。 这通常包括系统管理员。开发人员和服务帐户。 他们通常使用SSH或者SFTP对系统进行更改。

匿名用户是你网站的访问者。 尽管它们没有权限直接访问文件,但是它们可以请求web页面并代表它们代表web服务器。 你可以限制匿名用户访问web服务器进程的权限,从而限制匿名用户的访问。 在许多Linux发行版上,Apache作为 www-data 用户运行,但它可以是不同的。 用户 ps aux | grep httpd 或者 ps aux | grep apache 查看Apache在你的系统上使用的用户。

关于linux权限的说明

Linux和其他符合posix标准的系统使用传统的unix权限。 维基百科上有关于 文件系统 权限的文章,所以我不会在这里重复所有内容。 但是你应该注意一些事情。

执行位
解释的脚本(。ruby,PHP ) 在没有执行权限的情况下工作正常。 只有二进制和 shell 脚本需要执行位。 为了遍历( 输入) 目录,你需要对该目录具有执行权限。 web server需要这里权限来列出目录或者服务其中的任何文件。

默认新文件权限
创建文件时,通常会继承创建该文件的人的组 id。 但是有时你希望新文件继承它们创建的文件夹的组 id,因此你将在父文件夹上启用SGID位。

默认权限值取决于你的umask。 umask从新创建的文件中减去权限,因此 022的公共值会导致使用 755创建文件。 当与团队协作时,将你的umask更改为 002,这样你创建的文件就可以被组成员修改。 如果你想自定义上传文件的权限,你需要更改has或者在文件上载后运行 chmod。

777的问题

当你 chmod 777 网站的时候你根本没有任何安全。 系统上的任何用户都可以更改或者删除你网站中的任何文件。 但更重要的是,请记住web服务器代表你的网站访问者,现在web服务器能够更改它正在执行的文件。 如果网站上有任何编程漏洞,可以用来损坏网站,插入仿冒攻击或者从服务器中偷取信息。

另外,如果服务器运行在已知的端口( 它应该防止非根用户产生世界可以访问的侦听服务),这意味着服务器必须通过 root ( 一旦端口绑定,任何健全的服务器都会立即下降到一个较低特权的帐户) 启动。 换句话说,如果你正在运行主可以执行文件的主要可以执行文件( 比如 )的服务器,。 如果你想让你的用户在任何一个 root 可执行文件上运行,你可以让任何用户以英镑为代价,以1 英镑为代价。

定义需求

  • 开发者需要对文件进行读/写访问,这样他们才能更新网站
  • 开发人员在目录上需要 read/write/execute,以便他们可以浏览
  • Apache需要读取文件和解释的脚本
  • Apache需要对serveable目录进行读取/执行访问
  • Apache需要 read/write/execute 访问上传内容的目录

由单个用户维护

如果只有一个用户负责维护站点,将它们设置为网站目录中的用户所有者,并为用户提供完整的rwx权限。 Apache仍然需要访问,以便它可以为文件服务,因这里将,数据设置为组所有者,并给出。

在你的例子中,用户名可以能是 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



如果你有需要可以写的文件夹,你可以只修改组所有者的权限值,以便has数据写入。


chmod g+w uploads


ls -l


drwxrws--- 2 eve www-data 4096 Feb 5 22:52 uploads



这种配置的好处在于,对于系统上其他用户来说,它变得更加困难,因为只有用户和组所有者可以浏览你的网站目录,并进行搜索。 如果配置文件中有机密数据,这很有用。 小心你的umask ! 如果在这里创建新文件,则权限值可能默认为 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有相同的特权,因这里它的他用户易于浏览你的网站,如配置文件。

你可以用你的Cake 吃得太多。

这可以进一步改进。 这是完全合法的,所有者比组拥有更少的权限,因这里,我们可以使用 root的用户拥有者。 这是单个维护者场景的逆转,但同样有效。


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



如果你有需要可以写的文件夹,你可以只修改用户所有者的权限值,以便has数据写入。


chmod u+w uploads


ls -l


drwxrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com



关于这个解决方案要注意的一点是,新文件的用户拥有者将使用 MATCH,而不是设置为www数据。 所以所创建的任何新文件都不能在Apache中读取,直到你 chown。

*Apache 特权分离

我前面提到,它的他用户可以能在你的网站上搜索你的网站,无论你使用什么特权。 在默认情况下,所有Apache进程都作为相同的数据用户运行,因此任何Apache进程都可以从同一台服务器上配置的所有其他网站读取文件,有时甚至。 任何能够让Apache运行脚本的用户都可以获得与Apache本身相同的访问权限。

为了解决这个问题,在Apache中有多种方法可以实现权限分离。 然而,每个方法都有各种性能和安全缺陷。 我认为,在共享服务器上,应该在专用服务器上运行安全需求较高的任何站点,而不是使用 VirtualHosts。

.一次性备份向导

以前我没有提到过,但是让开发者直接编辑网站是一个糟糕的做法。 对于更大的站点,你更好地使用某种版本的发布系统来更新版本控制系统内容。 单一维护者方法可能是理想的,但不是一个你拥有自动化软件的人。

如果你的网站允许上传不需要提供,那么这些上传应该存储在 web root 外部。 否则,你可能会发现人们正在下载想要保密的文件。 例如,如果允许学生提交作业,则应将它们保存到不提供Apache服务的目录中。 这对于包含秘密的配置文件也是一个很好的方法。

对于要求更复杂的网站,你可能需要查看使用访问控制列表。 这些功能可以更加精确地控制特权。

如果你的网站要求复杂,你可能需要编写一个脚本来设置所有的权限。 彻底测试,然后保持安全。 如果你发现自己需要重新建立网站,那么它可以能值得金价值。


回答 2:

给出上面的优秀答案,我认为有一件事应该注意,我不能在答案后面留言。

如果你的网站是( 文件或者文件),请注意,如果你的网站上包含 setuid,那么所有新文件都会被创建,因此。 这意味着创建新目录和文件后,你必须使用类似于以下内容的内容:


chown -R www-data/newdirectory/


chmod -R 570/newdirectory/



我曾在Ubuntu中遇到过一个奇怪的问题:在重启服务器之前,我无法获得权限,这神奇地修复了问题。 在这个看似简单的问题上失去了头发的速度。


回答 3:

我将使用这里配置:

  • 除了上传一个 directories root 和组 root 之外的所有目录,对 0755的权限。
  • 所有文件设置为所有者 root 和组 root,对 0644的权限。
  • 上传目录设置为所有者 root,组 www-data,权限到 1770。 sticky位不允许组所有者删除或者重命名内部的目录和文件。
  • 内部上传文件夹包含 www-data 所有者用户和组的新目录,以及上传文件的每个 www-data 用户的0700 权限。
  • Apache配置:
  • 在上传目录中拒绝 AllowOverrideIndex,以便Apache不读取 .htaccess 文件,并且Apache用户不能索引上载文件夹的内容:

    
    <Directory/siteDir>
    
    
     Options -Indexes
    
    
    </Directory>
    
    
    
    <Directory/siteDir/uploadDir>
    
    
     AllowOverride none
    
    
    </Directory>
    
    
    
    

    6.php.ini 配置:

    
    open_basedir =/siteDir:/tmp:/usr/share/phpmyadmin
    
    
    post_max_size = 5M
    
    
    file_uploads = On
    
    
    upload_max_filesize = 3M
    
    
    max_file_uploads = 20
    
    
    
    

    使用这里配置,www-data 用户将无法获得 siteDir//tmp/usr/share/phpmyadmin 以外的其他目录。 还可以控制最大文件大小。最大邮件大小和要在同一请求中上载的最大文件。


回答 4:

当你有一个名为"狮子座"的FTP用户需要将文件上传到 example.com web目录,并且你的"apache"用户能够在缓存目录中创建 uploa-files/sessions/cache 文件。

命令将leo作为所有者和组分配给 example.com, apache用户是组apache的一部分,因此它将继承apache组的权限。

chown R leo:apache example.com

另一个命令,它确保权限正确并满足安全考虑。

chmod R 2774 example.com

这里第一个数字 2用于目录,确保创建的每个新文件都将保留在相同的组和所有者权限中。 77为所有者和组,表示它们具有完全访问权限。 4代表别人只能读槽。

下面有助于理解权限编号


Number Octal Permission Representation


0 No permission


1 Execute permission


2 Write permission


3 Execute and write permission: 1 (execute) + 2 (write) = 3


4 Read permission


5 Read and execute permission: 4 (read) + 1 (execute) = 5


6 Read and write permission: 4 (read) + 2 (write) = 6


7 All permissions: 4 (read) + 2 (write) + 1 (execute) = 7





相关文章