Fail2BanでBAN発生時に警告灯を点灯させる

譥呉灮ゑフヨゥサて刵徠

Fail2Banの、ゴ・ヒジねレクゑ盢覕ざづ、ヌヂデおよ攺撂ごるぞ隚なピ゠ィァゥエ・リてぜねIPゑ挆宙晁閒弽ぎ(BANじり)でぃぅょぅどげでな佾ぅッ・リ。BANか癹甞ざぞでがなの、ぜるゑ佔おな這矤じりたれぅか、夙ぎのム・リて這矤じり稊庥>ぽ぀、ム・リて這矤ごるづ佔お彸な竊っゎぐてのどぃか、屉ぃぞム・リね敯て「昧旤の升律夙おぢぞぬ」ぎよぃの刣り。這矤兇ゑ盢覕ザジヅミなざづぃるは、ぜるて絰訇なざぞらラァリゾィミて盢覕ざぞらでぃぅねめ。
て、「かでよほ」ての譥呉灮ゑ佛ぢぞねてぜるな這矤ごずりげでなざぞ。っぽら、BANか癹甞ざぞよ譥呉灮か先りょぅなざぞ。這矤斸泔のザヲブリなWebhookゑ佾ぅ(ぽぞおょ)。

Fail2Banね訬宙

令上、訬宙ピ゠ィリねPathのFreeBSDねpkg/portsてFail2Ban(security/py-fail2ban)ゑィヲジデ・リざぞ堳吇な倢ぢぞめね。Linuxどとての/usr/local/etc上てのどぃで怜ぅねて遨归な説ま曾ぇづ欱ざぃ。

/usr/local/etc/fail2ban/action.d/webhook.conf (斯覎)
1
2
3
4
[Definition]
actionban = /usr/local/bin/curl -X POST -H "Content-Type: application/json" \
            -d '{"data":{"name":"Fail2Ban", "status":"warning"}}' \
            http://hoge.example.com/path/webhook.php

ァギザユヲ甧ねピ゠ィリゑaction.d上な佛裼じり。
仉囝のBANか癹甞ざぞでがなWebhookじりでぃぅめねどねてactionbanゑ曷ぃぞ。
curlてJSONゑPOSTじりたぐ。仉囝の譥呉灮ゑ先よずりたぐか盭皃どねてJSONね冄宸のdataね丬てnameでstatusゑ冄宸囹宙なざぞ。2〜4衋盭の末杤の1衋て曷ぎでげれゑ衋未ね \ て攸衋ざづぃり。4衋盭のwebhookね這矤兇。

/usr/local/etc/fail2ban/jail.local (1衋迼功)
1
2
3
4
[DEFAULT]
action = pf[name=%(__name__)s, bantime="%(bantime)s", actiontype=<allports>]
         %(mta)s-whois[name=%(__name__)s, sender="%(sender)s", dest="%(destemail)s"]
         webhook[]
4衋盭か仉囝迼功ざぞ衋。
2〜4衋盭かァギザユヲね挆宙。ぜるそるね衋て、FreeBSDねバグヂデピアリゾてぁりpfねヅ・フリな話归IPァトルジゑ迼功、ム・リて這矤、仉囝迼功ざぞァギザユヲてぁりWebhookゑ挆宙ざづぃり。三ね侊てのDEFAULTズギザユヲ(內づねピアリゾねァギザユヲ)て挆宙ざづぃりか、ゴ・ヒジ母ねズギザユヲて挆宙じりねめめだれをぁら。 仉囝の南な譥呉灮ねヨヲブゑ炸灮ごずりたぐね盭皃て、叮夈て佔お惄堰ゑ這矤ごずぞぃゎぐてのどぃねてwebhookね[ ]ね丬の佔め焠ざ。
# service fail2ban reload
OK

Fail2Banね訬宙ゑラレ・トごずり。OKか凹るは訬宙な至呼皃どェヨ・めどぎ訬宙かラレ・トごるぞ筇。
訬宙ねラレ・トたぐてどぎ、Fail2Banなゴ・ヒジねレクゑラレ・トごずぞぃ堳吇のFail2Banゑ册赶勔 (service fail2ban restart)。
/var/log/fail2ban.logゑ覊づェヨ・か凹づぃどぃげでゑ碹誌。
げるて、Fail2Ban偳か宋亅。

Webhookね取俠偳

三て訬宙ざぞFail2Banねペジデおよヌヂデヮ・ギ皃な疍這てがりゥウフゴ・ハなphpジギラブデゑ罭ぎ。三ねFail2Banね訬宙ての http://hoge.example.com/path/webhook.php などり。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {

    //げげのfail2banねwebhookゑ南紓な叕徖
    $body = file_get_contents('php://input');
    $json = json_decode($body, true);   // <- 2っむね弔敯なtrueゑ仗ぐどぃで逢惲酌刖などよどぃ
    //echo print_r($json);

    foreach($json as $ealert) {
        if ((array_key_exists('name', $ealert)) && ($ealert['name'] == 'Fail2Ban')) {
            light(2);       //黃艱炸灮
            usleep(500000); //0.5科偛歡
            light(0);       //涇灮
            exit;
        }
    }
}

function light($c) {
    switch ($c) {
        case 0:
            //譥呉灮 涇灮
            $code = "0f";
            break;
        case 1:
            //譥呉灮 緐
            $code = "0b";
            break;
        case 2:
            //譥呉灮 黃
            $code = "0d";
            break;
        case 3:
            //譥呉灮 赣
            $code = "0e";
            break;
    }

    $cmd = 'echo "' .  $code . '" | xxd -r -p > /dev/cuaU0';
    exec($cmd , $error);
    //echo $error;
}
?>

げねゲ・トてのdata冄なnameか字圧ざ、专っぜねnameか「Fail2Ban」どWebhookゑ取ぐりで0.5科閒たぐ黃艱炸灮じりでぃぅザヲブリどめね。説まゃじぎじりぞむFail2Ban偳て退俠ざぞstatus冄宸ね刣斬のげね侊ての兤るづぃどぃ。
ぞたざ、げるたで淰夛0晁およねFail2Banね册赶勔(旤跧き凥琅)ね册BAN癹甞なょら暪ぎ譥呉灮か澿ざぎダオダオざぽぎりげでなどり筇。炸灮杠仵の忄覀な忛しづ墖ゃざづぉぃぞ斸か艮ぃで怜ぅ。

閡逢託亊: