利用Fail2Ban增强Jupyter Notebook安全性以防范目录遍历攻击

作者:高玉涵
时间:2024.10.9 15:31
博客:blog.csdn.net/cg_i
环境:CentOS8、fail2ban 0.11.2

无论选择哪条路,都请保持一颗热爱学习、永不停止的心。
因为,只有不断学习,我们才能在这个日新月异的世界中立足。

书接上回1

Fail2ban的filter.d2里存放着大量针对市面上大多数服务程序的防护配置脚本。这些脚本通过正则表达式匹配系统日志中的特定模式,从而识别出潜在的恶意行为,如多次失败的登录尝试、异常访问模式等。当这些模式被触发时,Fail2ban可以采取相应的行动,如通过防火墙规则封禁IP地址、发送通知邮件等。

当然,值得称道的是,尽管Fail2ban已经为大多数主流服务提供了预配置的防护脚本,但当你像我一样,使用了一些较为小众却极为实用的服务,例如便于随时进行代码调试与灵感记录的Jupyter Notebook时,你可能会发现在filter.d目录中难以找到直接适用的专用防护配置。幸运的是,Fail2ban的设计充分考虑到了用户的这种需求,它提供了一套高度灵活的规则定制机制。这意味着,你可以针对Jupyter Notebook或任何其他特定服务,轻松创建个性化的防护策略,从而实现系统的全面安全防护,确保你的工作环境既便捷又安全。

本文旨在结合Fail2Ban的日志监控与封禁功能,为Jupyter Notebook量身定制一套专属的防护策略,让您的代码调试与灵感记录之旅更加无忧无虑。

一、目录遍历攻击(Directory Traversal Attack)

目录遍历攻击是指攻击者利用应用程序对文件路径处理的不当验证或过滤漏洞,通过构造特定的文件路径字符串,试图访问存储在Web服务器根目录之外的文件和目录。这种攻击通常发生在Web应用程序或其他需要文件系统访问的软件中,攻击者通过修改URL或输入字段中的文件路径来实现对受限资源的访问。

一、攻击方式

  1. 直接路径遍历:攻击者直接在URL或输入字段中构造包含“…/”等特殊字符的路径字符串,试图向上导航到更高层次的目录,从而访问到受限的文件或目录。
  2. 编码绕过:攻击者可能使用URL编码、Unicode编码等方式对特殊字符进行编码,以绕过应用程序的安全检查。例如,使用“%2e%2e%2f”代替“…/”来尝试访问上级目录。
  3. 利用应用程序漏洞:攻击者还可能利用应用程序的其他漏洞(如文件包含漏洞、文件上传漏洞等)来实现路径遍历攻击。

二、危害与影响

目录遍历攻击可能导致多种严重后果,包括但不限于:

  1. 数据泄露:攻击者可以访问包含敏感信息的文件,如配置文件、用户数据文件等。
  2. 代码泄露:攻击者可以访问应用程序的源代码,从而发现更多的漏洞。
  3. 系统破坏:通过访问和修改系统文件,攻击者可以对系统进行破坏性操作,影响服务的正常运行。
  4. 权限提升:攻击者可能通过读取和利用系统文件来提升自己的权限,执行更高级别的攻击。

二、日志记录的网络攻击示例分析

(省略...)
[W 01:24:43.095 NotebookApp] 403 POST /web/addons/ftp_download.php (107.172.20.215) 2.230000ms referer=None
[W 01:24:43.146 NotebookApp] 403 POST /tplus/ajaxpro/Ufida.T.SM.Login.UIP.LoginManager,Ufida.T.SM.Login.UIP.ashx?method=CheckPassword (107.172.20.215): '_xsrf' argument missing from POST
[W 01:24:43.147 NotebookApp] 403 POST OPTION=LOADFILE&FILENAME=../mysql_config.ini (107.172.20.215) 1.740000ms referer=None
[W 01:24:43.325 NotebookApp] 404 GET /Catalog/BlobHandler.ashx?Url=YQB3AGUAdgAyADoAawB2ADAAOgB4AGwAawBiAEoAbwB5AGMAVwB0AFEAMwB6ADMAbABLADoARQBKAGYAYgBHAE4ATgBDADUARQBBAG0AZQBZAE4AUwBiAFoAVgBZAHYAZwBEAHYAdQBKAFgATQArAFUATQBkAGcAZAByAGMAMgByAEUAQwByAGIAcgBmAFQAVgB3AD0A 
[W 01:24:43.549 NotebookApp] 404 GET /AirWatch/BlobHandler.ashx?Url=YQB3AGUAdgAyADoAawB2ADAAOgB4AGwAawBiAEoAbwB5AGMAVwB0AFEAMwB6ADMAbABLADoARQBKAGYAYgBHAE4ATgBDADUARQBBAG0AZQBZAE4AUwBiAFoAVgBZAHYAZwBEAHYAdQBKAFgATQArAFUATQBkAGcAZAByAGMAMgByAEUAQwByAGIAcgBmAFQAVgB3AD0A (107.172.20.215) 1.450000ms referer=None
[W 01:24:43.594 NotebookApp] 404 GET /go/add-on/business-continuity/api/plugin?folderName=&pluginName=../../../../../../../../windows/win.ini (107.172.20.215) 1.450000ms referer=None
[W 01:24:43.640 NotebookApp] 403 POST /ispirit/interface/gateway.php (107.172.20.215): '_xsrf' argument missing from POST
[W 01:24:43.922 NotebookApp] 403 POST /tplus/SM/SetupAccount/Upload.aspx?preload=1 (107.172.20.215): '_xsrf' argument missing from POST
(省略...)
[I 01:24:45.555 NotebookApp] 302 GET /?rest_route=/wc/store/products/collection-data&calculate_attribute_counts[0][query_type]=or&calculate_attribute_counts[0][taxonomy]=%252522%252529%252520union%252520all%252520select%2525201%25252Cconcat%252528id%25252C0x3a%25252cmd5%252528142712%252529%252529from%252520wp_users%252520where%252520%252549%252544%252520%252549%25254E%252520%2525281%252529%25253B%252500 (107.172.20.215) 0.650000ms
(省略...)

