计科网络

强化网站安全:有效拦截恶意访问者,守护您的在线领地

计科建站

最近我们的一个客户遇到了问题,其网站托管于一台运行LAMP环境的服务器中,前端则使用了某云计算服务商的商业CDN + HTTPS请求服务,然而最近这位客户向我们反应其CDN流量异常,CDN流量消耗的高,仅仅一天消耗了将近一个T的流量,这也导致了高额费用的产生。

因此,我们首先要找出流量异常的网站,通过CDN的管理后台我们找出了流量异常的站点

强化网站安全:有效拦截恶意访问者,守护您的在线领地(图1)

接下来我们需要在服务器中找到这些站点在apache2中的访问日志以确定更多细节,在ubuntu中,用户可以通过conf站点配置文件中的ErrorLog和CustomLog参数来自定义当前网站log存放的位置,如果您没有启用这一项则可以在/var/log/apache2/目录下查看全部的日志文件。

日志分析

我们通过日志文件分析出了一些不友好的访问者:

非法蜘蛛程序

蜘蛛程序常用于搜索引擎抓取和索引网站页面,而我们在日志中看到一些不正常的蜘蛛,其中“122.246.31.xx”这个IP段的请求一直伪装成不同的User-Agent来产生高频请求,每秒钟多达十多次的请求,这显然人类是做不到的:

www.xxx.com:443 122.246.31.168 - - [02/Aug/2024:08:33:38 +0800] "GET /news/1309/ HTTP/1.1" 200 27164 "-" "SkyworkSpider" www.xxx.com:443 122.246.31.168 - - [02/Aug/2024:08:32:36 +0800] "GET /favicon.ico HTTP/1.1" 404 3563 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36" www.xxx.com:443 122.246.31.173 - - [02/Aug/2024:08:32:08 +0800] "GET /product/gauge/page3 HTTP/1.1" 200 21712 "-" "YisouSpider"

日志文件的解释

  • www.xxx.com:443:这是服务器的主机名和端口号(443表示HTTPS)。
  • 122.246.31.168:这是客户端的IP地址,表示发起请求的用户的IP地址。
  • -:这是客户端标识符(通常是一个空白字段,表示客户端未认证或无标识符)。
  • -:这是用户标识符(通常是一个空白字段,表示未使用身份验证)。
  • [02/Aug/2024:08:33:38 +0800] :这是请求的时间戳,表示请求发生的日期和时间(2024年8月2日 00:09:59,时区为+0800)。
  • "GET /news/1309/ HTTP/1.1":这是请求行,表示客户端发送了一个GET请求,目标是/news/1309/,使用HTTP/1.1协议。
  • 200:这是HTTP状态码,表示请求的资源未找到(即,服务器返回了“404 Not Found”错误)。
  • 27164:这是响应的字节数(表示返回给客户端的内容长度为1897字节)。
  • "-":这是引用来源(Referer),表示客户端是从这个URL发起的请求。
  • "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36":这是用户代理字符串,表示客户端的浏览器类型和操作系统信息。

自动化扫描工具

这种扫描工具的主要特征是访问一些不存在的页面,而这些请求的页面地址来自两方面:

  1. 某网站程序的漏洞文件,被黑客扫描获取地址后从而进行进一步产生网站安全的操作
  2. 已经被黑客攻陷并上传的木马后门程序文件

自动化工具会批量扫描互联网中的网站,通过大海捞针的方式寻找网站漏洞,这也给我们的网站产生大量http404请求,从而增加我们的服务器压力,影响正常用户的访问。

以下是一些log日志样例

