pragmarx/firewall

一个 Laravel IP 白名单和黑名单插件

v2.3.2 2023-02-17 12:06 UTC

README

Latest Stable Version License Downloads Code Quality Build Coverage StyleCI

目的

这是一个“软防火墙”包。其目的是帮助人们通过IP地址防止未经授权的访问路由。它能够跟踪IP、国家和主机(动态IP),并将未经授权的用户重定向到例如“即将推出”页面,同时允许白名单IP访问整个网站。现在它还能检测并阻止来自单个IP或整个国家的攻击。

这个包可以防止一些头疼的问题,并帮助您阻止对您的应用程序的某些访问,但不能取代防火墙和设备。对于网络级别的攻击,您仍然需要一个真正的防火墙。

特性

  • 通过黑白名单控制路由和组访问。
  • 检测并阻止来自IP地址或国家的应用程序攻击。
  • 在攻击事件中发送Slack通知。
  • 允许白名单访问整个网站并将其他人重定向到“即将推出”页面。
  • 将黑名单用户重定向到其他页面。
  • 使用数据库或数组存储IP列表。
  • 使用动态DNS主机名白名单您的开发机器。
  • 使用中间件完成,因此您可以保护/取消保护路由组。
  • 所有功能都适用于主机、IP地址、IP地址范围和整个国家。
  • 超级快速,每个请求增加不到10ms。
  • 高度可配置。

概念

黑名单

那些列表中的所有IP地址将无法访问黑名单过滤器过滤的路由。

白名单

那些IP地址、范围或国家可以

  • 访问黑名单中的路由,即使它们位于黑名单IP地址范围内。
  • 访问允许白名单过滤的路由。
  • 如果路由被“允许白名单”过滤器过滤,并且IP地址没有白名单,则请求将被重定向到替代URL或路由名称。

攻击检测

attack

防火墙能够通过计算来自同一IP或国家的请求来检测对您页面的简单攻击。只需在您的 config/firewall.php 中启用它,并在 config/services.php 中配置Slack服务以接收通知,然后添加路由通知方法到您的用户模型中。

'slack' => [
    'webhook_url' => env('SLACK_WEBHOOK_URL'),
],

和添加路由通知方法到您的用户模型

/**
 * Route notifications for the Slack channel.
 *
 * @return string
 */
public function routeNotificationForSlack()
{
    return config('services.slack.webhook_url');
}

IP列表

IP列表(白名单和黑名单)可以存储在数组、文件和数据库中。最初禁用了数据库访问列表,因此,要测试您的防火墙配置,您可以发布配置文件并编辑 blacklistwhitelist 数组

'blacklist' => array(
    '127.0.0.1',
    '192.168.17.0/24'
    '127.0.0.1/255.255.255.255'
    '10.0.0.1-10.0.0.255'
    '172.17.*.*'
    'country:br'
    '/usr/bin/firewall/blacklisted.txt',
),

文件(例如 /usr/bin/firewall/blacklisted.txt)必须按行包含一个IP、范围或文件名,是的,它会递归地搜索文件,所以如果您需要,您可以有一个文件中的文件

127.0.0.2
10.0.0.0-10.0.0.100
/tmp/blacklist.txt

重定向非白名单IP地址

非白名单IP地址可以被阻止或重定向。要配置重定向,您将必须发布 config.php 文件并配置

'redirect_non_whitelisted_to' => 'coming/soon',

Artisan命令

您可以使用以下命令

全局

  firewall:cache:clear  Clear the firewall cache.
  firewall:list         List all IP address, white and blacklisted.
  firewall:updategeoip  Update the GeoIP database.

当数据库启用时

  firewall:blacklist          Add an IP address to blacklist.
  firewall:clear              Remove all ip addresses from white and black lists.
  firewall:remove             Remove an IP address from white or black list.
  firewall:whitelist          Add an IP address to whitelist.

这些是来自 firewall:list 的结果

+--------------+-----------+-----------+
| IP Address   | Whitelist | Blacklist |
+--------------+-----------+-----------+
| 10.17.12.7   |           |     X     |
| 10.17.12.100 |     X     |           |
| 10.17.12.101 |     X     |           |
| 10.17.12.102 |     X     |           |
| 10.17.12.200 |           |     X     |
+--------------+-----------+-----------+
+-----------------------+-----------+-----------+
| IP Address            | Whitelist | Blacklist |
+-----------------------+-----------+-----------+
| 172.0.0.0-172.0.0.255 |           |     X     |
| country:br            |           |     X     |
| host:mypc.myname.com  |     X     |           |
+-----------------------+-----------+-----------+

外观

您还可以使用 Firewall Facade 来管理列表

