Fail2Ban

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Registriere dich um viele Vorteile zu genießen! Weniger Werbung, bessere Kommunikation und vieles mehr!

  • Fail2ban ist ein Dienst, welcher bestimmte IP Adressen, die wahrscheinlich zu Angreifern gehören, blockiert. Dieser Dienst ermittelt aus Log Dateien fehlgeschlagene Anmeldungen und sperrt diese IP Adressen dann.
    In diesem Tutorial zeige ich wie man sehr schnell Fail2ban einrichtet und sogar an Blocklist.de mit einbindet.

    Einleitung



    Meiner Meinung nach sollte jeder Server sich mit dem Dienst Fail2ban gegen Brute-Force-Methode absichern.
    Fail2ban besteht darin Angreifer zu erkennen, vor allem Bots, welche versuchen durch ausprobieren des Users und des Passworts sich Zugriff zum Server zu verschaffen.

    Installation



    Fail2ban ist sehr einfach zu installieren. Einfach sudo apt-get install fail2ban eingeben und Enter drücken. ;)
    Jetzt sollte Fail2ban installiert sein. Um Fail2ban richtig zu konfigurieren, sollten wir diesen Dienst nun stoppen service fail2ban stop oder systemctl stop fail2ban.

    Script Installation (only Debian / Ubuntu)



    Ich habe ein ganze einfaches Script geschrieben, welches gleich die neuste Version von fail2ban herunterlädt und installiert.
    Wenn man vorher schon Fail2ban installiert hatte, muss man es deinstallieren: apt-get purge fail2ban.
    Danach geht man ins root Verzeichnis cd /root und jetzt laden wir mit wget das Script herunter wget https://dev-tek.de/Attachment/532-fail2ban-setup-sh/ -O fail2ban-setup.sh.
    Dieses machen wir nun ausführbar mit chmod +x fail2ban-setup.sh und führen es aus ./fail2ban-setup.sh.
    Jetzt kann man einfach die jail.local bearbeiten in /etc/fail2ban/jail.local. Diese Datei ist jetzt schon vorhanden. Alles weiter kann man in Schritt 3. Konfiguration lesen.
    Die Kurzfassung von den Befehlen hier einmal:
    wget https://dev-tek.de/Attachment/532-fail2ban-setup-sh/ -O fail2ban-setup.sh && chmod +x fail2ban-setup.sh && ./fail2ban-setup.sh


    Der Vorteil darin besteht, das Fail2ban jetzt schon IPv6 unterstützt.


    Konfigurieren



    Als Erstes laden wir diese ZIP Datei herunter. Als Nächstes entpacken wir diese Datei, darin sollte ein fail2ban Ordner zu finden sein.
    Da eigentlich somit alle Configs mitgebracht werden, leeren wir das ganze fail2ban Verzeichnis rm -R /etc/fail2ban/*.
    Jetzt laden wir die Dateien mit allen Unterordnen in das Verzeichnis /etc/fail2ban hoch.
    Die jail.local sollte sich jetzt direkt im Verzeichnis /etc/fail2ban befinden.

    Als Nächstes konfigurieren wir die jail.local Datei.
    In Zeile 2 befinden sich die Includes, die auf das jeweilige System angepasst werden muss. Debian und Ubuntu nutzten die gleiche Datei.
    In Zeile 16 befindet sich die Sender Adresse, hier ändern wir einfach den Hostname z.B.: sender = fail2ban@dev-tek.local.

    Standardgemäß ist fail2ban so konfiguriert, dass Blocklist genutzt wird. Dies kann man in Zeile 39 aber abändern. Einfach die jeweilige Action die davor aufgelistet sind eintragen. Zum Beispiel: action = %(action_blocklist_de)s oder action = %(action_mwl)s

    Ab Zeile 42 findet man die einzelnen Dienste. Solltet ihr einen dieser Dienste benutzen, müsst ihr einfach von enabled = false zu enabled = true setzen.

    Blocklist API nutzen



    Damit wir die Blocklist API nutzen können, müssen wir uns einen Account bei Blocklist erstellen.
    Wir gehen einfach auf Blocklist.de und drücken registrieren. Nun einfach die Schritte durchführen und man bekommt sein Passwort per E-Mail zugeschickt.

    Sollte dies alles geklappt haben loggen wir uns ein und klicken auf den Reiter Server.
    Da klicken wir nun auf "Neuen Server einrichten".



    Jetzt müssen wir das Formular ausfüllen.



    1. Als Namen können wir Eintragen wir wollen.
    2. Als IPs, die jeweilige IP Adressen des Servers.
    3. Die Absender Adresse muss mit der Adresse, die wir zuvor in Fail2ban eingetragen haben übereinstimmen.
    4. Den API Key lassen wir einfach leer.

    Jetzt sollte der Server in der Übersicht zu sehen sein.



    Der API Key sollte nun auch generiert worden sein. Bei mir lautet der API Key: fc98fe8a8e.
    Diesen API Key fügen wir jetzt in Zeile 24 ein. blocklist_de_apikey = fc98fe8a8e

    Jetzt sollte der Server schon alle Angreifer an Blocklist reporten und Blocklist schreibt dann einen Abuse Report an den IP Inhaber.

    Blocklist



    Blocklist automatisch einbinden (only Debian 7/8 / Ubuntu)



    Dieses Script bindet die Blocklist automatisch ein. Zu jeder vollen Stunden, werden dann die neuen gesperrte und die entsperrten IPs geupdatet.
    Einfach wieder per wget herunterladen: wget https://dev-tek.de/Attachment/533-blocklist-setup-sh/ -O blocklist-setup.sh.
    Ausführbar machen chmod +x blocklist-setup.sh und ausführen ./blocklist-setup.sh.
    Zusammengefasst sieht der ganze Befehl so aus:
    wget https://dev-tek.de/Attachment/533-blocklist-setup-sh/ -O blocklist-setup.sh && chmod +x blocklist-setup.sh && ./blocklist-setup.sh



    Blocklist manuell einbinden



    Dieses Script führt ihr einfach einmal am Tag aus und es blockiert dann alle IPs die bei Blocklist gelistet sind. Ihr führt es mit perl blocklist.pl aus.

    Automatisiert mit Crontab sieht das ganze so aus:

    Ihr führt crontabe -e in der Console aus und bearbeitet es mit nano.

    Hier fügt ihr

    0 3 * * * perl /root/blocklist.pl > /dev/null 2>&1 ein.

    Nun mit CTRL + X dann CTRL + Y und Enter speichern und fertig.

    Perl-Quellcode: blocklist.pl

    1. ################################################################
    2. ###### Script to check Blocklist.de list. Block new IP ######
    3. ###### and unblock deleted entrys ######
    4. ################################################################
    5. ## config ##
    6. my $listUrl = "http://lists.blocklist.de/lists/all.txt";
    7. my $fileName = "Blocklist.txt";
    8. my $tmpDir = "/tmp";
    9. my $file = "$tmpDir/$fileName";
    10. my $logFile = "/var/log/blocklist";
    11. ## binarys ##
    12. my $iptables = "/sbin/iptables";
    13. my $ipset = "/sbin/ipset";
    14. my $grep = "/bin/grep";
    15. my $rm = "/bin/rm";
    16. my $wget = "/usr/bin/wget";
    17. ## plain variables ##
    18. my($row, $Blocklist, $line, $check, $checkLine, $result, $output, $ipRegex, $message);
    19. my ($added, $removed, $skipped);
    20. $added = $removed = $skipped = 0;
    21. ## init arrays ##
    22. my @fileArray = ();
    23. my @ipsetArray = ();
    24. ## init hashes for faster searching
    25. my %ipsetArray;
    26. my %fileArray;
    27. my $dateTime;
    28. my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
    29. my @months = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
    30. my @days = qw(Sun Mon Tue Wed Thu Fri Sat Sun);
    31. #****************************#
    32. #*********** MAIN ***********#
    33. #****************************#
    34. logging("Starting blocklist refresh");
    35. &iptablesCheck();
    36. &getFileArray();
    37. &getIpsetArray();
    38. &addIpsToBlocklist();
    39. &remIpsFromBlocklist();
    40. &cleanup();
    41. exit;
    42. #***** END MAIN *****#
    43. #****************************#
    44. #******* Subroutines ********#
    45. #****************************#
    46. ############# iptablesCheck ###############
    47. ## checks if all necessary ##
    48. ## iptable/ipset Settings have been set ##
    49. ###########################################
    50. sub iptablesCheck {
    51. ## Do we have an BLOCKLIST/DROP Chain?
    52. if (`$iptables -L -n | $grep BLOCKLIST` =~ m/Chain BLOCKLIST/) {
    53. } else {
    54. $message = "Creating Chain BLOCKLIST";
    55. logging($message);
    56. `$iptables -N BLOCKLIST`;
    57. `$iptables -A BLOCKLIST -m limit --limit 2/min -j LOG --log-prefix "Blocklist Dropped: " --log-level 4`;
    58. `$iptables -A BLOCKLIST -j DROP`;
    59. }
    60. ## Do we have an ipset list called blocklist?
    61. if(`$ipset list -n | $grep blocklist` =~ m/blocklist/) {
    62. } else {
    63. `$ipset -N blocklist iphash --hashsize 4096`;
    64. $message = "Created ipset list blocklist";
    65. logging($message);
    66. }
    67. ## Is there an forwarded from INPUT to BLOCKLIST?
    68. if (`$iptables -L INPUT | $grep BLOCKLIST`=~ m/BLOCKLIST/) {
    69. } else {
    70. `$iptables -I INPUT -m set --match-set blocklist src -j BLOCKLIST`;
    71. $message = "Creating forward to BLOCKLIST chain";
    72. logging($message);
    73. }
    74. }
    75. ######## END iptablesCheck ########
    76. ########## getFileArray #############
    77. ## downloads the Blocklist.txt and ##
    78. ## pushes it into an array ##
    79. #####################################
    80. sub getFileArray {
    81. `$wget -q -O $tmpDir/$fileName $listUrl && echo "Downloaded temp file to $tmpDir/$fileName" || echo "Can not download file.... stopping"`;
    82. open(INFO, $file) or die("Could not open file.");
    83. foreach $line (<INFO>) {
    84. push(@fileArray, $line);
    85. }
    86. close(INFO);
    87. chomp(@fileArray);
    88. %fileArray = map {$_ => 1 } @fileArray;
    89. }
    90. ####### END getFileArray ##########
    91. ######### getIpsetArray ##########
    92. ## runs ipset list blocklist ##
    93. ## and pushes it into ##
    94. ## array ipsetList ##
    95. ##################################
    96. sub getIpsetArray {
    97. $output = `$ipset list blocklist`;
    98. @ipsetArray = split("\n", $output);
    99. # %ipsetArray = map { $_ => 1} @ipsetArray;
    100. #remove the first 6 Elements of our Array using splice (ipset header info)
    101. splice @ipsetArray, 0, 6;
    102. %ipsetArray = map { $_ => 1} split("\n", $output);
    103. }
    104. ##### END getIpsetArray #########
    105. ######## addIpsToBlocklist ######
    106. ## adds IPs to our blocklist ##
    107. #################################
    108. sub addIpsToBlocklist {
    109. foreach $line (@fileArray) {
    110. if (exists $ipsetArray{"$line"}) {
    111. $skipped++;
    112. } else {
    113. if ($line eq &isIpv4($line)) {
    114. $result = `$ipset -A blocklist $line`;
    115. $added++;
    116. $message = "added $line";
    117. logging($message);
    118. } else {
    119. $skipped++;
    120. }
    121. }
    122. }
    123. }
    124. ######## END addIpsToBlocklist ######
    125. ########## remIpsFromBlocklist ########
    126. ## remove IPs from our blocklist ##
    127. #####################################
    128. sub remIpsFromBlocklist {
    129. foreach $line (@ipsetArray) {
    130. if (exists $fileArray{"$line"}) {
    131. $skipped++;
    132. } else {
    133. if ($line eq &isIpv4($line)) {
    134. $result = `$ipset -D blocklist $line`;
    135. $message = "removed $line";
    136. logging($message);
    137. $removed++;
    138. } else {
    139. $skipped++;
    140. }
    141. }
    142. }
    143. }
    144. ######## END remIpsFromBlocklist ########
    145. ################## cleanup ###################
    146. #### Cleanup: move tmp file to new place #####
    147. ##############################################
    148. sub cleanup {
    149. $result = `$rm $tmpDir/$fileName && echo "Deleted file $tmpDir/$fileName" || echo "Can\t delete file $tmpDir/$fileName"`;
    150. $message = "We added $added, removed $removed, skipped $skipped Rules";
    151. logging($message);
    152. }
    153. ############### END cleanup ######################
    154. ############ isIpv4 #############
    155. ## check if given value looks ##
    156. ## like an ipv4 ip address ##
    157. #################################
    158. sub isIpv4 {
    159. my ($isIp) = @_;
    160. if ($isIp =~ m/^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/) {
    161. #print "It's an IPv4\n";
    162. return $isIp;
    163. } else {
    164. return 0;
    165. }
    166. }
    167. ######### END isIpv4 ##########
    168. ###### log #######
    169. ## log $message ##
    170. ##################
    171. sub logging {
    172. my ($message) = @_;
    173. ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime();
    174. open my $fh, ">>", $logFile
    175. or die "Can't open logfile: $!";
    176. $dateTime = sprintf("$months[$mon] %02d %02d:%02d:%02d ", $mday,$hour,$min,$sec);
    177. print $fh "$dateTime $message\n";
    178. print "$message\n";
    179. close($fh);
    180. }
    181. #### end log #####
    182. ######### EOF ###########
    Alles anzeigen

    Script: forum.blocklist.de/viewtopic.php?f=11&t=205
    Dateien

    319 mal gelesen

Kommentare 2