これは「ソフトファイアウォール」パッケージです。その目的は、 IP アドレスによるルートへの不正アクセスを防止することです。 IP、国、ホスト (動的 IP) を追跡し、ホワイトリストに登録された IP がサイト全体にアクセスできるようにしながら、承認されていないユーザーを「近日公開」ページなどにリダイレクトすることができます。また、単一の IP または国全体からの攻撃 (多すぎるリクエスト) を検出してブロックできるようになりました。
このパッケージは、いくつかの問題を防ぎ、アプリへの一部のアクセスをブロックするのに役立ちますが、ファイアウォールやアプライアンスを置き換えることはできません。ネットワーク レベルでの攻撃の場合は、依然として実際のファイアウォールが必要です。
これらのリスト内のすべての IP アドレスは、ブラックリスト フィルターによってフィルターされたルートにアクセスできなくなります。
これらの IP アドレス、範囲、または国は、
ファイアウォールは、同じ 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 (ホワイトおよびブラック) リストは、アレイ、ファイル、データベースに保存できます。最初はリストへのデータベース アクセスが無効になっているため、ファイアウォール構成をテストするには、構成ファイルを公開し、 blacklist
またはwhitelist
配列を編集します。
' 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
) には、1 行に 1 つの IP、範囲、またはファイル名が含まれている必要があります。また、ファイルは再帰的に検索されるため、必要に応じてファイルのファイルを作成できます。 :
127.0.0.2
10.0.0.0-10.0.0.100
/tmp/blacklist.txt
ホワイトリストに登録されていない IP アドレスはブロックまたはリダイレクトされる可能性があります。リダイレクトを構成するには、 config.php
ファイルを公開して以下を構成する必要があります。
' redirect_non_whitelisted_to ' => ' coming/soon ' ,
次のコマンドにアクセスできます。
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
IP アドレスの代わりにcountry:<2-letter ISO code>
を渡すことで国をブロックできます。したがって、ブラジルのすべての 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 );
ここをクリックして動作を確認し、問題を解決するためのヘルプが必要な場合は、このリポジトリを試してください。
Composer を使用してファイアウォール パッケージを要求します。
composer require pragmarx/firewall
Laravel 5.5以降
他に何もする必要はありません。このパッケージは Package Auto-Discovery の機能を使用しているため、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 アドレスへのアクセスをブロックしながら、ホワイトリストに登録されていない IP アドレスをブロックするか、単に別の 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-wl
またはfw-block-bl
ミドルウェア グループに追加するだけで、新しいグループに追加できます。
データベースを移行する
php artisan migrate
警告:すでにファイアウォール パッケージがインストールされ移行されている場合は、 migrations
テーブル内の移行名を2014_02_01_311070_create_firewall_table
に更新する必要があります。更新しないと、移行コマンドは失敗し、テーブルが既に存在することが通知されます。
構成ファイルを公開するには、次のことを行う必要があります。
ララベル4
php artisan config:publish pragmarx/firewall
ララベル5
php artisan vendor:publish --provider="PragmaRXFirewallVendorLaravelServiceProvider"
アントニオ・カルロス・リベイロ
ファイアウォールは BSD 3 条項ライセンスに基づいてライセンスされています - 詳細についてはLICENSE
ファイルを参照してください。
プルリクエストや問題は大歓迎です。