i春秋作家:Arizona
原文来自:隔壁小孩都要知道的Drupal配置
Drupal是一个开源的PHP内容管理系统,具有相当复杂的架构。它还具有强大的安全模型。感谢开发人员在社区的贡献和维护,所以有很多详细的文档和有关加强Drupal网站安全配置的方法。
切记,Drupal是运行网站所需的一部分。为了保护整个系统免受黑客攻击,我们需 要处理整套系统。它包括一些常见的服务器设置,Web服务器的配置,PHP和数据库。此外,服务器上的任何其他服务都需要正确配置。
本文重点讨论上述关键点。它提供了一些提示和关键点,可以帮助服务器和网站管理员审核整个系统的安全性。我们应该明白,打造一个绝对安全的系统是不可能的,但如果你坚持一些原则,它将有助于你的系统安全。
让我们从常见的安全守则开始。它们中的大多数不仅适用于Drupal开发并且支持Drupal网站运行基础设施的相关安全性,而且还适用于许多其他情况:
使用由一个拥有大量用户群体的社区开发的解决方案。它可以很好地维护开源库,流行的Linux发行版等等。始终检查下载代码的完整性。
遵循最小原则,尽量不使用任何其他服务。如果你真的需要它,请安装新软件,卸载所有不需要的服务。
避免编写自定义代码。在开始之前,请仔细考虑是否可以避免这种情况。与Drupal开发相关的真实情况是在编写自定义模块之前在drupal.org上搜索现成的解决方案。
默认拒绝访问。只有在必要时,才应授予相关的访问权限。
添加具有所需权限的角色。每个角色都必须有详细记录。这样,应该很容易支持和扩展整个权限框架。
不要使用root权限。在基于Linux的操作系统上,仅在需要时使用root访问权限,并通过sudo执行此操作。换句话说,你不应该以root用户身份登录和运行。
定期对系统进行安全检查和维护。你应仔细分析所有可疑情况并对其作出分析。
备份!你必须始终能够将系统还原为以前的任何状态。此外,你需要确保系统进行有效可以用的备份。
这些原则可以应用于任何系统和服务,无论它使用何种软件和硬件。我们进一步讨论更具体的关键点。
除了运行网站的Drupal之外,还需要配置PHP,Web服务器和数据库。你可能还需要安装一些服务插件来扩展搜索功能,使用缓存等。
如你所见,有很多事情需要正确配置和定期维护。基于上述的情况,我们可以在一定程度上区分以下需要确保安全性的服务:
服务器(常用的配置)
Web服务器
PHP
数据库
互联网上可用的任何服务的安全性始于服务器的基本配置。对于基于Linux的服务器,它可以使用以下的配置方法:
改变远程登陆的配置
使用iptables设置防火墙
通过更改登录到服务器的配置,。主要目标是使这个过程与一般默认的过程有所区别。
例如,任何Linux的系统都有一个名为root的超级用户。攻击者可以通过ssh等爆破root的默认密码。但是,如果服务器管理员关闭root登录,则此类尝试将失败。我们可以创建一个新用户,而不是root用户,然后授予他必要的权限。
大多数这个的更改都与ssh设置有关。它们通常位于/etc/ssh/ sshd_config文件中。相关配置:
Port 2345
Protocol 2
PermitRootLogin no
PasswordAuthentication no
UseDNS no
AllowUsers user
它允许使用有效的用户名通过ssh连接到服务器使用2345端口(非默认,默认22)。它还会禁用root登录和密码身份验证。
禁用密码验证是提高整个系统安全性的重要步骤。无密码身份验证更安全。要登录服务器,你需要在本地计算机上生成ssh密钥,然后将公钥复制到服务器。安全性更高。
iptables是Linux系统的默认防火墙。它可用于管理与指定端口的连接。如果我们想将网站保留在服务器上,除了ssh端口之外,还需要打开http和/或https端口。
默认情况下,操作系统上没有建立规则。敲sudo iptables -L
命令(Ubuntu)将返回以下内容:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
这意味着服务器接受来自任何端口上任何人的任何内容(策略默认ACCEPT)。我们可以只打开必要的端口并关闭其他没必要的端口。
sudo iptables -A INPUT -p tcp --dport 2345 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
这些命令是 接受2345,80和443端口的连接。尽管如此,我们仍然没有其他端口的其他限制。因此,你需要在最后添加一条规则,拒绝所有不需要的数据包。
sudo iptables -A INPUT -j DROP
就这样。应该记住,上面的配置可能会你使用不同的系统而有很大差异。这里的主要目标只是对基本原则的解释。更改网络配置时要小心!!!有时,你一不小心 它就拒绝任何连接。比如你不小心drop了你的ssh端口,2333。
设置Web服务器的一些一般原则。使用这些规则对于你的网站运行非常重要。通过服务器的漏洞,攻击者可以任意执行文件,上传恶意脚本并以某种骚操作运行这些脚本。
主要的原则就是 网站文件应该由非root用户运行,并且不应该由Web服务器写入(敲黑板,划重点!)。在一些情况下,Drupal目录可供Web服务器用户写入,有关保护文件权限和所有权的详细信息,请看本文末尾的“相关链接”。
有时,限制在Web服务器对网站的一些功能的访问可能是有用的。例如,在你拥有演示网站或没有注册功能的网站的情况下。你可以限制/user和/admin/ *。对于Apache Web服务器,可以使用mod_authz_host和mod_rewrite模块完成。切记,http身份验证不是一种安全的方法。因此,所描述的方法在特定情况下更适用。
服务器上的所有其他服务都存在潜在的安全风险。因此,你应该遵循最小化原则。如果你不需要什么,只需将其删除即可。
这同样适用于Web服务器。Apache和Nginx Web服务器有许多额外的插件,仔细检查已启用的扩展名列表,并删除所有未使用的扩展名。
使用HTTPS协议可以使网站和私人用户数据的访问更加安全。如今,当一些在线商店不对他们的支付交易使用加密,这是绝对不对的。而且,Google已经将HTTPS设置为排名指标。这意味着不使用HTTPS协议但还是能运行的网站,一些重要信息(信用卡,支付交易等)会对搜索排名产生负面影响。
理想情况是,如果你为与用户进行交互的所有网站加密。例如说登录和注册。用户输入密码。即使这些密码在所有浏览器中看起来都不可见(如**),它们也会以未加密的形式通过网络传递。因此,攻击者可以通过中间人方式等轻松拦截输入的数据。用户通常都是使用常用密码。这意味着也可能会影响你在对别的网站的账号。
应该清楚在什么情况下可以使用HTTP身份验证。大多数情况下,你需要它来保护对网站的缓存并禁用爬虫对该网站的索引。但是,HTTP身份验证本质上是不安全的。它不使用任何加密算法。因此,浏览器和网站之间的流量不会被加密,攻击者只需复制可以用的HTTP头并将数据包其发送到Web服务器即可访问网站。
此外,强烈建议将htpasswd文件保留在文档根目录之外。设置此文件的只读权限(440)。
PHP与服务器的其他服务一样可能包含漏洞。这在很大程度上取决于PHP本身的设置以及当前使用的PHP版本。当然,你始终需要检查所有可用的更新并保持PHP更新。但是,在某些情况下,这可能非常困难甚至是不可能的。
一般来说,优化服务器上PHP安全性的所有工作可以分为三个部分:
优化PHP设置
这是比较容易理解的事情,但正如我所提到的,在某些情况下,更新可能非常困难甚至是不可能的。当你的应用程序中有很多祖传代码(它在新的PHP版本中不起作用)并且当前的业务不允许你花时间更新这段代码时就会主要,因为它是很耗费时间的操作。在这种情况下,你可以尝试使用下面的一些建议。
编写安全代码是服务器安全的重要一步。你应该花一些时间定期查看你所有自定义代码。此外,没有人可以保证第三方库不包含任何漏洞。正如我所提到的,即使PHP本身也存在安全性问题(使用不安全的函数,缓冲区溢出等)。
为了解决这些问题,有一个很好的玩意叫做Suhosin,它可以帮助你摆脱许多安全问题。Suhosin旨在保护服务器和用户免受PHP和PHP核心中已知和未知的缺陷的影响。它由两部分组成。第一部分是PHP核心的补丁,它提供了一些针对缓冲区溢出或格式化字符串漏洞的低级保护。第二部分是PHP扩展,它实现了一些额外的保护。
Suhosin是一个非常强大的工具,可以保护你的服务器免受许多漏洞的侵害。蛋疼的是,它不适用于PHP7.事实上,Suhosin7 正在开发,但还没有完成。作者不建议在生产服务器上使用Suhosin7。
为优化PHP安全配置,我们可以采取的两个最简单的步骤是禁用未使用的模块,并最大限度地减少用户可以获得的有关当前PHP安装的信息。
要查看所有已编译的PHP模块,请运行以下命令:
$ php -m
建议仅使用必要的模块来提高安全性。仔细检查整个列表哪些是你不需要的模块。删掉吧。
保护PHP免受黑客攻击还要隐藏有关系统的信息。看看php.ini文件中的这个配置:
expose_php = Off
确保此参数配置。否则,PHP将发送版本号到X-Powered-By
http头中的。
同样适用于网站上的PHP报错。他们可以提供有关你的服务器的一些额外信息(Web服务器版本,目录结构等)。因此,强烈建议在生产服务器上禁用此功能。
display_errors = Off
log_errors = On
error_log = /var/log/httpd/php_scripts_error.log
上面的设置允许你关闭显示网站发生的报错。此外,它们还会将错误记录到指定的日志中。
这些是初步步骤,可以帮助你提高在服务器上使用PHP的安全性,即使没有对系统进行任何重大修改。现在让我们谈谈你可以添加到PHP配置(php.ini文件)的一些特定配置:
file_uploads = Off #禁用文件上传
但是如果需要文件上传的功能,最好限制文件大小。
file_uploads = on
upload_max_filesize = 1M
2.控制系统资源
max_execution_time = 30
max_input_time = 30
memory_limit = 50M
你可以指定每个脚本的最长执行时间,最大内存量和最大数据读取时间。
3.关闭允许脚本包含其他URL的PHP函数
allow_url_include = Off
allow_url_fopen = Off
如果启用了allow_url_fopen,PHP可以使用文件函数,例如file_get_contents。有了它,PHP可以从远程服务器下载文件。
4.禁用危险功能
disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
在禁用之前,请确保你的网站不需要其中任何一个函数。
5.限制对文件的访问权限
open_basedir =“/var/www” #允许访问的目录
该open_basedir的配置允许你设置在PHP可以使用函数访问文件的目录如fopen,file_get_contents等。如果该文件是在这个目录之外,PHP将拒绝打开它。
6.临时路径
session.save_path =“/tmp”
确保临时路径位于网站根目录之外。此外,它不能被其他系统用户读取或写入。
采取什么措施来确保数据库安全性主要取决于应用程序的基础结构。例如,Drupal的数据库抽象层使你能够在不同的数据库之间进行选择。它可以是MySQL,SQLite或PostgreSQL。此外,Drupal支持流行的MySQL分支,例如MariaDB和Percona。你应该了解每个系统可能有不同的安全规范。
还取决于你安置数据库的位置。最简单的(在安全性方面)是在拥有网站的同一台服务器上安装数据库。但是,这种方法可能会影响整个系统的性能,因此服务器管理员可能决定在另外的服务器上安装数据库(站库分离)。对于高负载应用尤其如此。
完成服务器环境配置后,你应该做的第一件事是检查你的架构是否足够强大,并且不容易被DoS攻击破坏。事实上,即使在其工作负载的高峰期,服务器也应该有一些资源储备。
正如我之前提到的,数据库安全性设置的具体情况具体取决于所选的数据库 在本文中,我们来看一些一般性措施:
数据库访问
如果数据库是在本地安装的,则可以禁用从网络访问它。如果你的数据库位于单独的服务器上,则应该可以设置它将侦听的IP地址。如果在Web服务器和数据库服务器之间共享LAN,则仅设置LAN IP地址(无法通过Internet访问)。可以通过编辑my.conf文件来完成。下面是为数据库和网站使用相同服务器时的配置示例。bind-address=127.0.0.1
查看数据库,用户和权限,以查找任何安全的缺陷。不要为用户提供超出实际需要的权限
Drupal有一个非常复杂的架构。为了确保这个复杂系统的安全性,最好将所有相关工作分成小部分。在此操作期间,你将遇到仅需要执行一次的配置(设置文件权限,配置settings.php文件等)。将会有一些需要定期关注的任务(更新Drupal和模块)。也许其他人会要求你与Drupal社区密切合作。
以下是你应该记住的两个关键时刻:
确保Drupal安全并不是一件容易的事情,但它对任何网站都非常重要。所以,你一定要努力做到这一点。安全需要你用心的关注。
确保Web服务器对Drupal文件没有写入权限。只有缓存文件,上传,session和临时目录才需要写入权限。以下命令授予对公共文件目录(Ubuntu或者 Debian)的写权限:
$ chown -R www-data:www-data sites / default / files
如果你的网站允许上传文件,请注意如何确保使用这些文件的过程。仅允许上传某些文件类型。相对安全的是文本文件和图片。但是,这并没有改变用户可以上传恶意代码的事情,例如具有.jpg或.txt扩展名的文件。要避免此问题,你可以尝试安装ClamAV模块,该模块可以扫描上传的文件以查找病毒和其他恶意代码。
初始安装后,请确保settings.php文件没有写入权限。有关此信息可在相关公告(admin/reports/status in Drupal 8)中找到。
在settings.php中,你可以设置一个重要选项,以防止特殊的攻击(https://www.drupal.org/node/1992030)。这种类型的攻击称为HTTP POST Header攻击。为了保护Drupal 7网站免受他们的影响,请在你的设置中添加基本URL参数:
$ base_url ='http://www.example.com';
Drupal 8中类似的配置是:
$settings['hash_salt'] = file_get_contents('/home/example/salt.txt');
Drupal提供了一种监控网站状态的机制。这里我的意思是最近的日志消息和报告。尝试定期检查这些日志并修复发现的问题。报告非常有用,尤其是在安装网站后。例如,如果你忘记添加可信主机设置或者对settings.php文件具有写访问权限,它可以通知你。
只需查看“最近的日志消息”页面,即可跟踪某些类型的可疑活动。举一个例子,想象一下当你注意到新用户注册激增时的情况。
不要忘记禁用PHP错误的回显。普通用户不应该看到它们。虽然你可能会在“最近的日志消息”页面上看到这些错误,但请记住它不会捕获所有PHP错误。因此,有时请检查你的服务器日志文件。
Drupal核心和贡献模块的变化
这部分是关于Drupal核心和贡献模块的黑客攻击。实际上,一个众所周知的事实是,新开发人员可能会偷工减料并将他们的代码或一些更改直接放入Drupal核心或已安装的贡献模块中。这可能会导致Drupal本身的不可预测行为,以及漏洞的出现,或者恶意存放后门。
为了摆脱这些问题,我建议使用Hacked!模块。该模块扫描当前安装的Drupal,贡献的模块和主题,并将所有内容与drupal.org中的相应版本进行比较。如果你安装了Diff模块,请使用Hacked!会告诉你有什么放生了改变。这让hacked!模块是任何网站宝贵的分析工具。
Drupal具有直观且可自定义的权限模型。权限是此类系统中最简单的元素。一组权限可以按角色类型分组。然后可以将此角色类型分配给特定用户。在更新Drupal核心和贡献模块期间可能会出现新的权限和角色类型。你应定期检查(例如更新后)为你的网站上的每个用户分配的角色类型以及这些角色类型中包含的权限。尝试最小化每个角色中包含的权限。不要为用户提供超出实际需要的权限。
一个好的配置是使用非默认用户名(例如不是admin或root),因为黑客将首先尝试默认的用户名。为了更高的安全性,甚至可以完全禁用管理员帐户。
另一件好事是检查你网站上的用户活动并锁定非活跃帐户。用户过期模块提供了定义特定用户帐户将被锁定的功能。此外,它可以锁定在一段时间内处于非活跃状态的帐户。
根据你的需要,你可以在drupal.org上找到许多有用的安全模块。以下是其中一些:
在本文中,我们回顾了一些保护你网站的方法。还涵盖了必要基础架构的所有部分 - 从通用服务器设置到某些Drupal模块的特定用例。
许多人忽略了监视其站点和服务器基础结构的安全性,直到出现明显问题。虽然即使遵守一些简单的规则也有助于避免它们的出现。请始终耐心始终关注系统的安全性。祝你好运!
作者:ADCI Solutions团队负责人Evgeny Leonov
翻译:i春秋翻译小组-K0nJac
责任编辑:F0rmat
翻译来源:https://medium.com/@ADCISolutions/security-for-drupal-and-related-server-software-f7008211f80b