777:兽的数字
曾经在一个Linux世界...
大多数的Web服务器都运行在Linux或其他UNIX变体上,如Solaris、FreeBSD等。所有UNIX操作系统变体中有一个共同的主题,那就是基于用户、组、所有权和权限的文件系统安全模型。这是一个很大的话题,但通过快速谷歌搜索就可以找到很多优秀的资源。无论如何,我会尽量给你一个总结。
UNIX变体有用户,每个用户属于一个或多个组。文件系统中的每个文件和目录都属于一个且仅属于一个用户和一个组。拥有者用户不一定是拥有者组的一部分,这提供了灵活性。系统通过权限知道谁可以做什么,每个目录和文件。权限通常以三位八进制数字的形式书写。第一个数字告诉系统拥有者用户可以做什么,第二个数字告诉它拥有者组可以做什么,第三个数字告诉它其他人(“世界”的其余部分)可以做什么。常用的数字是4(只读)、5(读和执行)、6(读和写)和7(读、写和执行)。在目录上执行位有特殊的意义:它意味着“浏览”,即允许某人列出目录的内容。这与“读”不同,后者仅仅意味着如果用户知道文件名,则允许用户从该目录中读取文件。
但是操作系统是如何知道如何解析这些权限的呢?就像目录和文件一样,你运行的所有程序都由用户和组拥有。Apache——最常用的Web服务器——也是一个程序。它在用户和组的“之下”运行。FTP服务器也是如此。更复杂的是,FTP服务器实际上是在你登录到它的用户下运行的。
所以,这就是关键。操作系统根据请求访问的程序的用户和组来确定谁请求访问。它也知道你请求什么类型的访问(读取、写入或执行/浏览)。当它找到文件或目录时,它可以查找其所属的用户和组以及其权限。它首先检查所属用户和运行用户是否匹配。如果它们匹配,它将使用权限的第一个数字来决定做什么。如果不匹配,它将检查所属组和运行组是否匹配,并使用权限的第二个数字来决定做什么。如果所有这些都失败了,它将使用权限的第三个数字(即“世界”权限)来决定。这是一个优雅而有效的系统,直到有人试图不明智地使用它。
咬一口苹果就足够了
大多数共享主机都配置为以Apache“模块”(即mod_php)的形式运行PHP。这意味着你的PHP文件将在与Web服务器相同的用户和组下运行。通常,这些被称为“nobody”和“nogroup”。然而,当你使用FTP上传文件时,FTP服务器将在你登录的用户下运行。假设你的用户名是“foobar”,你属于名为“users”的组。你现在拥有的所有由FTP上传的目录和文件都由foobar:users拥有,并在nobody:nogroup下运行(请注意,我在本文的其余部分使用用户:组简称)。这意味着在你的网站通常默认的目录和文件权限644下,你的PHP脚本(包括Joomla!及其扩展)不能写入网站上的文件,甚至不能列出你自己的网站目录的内容!
你为什么应该关心呢?嗯,现代Web应用程序(如Joomla!、WordPress和Drupal)需要能够写入文件,原因有很多:缓存文件、软件安装、日志、通过Web界面上传的文件、备份等。由于所属的、运行的用户和组不同,唯一分配适当权限的方法是使用第三个权限数字,即臭名昭著的“世界”权限。很多指示——甚至软件——建议你应该使用777权限。确实,这很有效,你的PHP文件现在可以写入文件。然而,这对你的网站来说实际上有点过于有效了。就像咬一口禁果一样。有多坏?
你知道这个故事。咬一口苹果就足够了。你知道吗,在共享主机上,你并不是唯一用户。其他网站在同一系统上也有用户。更糟糕的是,每个网站根目录的确切路径(即绝对文件系统路径)非常可预测,通常格式为/home/username/public_html。如果有人想黑你的网站,他只需在同一服务器上创建一个账户,并尝试写入你的网站上的某个文件。有了0777权限,即使他没有你的用户名和密码,他也可以做到这一点!记住我多次提到权限的第三个数字被称为“世界”权限吗?它们真正做到了名副其实。它们允许同一系统上的任何人——我的意思是任何人——写入你的目录和文件!
雪上加霜的是,一个聪明的黑客甚至不需要在同一个服务器上创建账户。您的服务器运行了许多软件,例如Web服务器、FTP服务器、DNS服务器、SSH服务器、邮件服务器等等。如果其中之一存在漏洞,他可以利用这些漏洞写入您的网站文件。即使您把一切都锁起来,共享主机仍然提供了被偷偷破坏的机会。即使您已经采取了所有措施来防止漏洞在您的网站上运行,同一服务器上托管的另一个网站可能对安全性并不那么关注。如果其他网站被攻击,黑客将能够攻击您的网站,因为777权限允许他这样做。
换句话说,赋予777权限是让潜在的黑客以至少三种不同的方式“拥有”您的网站的快捷方式。当我告诉您777是恶魔的数字时,您现在相信我了吗?
顺便说一句,我想让您知道这个规则的例外。如果您授予0777权限的目录的上一个目录在全局权限中有一个0,例如0700或0750,那么即使您的目录具有0777权限,操作系统也不会授予全局可写权限。例如,如果您的网站位于/home/myuser/public_html,并且/home/myuser具有0700权限,那么在/home/myuser/public_html/tmp中设置0777权限将没有任何效果。这可能解释了为什么在一个正确配置的主机上,授予0777权限似乎不起作用。
是时候召唤驱魔师了……还是说不是?
从您的服务器上清除邪恶的777权限有几种方法。这取决于您的Web服务器是如何设置的。系好安全带,我们即将进入DIY区域!记住:在尝试对实时网站进行任何更改之前,请备份。将其下载到本地并存储在至少三种不同的媒介上。在任何情况下,都不要尝试对实时网站进行更改,除非您有一个有效且经过测试的备份。您可以手动进行备份,或使用Joomla!扩展目录中的免费扩展之一。
完美的共享主机运行在suPHP上
这是理想的情况,当您的托管服务器的服务器运行在suPHP上,就像许多值得信赖的主机一样。suPHP是解决权限问题的非常巧妙的解决方案。它不是在Web服务器用户和组下运行PHP,而是在PHP文件的拥有用户和组下运行PHP。这意味着权限的第一个数字是重要的,而第二个和第三个数字可以将目录设置为4(仅读)或5(读取、浏览)。不要使用0,因为这会导致非PHP内容(如图片、JavaScript和CSS文件)无法访问。在这种情况下,完美的权限是文件的0644和目录的0755,您可以使用您喜欢的FTP软件来设置这些权限。
如果您不确定,有一个简单的方法可以确定您的托管是否运行在suPHP上。转到Joomla!管理后端的帮助,系统信息菜单项。如果“Web服务器到PHP接口”读取CGI或FastCGI,那么您的托管很可能使用suPHP。只需询问他们即可。
外行人的共享主机
一些共享主机拒绝使用suPHP。这些是那种在单个服务器上挤满2,000-3,000个网站的托管。suPHP会降低性能,因此他们不使用它,以便能够过度拥挤他们的服务器而不会使其戛然而止。无论如何,即使在这种情况下,您也可以采取一些措施来部分保护您的网站。
常见的错误做法是将所有文件和目录的所有权赋予Web服务器用户。实现这一点的简单方法是备份您的网站,从您的账户中删除所有内容,然后通过使用不使用FTP传输文件的PHP脚本来恢复备份。所有文件都将由Web服务器运行用户所有,并且您可以分别为文件使用0644权限,为目录使用0755权限。从安全角度来看,这是一个大问题。遗憾的是,即使是经验丰富的Linux用户也难免会犯这样的错误。为什么是陷阱呢?哈哈!如果同一服务器上另一个网站被黑客攻击,黑客就可以写入您的网站文件,因为这两个网站的所有权用户相同:即Web服务器运行的用户。恭喜,您被黑了。
正确的做法既痛苦又耗时。您需要所有文件和目录都属于您账户的用户所有(即使用FTP上传它们,或使用PHP脚本来提取备份归档,该归档可以使用FTP写入提取的文件)除了那些您需要写入的。既然我们在这里讨论的是Joomla!,请执行以下操作
-
删除缓存、tmp和日志目录
-
在您的网站上安装Joomla! eXtplorer或NinjaXplorer。这些文件管理器在Joomla!内部运行,因此与您的Web服务器具有相同的用户和组。
-
使用这些文件管理器中的任何一个创建缓存、tmp和日志目录。这些目录现在由Web服务器用户所有。
-
使用这些文件管理器暂时给予它们777权限。
-
使用您最喜欢的FTP程序在每个这些目录中创建一个包含以下内容的 .htaccess 文件
order deny, allow
deny from all
-
使用FTP程序将这些文件设置为0644权限。
-
返回到文件管理器(eXtplorer或NinjaXplorer),将缓存、tmp和日志目录设置为0700权限。注意:您可能需要为缓存目录设置0744权限并移除 .htaccess 文件,以便某些CSS/JS聚合和压缩插件能够工作。我认为这是一种糟糕的做法,但它似乎是目前唯一的解决方案...如果我的意见,请卸载相关的插件。
-
转到Joomla!的全局配置并启用FTP层。不要存储您的密码!
这里的技巧是多方面的。首先,我们确保缓存、tmp和日志目录由Web服务器用户所有,因此Joomla!可以写入它们。由于这些目录包含必须不可从网络上访问的文件,我们使用 .htaccess 文件禁止对这些目录进行网络访问。由于 .htaccess 是通过FTP上传的,因此它现在由您的账户用户所有,其权限不允许它被覆盖。即使黑客试图通过写入这些世界可写目录来利用我们的网站,他也不会能够执行它们,攻击就会失败。您还需要在组件安装期间能够写入其他目录。这就是为什么我们启用了FTP层。不存储FTP密码将导致Joomla!每次需要时都请求它。由于它没有写入您网站上任何文件,即使您的网站被利用,黑客也无法获取您的密码。任务完成,极端偏见!
性能调优的专用主机
这是我最喜欢的一部分,因为这种类型的主机广泛采用的形式代表了双重失败。
当您的网站流量很大时,您需要在一个专用服务器上运行它。由于它是专用服务器,这意味着它只会在上面运行一个网站。然而,您希望将每个CPU周期都用于良好的用途,因此由于其开销和不兼容性能调整技巧(例如使用操作码缓存,例如APC - 替代PHP缓存),您不能使用suPHP。这一切都很好,直到您决定在服务器上安装ISPConfig、Plesk、cPanel或任何其他预包装服务器环境管理器(SEM)。
为什么?因为您这样做的时候,您就进入了“愚蠢模式”。您的头脑关闭,接受SEM“强加”给您的设置。更具体地说,所有SEM都假设您正在设置一个共享主机,并配置Apache使用与您要托管的一个唯一网站的拥有者用户不同的用户。结果——因为您不能使用FTP层(由于巨大的性能影响),您开始赋予777权限。
啊!您让这头野兽爬进来了!您只托管一个网站,因此黑客必须渗透这个网站的安保才能攻击您的网站。或者不。他可以使用各种系统服务器(FTP、邮件、SSH、DNS等)作为攻击向量。您的777权限给了他这样做的能力。又一次,您让自己变成了一个容易攻击的目标。为什么,哦,为什么这样做?解决方案很简单。
无论您使用哪个SEM,您都是系统管理员。您可以编辑Apache的配置文件并做些神奇的事情。将Apache配置为以您要托管的唯一网站的拥有者用户身份运行。没错,就是这么简单。从那时起,您可以简单地使用0700权限为目录和0600权限为文件。正如朱利叶斯·恺撒所说:我来,我见,我征服。
回顾过去
我们都是人类,我们都会犯错误,甚至在安全领域也是如此。成为一个专家并不能完全避免错误。当我写这篇文章的时候,我开始质疑自己的安全实践。你知道什么?我在一些网站上犯了一些错误,我还在其他网站上做得相当不错。不可能做到完美,更不用说总是完美,但把所有这些都写下来是有帮助的。您可以用这篇文章作为下一次为客户设置网站或甚至您自己的网站的参考。
记住,安全就像避孕一样。它是可选的,但只有当您不介意与错误的人不幸发生性关系所带来的后果时才是这样。在互联网上,情况甚至更糟,因为错误的人甚至不会向您询问。最终,这完全取决于您自己。
祝您健康。祝您安全。不要让任何软件决定777权限不是邪恶的!
在Joomla社区杂志上发布的某些文章代表了作者对特定主题的个人观点或经验,可能并不与Joomla项目的官方立场一致
通过接受,您将访问由 https://magazine.joomla.net.cn/ 之外的第三方提供的服务
评论