{"id":19763,"date":"2024-03-13T16:22:01","date_gmt":"2024-03-13T15:22:01","guid":{"rendered":"https:\/\/www.boc.de\/watchguard-info-portal\/?p=19763"},"modified":"2024-07-24T13:36:58","modified_gmt":"2024-07-24T11:36:58","slug":"howto-haerten-einer-watchguard-firebox-mit-fail2ban-schutz-gegen-sslvpn-logon-brute-force","status":"publish","type":"post","link":"https:\/\/wordpress.boc.de\/watchguard-info-portal\/2024\/03\/howto-haerten-einer-watchguard-firebox-mit-fail2ban-schutz-gegen-sslvpn-logon-brute-force\/","title":{"rendered":"HOWTO: H\u00e4rten einer WatchGuard Firebox mit fail2ban (Schutz gegen SSLVPN Logon Brute-Force)"},"content":{"rendered":"<p>Im Rahmen der Brute-Force-Angriffe auf das WatchGuard SSLVPN Portal haben wir ein Proof of Concept Setup mit einer externen Linux-VM gebaut, um IP-Adressen nach mehreren fehlerhaften Login-Versuchen auf die WatchGuard-eigene auto-blocklist zu setzen.<br \/>\nDie ben\u00f6tigten Scripte und Snippets sind unter der MIT-License auf Github ver\u00f6ffentlicht: <a href=\"https:\/\/watchguard-toolbox-project.github.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/watchguard-toolbox-project.github.io\/<\/a><\/p>\n<p><strong>Update Fireware 12.10.4:\u00a0 <\/strong>Mit dem aktuellen Fireware-Update (Version 12.10.4) kann auch das jetzt integrierte Feature &#8220;Block Failed Logins&#8221; verwendet werden.<br \/>\nEine ausf\u00fchrliche Anleitung dazu finden Sie in diesem <a href=\"https:\/\/www.boc.de\/boc-wp-test\/2024\/07\/howto-konfiguration-des-block-failed-logins-features-in-12-10-4-fail2ban\/\" target=\"_blank\" rel=\"noopener\">HOWTO-Artikel<\/a>.<\/p>\n<h2>Idee \/ Funktionsweise<\/h2>\n<p><!--more--><\/p>\n<ul>\n<li>Setup einer Linux-VM<\/li>\n<li>Installation Konfiguration von syslog-ng<\/li>\n<li>Konfiguration der WatchGuard, loggen via Syslog auf die Linux-VM. <strong>ACHTUNG: syslog ist unverschl\u00fcsselt!<\/strong><\/li>\n<li>Installation und Konfiguration von logrotate, damit die Firewall-Logs auch rotiert werden<\/li>\n<li>Installation von fail2ban<\/li>\n<li>Erweiterung der fail2ban Konfiguration\n<ul>\n<li>\u00dcberwachen der WatchGuard Log Files<\/li>\n<li>Triggern eines Scriptes, das per CLI die angreifende IP auf die auto-blocklist setzt<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>Details<\/h2>\n<h3>Voraussetzung:<\/h3>\n<ul>\n<li>bereits installierte Linux-VM (Distribution eigentlich egal, wir haben ubuntu verwendet, die verwendeten Befehle passen daher typisch f\u00fcr ubuntu und debian)<\/li>\n<li>Ausstattung 1-2 Kerne, 2-4 GB RAM, ca. 20 GB f\u00fcr das Betriebssystem und die Logfiles.<br \/>\nMein eigenes Setup loggt zu einer Standard-Dimension (40GB Logdevice auf der Dimension,<br \/>\ndas ergibt bei mir ca. 30d Vorhaltezeit) sowie eben parallel per syslog zu einer Linux-VM.<br \/>\nAufgrund des t\u00e4glichen Logrotates habe ich hier einen Platzbedarf von unter 3 GB f\u00fcr das<br \/>\ngesamte Logverzeichnis.<\/li>\n<\/ul>\n<h3>Umsetzung:<\/h3>\n<h4>Installation\/Konfiguration syslog-ng<\/h4>\n<p>Installation von syslog-ng mittels:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">apt-get install syslog-ng<\/pre>\n<p>Anpassung der Konfiguration: der folgende Bereich muss in die Datei \/etc\/syslog-ng\/syslog-ng.conf eingetragen werden (am Dateiende ist ausreichend):<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">source s_net {  tcp(ip(10.10.1.5) port(514));\r\n                udp(ip(10.10.1.5) port(514)); };\r\n\r\ndestination d_net_messages { file(\"\/var\/log\/hosts\/$HOST\/syslog\"); };\r\n\r\nlog { source(s_net); filter(f_messages); destination(d_net_messages); };<\/pre>\n<p>Neustart von syslog-ng mittels:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">service syslog-ng restart<\/pre>\n<h4>Konfiguration der Firewall f\u00fcr syslog<\/h4>\n<p>Im Policy Manager unter <strong>Setup =&gt; Logging<\/strong> wird die IP des Syslog-Hosts (unserer Linux-VM) eingetragen.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-19765 \" src=\"https:\/\/www.boc.de\/watchguard-info-portal\/wp-content\/uploads\/2024\/03\/2024-03-13_15h41_29.png\" alt=\"\" width=\"563\" height=\"176\" srcset=\"https:\/\/wordpress.boc.de\/watchguard-info-portal\/wp-content\/uploads\/2024\/03\/2024-03-13_15h41_29.png 780w, https:\/\/wordpress.boc.de\/watchguard-info-portal\/wp-content\/uploads\/2024\/03\/2024-03-13_15h41_29-300x94.png 300w, https:\/\/wordpress.boc.de\/watchguard-info-portal\/wp-content\/uploads\/2024\/03\/2024-03-13_15h41_29-768x240.png 768w\" sizes=\"(max-width: 563px) 100vw, 563px\" \/><\/p>\n<h4>Testen der Syslog-\u00dcbertragung:<\/h4>\n<p>Mit folgendem Kommando sollte auf der Linux-Maschine das Live-Log der WatchGuard zu sehen sein:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">tail -f \/var\/log\/hosts\/&lt;ip.der.firewall&gt;\/syslog<\/pre>\n<p>Dort erscheinen dann auch die Logon-Zeilen des SSLVPN:<\/p>\n<div class=\"highlight-shell notranslate\">\n<div class=\"highlight\">\n<pre>tail -f \/var\/log\/hosts\/&lt;ip.der.firewall&gt;\/syslog <span class=\"p\">|<\/span> grep <span class=\"s2\">\"SSL\"<\/span>\r\n\r\nMar <span class=\"m\">11<\/span> <span class=\"m\">14<\/span>:44:59 <span class=\"m\">10<\/span>.10.1.11 M270-NFR-WUE wgcgi<span class=\"o\">[<\/span><span class=\"m\">12399<\/span><span class=\"o\">]<\/span>: SSL VPN user foo@Firebox-DB from &lt;ip&gt; was rejected - Unspecified.\r\nMar <span class=\"m\">11<\/span> <span class=\"m\">14<\/span>:45:02 <span class=\"m\">10<\/span>.10.1.11 M270-NFR-WUE wgcgi<span class=\"o\">[<\/span><span class=\"m\">12400<\/span><span class=\"o\">]<\/span>: SSL VPN user foo@RADIUS from &lt;ip&gt; was rejected - U<\/pre>\n<\/div>\n<\/div>\n<h4>Installation\/Konfiguration git<\/h4>\n<p>Installation von git mittels:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">apt-get install git<\/pre>\n<h4>Installation fail2ban-for-watchguard<\/h4>\n<p>Die folgenden Kommandos installieren die fail2ban-for-watchguard Komponenten nach \/usr\/local\/fail2ban-for-watchguard\/ &#8211; wo sie von den Scripten und den Config-Dateien auch erwartet werden:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">cd \/usr\/local\/\r\ngit clone https:\/\/github.com\/watchguard-toolbox-project\/fail2ban-for-watchguard.git<\/pre>\n<h4>Konfiguration fail2ban-for-watchguard<\/h4>\n<p>Unter \/usr\/local\/fail2ban-for-watchguard wird eine Datei &#8220;config.sh&#8221; erwartet. (zur Vorlage: config.sh-dist mitgeliefert).<\/p>\n<p>kopieren:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">cd \/usr\/local\/\r\ncp config.sh-dist config.sh<\/pre>\n<p>Mit dem Editor der Wahl editieren, sie sollte dann wie folgt aussehen; nat\u00fcrlich m\u00fcssen IP und Username\/Passwort entsprechend angepasst werden. Hier wird ein Benutzer ben\u00f6tigt, der Schreib-Rechte f\u00fcr die Firewall hat (z.b. admin). Zum Testen sind 3 Minuten sehr gut geeignet, im Live-Betrieb kann man hier durchaus auf 10 oder 20 Minuten gehen. Vorsicht: IPs auf der Blockliste sind generell gesperrt, nicht nur f\u00fcr diesen Dienst. Es w\u00e4re nicht das erste Mal, das sich jemand mittels auto-block-liste selbst von der Firewall aussperrt. (Zitat aus unserem Firewall-Kurs: <em>&#8220;block ist b\u00f6se, denn es macht genau das: blocken.&#8221;<\/em>).<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">#!\/bin\/bash\r\n\r\nFW=10.0.1.1\r\nUSER=admin\r\nPASS=readwrite\r\nTIME=\"minute 3 second 0\"\r\n<\/pre>\n<h4>Absichern der Konfiguration fail2ban-for-watchguard<\/h4>\n<p>Zur Sicherheit sollten die Linux-Dateirechte entsprechend gesetzt werden. fail2ban l\u00e4uft als root, weil es im Normalfall ja auch die lokalen Linux-iptables bearbeiten soll. Daher zur Sicherheit die Ownership und Dateirechte der config.sh entsprechend setzen, damit niemand (au\u00dfer root) diese lesen kann. Dort ist schlie\u00dflich unser Firewall-Passwort enthalten:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">cd \/usr\/local\/fail2ban-for-watchguard\r\nchown root:root config.sh\r\nchmod 700 config.sh<\/pre>\n<h4>Installation fail2ban<\/h4>\n<p>Installation von fail2ban mittels:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">apt-get install fail2ban<\/pre>\n<h4>Anpassung von fail2ban<\/h4>\n<p>Das fail2ban muss entsprechend angepasst werden, damit es die Logfiles \u00fcberwacht, dann muss ein Filter definiert werden, der auf die WatchGuard Log-Zeile matcht und letztlich eine Aktion definiert werden, die ausgef\u00fchrt wird. Die entsprechenden Dateien \/ Snippets sind bereits enthalten.<\/p>\n<p>Mit folgenden Kommandos wird das ganze eingerichtet:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">cd \/usr\/local\/fail2ban-for-watchguard\/\r\n\r\n# Filter-Definition kopieren\r\ncp filter.d-wgsslvpn.conf to \/etc\/fail2ban\/filter.d\/wgsslvpn.conf\r\n\r\n# Action-Definition kopieren\r\ncp action.d-wgsslvpn.conf to \/etc\/fail2ban\/action.d\/wgsslvpn.conf\r\n\r\n# Jail f\u00fcr den neuen Service konfigurieren\r\ncat jail.conf-addon &gt;&gt; \/etc\/fail2ban\/jail.conf<\/pre>\n<p>Abschlie\u00dfend muss fail2ban neu gestartet werden:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">service fail2ban restart<\/pre>\n<h3>Pr\u00fcfung, ob alles funktioniert<\/h3>\n<p>in der Datei \/var\/log\/fail2ban.log werden die Aktionen von fail2ban geloggt:<\/p>\n<pre>tail -f \/var\/log\/fail2ban.log\r\n<span class=\"m\">2024<\/span>-03-11 <span class=\"m\">14<\/span>:44:55,444 fail2ban.filter         <span class=\"o\">[<\/span><span class=\"m\">24195<\/span><span class=\"o\">]<\/span>: INFO    <span class=\"o\">[<\/span>wgsslvpn<span class=\"o\">]<\/span> Found &lt;ip&gt;\r\n<span class=\"m\">2024<\/span>-03-11 <span class=\"m\">14<\/span>:44:59,509 fail2ban.filter         <span class=\"o\">[<\/span><span class=\"m\">24195<\/span><span class=\"o\">]<\/span>: INFO    <span class=\"o\">[<\/span>wgsslvpn<span class=\"o\">]<\/span> Found &lt;ip&gt;\r\n<span class=\"m\">2024<\/span>-03-11 <span class=\"m\">14<\/span>:45:02,819 fail2ban.filter         <span class=\"o\">[<\/span><span class=\"m\">24195<\/span><span class=\"o\">]<\/span>: INFO    <span class=\"o\">[<\/span>wgsslvpn<span class=\"o\">]<\/span> Found &lt;ip&gt;\r\n<span class=\"m\">2024<\/span>-03-11 <span class=\"m\">14<\/span>:45:03,037 fail2ban.actions        <span class=\"o\">[<\/span><span class=\"m\">24195<\/span><span class=\"o\">]<\/span>: NOTICE  <span class=\"o\">[<\/span>wgsslvpn<span class=\"o\">]<\/span> Ban &lt;ip&gt;\r\n<span class=\"m\">2024<\/span>-03-11 <span class=\"m\">14<\/span>:46:03,119 fail2ban.actions        <span class=\"o\">[<\/span><span class=\"m\">24195<\/span><span class=\"o\">]<\/span>: NOTICE  <span class=\"o\">[<\/span>wgsslvpn<span class=\"o\">]<\/span> Unban &lt;ip&gt;<\/pre>\n<h2>Gory Details und weitere Ideen<\/h2>\n<ul>\n<li>Die Datei mit dem Filter ist ziemlich primitiv, das k\u00f6nnte professioneller gestaltet werden.<\/li>\n<li>Ebenso k\u00f6nnen hier weitere Filter dazugeschrieben werden: IKEv2-VPNs, Access Portal logons, etc.<\/li>\n<li>Im Abschnitt f\u00fcr die jail.conf ist die bantime mit 60s angegeben. Dies dient dazu, das fail2ban nach 60s f\u00fcr diese IP erneut scharf zu schalten. Das Unbanning erfolgt aber nicht durch fail2ban getriggert, sondern durch den Automatismus der WatchGuard und deren Auto-Block-Liste. Dies war eine bewusste Design-Entscheidung, denn hierdurch greifen auch die Exceptions der WatchGuard (Ausnahmen, wer NIE geblockt werden soll), zudem gibt es die gewohnten manuellen Eingriffsm\u00f6glichkeiten zum Bearbeiten der Auto-Block-Liste \u00fcber den Firebox System Manager<\/li>\n<li>Zum Erweitern der Blockliste wird per SSH und EXPECT Script die CLI der WatchGuard verwendet.<\/li>\n<li><span style=\"font-size: inherit;\">Die Inhalte der Dateien will ich bewusst nicht hier im Blog-Artikel hinterlegen, da sich diese bei Weiterentwicklung noch ver\u00e4ndern k\u00f6nnen.<br \/>\nSie sind direkt auf github zu finden, falls es jemand vorher ansehen\/pr\u00fcfen m\u00f6chte.<\/span><\/li>\n<\/ul>\n<h2>Links \/ Referenzen<\/h2>\n<ul>\n<li>Homepage des Projektes:\n<ul>\n<li><a href=\"https:\/\/watchguard-toolbox-project.github.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/watchguard-toolbox-project.github.io\/<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/watchguard-toolbox-project\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/watchguard-toolbox-project\/<\/a><\/li>\n<\/ul>\n<\/li>\n<li>Homepage des Fail2Ban-for-Watchguard:<br \/>\n<a href=\"https:\/\/watchguard-toolbox-project.github.io\/fail2ban-for-watchguard.html\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/watchguard-toolbox-project.github.io\/fail2ban-for-watchguard.html<\/a><\/li>\n<li>Github-Repository:<br \/>\n<a href=\"https:\/\/github.com\/watchguard-toolbox-project\/fail2ban-for-watchguard\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/watchguard-toolbox-project\/fail2ban-for-watchguard\/<\/a><\/li>\n<\/ul>\n<div class=\"highlight-shell notranslate\">\n<div class=\"highlight\">\n<h2>Notizen<\/h2>\n<ul>\n<li>Kommentare willkommen.<\/li>\n<li><span style=\"font-size: inherit;\">Pull-Requests werden ebenfalls gerne gesehen.<\/span><\/li>\n<\/ul>\n<h2>Update Fireware 12.10.4<\/h2>\n<p>Mit dem aktuellen Fireware-Update (Version 12.10.4) kann auch das jetzt integrierte Feature &#8220;Block Failed Logins&#8221; verwendet werden.<br \/>\nEine ausf\u00fchrliche Anleitung dazu finden Sie in diesem <a href=\"https:\/\/www.boc.de\/boc-wp-test\/2024\/07\/howto-konfiguration-des-block-failed-logins-features-in-12-10-4-fail2ban\/\" target=\"_blank\" rel=\"noopener\">&gt;&gt; HOWTO-Artikel<\/a>.<\/p>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Im Rahmen der Brute-Force-Angriffe auf das WatchGuard SSLVPN Portal haben wir ein Proof of Concept Setup mit einer externen Linux-VM gebaut, um IP-Adressen nach mehreren fehlerhaften Login-Versuchen auf die WatchGuard-eigene auto-blocklist zu setzen. Die ben\u00f6tigten Scripte und Snippets sind unter der MIT-License auf Github ver\u00f6ffentlicht: https:\/\/watchguard-toolbox-project.github.io\/ Update Fireware 12.10.4:\u00a0 Mit dem aktuellen Fireware-Update (Version 12.10.4) kann auch das jetzt integrierte Feature &#8220;Block Failed Logins&#8221; verwendet &hellip; <a href=\"https:\/\/wordpress.boc.de\/watchguard-info-portal\/2024\/03\/howto-haerten-einer-watchguard-firebox-mit-fail2ban-schutz-gegen-sslvpn-logon-brute-force\/\" class=\"more-link\">Weiterlesen <span class=\"screen-reader-text\">HOWTO: H\u00e4rten einer WatchGuard Firebox mit fail2ban (Schutz gegen SSLVPN Logon Brute-Force)<\/span> <span class=\"meta-nav\">&raquo;<\/span><\/a><\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[362,3],"tags":[1045,34,1056,1058,1062,304,89,1057,518],"class_list":["post-19763","post","type-post","status-publish","format-standard","hentry","category-howto","category-watchguard-technischer-blog","tag-brute-force","tag-cli","tag-fail2ban","tag-firewall-haertung","tag-hardening","tag-ssl-vpn","tag-sslvpn","tag-syslog","tag-watchguard"],"_links":{"self":[{"href":"https:\/\/wordpress.boc.de\/watchguard-info-portal\/wp-json\/wp\/v2\/posts\/19763"}],"collection":[{"href":"https:\/\/wordpress.boc.de\/watchguard-info-portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.boc.de\/watchguard-info-portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.boc.de\/watchguard-info-portal\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.boc.de\/watchguard-info-portal\/wp-json\/wp\/v2\/comments?post=19763"}],"version-history":[{"count":22,"href":"https:\/\/wordpress.boc.de\/watchguard-info-portal\/wp-json\/wp\/v2\/posts\/19763\/revisions"}],"predecessor-version":[{"id":21273,"href":"https:\/\/wordpress.boc.de\/watchguard-info-portal\/wp-json\/wp\/v2\/posts\/19763\/revisions\/21273"}],"wp:attachment":[{"href":"https:\/\/wordpress.boc.de\/watchguard-info-portal\/wp-json\/wp\/v2\/media?parent=19763"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.boc.de\/watchguard-info-portal\/wp-json\/wp\/v2\/categories?post=19763"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.boc.de\/watchguard-info-portal\/wp-json\/wp\/v2\/tags?post=19763"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}