ホームページ >運用・保守 >安全性 >Drupal 構成を分析する方法

Drupal 構成を分析する方法

WBOY
WBOY転載
2023-05-15 21:22:11966ブラウズ

Drupal の構成

Drupal は、かなり複雑なアーキテクチャを持つオープン ソースの PHP コンテンツ管理システムです。強力なセキュリティモデルも備えています。コミュニティの開発者の貢献とメンテナンスのおかげで、Drupal Web サイトのセキュリティ構成を強化するための詳細なドキュメントと方法がたくさんあります。

Web サイトを実行するには Drupal が必要であることに注意してください。システム全体をハッカーから守るには、システム全体に対処する必要があります。これには、いくつかの一般的なサーバー設定、Web サーバー、PHP、データベースの構成が含まれます。さらに、サーバー上の他のサービスも正しく構成する必要があります。

サーバーおよび Web サイト管理者がシステム全体のセキュリティを監査するのに役立つヒントと重要なポイントを提供します。完全に安全なシステムを作成することは不可能であることを理解する必要がありますが、いくつかの原則に従えば、システムを安全にするのに役立ちます。

安全原則

一般的な安全規則から始めましょう。それらのほとんどは、Drupal 開発や Drupal Web サイト実行インフラストラクチャのセキュリティ関連インフラストラクチャのサポートだけでなく、他の多くの状況にも適用できます: コミュニティが開発したソリューション。オープンソース ライブラリ、一般的な Linux ディストリビューションなどを適切に管理しています。ダウンロードしたコードの整合性を常に確認してください。

  • 最低限の原則に従い、他のサービスは使用しないようにしてください。本当に必要な場合は、新しいソフトウェアをインストールし、不要なサービスをアンインストールしてください。

  • カスタム コードの作成は避けてください。始める前に、この状況を回避できるかどうかを慎重に検討してください。 Drupal 開発に関連する現実は、カスタム モジュールを作成する前に、drupal.org で既製のソリューションを検索することです。

  • アクセスはデフォルトで拒否されます。関連するアクセス権は、必要な場合にのみ付与する必要があります。

  • 必要な権限を持つロールを追加します。すべての役割を詳細に文書化する必要があります。こうすることで、アクセス許可フレームワーク全体のサポートと拡張が簡単になります。

  • root 権限は使用しないでください。 Linux ベースのオペレーティング システムでは、必要な場合にのみ root アクセスを使用し、これを sudo 経由で実行します。つまり、root としてログインして実行する必要はありません。

  • システムのセキュリティ検査とメンテナンスを定期的に実施してください。すべての疑わしい状況を注意深く分析する必要があります。 ############バックアップ!システムを常に以前の状態に復元できる必要があります。さらに、システムに有効で使用可能なバックアップがあることを確認する必要があります。

  • 適切なセキュリティ保守が実行されるまで、サーバーをパブリック ネットワークに公開しないでください。

  • これらの原則は、使用するソフトウェアやハードウェアに関係なく、あらゆるシステムやサービスに適用できます。さらに具体的な重要なポイントについて説明します。

  • 重要なセキュリティ保守オブジェクト:
  • Web サイトを実行する Drupal に加えて、PHP、Web サーバー、データベースも構成する必要があります。検索機能を拡張したり、キャッシュを使用したりするために、いくつかのサービス プラグインをインストールする必要がある場合もあります。

  • ご覧のとおり、正しく構成し、定期的にメンテナンスする必要があるものがたくさんあります。上記の状況に基づいて、セキュリティを確保する必要がある以下のサービスをある程度区別できます。

サーバー (共通構成)

Web サーバー

  • PHP

  • データベース

  • Drupal

  • サーバー (共通設定)

  • インターネット上で利用できるサービスのセキュリティは、サーバーの基本構成から始まります。 Linux ベースのサーバーの場合、次の構成方法を使用できます:
  • リモート ログイン構成の変更

iptables を使用してファイアウォールを設定する

    リモート ログインの構成を変更する
  • サーバーへのログインの構成を変更します。主な目的は、このプロセスを通常のデフォルト プロセスとは異なるものにすることです。
  • たとえば、どの Linux システムにも root という名前のスーパーユーザーがいます。攻撃者は ssh などを介して root のデフォルトのパスワードを解読できます。ただし、サーバー管理者が root ログインをオフにすると、そのような試みは失敗します。 root の代わりに、新しいユーザーを作成し、必要な権限を付与することができます。

    これに対する変更のほとんどは ssh 設定に関連しています。これらは通常、/etc/ssh/sshd_config ファイルにあります。関連構成:

    Port 2345Protocol 2PermitRootLogin noPasswordAuthentication noUseDNS noAllowUsers user
  • これにより、ポート 2345 (デフォルトではなく、デフォルトの 22) を使用する有効なユーザー名を使用して ssh 経由でサーバーに接続できます。また、root ログインとパスワード認証も無効になります。

パスワード検証を無効にすることは、システム全体のセキュリティを向上させるための重要な手順です。パスワードレス認証はより安全です。サーバーにログインするには、ローカル コンピューターで ssh キーを生成し、公開キーをサーバーにコピーする必要があります。さらなるセキュリティ。

iptables を使用してファイアウォールを設定する

iptables は、Linux システムのデフォルトのファイアウォールです。指定したポートへの接続を管理するために使用できます。 Web サイトをサーバー上に保持したい場合は、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服务器

