Este é um pacote de "soft-firewall". Seu objetivo é ajudar as pessoas a impedir o acesso não autorizado a rotas por endereço IP . Ele é capaz de rastrear IPs, países e hosts (ip dinâmico) e redirecionar usuários não autorizados para, por exemplo, uma página “Em breve”, permitindo que IPs na lista de permissões tenham acesso a todo o site. Agora também é capaz de detectar e bloquear ataques (muitas solicitações) de IPs únicos ou de países inteiros.
Este pacote pode evitar algumas dores de cabeça e ajudá-lo a bloquear alguns acessos aos seus aplicativos, mas não pode substituir firewalls e dispositivos. Para ataques em nível de rede, você ainda precisará de um firewall real.
Todos os endereços IP nessas listas não poderão acessar rotas filtradas pelo filtro de lista negra.
Esses endereços IP, intervalos ou países podem
O Firewall é capaz de detectar ataques simples à sua página, contando solicitações do mesmo IP ou país. Basta habilitá-lo em seu config/firewall.php
e, para receber notificações, configurar o serviço Slack em config/services.php
:
' slack ' => [
' webhook_url ' => env ( ' SLACK_WEBHOOK_URL ' ),
],
e adicione o método de notificação de rota ao seu modelo de usuário:
/**
* Route notifications for the Slack channel.
*
* @return string
*/
public function routeNotificationForSlack ()
{
return config ( ' services.slack.webhook_url ' );
}
As listas de IPs (branco e negro) podem ser armazenadas em array, arquivos e banco de dados. Inicialmente o acesso ao banco de dados às listas está desabilitado, então, para testar a configuração do seu Firewall você pode publicar o arquivo de configuração e editar os arrays blacklist
ou 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',
),
O arquivo (por exemplo /usr/bin/firewall/blacklisted.txt
) deve conter um IP, intervalo ou nome de arquivo por linha e, sim, ele procurará arquivos recursivamente, para que você possa ter um arquivo de arquivos se precisar :
127.0.0.2
10.0.0.0-10.0.0.100
/tmp/blacklist.txt
Endereços IP não incluídos na lista de permissões podem ser bloqueados ou redirecionados. Para configurar o redirecionamento você terá que publicar o arquivo config.php
e configurar:
' redirect_non_whitelisted_to ' => ' coming/soon ' ,
Você tem acesso aos seguintes comandos:
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.
Esses são resultados de 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 | |
+-----------------------+-----------+-----------+
Você também pode usar o Firewall Facade
para gerenciar as listas:
$ 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 );
}
Retorne uma resposta de bloqueio de acesso:
return Firewall:: blockAccess ();
Eventos suspeitos serão (se desejar) registrados, então tail
frente:
php artisan tail
Você pode bloquear um país, em vez de um endereço IP, passando country:<2-letter ISO code>
. Então, para bloquear todos os endereços IP do Brasil, você faz:
php artisan firewall:blacklist country:br
Você terá que adicionar este requisito ao seu arquivo composer.json
:
"geoip/geoip": "~1.14"
ou
"geoip2/geoip2": "~2.0"
Você precisa habilitar a pesquisa de país em seu arquivo de configuração firewall.php:
' enable_country_search ' => true,
E você pode programar este comando para atualizar o banco de dados GeoIp de suas cidades regularmente:
php artisan firewall:updategeoip
Você pode encontrar esses códigos aqui: isocodes
Você pode impedir que os usuários acessem algumas páginas apenas para a sessão atual, usando estes métodos:
Firewall:: whitelistOnSession ( $ ip );
Firewall:: blacklistOnSession ( $ ip );
Firewall:: removeFromSession ( $ ip );
Clique aqui para ver como funciona e caso precise de ajuda para descobrir alguma coisa, experimente este repositório.
Exija o pacote Firewall usando o Composer:
composer require pragmarx/firewall
Laravel 5.5 e superior
Você não precisa fazer mais nada, este pacote usa o recurso Package Auto-Discovery e deve estar disponível assim que você instalá-lo via Composer.
Laravel 5.4 e abaixo
Adicione o provedor de serviços e a fachada ao seu app/config/app.php:
PragmaRX Firewall Vendor Laravel ServiceProvider::class,
' Firewall ' => PragmaRX Firewall Vendor Laravel Facade::class,
Adicione middlewares ao seu 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,
];
ou
protected $ middlewareGroups = [
' web ' => [
...
],
' api ' => [
...
],
' firewall ' => [
PragmaRX Firewall Middleware FirewallBlacklist::class,
PragmaRX Firewall Middleware BlockAttacks::class,
],
];
Então você pode usá-los em suas rotas:
Route:: group ([ ' middleware ' => ' fw-block-blacklisted ' ], function ()
{
Route:: get ( ' / ' , ' HomeController@index ' );
});
Ou você pode usar ambos. No exemplo a seguir, o grupo de permissão dará acesso gratuito à página 'em breve' e bloqueará ou apenas redirecionará endereços IP não incluídos na lista de permissões para outro, enquanto ainda bloqueia o acesso aos que estão na lista negra.
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 ' );
});
});
Nota: Você pode adicionar outro middleware já criado aos novos grupos simplesmente adicionando-o ao grupo de middleware fw-allow-wl
ou fw-block-bl
.
Migre seu banco de dados
php artisan migrate
Aviso: Se você já possui um pacote de Firewall instalado e migrado, será necessário atualizar o nome da migração, na tabela migrations
, para 2014_02_01_311070_create_firewall_table
, caso contrário, o comando de migração falhará, informando que a tabela já existe.
Para publicar o arquivo de configuração você terá que:
Laravel4
php artisan config:publish pragmarx/firewall
Laravel5
php artisan vendor:publish --provider="PragmaRXFirewallVendorLaravelServiceProvider"
Antonio Carlos Ribeiro
O Firewall é licenciado sob a licença BSD de 3 cláusulas - consulte o arquivo LICENSE
para obter detalhes
Solicitações pull e problemas são mais que bem-vindos.