Gallery:安全性
Gallery2的安全性[ ]
本文解释有关Gallery2安全性的各个方面,还会指导如何使你的服务器/托管账号以及Gallery2远离可能遭受的攻击,但不对Gallery2的权限系统多加描述。本文还专门解释以linux/unix为基础的服务器,但相关的大多数指导都可以直接转译给Windows所用。如果我们谈及权限,就忽略出现类似777的数字而只需关注read+write+execute…
介绍[ ]
Gallery2的安全离不开WEB服务器的安全。如果服务器/WEB服务器的安全性没有保障,那么Gallery2的安全性也就无从谈起了。
此文中我们涉及以下几个话题:
- 确保除了你以外没有人可以读/写你的Gallery2文件
- 确保账户都具有适当的权限
- 如无必要,不要暴露更多的有关Gallery2/G2版本的信息
- 如何辨别出不安全的webhost
- 与杂项安全有关的话题
有关联系方法[ ]
Gallery项目对安全性问题态度极为认真。如果你发现了安全性方面的瑕疵,请不要发布公共BUG报告或在公共论坛里谈及。你可以通过Email的方式直接递交给我们的安全性问题处理小组(gallery.menalto.com)。请提供尽可能多的信息,包括你使用的Gallery版本以及对安全性瑕疵的描述。如果能提供服务器日志或情景重现的类似数据,那将对问题的澄清有质的影响。如果你在某安全性问题公示以前就提交给我们了,你就会得到认可并有资格获得现金奖励!
短小的查漏清单[ ]
如果你暂时没有那么多时间通读此文档,你可以查看以下所列最为重要的安全性问题。尽管如此,我们还是建议你稍后返回这里,将整个文档都看一下,以使你尽可能地保证Gallery的安全。
- config.php的文件系统权限:请保证只有你和WEB服务器能够读(或写)config.php文件。使用FTP软件将config.php文件的权限设置为444(即所有人可读)。绝大多数的共享网络托管安装不允许权限设置超越“所有人可读”。在某些情况下,权限设置可以更为严格。详细信息请见后文。
- 禁止查看Gallery代码:如果在你的gallery2/文件夹下已有一个名为.htaccess的文件,就在它的顶部加入(复制粘贴即可)如下代码。相反,如果没有发现此文件,就用文本编辑器创建一个。你可能需要使用FTP来将其重命名为.htaccess,因为Windows不允许扩展名(即“.”)之前空空如也。以下的代码应作为该.htaccess文件的一部分:
<Files ~ "\.(inc|class)$"> Deny from all </Files>
- 注: 有关.htaccess的知道仅对托管于Aapche服务器上的网站适用。同样地,如果你被允许访问该WEB服务器上的配置文件的话,你可以直接将这些改变应用于httpd.conf而无需是.htaccess。
- gallery2/文件夹的文件系统权限:确保没有人可以写入gallery2/目录,WEB服务器用户也不可以。使用FTP软件将gallery2/目录的权限修改为555(所有人具有读和列表权限)。在某些情况下,权限设置可以更为严格。详细信息请见后文。
- 存储文件夹位置:存储文件夹(缺省为'g2data/')不能够为web-accessible,即它应当置于文档根目录之外。
初步了解你的WEB服务器[ ]
无论你是使用托管WEB服务器还是专用的WEB服务器,首先需要初步了解你的环境。我们会对以下设定感兴趣:
- 网站中用以执行所有PHP脚本的帐户
- PHP open_basedir设定的(本地)值
- 服务器API,无论PHP是如何运行的,Apache / IIS / ... Module或(fast-)cgi
创建一个名为“info.php”的文件用来查找这些设定的值,该文件内容如下:
<?php print "PHP runs under the user: [" . system('whoami') . "]<br>"; phpinfo(); ?>
将其放在gallery2文件夹下,或是预备给上传gallery2用的文件夹。接着使用WEB浏览器浏览该文件。
PHP是在你自己的帐户下运行还是在一个通用帐户下?[ ]
一般来讲,WEB服务器中PHP脚本的运行有两种不同的方式。
- WEB服务器中所有的PHP脚本都在同一个帐户下运行。而在一个共享的网络托管计划中,所有域名/帐户下的PHP脚本都在同一个通用帐户(generic user)下运行。
- WEB服务器根据不同的帐户/域名而有所区别。意即在一个共享的虚拟主机上,你的PHP脚本是为“你的用户”所运行的(大多数情况下就是你的FTP帐户);而该主机上的其他网站则在其他帐户下运行。为了安全起见,这无疑是更好的方式!
如果你的PHP 服务器API是Apache或IIS或Module / mod_php,那么此服务器上的所有PHP脚本都于一个通用帐户下运行。将PHP脚本作为WEB服务器模块并运行于不同的帐户下是不可能的。mod_php则意味着该WEB服务器上的所有脚本都运行于相同的通用帐户下。info.php极有可能在[]标记中显示不同于你的用户/帐户名称的其他通用名称。
如果你的PHP服务器API是php-cgi或php-fastcgi,那么PHP脚本很有可能在你的帐户下运行。如果info.php页面在[]中显示你的用户/帐户名称的话,那很明显地是在你的帐户下运行。
注:可能在[]中没有任何东西,甚至有可能你会得到函数“system”被禁用的警告。
设置Gallery2文件和目录的读写权限[ ]
在此我们要确保:
- 除了你没有人可以阅读你的config.php文件内容(安装密码存放之处),并且
- 没有人可以读/写你的g2data (存储)目录。
我们需要区分以下三种情况:
a) PHP为mod_php而open_basedir没有设置或不够严格[ ]
如果你的PHP运行为mod_php(所有脚本的通用用户),那么你的唯一希望就是PHP open_basedir(见info.php)设置的足够严格。PHP open_basedir应设置为除了你的g2data文件夹和gallery2文件夹没有其他帐户在此路径下。如果你的PHP服务器API是Apache而open_basedir为空(无值),那你就得跟你的主机供应商谈谈,因为这是一个很大的安全隐患。在此情况下,除非你有一个专用服务器否则无法保证Gallery2的安全。那么在这样的环境中会发生些什么呢?
- 某个客户可以使用PHP读取你的config并获取密码来肆意而为。
- 如果你使config.php设置为可写,其他某个用户就有可能写入不可用的配置或是调用其他数据的配置,从而一定程度上对你造成损害。
- 某个客户可以使用PHP 读/写你的Gallery2存储目录(g2data)
在此种环境中你所能做的有:
- 设置config.php为444 (所有人可读权限)
- 为你的G2管理员帐户启用另外一套密码取代安装密码(G2安装时输入的密码)
- 删除upgrade/文件夹,因为某人可以使用存储在config.php中的安装密码访问此文件夹
- 另见 如何保证Gallery2的安全
b) PHP为mod_php且open_basedir设置足够严格[ ]
尽管你的WEB服务器并非固若金汤,但严格设置的open_basedir聊胜于无。你需要保证config.php文件为全球/公共范围可读。Open_basedir将会确保仅你所在帐户下的PHP代码可以打开你的帐户下的文件。
- 将config.php的权限设置为444(所有者,组和世界/公共范围可读权限)
- 将g2data的权限设置为777(所有人具有读/写/执行的权限)。递归地应用此权限设置(包括所有次级文件夹和文件等)。
另外一个办法就是请求管理员改变config.php文件和g2data目录(递归地包括下属文件夹)的所有者,这样通用WEB服务器用户就会享有这些文件了牡蛎了。(命令:chown -R username g2data,此命令只能被管理员执行)。那么为什么这样就可以提高安全性了呢?在此情形下,其他人无法再通过shell(telnet/ssh)读/写你的文件了。接着你可以设置权限为:
- 设置config.php的权限为400(所有者可读,无其他权限)
- 设置g2data的权限为700 (所有者可读/写/执行权限,无其他权限)。递归地应用此权限设置(包括所有次级文件夹和文件等)。
注: Open_basedir仅保证PHP下的安全性,不包括其他脚本语言。如果WEB服务器也允许Perl或其他脚本语言,那么你的Gallery2还无法保证绝对的安全—对于来自其他人或其他网页脚本的攻击。
c) PHP为cgi并且所有脚本运行于你的帐户下[ ]
你很走运。如果PHP仅在你的用户帐户下运行,那我们就可以将其他用户的所有文件系统移除了。
- 将config.php的权限设置为400 (所有者/你的可读权限,其他任何人均无此权限)。
- 将g2data的权限设置为700 (所有者/你的读/写/执行权限,其他任何人均无此权限)。递归地应用此权限设置(包括所有次级文件夹和文件等)。
- 在G2的site admin -> general中,为新的目录设置权限为700,而新文件设置为600。
限制WEB服务器用户的权利[ ]
你应当明确,Gallery可能存在的易损性是不应扩大的。尽可能地限制运行WEB服务器/PHP脚本的用户的权限。比如,不将WEB服务器作为根目录运行。
用户应该仅享有以下权利
- 对g2data及下属文件夹的读/写/执行
- 对g2data及下属文件夹中文件的读/写/执行
- 对gallery2文件夹及下属文件夹的读/写/执行
- gallery2及下属文件夹中所有文件可读
- 二进制及二进制所在文件夹的读和执行(imagemagick,netpbm,ffmpeg,dcraw,unzip和zip...)
- 同时你应当阻止所有对存储目录(缺省为'g2data/')的访问。添加以下内容到存储文件夹下名为.htaccess文件中:
Deny From All
请勿暴露有关Gallery2的信息[ ]
Gallery2的编写是将安全性考虑在内的。尽管如此,安全性的薄弱环节还是存在于Gallery2中的(所有已知问题均被修复)。你应当尽量不让网站访问者知道你的Gallery2的版本。因为一旦攻击者知道你的Gallery2版本的话,他们就有可能钻空子。比如说,你在首页显示了完整的版本号,某个攻击者就会用GOOGLE查到一列易损的安装,其中包括有你使用的。
- 在你的WEB服务器配置中(Apache的httpd.conf/.htaccess),可以禁止所有对源代码文件和文件完整性checksum文件(MANIFEST)的访问。
<Files *.inc> Deny From All </Files> <Files *.class> Deny From All </Files> <Files MANIFEST> Deny From All </Files>
- 移除你的网站上的目录列表。加入:
<Directory YOUR WEBROOT PATH> Options -Indexes </Directory>
你可以打开modules/来测试是否暴露了。如果你可以列出所有已安装的模块,Apache就会列出目录。
- 将gallery2文件夹下的README.html删除
- 降低PHP错误报告级别,因为PHP Notices/Warnings等能够暴露确切的文件系统路径及其他信息。在php.ini(PHP配置文件)中,将error_reporting级别至少改为:
error_reporting = E_ALL &~ (E_WARNING | E_NOTICE)
或者
error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR
请注意抑制的错误越多,对真正问题的诊断就越难。一旦你遇上问题,你应当将error_reporting修改为E_ALL。
如何辨认出不安全的Webhost[ ]
一个共享的服务器,如果是在相同的通用帐户而不是特定帐户下运行所有的PHP脚本的话,其安全性就会被限制在一个很小的范围内。所有基于mod_php的webservers/webhosts都在此列。如果在你的info.php中没有看见php-cgi或php-fastcgi作为服务器API的话,那么你的webhost就在此列。
另外如果open_basedir过于公开或根本没有设置的话,我们建议还是不要在此服务器上使用Gallery2了。
现状分析: 大部分网络托管计划均在上述行列之中。而我们听说类似Gallery2一夜之间被删除的例子几乎没有,或者可能的话也就是一年一次。所以,这并没有之前所说的那么不幸。因此在一个webhost中与恶意用户为伴的可能性小之又小。
此部分的目的在于让你明白你的webhost并非想象的那样安全。至少你应该要求你的webhost改变现状(一个请求并不过分,而且这是大势所趋,谁都希望有安全的网络托管环境)。如果你想要一个真正安全的环境,很多专业网络托管公司至少会为每个帐户严格配置open_basedir路径。而很小一部分低端中端的则会提供基于php-cgi的网络托管。
如何配置一个安全的WEB服务器[ ]
这个话题需要大量篇幅才能说清楚。而此部分只浅酌基础:
- 如果你在使用一个专用服务器,你可以使用mod_php。请确保为WEB服务器的运行另开一个用户,并赋予最低限度的权限(前部分所述)。
- 如果你使用共享的网络托管,就不要使用mod_php。请使用php-fastcgi+suexec+apache2+chroot jails来为你的客户营造一个安全的环境。在这里,如果产生任何损害,则一个用户只会被自己的脚本损害,而不可能是其他人的脚本。与php-cgi不同,php-fastcgi的速度可以与mod_php媲美,而且对系统造成的负担不会比mod_php大。但是与mod_php相比,如果使用于共享的网络托管环境下,php-fastcgi的整个系统可能需要更多些的内存。
- 请勿定义一个crossdomain.xml。如果真的需要为跨站点flash访问提供服务的话,请务必严格限制crossdomain.xml。注意Macromedia/Adobe Flash的插件与version8有相关薄弱点。因此如果你需要crossdomain.xml,请在论坛中获取帮助来保护自己免受CSRF攻击。
Multisite/嵌入的G2[ ]
保证Multisite/嵌入的G2的安全在某些情况下稍微复杂些。可能遇到的问题:
- Multisite嵌入G2的PHP open_basedir没有包含Gallery2路径。
- 解决办法:对open_basedir做修改使其包含此路径或者修改Gallery2的位置/路径。
- PHP在你的帐户下运行,而你从一个帐户/域执行的安装(multisite -> codebase, embedded G2 -> Gallery 2)。现在你从Multisite或嵌入的其他域/账户访问Gallery2。
- 解决办法:
- Multisite:自代码库进行首次安装后,你就没必要再次通过代码库访问multisite了。尽管升级是通过multisite的,则只要运行chown -R multisite_accountName multisite_g2data (将name/g2data paths替换为正确值);也就是将g2data的所有者和multisite的config.php改变为multisite所有者。同样地,确保代码库足够公开以使得所有multisite用户可以阅读gallery2文件并读/执行gallery2文件夹。
- 嵌入的G2:你需要确保用户(G2独立域,嵌入的G2域)具有上部分提及的必要权限。
- 解决办法:
备注[ ]
- 相对其他应用程序/系统,请为Gallery2启用另一套密码。而相对于安装时输入的密码,请另为管理员用户帐户设置另一套密码
- 确保Gallery2的图片防火墙。如果g2data目录不放置在文档根目录之外(public_html,html, www,. folder)的话,图片权限就可以通过直接浏览g2data目录下的图片而被肆意动用
- 警告:如果你在site admin -> general中为本地上传路径列表添加了一个路径的话,那么你所有的具有“添加项目”权限的Gallery2用户就能通过add items -> from local server这条本地路径添加文件。
- 所有Gallery2站点管理员能在你的Gallery2安装中做任何操作,他们可以通过简单的点击删除所有相册和用户等。因此请确保你完全信任站点管理员组的用户。一般来说,我们建议不要向此组添加任何用户,并且我们还会建议你使用另外一个Gallery2用户帐户来做日常任务/浏览—这与linux/Windows的情况一样,管理员帐户一般不用来做日常工作。
常见问题[ ]
PHP safe_mode是什么?[ ]
不要在意它的名字,PHP safe_mode并非为PHP脚本营造的安全环境。在安全环境中有时严格到禁用了很有用的功能,而PHP扩展及其他脚本语言却仍能在safe_mode 保护/限制下运行。关于PHP safe_mode已经说过很多了,长话短说,甚至PHP的编写者都认为safe_mode 是一个错误而PHP safe_mode将在PHP6中被移除,甚至不会作为可选项存在。
什么是PHP open_basedir?[ ]
参见PHP open_basedir。 如果设置足够严格的话,如果在此服务器上除了其他计算机语言而仅能使用PHP的话,如果客户不被准许ssh/telnet访问的话,open_basedir对同一webhost上的Gallery2安装来说是个不错的保护措施。
同一webhost上的其他用户如何能够损害我的Gallery2安装?[ ]
- 如果没有足够的安全保障,恶意用户可以使用PHP读/写你的config.php/g2data目录
- 有些用户甚至并非蓄意如此的。某用户可能安装的带有安全易损性的PHP脚本都可能很要命了;而且这样的情况不仅仅对用户数据/网站造成损害,其影响还会波及到使用相同webhost的其他任何网站--除非web服务器的安全性有足够的保障。
- 其他编程语言也有可能作为攻击手段,而并非必须是PHP。任何该webhost可用的语言都可以成为安全性威胁。
- 如果用户具有telnet/ssh访问权限,则他们也能访问并操作你的数据/网站,除非你正确设置了权限或者web服务器的安全性有保障。
Gallery2如何安装在SELinux服务器上?[ ]
需要经过合理地配置SELinux才能与Gallery2兼容。参见Gallery2在启用SELinux的服务器上的安装获取更详尽的信息。我们不推荐使用SELinux但也不反对使用它。我们目的是解释如何在SELinux服务器上安装Gallery2,仅此而已。
Apache mod_security如何配置以兼容Gallery2?[ ]
mod_security默认情况下不与Gallery2兼容。如果要使用的话,就需要进行特别配置,参见已知问题.
能否合并使用symlinks和open_basedir?[ ]
目前,你无法再Gallery2中同时使用symlinks和open_basedir。请参见:如何为G2配置open_basedir.
安装完成后,是否需要删除install/和upgrade/ 文件夹?[ ]
没有必要将这些文件夹删除。但是即使删除,Gallery2仍能正常运行。某人仅需在gallery2文件夹中创建一个login.txt文件就可以访问安装程序了。一般情况下,这个“某人”也就是一个人而已。你无法在web浏览器中创建/编辑login.txt。你只能通过安装密码(存储于config.php中)访问升级程序。
数据库权限方面如何设置?[ ]
确保只有你的数据库用户才具有访问数据库的权限。数据库用户需要相当多的权限,包括修改表格,放下表格,索引一类的也一样。因此,对此类用户权限的限制不应过于严格。
web-accessible什么意思/文档根目录是什么?[ ]
我们说一个文件或文档直接是网络可访的(web-accessible),意思就是其他人可以使用web浏览器或其他网页软件来访问你的文件和文档。举例:Gallery中gallery2/main.php文件就是web-accessible的,任何人都可以浏览它。
再举一个例子:Gallery存储文件夹(比如 'g2data/')可能含有安全性方面较敏感的数据。如果人们随便就可以浏览存储文件夹中的内容的话,安全性就根本没有保障了。因此,为了最大限度的安全保障,你就要确保存储文件夹无法通过web访问。
为了达到此目的,你可以将存储文件夹置于web的文档根目录的上一级。web根目录就是存放所有网站文件和文件夹的文件系统文件夹。一般此根目录的名称为'htdocs','www'或'public_html'。其中的所有文件和文件夹都是web-accessible的。
举例:'/home/yourusername/public_html/'作为你的文档根目录。 '/home/yourusername/public_html/gallery/g2data/'在此根目录之下,那么它就是web-accessible的。 '/home/yourusername/g2data'位于文档根目录的上一级因此不是web-accessible的。刚才所述的存储文件夹摆放位置就是如此。