www.xxx.com:443 123.150.77.154 - - [02/Aug/2024:00:09:59 +0800] "POST /include/taglib/jr.lib.php HTTP/1.1" 404 1897 "http://www.xxx.com/include/taglib/jr.lib.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" www.xxx.com:443 27.44.206.40 - - [02/Aug/2024:00:10:00 +0800] "POST /plus/read.php HTTP/1.1" 404 1897 "http://www.xxx.com/plus/read.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" www.xxx.com:443 223.109.210.118 - - [02/Aug/2024:00:10:00 +0800] "POST /data/cache/flye.php HTTP/1.1" 404 1897 "http://www.xxx.com/data/cache/flye.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" www.swxwj.com:443 123.150.77.152 - - [02/Aug/2024:00:10:01 +0800] "POST /fuck.php HTTP/1.1" 404 1572 "http://www.xxx.com/fuck.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" www.xxx.com:443 183.61.174.130 - - [02/Aug/2024:00:10:02 +0800] "POST /include/common.inc.php HTTP/1.1" 404 1897 "http://www.xxx.com/include/common.inc.php" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" www.xxx.com:443 111.32.207.223 - - [02/Aug/2024:00:10:02 +0800] "POST /inc/function.asp HTTP/1.1" 404 1897 "http://www.xxx.com/inc/function.asp" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)"

至此,我们已经发现大量恶意请求,我们需要现在需要在服务器中拒绝来源于这些IP地址的请求。

拒绝恶意请求者

我们注意到网站的访问日志中充斥着以上非正常用户的访问日志,那么接下来我们需要拒绝这些不良访问者的IP地址。

我们有两种方式来实现这一目标

使用apache2.4

通过在conf配置文件使用RequireAll语法我们可以实现请求拒绝这一目标,其中末尾是0/24表示匹配0-255,113.219.202.0/24意味着作用于113.219.202.*这个IP段。

<RequireAll>
    Require all granted
	Require not ip 113.219.202.0/24
	Require not ip 122.246.31.0/24
	Require not ip 219.144.89.0/24
	Require not ip 219.144.88.0/24
	Require not ip 123.150.77.154
</RequireAll>

进一步的优化

那么服务器如果多个网站,我们可以将需要屏蔽的IP地址信息存放于一个文件中以便于统一管理,新建文件/etc/apache2/block_ips.conf,并将以上内容复制进该文件中。

修改站点配置文件.conf,找到<Directory >区块,并添加这行Include /etc/apache2/block_ips.conf,conf文件中最终效果看起来是这样子的:

    <Directory /mnt/www/xxx.com/public_html/>    
        Options FollowSymLinks
        AllowOverride All
        Require all granted
        Include /etc/apache2/banlist.conf
    </Directory>

最后我们使用apache2ctl configtest命令来检测conf文件的语法,如果没有问题重启apache

systemctl reload apache2

使用防火墙ufw

在ubuntu中,我们可以使用ufw来实现这一目标,以屏蔽122.246.31.*这个IP段为例,禁止其访问80和443端口:

sudo ufw deny from 122.246.31.0/24 to any port 80 proto tcp
sudo ufw deny from 122.246.31.0/24 to any port 443 proto tcp
sudo ufw deny from 122.246.31.0/24 to any port 80 proto udp
sudo ufw deny from 122.246.31.0/24 to any port 443 proto udp

使用过 ufw status 命令来查看当前状态。

ufw的基本使用命令

# 添加TCP规则
sudo ufw deny from 192.168.1.0/24 to any port 80 proto tcp
sudo ufw deny from 192.168.1.0/24 to any port 443 proto tcp

# 添加UDP规则(可选)
sudo ufw deny from 192.168.1.0/24 to any port 80 proto udp
sudo ufw deny from 192.168.1.0/24 to any port 443 proto udp

# 检查规则
sudo ufw status

# 删除TCP规则
sudo ufw delete deny from 192.168.1.0/24 to any port 80 proto tcp
sudo ufw delete deny from 192.168.1.0/24 to any port 443 proto tcp

# 删除UDP规则(如果添加了的话)
sudo ufw delete deny from 192.168.1.0/24 to any port 80 proto udp
sudo ufw delete deny from 192.168.1.0/24 to any port 443 proto udp

屏蔽恶意访问者对于保护网站安全、维护用户隐私、提升网站性能以及增强企业竞争力具有重要意义。网站管理员应当积极采取各种技术手段,如使用防火墙、入侵检测系统和访问控制策略,及时发现并屏蔽恶意访问者,确保网站的安全和稳定运行。在不断变化的网络环境中,只有持续关注和优化安全策略,才能有效应对各种安全威胁,保障网站和用户的利益。