这些日志条目来自Jupyter Notebook,记录了特定时间段内的HTTP请求。分析这些日志,我们可以看出以下几点:

  1. 访问尝试的IP地址:

    • 所有记录的请求都来自同一个IP地址:107.172.20.215。这可能表明是一个单一的用户或系统在进行这些操作。
  2. 请求类型与结果:

    • 多数请求是POST和GET请求。
    • 许多请求返回了403(禁止访问)和404(未找到)状态码,这表明请求的资源不存在或者请求被拒绝。
  3. 潜在的攻击尝试:

    • 请求中尝试访问一些常见的敏感文件或执行SQL注入,例如:
      • /web/addons/ftp_download.php:尝试下载FTP文件。
      • OPTION=LOADFILE&FILENAME=../mysql_config.ini:尝试加载MySQL配置文件。
      • /Catalog/BlobHandler.ashx/AirWatch/BlobHandler.ashx:带有可疑的URL编码参数,可能是尝试访问或执行未授权的资源。
      • /go/add-on/business-continuity/api/plugin?folderName=&pluginName=../../../../../../../../windows/win.ini:尝试访问系统文件。
      • /wc/store/products/collection-data 带有SQL注入特征的查询参数。
  4. 缺少安全令牌:

    • 一些POST请求因为缺少_xsrf参数而失败。这可能是因为这些请求没有包含必要的安全令牌,该令牌通常用于防止跨站请求伪造(CSRF)攻击。
  5. 请求的时间戳:

    • 所有这些请求都发生在相同的时间段内(01:24:43到01:24:45),表明这是一系列连续的尝试。
  6. 可能的目标:

    • 目标系统可能运行着多种应用或服务(如FTP服务、数据库服务、Web服务等),攻击者尝试利用这些服务中的漏洞。

这些日志条目揭示了来自特定IP地址的一系列可疑且潜在恶意的请求,包括尝试访问敏感文件、执行SQL注入以及绕过安全机制等。尽管攻击者并未获得实质性成果,且系统防护措施已相当完善,但此类攻击事件仍频繁发生,对服务器造成了不小的压力和资源损耗。

三、配置 Fail2ban

编辑 /etc/fail2ban/jail.local(或相应的配置文件),添加以下内容:

[jupyter]
enabled  = true  
filter   = jupyter-notebook
logpath  = /path/to/your/jupyter.log # 你所在日志路径
maxretry = 3
bantime  = 6000 # 禁止时间,单位为秒

然后,创建一个新的过滤器文件 /etc/fail2ban/filter.d/jupyter-notebook.conf,并添加以下内容:

[Definition]
failregex = ^.*\[(W|E|I|D) .*\] 4\d{2} (GET|POST) .* \(<HOST>\).*$ # 日志匹配的正则表达式
ignoreregex =

解释:

  • ^ 表示行的开始。
  • .* 表示任意数量的任意字符(除了换行符)。
  • \[(W|E|I|D) .*\] 匹配一个方括号内的内容,其中以W、E、I或D开头,后面跟着任意字符。这通常表示日志级别或某种标记。
  • 4\d{2} ,其中 4 表示匹配数字4,\d{2} 表示匹配两位数字。这样,正则表达式就能匹配所有从400到499的HTTP状态码了。
  • (GET|POST) 匹配请求方法GET或POST。
  • .* 再次匹配任意数量的任意字符。
  • \(<HOST>\) 是一个特殊的Fail2Ban占位符,用于匹配日志中的主机名或IP地址。在实际使用中,这通常会被替换为具体的值。
  • .*$ 表示行的结束,前面再次匹配任意数量的任意字符。

四、fail2ban-regex测试和验证正则表达式

fail2ban-regex是fail2ban提供的一个小工具,用于测试正则表达式是否能够匹配到日志文件中的要禁止的IP行。fail2ban-regex在默认情况下会自动匹配到日志文件中的日期和时间部分,因此在编写正则表达式时,通常无需显式包含日期和时间模式。

