asmithsummer/roadblock

基于安全成员、会话和请求信息(也记录在日志中)的自动流量拦截。

安装: 8

依赖项: 1

建议者: 0

安全: 0

星星: 0

关注者: 2

分支: 0

开放问题: 0

类型:silverstripe-vendormodule

1.1.3 2024-06-26 23:30 UTC

README

此模块创建会话、请求和登录尝试的数据库日志。尽可能将这些日志附加到已认证的用户。网关随后使用基于规则的架构来识别应标记的请求,并在必要时拦截请求。新增了两个模型管理器标签页,会话和拦截。这些是这两个方面的报告,以及一个用于删除过时请求日志的排队任务。

会话

现在所有请求都会设置会话。为了避免在登录时重置,在config yml中将$session_regenerate_id设置为false。

日志

对会话、请求和登录尝试进行日志记录。每个请求都会记录IP地址、URL、用户代理、请求类型(在模型管理器中可配置)、动词(GET、POST等)。

排除的URL

config/urlignore.yml文件包含要排除在请求日志之外的preg_match值。这减少了资源请求的噪音,并使/dev/build和错误页面免受拦截。

网关

该模块通过在成员身份验证完成后插入一个新的网关来工作。

  • 第一步是记录请求和会话数据。
  • 第二步是将这些数据与任何已建立的规则进行解析。如果存在违规规则,则创建一个新的拦截记录,或将现有记录添加到其中。拦截记录记录了分数、规则违规列表(作为“拦截异常”)以及针对此记录的规则列表。
  • 第三步(可选且可配置)是在创建新的拦截记录或拦截生效时(分数大于或等于100.00)通过电子邮件通知。
  • 第四步是检查是否存在当前对请求生效的拦截。

覆盖拦截

如果检查后应移除拦截,则在拦截模型管理器上有一个管理员覆盖复选框。这允许成员或会话忽略所有规则。只有当您高度信任成员或会话是合法的时才进行覆盖。

使拦截过期

在config yaml中设置过期值将在分数超过100.00时设置过期日期。当过期时间过后,在成员/会话下一次被拦截的请求中,从分数中减去100.00。如果分数仍然超过100,将设置新的过期日期。例如,假设我有一个设置为50.00(累积)的成员级别规则,并设置过期时间为600秒。

  • 成员第一次触发规则时,管理员会收到通知,并创建一个拦截记录,其中包含异常、违反的规则等,但用户可以继续正常操作。
  • 规则第二次被触发时,请求被拦截,管理员会收到新的通知,拦截记录被更新。所有后续请求都将被拦截10分钟(600秒)。
  • 用户尝试几次,将分数增加到200.00,并将更多异常添加到拦截记录中。
  • 10分钟后,用户尝试一个不会触发标记的请求,这次过期时间已过,从分数中减去100.00。分数仍然是100.00,因此添加了一个新的10分钟过期时间。请求被拦截。
  • 又过了10分钟后,用户再次尝试使用第一个请求,该请求将被标记。这次由于触发了规则,分数增加到150.00,但由于过期,分数减少到50.00。请求没有被阻止,会员可以继续操作。当在roadblock中添加具有过期覆盖的新规则时,此值可以被覆盖。覆盖值如下
  • -1 永不使roadblock过期
  • 0 使用应用程序默认值
  • 大于0 使用秒数来使用roadblock将记录最严厉的违规(即最高值或-1)。这也可以在roadblock本身中手动更改。

规则

规则基于“如果为假则”创建,这允许合法流量提前退出。当分数超过100.00时,将执行“roadblock”,返回404错误页面或httprequest异常(可配置)。

  • 级别:- 全局将用IPAddress替换Session。会员级别将遍历会员的所有会话以及登录尝试。
  • 登录尝试状态:- 考虑失败、成功或任何登录尝试状态。
  • 登录尝试次数:- 在标记之前允许多少次登录尝试。
  • 登录尝试开始偏移:- 回顾登录尝试的时间周期(秒)。
  • 计数:- 请求类型的请求数量,这组url规则,例如 /^admin//
  • 开始偏移:- 回顾的时间周期(秒)。
  • 动词:- 规则的请求动词。
    • 任何
    • POST
    • GET
    • DELETE
    • PUT
    • CONNECT
    • OPTIONS
    • TRACE
    • PATCH
    • HEAD
  • IPAddress:-
    • 如果‘允许’仅允许与‘类型’关联的IP地址被接受。
    • 如果‘允许组’仅允许与‘类型’关联的IP地址被接受,并且必须在指定的组中。
    • 如果‘允许权限’仅允许与‘类型’关联的IP地址被接受,并且具有正确的权限。
    • 如果‘拒绝’仅标记这些IP地址,允许所有其他IP地址。
  • 组:- 在此组中的会员将触发规则。
  • 排除组:- 与上述逻辑相反,如果在该组中,则不会触发规则,并且进一步评估停止。
  • 权限:- 与上述组类似,但针对会员的权限。
  • 排除权限:- 与排除组类似,但针对会员的权限。
  • 分数:- 分配给此规则的分数。分数将累积到当前用户会话的整体总分数。
  • 分数为100.00将自动阻止请求。
  • 分数为0将创建roadblock记录,如果设置了通知,则发送通知,但不会添加到整体分数。当前请求将被阻止。
  • 可以设置负分数,这将减少分数,可能解除会话/会员/IP的阻止。
  • 过期覆盖:- 使用此值覆盖默认过期间隔。-1不过期,或正数为秒数。
  • 累积:- 如果设置为“是”,分数将每次违反规则时累积。否则,它只会捕获一次。
  • 状态:- 规则是否生效?
  • 分别通知主题 & 通知会员内容
    • 如果设置,将在每次违反此规则时向会员发送单独的电子邮件通知,如果已知,则包含附加内容。

