简单安全指南,第2部分
这是我的安全网站的第二部分,是从希伯来语指南翻译过来的。第一部分更基础,面向初学者。这部分更高级,包含详细说明。
服务器
世界上大多数Web服务器都运行在Linux操作系统上。原因是这个系统对IT经理来说是安全的,并且易于维护。我所遇到的大多数漏洞并不是因为Linux,漏洞来源在服务器平台之上。如果你的托管提供商负责维护所有服务器层 - Apache、MySQL和PHP(见演示图像),并在必要时更新它们,那么大部分安全风险将发生在应用程序层,在这种情况下是Joomla,因此这是你需要最小心的地方。
文件权限
如果你从开发环境过渡到生产环境,你应该首先关注文件权限。在直接安装Joomla的情况下,你不需要这样做。在Linux中,每个文件和目录都有三个标志 - 读取(r)、写入(w)和执行(x)。此外,有三个相关组 - 用户(u)、组(g)和其他(s)。每个组包含3个标志。每个文件都有权限,可以转换为数字,但我不打算详细说明这些标志、组和数字。我相信你可以通过谷歌搜索到完整的文档。在这些标志中,重要的是其他组的“写入”标志,它允许用户向文件系统添加文件。向文件系统添加文件的例子是将图像和其他文件添加到内容中。Joomla有几个目录需要为这些文件设置写入权限,包括缓存目录(用于缓存页面)和tmp目录(用于扩展安装期间分配的临时文件,例如)。因此,我们应该允许这些目录可写,但仅限这些目录。所有其他目录和文件都不应该是可写的。
文件的权限应设置为644(意味着只有“用户”组有写入权限,没有“组”或“其他”)
find /home/xxx/domains/xxxxxxx.com/public -type f -exec chmod 644 {} \;
目录 需要权限 755(意味着只有“用户”组有写和执行权限,没有“组”或“其他人”)
find /home/xxx/domains/xxxxxxx.com/public -type d -exec chmod 755 {} \;
一些额外的说明
- 如果你对数字和它们如何从标志和组转换为数字感兴趣,请阅读此指南(它在此指南范围之外)。
- 该命令可以通过 ftp、ssh 或 cpanel 接口执行。
- 请注意,/home/xxx/domains/xxxxxxx.com/public 目录将被替换为你在服务器上 Joomla 安装的路径。
使目录可写
如我之前提到的,有时我们需要某些目录可写。我推荐的要可写的目录是:缓存、tmp 和图像。你可以使用以下命令来做这件事
cd /home/xxxxxx/domains/xxxxxxx.com/public_html && chmod -R o+w images cache tmp
现在,如果有人黑了你的 Joomla 网站,上传了一个脚本文件(PHP 是一种脚本语言)呢?一个人可以安装一个可以在服务器上做任何事情(包括破坏我们美丽的网站)的脚本。当然,Joomla 默认阻止上传脚本,但如果某些扩展没有阻止它怎么办呢?
答案分为两个选项。首先,如果你不需要上传内容图像,不要使用缓存或安装任何扩展 - 不要使任何目录可写!
如果你需要我提到的一些功能,或者任何需要使目录可写的其他功能,你必须禁用这些目录运行脚本的权限。为此,你需要使用以下简单的技巧 - 为每个目录添加一个 .htaccess(以点开头!)文件,并且它应该包含以下这些行
# 通过禁用脚本执行来保护目录
Options -ExecCGI
AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi
htaccess 指令先于任何 Joomla 活动执行,因为该文件来自 Apache,在 PHP 之前调用 htaccess。
MySQL 数据库
建议不要使用 MySQL 表的默认前缀 jos_。2.5 版本会随机化前缀。如果你已经用这个前缀安装了 Joomla,只需使用脚本或指南将表前缀转换为另一个,并且别忘了在之后立即更新你的配置。
此外,建议运行 MySQL 服务的用户仅使用以下特定权限(SELECT、UPDATE、DELETE、INSERT、CREATE)。在任何情况下 - 不要使用 MySQL 的 root 用户。这非常危险!
高级:PHP
以下选项是为具有对名为 php.ini 的 PHP 配置文件访问权限的先进用户。如果你不熟悉这个,就让它交给你的主机提供商。
阻止风险函数
PHP 是基于网络的程序最常用的编程语言。它很容易用 PHP 开发,这是它的一个重大优势,但它有风险。有几个函数可以在不需要的地方提供访问。你可以轻松地使用 disable_functions 参数阻止危险函数
disable_functions = show_source, system, shell_exec, passthru, exec, phpinfo, popen, proc_open, eval
这些函数允许用户在服务器上运行函数,例如发送数据、从服务器运行命令、接收有关服务器的信息等,但小心。它们在开发环境中很有用,但在生产环境中根本不推荐。
PHP 访问指令
PHP可以访问Web服务器上的任何位置,除非进行了其他配置。这是危险的,因为如果黑客获得对服务器的访问权限,他可以访问任何地方。为了降低这种风险,让我们在PHP中定义他可以访问的内容。
open_basedir =/home/xxxxxx/domains/xxxxxxx.com/:/tmp
tmp目录应该是可访问的(这不是Joomla的tmp目录),因为PHP上传首先将文件移动到这个目录,然后再移动到Joomla。
高级:htaccess
如前所述,htaccess文件可以在数据进入Joomla应用程序之前过滤数据,从而节省服务器使用。这很好,但你可能会问,如果这是配置一次就忘记的,为什么这个部分是针对高级用户。答案是,htaccess可以过滤必要请求所需的信息,有时经验有限的初学者开始玩弄文件,结果导致问题。在最坏的情况下,他们可能会删除Joomla重写指令,然后htaccess文件将损坏,Joomla的基本操作将停止工作(如SEF链接)。
我的建议是为每个新指令在htaccess文件中添加一个特定部分,并跟踪你添加的指令。将原始文件保存为htaccess.txt文件,以防你失去控制,导致问题,你可以恢复到一个正常版本。
你可以在Joomla维基中的htaccess文件中找到详细和长篇的例子,并使用那里的特定部分。
阻止直接访问Joomla核心
所有Joomla应用程序请求都通过一个地方 - index.php(在版本1.5中也有index2.php)。任何其他直接访问都可以被视为黑客攻击。大多数扩展(其中大部分)不会直接访问任何文件,而是通过Joomla平台访问,该平台通过这个门。因此,你可以通过在htaccess文件中添加以下部分来阻止对大多数文件(ini、xml & php)的直接访问:
#### @RS
# 在组件和插件目录中拒绝访问php、xml和ini文件
#
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} \.php|\.ini|\.xml [NC]
RewriteCond %{REQUEST_URI} \/components\/ [OR]
RewriteCond %{REQUEST_URI} ^\/includes\/|^\/administrator\/includes\/ [OR]
RewriteCond %{REQUEST_URI} \/language\/ [OR]
RewriteCond %{REQUEST_URI} \/libraries\/ [OR]
RewriteCond %{REQUEST_URI} \/modules\/ [OR]
RewriteCond %{REQUEST_URI} \/plugins\/ [OR]
RewriteCond %{REQUEST_URI} \/templates\/ [OR]
RewriteCond %{REQUEST_URI} \/xmlrpc\/
RewriteRule ^(.*)$ index.php [R=404,L]
#### @RS
The @RS marks the beginning and end of the section.
阻止MySQL注入攻击
SQL注入在Joomla中不起作用,因为大多数开发者使用Joomla核心SQL函数。但,同样,也有一些懒惰的扩展开发者没有这样做。因此,你可以通过以下部分来阻止这些尝试。
#### @RS
# 阻止最常见的SQL注入
RewriteCond %{query_string} concat.*\( [NC,OR]
RewriteCond %{query_string} union.*select.*\( [NC,OR]
RewriteCond %{query_string} union.*all.*select [NC]
RewriteRule ^(.*)$ index.php [F,L]
#### @RS
阻止劫持工具
访问你网站的任何人都是用户代理。对于普通访客,这包括浏览器识别(Firefox、Explorer、Chrome)。对于搜索引擎爬虫,有一个特殊的标识,对于劫持工具,有独特的标识。因此,我们也可以阻止它们。
#### @RS
# 阻止最常见的黑客工具
SetEnvIf user-agent "Indy Library" stayout=1
SetEnvIf user-agent "libwww-perl" stayout=1
SetEnvIf user-agent "Wget" stayout=1
deny from env=stayout
#### @RS
高级:更改configuration.php位置
自1.6版本以来,您可以更改主要配置文件:configuration.php的位置。进行此更改有几个原因。首先,许多黑客知道您正在运行Joomla,并试图破解这个众所周知文件。此外,该文件位于同一位置(它是静态的),并且可以通过公共文件夹从网络访问。由于人们为了让该文件可写以便在管理面板中更新全局配置,因此风险增加。
应该提出的问题是,我们如何更改文件的位置,最好是移出公共文件夹,同时仍然让Joomla继续正常工作?
您可以覆盖配置文件的默认位置,但不仅仅是配置路径,您还可以更改多个路径。在本指南中,我们将仅更改配置(首先备份!)
- 将public_html/includes/defines.php文件复制到public_html,将public_html/administrator/includes/defines.php文件复制到public_html/administrator/defines.php。
- 编辑public_html和public_html/administrator中的每个新defines.php,并添加以下两行
define('_JDEFINES', 1);
define('JPATH_BASE', dirname(__FILE__));
在
defined('_JEXEC') or die; - 下一步是更新新文件中配置的默认位置。例如,让我们将配置放在public_html范围之外(在其上方一个级别)。为此,让我们将以下行从
define('JPATH_CONFIGURATION', JPATH_ROOT);
改为
define('JPATH_CONFIGURATION', JPATH_ROOT .DS.'..'); - 同样,您需要在两个新的defines.php文件中都进行此更改。
- 别忘了将configuration.php文件移动到新位置!
总结和甜点
我希望您从本第二次指南中学到了更多关于安全的知识,本指南旨在更加高级。
请记住,安全是一个持续的过程,人们应该始终注意将其保持得像自己的家或企业一样安全。
在Joomla社区杂志上发表的一些文章代表了作者对特定主题的个人观点或经验,可能并不代表Joomla项目的官方立场。
通过接受,您将访问https://magazine.joomla.net.cn/之外的第三方外部服务
评论