# fail2ban-regex /path/to/your/jupyter.log /etc/fail2ban/filter.d/jupyter-notebook.conf

Running tests
=============
Use      filter file : jupyter-notebook, basedir: /etc/fail2ban
Use         log file : /path/to/your/jupyter.log
Use         encoding : UTF-8

Results
=======

Failregex: 71851 total
|-  #) [# of hits] regular expression
|   1) [71851] ^.*\[(W|E|I|D) .*] 4\d{2} (GET|POST) .* \(<HOST>\).*$
`-

Ignoreregex: 0 total

Date template hits:

Lines: 107606 lines, 0 ignored, 71851 matched, 35755 missed
[processed in 52.87 sec]

Missed line(s): too many to print.  Use --print-all-missed to print all 35755 lines

fail2ban-regex 测试结果来看:

  1. 正则表达式匹配情况:
    • 正则表达式 ^.*\[(W|E|I|D) .*] 4\d{2} (GET|POST) .* \(<HOST>\).*$ 在日志文件中找到了 71851 次匹配。
    • 这意味着该正则表达式成功地匹配到了日志中很多行,这些行可能表示了Jupyter Notebook的访问尝试(可能是失败的登录尝试或其他相关事件)。
  2. 忽略规则匹配情况:
    • 没有设置忽略规则(Ignoreregex),因此没有日志行被忽略。
  3. 日期模板匹配情况:
    • 测试结果没有直接提到日期模板的匹配情况,但通常这不是主要关注点,因为 fail2ban-regex 主要用于测试正则表达式是否能正确匹配到IP地址和其他关键信息。
  4. 未匹配的行:
    • 有 35755 行日志没有被正则表达式匹配到。这可能是因为这些行的格式与您的正则表达式不匹配,或者它们不包含您想要捕获的信息(如IP地址)。
    • 如果您想要查看所有未匹配的行,可以使用 --print-all-missed 选项来运行 fail2ban-regex 命令。
  5. 性能:
    • 处理 107606 行日志花费了 52.87 秒。这对于一次性测试来说可能是可以接受的,但如果这是在生产环境中实时运行的,您可能需要考虑优化正则表达式或日志处理流程。

总的来说,我们的正则表达式已经成功匹配到了大量日志行,达到了预期。

五、重启 Fail2Ban

最后,重启 fail2ban 以应用新的配置:

systemctl restart fail2ban

六、验证配置生效

通过 fail2ban-client status命令检查:

# fail2ban-client status 
Status
|- Number of jail:	3
`- Jail list:	jupyter-notebook, mysqld-auth, sshd

可以看到此时有三条 Jail 生效,其中 jupyter-notebook是我们自定义的配置。要想进一步了解通过 fail2ban-client status <jail>命令获得详细信息。

fail2ban-client status jupyter-notebook
Status for the jail: jupyter-notebook
|- Filter
|  |- Currently failed:	1
|  |- Total failed:	2
|  `- File list:	/path/to/your/jupyter.log
`- Actions
   |- Currently banned:	0
   |- Total banned:	0
   `- Banned IP list:	

通过命令输出结果来看:

  • 当前失败次数:1。这意味着在最近的日志检查中,有1次尝试(可能是登录尝试)被判定为失败,并触发了fail2ban的机制。
  • 总失败次数:2。自jupyter-notebook监狱启动以来,总共有2次尝试被判定为失败。

因为失败次数maxretry尚未达到触发禁止条件3次,所以暂时没有IP地址被禁止。可见我们的配置已然生效了。

七、一些建议

在互联网环境中,每分钟都有成千上万的类似攻击在不断上演。这些攻击不仅威胁着系统的安全,还可能导致服务中断、数据泄露等严重后果。因此,必须采取有效措施来约束和防范此类攻击。为了应对这一挑战,建议采取以下措施:

  1. 加强日志监控与分析:通过实时监控和分析服务器日志,及时发现并响应可疑请求和攻击尝试。这有助于快速定位问题并采取相应的防御措施。
  2. 更新与加固系统:定期更新系统和应用程序,以修复已知的安全漏洞。同时,加固系统配置,提高系统的安全性。
  3. 部署安全工具:利用fail2ban等安全工具,根据日志中的攻击模式自动阻止恶意IP地址的访问。这有助于减少攻击对服务器的影响。
  4. 限制访问权限:严格控制对敏感文件和资源的访问权限,确保只有授权用户才能访问。
  5. 加强用户教育与培训:提高用户对网络安全的认识和意识,教育用户如何识别和防范网络攻击。

通过综合运用这些措施,可以有效地约束和防范来自互联网的攻击,保护服务器的安全和稳定运行。同时,也有助于减轻服务器的压力和资源损耗,提高系统的整体性能。

参见:


  1. 利用 fail2ban 保护 SSH 服务器_fail2ban ssh-CSDN博客 ↩︎

  2. /etc/fail2ban/filter.d(Centos8位置) ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值