$whitelisted = Firewall::isWhitelisted('10.17.12.1');
$blacklisted = Firewall::isBlacklisted('10.0.0.3');

Firewall::whitelist('192.168.1.1');
Firewall::blacklist('10.17.12.1', true); /// true = force in case IP is whitelisted
Firewall::blacklist('127.0.0.0-127.0.0.255');
Firewall::blacklist('200.212.331.0/28');
Firewall::blacklist('country:br');

if (Firewall::whichList($ip) !== false)  // returns false, 'whitelist' or 'blacklist'
{
    Firewall::remove($ip);
}

返回阻止访问的响应

return Firewall::blockAccess();

可疑事件将被(如果您愿意)记录,因此请使用 tail 命令查看

php artisan tail

阻止整个国家

您可以通过传递 country:<2-letter ISO code> 来阻止一个国家,而不是使用IP地址。因此,要阻止巴西的所有IP地址,您需要这样做

php artisan firewall:blacklist country:br

您需要将此要求添加到您的 composer.json 文件中

"geoip/geoip": "~1.14"

或者

"geoip2/geoip2": "~2.0"

您需要在您的 firewall.php 配置文件中启用国家搜索

'enable_country_search' => true,

您可以将此命令计划为定期更新您的城市 GeoIp 数据库

php artisan firewall:updategeoip

您可以在以下位置找到这些代码: isocodes

会话阻止

您可以通过使用以下方法仅阻止用户在当前会话中访问某些页面

Firewall::whitelistOnSession($ip);
Firewall::blacklistOnSession($ip);
Firewall::removeFromSession($ip);

游乐场 & 引导应用程序

点击 这里 查看其工作情况,如果您需要帮助理解某些内容,请尝试 此存储库

playground

安装

兼容性

  • Laravel 4+ (版本 1.*)
  • Laravel 5.0, 5.1, 5.2 和 5.3 (版本 1.*)
  • Laravel 5.4, 5.5, 5.6 和 5.7 (版本 2.*)

安装

使用 Composer 安装 Firewall 包

composer require pragmarx/firewall
  • Laravel 5.5 及以上版本

    您无需做任何事情,此包使用自动发现功能,一旦通过 Composer 安装即可使用。

  • Laravel 5.4 及以下版本

    将服务提供者和外观添加到您的 app/config/app.php 文件中

PragmaRX\Firewall\Vendor\Laravel\ServiceProvider::class,
'Firewall' => PragmaRX\Firewall\Vendor\Laravel\Facade::class,

将中间件添加到您的 app/Http/Kernel.php 文件中

protected $routeMiddleware = [
    ...
    'fw-only-whitelisted' => \PragmaRX\Firewall\Middleware\FirewallWhitelist::class,
    'fw-block-blacklisted' => \PragmaRX\Firewall\Middleware\FirewallBlacklist::class,
    'fw-block-attacks' => \PragmaRX\Firewall\Middleware\BlockAttacks::class,
];

或者

protected $middlewareGroups = [
    'web' => [
        ...
    ],

    'api' => [
        ...
    ],
    
    'firewall' => [
        \PragmaRX\Firewall\Middleware\FirewallBlacklist::class,
        \PragmaRX\Firewall\Middleware\BlockAttacks::class,
    ],
];

然后您可以在路由中使用它们

Route::group(['middleware' => 'fw-block-blacklisted'], function () 
{
    Route::get('/', 'HomeController@index');
});

或者您可以使用两者。在下面的示例中,允许组将允许对“即将推出”页面的访问,并阻止或重定向非白名单IP地址到另一个地址,同时仍然阻止对黑名单的访问。

Route::group(['middleware' => 'fw-block-blacklisted'], function () 
{
    Route::get('coming/soon', function()
    {
        return "We are about to launch, please come back in a few days.";
    });

    Route::group(['middleware' => 'fw-only-whitelisted'], function () 
    {
        Route::get('/', 'HomeController@index');
    });
});

注意:您可以通过将它们添加到 fw-allow-wlfw-block-bl 中间件组来将您已创建的其他中间件添加到新组中。

迁移您的数据库

php artisan migrate

警告:如果您已经安装并迁移了 Firewall 包,您需要更新迁移名称,在 migrations 表中更改为 2014_02_01_311070_create_firewall_table,否则迁移命令将失败,并告知表已存在。

要发布配置文件,您需要

Laravel 4

php artisan config:publish pragmarx/firewall

Laravel 5

php artisan vendor:publish --provider="PragmaRX\Firewall\Vendor\Laravel\ServiceProvider"

TODO

  • 测试,测试,测试。

作者

Antonio Carlos Ribeiro

许可证

Firewall 在 BSD 3-Clause 许可证下授权 - 详细信息请参阅 LICENSE 文件

贡献

欢迎提交拉取请求和问题。