设置Web服务器的一些一般原则。使用这些规则对于你的网站运行非常重要。通过服务器的漏洞,攻击者可以任意执行文件,上传恶意脚本并以某种骚操作运行这些脚本。

能够访问运行的网站文件

主要的原则就是 网站文件应该由非root用户运行,并且不应该由Web服务器写入(敲黑板,划重点!)。在一些情况下,Drupal目录可供Web服务器用户写入,有关保护文件权限和所有权的详细信息,请看本文末尾的“相关链接”。

限制对Web服务器的某些功能的访问

有时,限制在Web服务器对网站的一些功能的访问可能是有用的。例如,在你拥有演示网站或没有注册功能的网站的情况下。你可以限制/user和/admin/ *。对于Apache Web服务器,可以使用mod_authz_host和mod_rewrite模块完成。切记,http身份验证不是一种安全的方法。因此,所描述的方法在特定情况下更适用。

删除不使用的Web服务器插件

服务器上的所有其他服务都存在潜在的安全风险。因此,你应该遵循最小化原则。如果你不需要什么,只需将其删除即可。

这同样适用于Web服务器。Apache和Nginx Web服务器有许多额外的插件,仔细检查已启用的扩展名列表,并删除所有未使用的扩展名。

使用HTTPS

使用HTTPS协议可以使网站和私人用户数据的访问更加安全。如今,当一些在线商店不对他们的支付交易使用加密,这是绝对不对的。而且,Google已经将HTTPS设置为排名指标。这意味着不使用HTTPS协议但还是能运行的网站,一些重要信息(信用卡,支付交易等)会对搜索排名产生负面影响。

理想情况是,如果你为与用户进行交互的所有网站加密。例如说登录和注册。用户输入密码。即使这些密码在所有浏览器中看起来都不可见(如**),它们也会以未加密的形式通过网络传递。因此,攻击者可以通过中间人方式等轻松拦截输入的数据。用户通常都是使用常用密码。这意味着也可能会影响你在对别的网站的账号。

HTTP认证

应该清楚在什么情况下可以使用HTTP身份验证。大多数情况下,你需要它来保护对网站的缓存并禁用爬虫对该网站的索引。但是,HTTP身份验证本质上是不安全的。它不使用任何加密算法。因此,浏览器和网站之间的流量不会被加密,攻击者只需复制可以用的HTTP头并将数据包其发送到Web服务器即可访问网站。

此外,强烈建议将htpasswd文件保留在文档根目录之外。设置此文件的只读权限(440)。

PHP

PHP与服务器的其他服务一样可能包含漏洞。这在很大程度上取决于PHP本身的设置以及当前使用的PHP版本。当然,你始终需要检查所有可用的更新并保持PHP更新。但是,在某些情况下,这可能非常困难甚至是不可能的。

一般来说,优化服务器上PHP安全性的所有工作可以分为三个部分:

  • 定期更新PHP版本

  • 避免使用不安全的代码,功能等

  • 优化PHP设置

    定期更新PHP版本

    这是比较容易理解的事情,但正如我所提到的,在某些情况下,更新可能非常困难甚至是不可能的。当你的应用程序中有很多祖传代码(它在新的PHP版本中不起作用)并且当前的业务不允许你花时间更新这段代码时就会主要,因为它是很耗费时间的操作。在这种情况下,你可以尝试使用下面的一些建议。

    避免使用不安全的代码

    编写安全代码是服务器安全的重要一步。你应该花一些时间定期查看你所有自定义代码。此外,没有人可以保证第三方库不包含任何漏洞。正如我所提到的,即使PHP本身也存在安全性问题(使用不安全的函数,缓冲区溢出等)。

    为了解决这些问题,有一个很好的玩意叫做Suhosin,它可以帮助你摆脱许多安全问题。Suhosin旨在保护服务器和用户免受PHP和PHP核心中已知和未知的缺陷的影响。它由两部分组成。第一部分是PHP核心的补丁,它提供了一些针对缓冲区溢出或格式化字符串漏洞的低级保护。第二部分是PHP扩展,它实现了一些额外的保护。

    Suhosin是一个非常强大的工具,可以保护你的服务器免受许多漏洞的侵害。蛋疼的是,它不适用于PHP7.事实上,Suhosin7 正在开发,但还没有完成。作者不建议在生产服务器上使用Suhosin7。

    优化PHP设置

    为优化PHP安全配置,我们可以采取的两个最简单的步骤是禁用未使用的模块,并最大限度地减少用户可以获得的有关当前PHP安装的信息。

    要查看所有已编译的PHP模块,请运行以下命令:

    $ php -m

    建议仅使用必要的模块来提高安全性。仔细检查整个列表哪些是你不需要的模块。删掉吧。

    保护PHP免受黑客攻击还要隐藏有关系统的信息。看看php.ini文件中的这个配置:

    expose_php = Off

    确保此参数配置。否则,PHP将发送版本号到X-Powered-Byhttp头中的。

    同样适用于网站上的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

  • 数据库,用户和权限

查看数据库,用户和权限,以查找任何安全的缺陷。不要为用户提供超出实际需要的权限

  • PHPMyAdmin和类似工具,确保在使用完后禁用图形工具再使用数据库。如果你打算继续使用这些工具,请尝试尽可能难以访问它们。例如,你可以通过.htaccess限制对PHPMyAdmin的访问,并通过白名单允许从某些可信IP地址进行访问。此外,你可以尝试使用MySQL Workbench等本地工具,而不是使用Web类型的。

Drupal

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

初始安装后,请确保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 構成を分析する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。