9分钟阅读时间 (1784 字)

简易安全指南,第二部分

Simple Security Guide, Part 2

这是我的安全网站的第二部分,是从希伯来语指南翻译过来的。第一部分更基础,针对初学者。这部分更高级,包含详细说明和解释。

 

 

服务器

LAMP世界上大多数网站服务器都在 Linux 操作系统上运行。原因是这个系统对 IT 管理员来说是安全的,并且易于维护。我遇到的绝大多数漏洞都不是因为 Linux,漏洞源位于服务器平台之上的层中。如果你的托管提供商注意维护所有服务器层——Apache、MySQL 和 PHP(见演示图像),并在必要时更新它们,那么大多数安全风险将发生在应用层,在这种情况下是 Joomla,所以这就是你需要注意的地方。

文件权限

如果您从开发环境迁移到生产环境,首先应该关注的是文件权限。在直接安装Joomla的情况下,您不需要这样做。在Linux中,每个文件和目录都有三个标志——读取(r)、写入(w)和执行(x)。此外,还有三个相关组——用户(u)、组(g)和其他(s)。每个组包含这3个标志。每个文件都有权限,可以转换为数字,但我不会详细介绍这些标志、组和数字。我相信您可以在Google上找到完整的文档。在这些标志中,重要的是其他组的“写入”标志,这允许用户向文件系统添加文件。向文件系统添加文件的例子是将图片和其他文件添加到内容中。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和images。您可以使用以下命令完成此操作

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)。在任何情况下——不要使用root用户MySQL。这非常危险!

高级:PHP

以下选项是为具有访问PHP配置文件(称为php.ini)的高级用户提供的。如果您不熟悉此文件,请交给您的托管提供商。

阻止风险函数

PHP是网络应用程序最常用的编程语言之一。使用PHP进行开发很容易,这也是其优势之一,但同时也存在风险。有一些函数可能在不需要的地方提供访问权限。您可以使用disable_functions参数轻松阻止危险函数。

disable_functions = show_source, system, shell_exec, passthru, exec, phpinfo, popen, proc_open, eval

这些函数允许用户在服务器上运行函数,例如发送数据、从服务器运行命令、接收有关服务器的信息等。但请注意,它们在开发环境中很有用,但在生产环境中根本不推荐使用。

PHP访问指令

除非进行其他配置,否则PHP可以访问网络服务器的任何地方。这是危险的,因为如果黑客获得对服务器的访问权限,他们可以访问任何地方。为了降低这种风险,让我们在PHP中定义他们可以访问的内容。

open_basedir =/home/xxxxxx/domains/xxxxxxx.com/:/tmp

tmp目录应该是可访问的(这不是Joomla的tmp目录),因为PHP上传首先发送到这个目录,然后再发送到Joomla。

高级:.htaccess

如前所述,.htaccess文件可以在数据进入Joomla应用程序之前过滤数据,从而节省服务器使用。这很好,但您可能会问,如果它是配置一次就不再需要管理的,为什么这个部分是为高级用户准备的。答案是,.htaccess可以过滤必需请求所需的信息,有时经验不足的初学者开始玩弄这个文件,结果会破坏一些东西。在最坏的情况下,他们可能会删除Joomla重写指令,然后.htaccess文件将会损坏,Joomla的基本操作(如SEO链接)将无法正常工作。

我的建议是为每个新指令添加到.htaccess文件中的特定部分,并跟踪您添加的指令。将原始文件保存为htaccess.txt文件,以便在您失去跟踪且某些东西损坏的情况下可以回滚到工作版本。

您可以在Joomla维基百科中找到详细且长的.htaccess文件,并使用那里的特定部分。

阻止直接访问Joomla核心

所有Joomla应用程序请求都通过一个地方 - index.php(在1.5版本中还有index2.php)。任何其他直接访问都可以被认为是黑客攻击。没有扩展(大多数扩展)使用除index.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

④@RS标记了部分的开始和结束。

阻止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 

高级:更改配置.php 位置

自1.6版本以来,您可以更改主配置文件 configuration.php 的位置。这样做有几个原因。首先,许多黑客知道您正在运行 Joomla,并试图攻击这个众所周知文件。此外,该文件位于同一位置(它是静态的),并且可以通过公共文件夹从网络上访问。由于人们为了能够在管理面板中更新全局配置而将该文件设置为可写,因此风险增加。

应该提出的问题是,我们如何更改文件的位置,最好移出公共文件夹,同时让 Joomla 仍然可以正确工作?

您可以覆盖配置文件的默认位置,但不仅限于配置路径,您还可以更改多个路径。在本指南中,我们将仅更改配置(先备份!)

  1. 将文件 public_html/includes/defines.php 复制到 public_html,将 public_html/administrator/includes/defines.php 复制到 public_html/administrator/defines.php。
  2. 编辑 public_html 和 public_html/administrator 中的每个新 defines.php,并添加以下两行
    define('_JDEFINES', 1);
    define('JPATH_BASE', dirname(__FILE__));

    defined('_JEXEC') or die;
  3. 下一步将是更新新文件中的配置默认位置。例如,让我们将配置放置在 public_html 范围之外(在其之上一个级别)。为此,我们将下面的行从
    define('JPATH_CONFIGURATION',   JPATH_ROOT);
    改为
    define('JPATH_CONFIGURATION',   JPATH_ROOT .DS.'..');
  4. 同样,您需要在两个新的 defines.php 文件中都进行此更改。
  5. 别忘了将 configuration.php 文件移动到新位置!

总结和甜点

我希望您从本第二个指南中学到了更多关于安全性的知识,本指南旨在更高级。

请记住,安全性是一个持续的过程,人们应该始终小心,以确保其像对待自己的家或企业一样安全。

 

《Joomla 社区杂志》上发布的一些文章代表了作者在特定主题上的个人观点或经验,可能不代表 Joomla 项目官方立场。

0
Joomla! 网站:冠军的首页
 

评论

已经注册? 登录这里
尚未发表评论。成为第一个发表评论的人

通过接受,您将访问 https://magazine.joomla.net.cn/ 外部第三方提供的服务