模型管理员

roadblock模型管理员允许对每个级别进行管理,并导出/导入以帮助设置规则。规则的基本层次结构如下

  • 规则
    • 请求类型
      • URL规则
      • IP规则
    • roadblock
    • 侵权
    • 规则检查员

测试‘检查员’

道路封锁规则检查员模型管理标签允许创建测试结果,以验证规则是否按预期工作。'结果'将调试规则运行的所有阶段,与检查员中设置的参数相匹配。如果您确认调试信息正确,将其复制到'预期结果',测试将通过。

通知

除了个人通知外,还可以配置标志,向管理员和/或成员的电子邮件发送通知。还有一个配置值用于设置道路封锁发送电子邮件的频率。

  • 在请求获得分数但尚未达到阈值时,通知道路封锁的第一个创建(部分)。
  • 仅在将规则分数设置为零时创建通知信息。
  • 在道路封锁越过阈值时发送通知。
  • 在道路封锁生效期间通知最新活动。电子邮件模板都在EmailService类中,因此扩展变得容易得多。

定制

规则可以扩展以包含新的变量。除了标准方法外,还提供以下扩展方法:

  • updateCaptureRequestData:用自定义字段/数据填充请求日志
  • updateCaptureSessionData:用自定义字段/数据填充会话日志
  • updateDescriptionForGridField:扩展规则的自动生成描述
  • updateEvaluateRoadblockData:用自定义字段/数据填充道路封锁记录
  • updateEvaluateInfringementData:用自定义字段/数据填充道路封锁异常
  • updateEvaluateMember:在成员级别运行您自己的自定义规则
  • updateEvaluateSession:在会话级别运行您自己的自定义规则
  • updateExportFields:添加或更新csv导出
  • updatePrepareRequestLog:用于扩展测试套件
  • updatePrepareRequestLogs:用于扩展测试套件
  • updatePrepareLoginAttempts:用于扩展测试套件
  • updatePrepareCurrentAssessment:用于扩展测试套件
  • updateNotification - 这允许在各种通知电子邮件中添加更多内容,可以针对主题等目标电子邮件

修剪旧请求日志

'TruncateRequestLogJob'将从请求日志中删除旧请求。它接受两个参数,test和repeat。如果设置了test,则作业的消息标签将显示将要删除的数据。如果存在repeat参数,它将安排另一个作业运行。记录的保留时间和作业的运行频率在yml配置设置中

  • keep_log_period_seconds,默认1周
  • keep_log_repeat_interval,默认1天

许可协议

请参阅许可协议

此模块模板默认使用"BSD-3-Clause"许可协议。BSD-3许可证是最自由的开源许可证之一,被大多数Silverstripe CMS模块使用。

安装

composer require aSmithSummer/roadblock

示例配置

由于我们正在为新未认证的成员设置会话,为了防止他们在登录时创建新会话,您应将login_recording设置为true。这不是万能的,但是一个很大的改进。

在您的应用程序的基础_config中添加以下内容

Silverstripe\Security\Security:
  login_recording: true;

您可以通过通常的方式覆盖道路封锁模块中的默认配置。默认配置是

---
Name: roadblock_member
---
SilverStripe\Security\Member:
    session_regenerate_id: false
---
Name: roadblock
---
aSmithSummer\Roadblock\Gateways\SessionLogMiddleware:
  show_error_on_blocked: true
aSmithSummer\Roadblock\Model\Roadblock:
  expiry_interval: 0
  email_notify_frequency: 60
  email_notify_on_info: false
  email_notify_on_partial: false
  email_notify_on_blocked: false
  email_notify_on_latest: false
  email_notify_frequency_member: 60
  email_notify_on_info_member: false
  email_notify_on_partial_member: false
  email_notify_on_blocked_member: false
  email_notify_on_latest_member: false
aSmithSummer\Roadblock\Services\EmailService:
  email_from: test@example.com
  email_to: test@example.com
---
Name: request_log_job
---
aSmithSummer\Roadblock\Jobs\TruncateRequestLogJob:
  keep_log_period_seconds: 604800
  keep_log_repeat_interval: "+1 day"