<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Malte&#39;s OpenSource Talk</title>
    <link>https://beli3ver.writeas.com/</link>
    <description>#Linux #OpenSource #FOSS</description>
    <pubDate>Sun, 05 Apr 2026 06:05:02 +0000</pubDate>
    <item>
      <title>Crontabs für Filerun</title>
      <link>https://beli3ver.writeas.com/crontabs-fur-filerun?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[Seit heute habe ich filerun im Einsatz.&#xA;Es läuft wirklich wunderbar. Doch habe ich mich nach der Einrichtung gewundert, dass Dateien, die ich mit rsync auf den Server geschoben habe, zwar angezeigt werden, diese aber nicht als Medientypen erkannt werden.&#xA;Also nicht automatisch als Videos, Bilder oder z.B. PDF Dokumente.&#xA;Nach einigen Forschen in der Dokumentation, wurde mir dann bewusst, dass Dateien, die manuell auf den Server geschoben werden und nicht über das Webfrontend, manuell erkannt werden müssen.&#xA;Filerun hat in seinem Stammverzeichnis extra hierfür ein cron Verzeichnis mit den wichtigsten Dateien für die Wartung der Installation angelegt.&#xA;Dazu habe ich jetzt folgende Cronjobs angelegt:&#xA;&#xA;/15    &#x9;root&#x9;php -c /etc/php/7.4/apache2/conf.d/filerun.ini /var/www/html/filerun/cron/metadataindex.php&#xA;/15    &#x9;root&#x9;php -c /etc/php/7.4/apache2/conf.d/filerun.ini /var/www/html/filerun/cron/indexfilenames.php /filerun/ true&#xA;/15    &#x9;root&#x9;php -c /etc/php/7.4/apache2/conf.d/filerun.ini /var/www/html/filerun/cron/reindexfiles.php&#xA;/15    &#x9;root&#x9;php -c /etc/php/7.4/apache2/conf.d/filerun.ini /var/www/html/filerun/cron/emptytrash.php –days 30&#xA;/15    &#x9;root&#x9;php -c /etc/php/7.4/apache2/conf.d/filerun.ini /var/www/html/filerun/cron/pathscleanup.php&#xA;/15    &#x9;root&#x9;php -c /etc/php/7.4/apache2/conf.d/filerun.ini /var/www/html/filerun/cron/make_thumbs.php&#xA;&#xA;Die folgenden Cronjobs erledigen folgenden Aufgaben:&#xA;Erkennen der Metadaten und erkennen von Mediendateien&#xA;Aufnahme der Dateinamen in die Suche&#xA;Indexieren von allen Dateien&#xA;Im Papierkorb alle Dateien löschen, die älter als 30 Tage sind&#xA;Manuell gelöscht Dateien aus dem Index entfernen&#xA;Erstellen von Thumbnails&#xA;&#xA;Jetzt werden wieder im Webfrontend alle Dateien ordentlich in entsprechender Struktur angezeigt.&#xA;&#xA;#filerun #cron #linux #debian #php]]&gt;</description>
      <content:encoded><![CDATA[<p>Seit heute habe ich <a href="https://filerun.com" rel="nofollow">filerun</a> im Einsatz.
Es läuft wirklich wunderbar. Doch habe ich mich nach der Einrichtung gewundert, dass Dateien, die ich mit rsync auf den Server geschoben habe, zwar angezeigt werden, diese aber nicht als Medientypen erkannt werden.
Also nicht automatisch als Videos, Bilder oder z.B. PDF Dokumente.
Nach einigen Forschen in der <a href="https://docs.filerun.com/admin_guide" rel="nofollow">Dokumentation</a>, wurde mir dann bewusst, dass Dateien, die manuell auf den Server geschoben werden und nicht über das Webfrontend, manuell erkannt werden müssen.
Filerun hat in seinem Stammverzeichnis extra hierfür ein <code>cron</code> Verzeichnis mit den wichtigsten Dateien für die Wartung der Installation angelegt.
Dazu habe ich jetzt folgende Cronjobs angelegt:</p>

<pre><code class="language-bash">*/15 * * * *	root	php -c /etc/php/7.4/apache2/conf.d/filerun.ini /var/www/html/filerun/cron/metadata_index.php
*/15 * * * *	root	php -c /etc/php/7.4/apache2/conf.d/filerun.ini /var/www/html/filerun/cron/index_filenames.php /filerun/ true
*/15 * * * *	root	php -c /etc/php/7.4/apache2/conf.d/filerun.ini /var/www/html/filerun/cron/reindex_files.php
*/15 * * * *	root	php -c /etc/php/7.4/apache2/conf.d/filerun.ini /var/www/html/filerun/cron/empty_trash.php –days 30
*/15 * * * *	root	php -c /etc/php/7.4/apache2/conf.d/filerun.ini /var/www/html/filerun/cron/paths_cleanup.php
*/15 * * * *	root	php -c /etc/php/7.4/apache2/conf.d/filerun.ini /var/www/html/filerun/cron/make_thumbs.php
</code></pre>

<p>Die folgenden Cronjobs erledigen folgenden Aufgaben:
– Erkennen der Metadaten und erkennen von Mediendateien
– Aufnahme der Dateinamen in die Suche
– Indexieren von allen Dateien
– Im Papierkorb alle Dateien löschen, die älter als 30 Tage sind
– Manuell gelöscht Dateien aus dem Index entfernen
– Erstellen von Thumbnails</p>

<p>Jetzt werden wieder im Webfrontend alle Dateien ordentlich in entsprechender Struktur angezeigt.</p>

<p><a href="https://beli3ver.writeas.com/tag:filerun" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">filerun</span></a> <a href="https://beli3ver.writeas.com/tag:cron" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">cron</span></a> <a href="https://beli3ver.writeas.com/tag:linux" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">linux</span></a> <a href="https://beli3ver.writeas.com/tag:debian" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">debian</span></a> <a href="https://beli3ver.writeas.com/tag:php" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">php</span></a></p>
]]></content:encoded>
      <guid>https://beli3ver.writeas.com/crontabs-fur-filerun</guid>
      <pubDate>Thu, 29 Dec 2022 12:08:38 +0000</pubDate>
    </item>
    <item>
      <title>IP&#39;s an AbuseIPDB melden (Fail2Ban)</title>
      <link>https://beli3ver.writeas.com/ips-an-abuseipdb-melden-fail2ban?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[In meinem letzten Artikel habe ich erklärt, wie man unter Linux die Firewall mit einem IP Block ausstatten kann.&#xA;In diesem Artikel möchte ich euch erklären, wie ihr auch IP&#39;s melden könnt, und somit der Community wieder was zurückgeben könnt.&#xA;&#xA;Fail2Ban installieren&#xA;&#xA;Fail2Ban ist schnell installiert:&#xA;&#xA;apt install -y fail2ban&#xA;&#xA;Fail2Ban und UFW&#xA;&#xA;Wie im ersten Artikel bereits beschrieben, nutze ich als Firewall für meine Systeme UFW. Damit Fail2Ban mit UFW sprechen kann, müssen wir kleine Anpassung machen.&#xA;Als Erstes müssen wir die Datei jail.local erstellen, dazu macht einfach folgendes:&#xA;&#xA;cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local&#xA;In der jail.local such jetzt bitte die folgende Zeile (ist bei mir die 167):&#xA;&#xA;banaction = ....&#xA;Alles hinter dem Gleichzeichen entfernen und ufw angeben.&#xA;&#xA;Fail2Ban und AbuseIPDB&#xA;&#xA;Als Nächstes müssen wir in der jail.local noch eine Änderung vornehmen.&#xA;Sucht in der Datei, im [DEFAULT] Block bitte die folgende Zeile (ist bei mir 228 kurz vor dem sshd Jail):&#xA;&#xA;action = %(action)s&#xA;Diese muss durch die folgende erstes werden, passt auch direkt deine API Key an.&#xA;&#xA;action = %(action)s&#xA;         %(actionabuseipdb)s[abuseipdbapikey=&#34;DeinAPIKey&#34;, abuseipdbcategory=&#34;18&#34;]&#xA;Was haben wir gerade gemacht?&#xA;Wir haben Fail2Ban gesagt, dass er bei einem Ban, die IP die gebannt wird, an die Aktion AbuseIPDB (bearbeiten wir gleich) übergeben werden soll, mit der Kategorie 18 (Brute-Force).&#xA;Weiteres zu den Kategorien hier.&#xA;&#xA;In diesem Teil habe ich jetzt beschrieben, wie wir allgemein eine Aktion für alle Bans aufrufen können. Natürlich kann man das für jeden Jail auch einzelnen machen, und so genauer melden, wenn man die entsprechenden Kategorien angibt.&#xA;So könnte man die Zeile oben auf Default lassen und im Jail sshd zum Beispiel das folgende machen:&#xA;&#xA;[sshd]&#xA;port    = ssh&#xA;logpath = %(sshdlog)s&#xA;backend = %(sshdbackend)s&#xA;action = %(action)s&#xA;         %(actionabuseipdb)s[abuseipdbapikey=&#34;DeinAPIKey&#34;, abuseipdbcategory=&#34;18,22&#34;]&#xA;Jetzt sind die Kategorien die wir melden, 18 (Brute-Force) und 22 (SSH). So kann AbuseIPDB, das viel genauer filtern und anderen zur Verfügung stellen.&#xA;&#xA;Als letztes müssen wir noch die Action abuseipdb anpassen. Leider, ist die action die mit Debian mitgeliefert wird nicht mehr aktuell, und führt dazu, das ihr nichts melden könnt, weil die API falsch angesprochen wird.&#xA;Dazu geht in die Datei /etc/fail2ban/action.d/abuseipdb.conf.&#xA;&#xA;Löscht die aktuelle Zeile, die mit actionban = begint komplett und setzt die folgenden rein:&#xA;&#xA;actionban = curl --tlsv1.2 --fail &#39;https://api.abuseipdb.com/api/v2/report&#39; -H &#39;Accept: application/json&#39; -H &#39;Key: abuseipdbapikey&#39; --data-urlencode &#34;comment=matches&#34; --data-urlencode &#39;ip=ip&#39; --data &#39;categories=abuseipdversionb_category&#39;&#xA;WICHTIG: hier nichts einsetzen, so eintragen wie ich es hier geschrieben habe, der APIKey und die IP und die Kategorien werden von Fail2Ban bei einem Ban übergeben!&#xA;&#xA;Jetzt alles speichern und einen neustart von fail2ban machen:&#xA;&#xA;fail2ban-client restart&#xA;Hier sollte kein Fehler kommen, sicherheitshalber kann man auch nochmal die Log überprüfen:&#xA;&#xA;cat /var/log/fail2ban.log&#xA;&#xA;Ergebnis&#xA;Dementsprechend wie sehr eurer Server &#34;angegriffen&#34; wird, solltet ihr nach einigen Tagen bereits einige IP&#39;s gemeldet haben, bei mir sieht das aktuell so aus:&#xA;&#xA;a href=&#34;https://www.abuseipdb.com/user/38312&#34; title=&#34;AbuseIPDB is an IP address blacklist for webmasters and sysadmins to report IP addresses engaging in abusive behavior on their networks&#34; alt=&#34;AbuseIPDB Contributor Badge&#34;&#xA;&#x9;img src=&#34;https://www.abuseipdb.com/contributor/38312.svg&#34; style=&#34;width: 200px;&#34;&#xA;/a]]&gt;</description>
      <content:encoded><![CDATA[<p>In meinem letzten Artikel habe ich erklärt, wie man unter <a href="https://beli3ver.writeas.com/linux-firewall-mit-blacklisten-ip-block" rel="nofollow">Linux die Firewall mit einem IP Block ausstatten kann</a>.
In diesem Artikel möchte ich euch erklären, wie ihr auch IP&#39;s melden könnt, und somit der Community wieder was zurückgeben könnt.</p>

<h2 id="fail2ban-installieren" id="fail2ban-installieren">Fail2Ban installieren</h2>

<p>Fail2Ban ist schnell installiert:</p>

<pre><code class="language-bash">apt install -y fail2ban
</code></pre>

<h2 id="fail2ban-und-ufw" id="fail2ban-und-ufw">Fail2Ban und UFW</h2>

<p>Wie im ersten Artikel bereits beschrieben, nutze ich als Firewall für meine Systeme UFW. Damit Fail2Ban mit UFW sprechen kann, müssen wir kleine Anpassung machen.
Als Erstes müssen wir die Datei <code>jail.local</code> erstellen, dazu macht einfach folgendes:</p>

<pre><code class="language-bash">cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
</code></pre>

<p>In der <code>jail.local</code> such jetzt bitte die folgende Zeile (ist bei mir die 167):</p>

<pre><code class="language-bash">banaction = ....
</code></pre>

<p>Alles hinter dem Gleichzeichen entfernen und <code>ufw</code> angeben.</p>

<h2 id="fail2ban-und-abuseipdb" id="fail2ban-und-abuseipdb">Fail2Ban und AbuseIPDB</h2>

<p>Als Nächstes müssen wir in der <code>jail.local</code> noch eine Änderung vornehmen.
Sucht in der Datei, im <code>[DEFAULT]</code> Block bitte die folgende Zeile (ist bei mir 228 kurz vor dem sshd Jail):</p>

<pre><code class="language-bash">action = %(action_)s
</code></pre>

<p>Diese muss durch die folgende erstes werden, passt auch direkt deine API Key an.</p>

<pre><code class="language-bash">action = %(action_)s
         %(action_abuseipdb)s[abuseipdb_apikey=&#34;DeinAPIKey&#34;, abuseipdb_category=&#34;18&#34;]
</code></pre>

<p>Was haben wir gerade gemacht?
Wir haben Fail2Ban gesagt, dass er bei einem Ban, die IP die gebannt wird, an die Aktion AbuseIPDB (bearbeiten wir gleich) übergeben werden soll, mit der Kategorie 18 (Brute-Force).
Weiteres zu den Kategorien <a href="https://www.abuseipdb.com/categories" rel="nofollow">hier</a>.</p>

<p>In diesem Teil habe ich jetzt beschrieben, wie wir allgemein eine Aktion für alle Bans aufrufen können. Natürlich kann man das für jeden Jail auch einzelnen machen, und so genauer melden, wenn man die entsprechenden Kategorien angibt.
So könnte man die Zeile oben auf Default lassen und im Jail <code>sshd</code> zum Beispiel das folgende machen:</p>

<pre><code class="language-bash">[sshd]
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
action = %(action_)s
         %(action_abuseipdb)s[abuseipdb_apikey=&#34;DeinAPIKey&#34;, abuseipdb_category=&#34;18,22&#34;]
</code></pre>

<p>Jetzt sind die Kategorien die wir melden, 18 (Brute-Force) und 22 (SSH). So kann AbuseIPDB, das viel genauer filtern und anderen zur Verfügung stellen.</p>

<p>Als letztes müssen wir noch die Action abuseipdb anpassen. Leider, ist die action die mit Debian mitgeliefert wird nicht mehr aktuell, und führt dazu, das ihr nichts melden könnt, weil die API falsch angesprochen wird.
Dazu geht in die Datei <code>/etc/fail2ban/action.d/abuseipdb.conf</code>.</p>

<p>Löscht die aktuelle Zeile, die mit <code>actionban =</code> begint komplett und setzt die folgenden rein:</p>

<pre><code class="language-bash">actionban = curl --tlsv1.2 --fail &#39;https://api.abuseipdb.com/api/v2/report&#39; -H &#39;Accept: application/json&#39; -H &#39;Key: &lt;abuseipdb_apikey&gt;&#39; --data-urlencode &#34;comment=&lt;matches&gt;&#34; --data-urlencode &#39;ip=&lt;ip&gt;&#39; --data &#39;categories=&lt;abuseipdversionb_category&gt;&#39;
</code></pre>

<p><strong>WICHTIG: hier nichts einsetzen, so eintragen wie ich es hier geschrieben habe, der APIKey und die IP und die Kategorien werden von Fail2Ban bei einem Ban übergeben!</strong></p>

<p>Jetzt alles speichern und einen neustart von fail2ban machen:</p>

<pre><code class="language-bash">fail2ban-client restart
</code></pre>

<p>Hier sollte kein Fehler kommen, sicherheitshalber kann man auch nochmal die Log überprüfen:</p>

<pre><code class="language-bash">cat /var/log/fail2ban.log
</code></pre>

<h2 id="ergebnis" id="ergebnis">Ergebnis</h2>

<p>Dementsprechend wie sehr eurer Server “angegriffen” wird, solltet ihr nach einigen Tagen bereits einige IP&#39;s gemeldet haben, bei mir sieht das aktuell so aus:</p>

<p><a href="https://www.abuseipdb.com/user/38312" title="AbuseIPDB is an IP address blacklist for webmasters and sysadmins to report IP addresses engaging in abusive behavior on their networks" rel="nofollow">
    <img src="https://www.abuseipdb.com/contributor/38312.svg" style="width: 200px;">
</a></p>
]]></content:encoded>
      <guid>https://beli3ver.writeas.com/ips-an-abuseipdb-melden-fail2ban</guid>
      <pubDate>Tue, 02 Jun 2020 05:07:43 +0000</pubDate>
    </item>
    <item>
      <title>Linux Firewall mit Blacklisten (IP Block)</title>
      <link>https://beli3ver.writeas.com/linux-firewall-mit-blacklisten-ip-block?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[Im folgenden Artikel möchte ich erläutern, wie ihr eure Linux Firewall (UFW) mit einer Blackliste von IP-Adressen, die durch Meldungen bereits als schadhafte IPs (wurden zum Beispiel für Brute-Force) genutzt, erweitern könnt.&#xA;&#xA;AbuseIPDB&#xA;&#xA;Ich nutze für dieses Setup die Datenbank von AbuseIPDB. Damit auch ihr diese nutzen könnt, müsst ihr euch einfach einen kostenlosen Account erstellen.&#xA;Danach könnt ihr in den Einstellungen einen API Key generieren, den ihr für das folgenden Setup benötigt.&#xA;&#xA;Software installieren&#xA;&#xA;Wir benötigen natürlich einige Softwarepakete. Grundsätzlich, gehe ich davon aus, dass ihr UFW bereits installiert habt und entsprechend konfiguriert habt.&#xA;Zusätzliche Pakete, die noch benötigt werden:&#xA;&#xA;apt install -y screen curl &#xA;&#xA;Ordnerstruktur&#xA;&#xA;Jetzt legen wir den Ordner an, den wir benötigen:&#xA;&#xA;mkdir /opt/blacklist&#xA;&#xA;Los geht es&#xA;&#xA;Ok, jetzt fangen wir dann mal wirklich an. Die erste Datei, die wir anlegen heißt blacklist.shund liegt in dem eben von uns erstellten Ordner. Der Inhalt ist klein und fein und sieht so aus:&#xA;&#xA;!/bin/bash&#xA;&#xA;while read line;&#xA;do&#xA;&#x9;ufw insert 1 deny from $line to any;&#xA;done &lt; /opt/blacklist/blacklist&#xA;&#xA;Das Script macht nichts anderes, als die Datei /opt/blacklist/blacklist Zeile für Zeile einzulesen und entsprechend an die UFW Firewall zu übergeben und zu blockieren. Richtig, jede Zeile enthält eine potenzielle &#34;böse&#34; IP-Adresse.&#xA;&#xA;Entsprechend setzten wir jetzt noch die Rechte auf die Datei:&#xA;&#xA;chmod 700 /opt/blacklist/blacklist.sh&#xA;&#xA;Um diese Liste mit den IP-Adressen zu erstellen, benötigen wir noch ein zweites Script, diese legen wir direkt im Verzeichnis /etc/cron.daily/ an. (Achtung, bei schwachen Servern sollte eher in diesem Verzeichnis /etc/cron.weekly/ die Datei angelegt werden). Das Script hat den Namen getBlacklist. Der Inhalt der Datei sieht wie folgt aus:&#xA;&#xA;!/bin/bash&#xA;&#xA;get latest blacklist from abuseIPDB&#xA;&#xA;curl -G https://api.abuseipdb.com/api/v2/blacklist \&#xA;  -d confidenceMinimum=50 \&#xA;  -H &#34;Key: EurerAPIKey&#34; \&#xA;  -H &#34;Accept: text/plain&#34; | sort   /opt/blacklist/blacklist&#xA;&#xA;block every ip in list&#xA;&#xA;/usr/bin/bash /opt/blacklist/blacklist.sh&#xA;Bitte ersetzt EurerAPIKey mit eurem Key, achtet auf das Leerzeichen nach dem Doppelpunkt!&#xA;&#xA;Entsprechend setzten wir jetzt noch die Rechte auf die Datei:&#xA;&#xA;chmod 755 /etc/cron.daily/getBlacklist&#xA;&#xA;Diese Datei holt die IP-Adressen aus der AbuseIPDB Datenbank und schreibt diese in die blacklist Datei. Danach wird unser erstes Script aufgerufen.&#xA;Der Wert confidenceMinimum gibt das folgenden an:&#xA;Wir empfehlen Ihnen, nach abuseConfidenceScore zu filtern, d.h. nach unserer berechneten Bewertung, wie missbräuchlich die IP ist, basierend auf den Nutzern, die sie gemeldet haben (mehr).&#xA;Quelle: AbuseIPDB Dokumentation&#xA;&#xA;Testen&#xA;&#xA;Wichtig: Diese Liste enthält aktuell über 10.000 IP-Adressen&#xA;&#xA;Das Einfügen einer solchen Menge in die Firewall, dauert.&#xA;Also werden wir den folgenden Befehl ausführen, nachdem wir screen gestartet haben.&#xA;&#xA;screen&#xA;Enter drücken&#xA;dann folgendes ausführen&#xA;bash /etc/cron.daily/getBlacklist&#xA;&#xA;Jetzt sollten die IP&#39;s geladen werden und dann alles in die Firewall eingetragen werden.&#xA;Mit Strg + a und Strg + d verlasst ihr die aktuelle screen Session.&#xA;Um das Ergebnis zu sehen, gebt einfach folgenden Befehl ein:&#xA;&#xA;ufw status&#xA;&#xA;Das Bild sollte dann diesem hier sehr ähnlich sein:&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Im folgenden Artikel möchte ich erläutern, wie ihr eure Linux Firewall (UFW) mit einer Blackliste von IP-Adressen, die durch Meldungen bereits als schadhafte IPs (wurden zum Beispiel für Brute-Force) genutzt, erweitern könnt.</p>

<h2 id="abuseipdb" id="abuseipdb">AbuseIPDB</h2>

<p>Ich nutze für dieses Setup die Datenbank von <a href="https://www.abuseipdb.com/" rel="nofollow">AbuseIPDB</a>. Damit auch ihr diese nutzen könnt, müsst ihr euch einfach einen kostenlosen Account erstellen.
Danach könnt ihr in den Einstellungen einen API Key generieren, den ihr für das folgenden Setup benötigt.</p>

<h2 id="software-installieren" id="software-installieren">Software installieren</h2>

<p>Wir benötigen natürlich einige Softwarepakete. Grundsätzlich, gehe ich davon aus, dass ihr UFW bereits installiert habt und entsprechend konfiguriert habt.
Zusätzliche Pakete, die noch benötigt werden:</p>

<pre><code class="language-bash">apt install -y screen curl 
</code></pre>

<h2 id="ordnerstruktur" id="ordnerstruktur">Ordnerstruktur</h2>

<p>Jetzt legen wir den Ordner an, den wir benötigen:</p>

<pre><code class="language-bash">mkdir /opt/blacklist
</code></pre>

<h2 id="los-geht-es" id="los-geht-es">Los geht es</h2>

<p>Ok, jetzt fangen wir dann mal wirklich an. Die erste Datei, die wir anlegen heißt <code>blacklist.sh</code>und liegt in dem eben von uns erstellten Ordner. Der Inhalt ist klein und fein und sieht so aus:</p>

<pre><code class="language-bash">#!/bin/bash

while read line;
do
	ufw insert 1 deny from $line to any;
done &lt; /opt/blacklist/blacklist
</code></pre>

<p>Das Script macht nichts anderes, als die Datei <code>/opt/blacklist/blacklist</code> Zeile für Zeile einzulesen und entsprechend an die UFW Firewall zu übergeben und zu blockieren. Richtig, jede Zeile enthält eine potenzielle “böse” IP-Adresse.</p>

<p>Entsprechend setzten wir jetzt noch die Rechte auf die Datei:</p>

<pre><code class="language-bash">chmod 700 /opt/blacklist/blacklist.sh
</code></pre>

<p>Um diese Liste mit den IP-Adressen zu erstellen, benötigen wir noch ein zweites Script, diese legen wir direkt im Verzeichnis <code>/etc/cron.daily/</code> an. (Achtung, bei schwachen Servern sollte eher in diesem Verzeichnis <code>/etc/cron.weekly/</code> die Datei angelegt werden). Das Script hat den Namen <code>getBlacklist</code>. Der Inhalt der Datei sieht wie folgt aus:</p>

<pre><code class="language-bash">#!/bin/bash

#get latest blacklist from abuseIPDB

curl -G https://api.abuseipdb.com/api/v2/blacklist \
  -d confidenceMinimum=50 \
  -H &#34;Key: EurerAPIKey&#34; \
  -H &#34;Accept: text/plain&#34; | sort &gt; /opt/blacklist/blacklist

#block every ip in list

/usr/bin/bash /opt/blacklist/blacklist.sh
</code></pre>

<p><strong>Bitte ersetzt EurerAPIKey mit eurem Key, achtet auf das Leerzeichen nach dem Doppelpunkt!</strong></p>

<p>Entsprechend setzten wir jetzt noch die Rechte auf die Datei:</p>

<pre><code class="language-bash">chmod 755 /etc/cron.daily/getBlacklist
</code></pre>

<p>Diese Datei holt die IP-Adressen aus der <em>AbuseIPDB</em> Datenbank und schreibt diese in die <em>blacklist</em> Datei. Danach wird unser erstes Script aufgerufen.
Der Wert confidenceMinimum gibt das folgenden an:</p>

<pre><code>Wir empfehlen Ihnen, nach abuseConfidenceScore zu filtern, d.h. nach unserer berechneten Bewertung, wie missbräuchlich die IP ist, basierend auf den Nutzern, die sie gemeldet haben (mehr).
</code></pre>

<p>Quelle: <a href="https://docs.abuseipdb.com/#blacklist-endpoint" rel="nofollow">AbuseIPDB Dokumentation</a></p>

<h2 id="testen" id="testen">Testen</h2>

<p><strong>Wichtig: Diese Liste enthält aktuell über 10.000 IP-Adressen</strong></p>

<p>Das Einfügen einer solchen Menge in die Firewall, dauert.
Also werden wir den folgenden Befehl ausführen, nachdem wir <code>screen</code> gestartet haben.</p>

<pre><code class="language-bash">screen
# Enter drücken
# dann folgendes ausführen
bash /etc/cron.daily/getBlacklist
</code></pre>

<p>Jetzt sollten die IP&#39;s geladen werden und dann alles in die Firewall eingetragen werden.
Mit Strg + a und Strg + d verlasst ihr die aktuelle screen Session.
Um das Ergebnis zu sehen, gebt einfach folgenden Befehl ein:</p>

<pre><code class="language-bash">ufw status
</code></pre>

<p>Das Bild sollte dann diesem hier sehr ähnlich sein:
<img src="https://i.snap.as/o8cwMbq.png" alt=""/></p>
]]></content:encoded>
      <guid>https://beli3ver.writeas.com/linux-firewall-mit-blacklisten-ip-block</guid>
      <pubDate>Mon, 01 Jun 2020 20:36:26 +0000</pubDate>
    </item>
    <item>
      <title>PostgreSQL Datenbank Dump</title>
      <link>https://beli3ver.writeas.com/postgresql-datenbank-dump?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[In meinem neuen Unternehmen arbeiten wir nur noch mit PostgreSQL Datenbanken. Für ein aktuelles Projekt haben wir jetzt in die Backup Strategie natürlich auch den Dump der jeweiligen Datenbank mit aufgenommen. Im folgenden will ich kurz erklären, wie es schnell unter Linux mit Cron zu lösen ist.&#xA;&#xA;Dazu legen wir eine Datei an, mit dem Name dbbackup.sh.&#xA;Diese sollte dann die folgenden Rechte gesetzt bekommen:&#xA;&#xA;chmod 700 dbbackup.sh&#xA;Grund hierfür ist, dass wir in die Datei, das Passwort des jeweiligen DB Nutzers ablegen müssen.&#xA;&#xA;Als nächstes kommen wir zum Inhalt:&#xA;&#xA;!/bin/bash&#xA;&#xA;date=$(date +%Y-%m-%d-%H-%M)&#xA;export PGPASSWORD=PasswortVomNutzerTest&#xA;/usr/bin/pgdump -C -f /opt/backup/dumps/${date}postgresdumpchurchevents.dmp --encoding=UTF-8 -U Test&#xA;&#xA;find /opt/backup/dumps -mtime +5 -exec rm {} \;&#xA;&#xA;Okay, gehen wir Zeile für Zeile durch&#xA;&#xA;date=$(date +%Y-%m-%d-%H-%M)&#xA;Wir legen einen Variabel mit dem Namen date fest, die einen String aus dem aktuellen Datum und Uhrzeit beinhaltet.&#xA;&#xA;export PGPASSWORD=PasswortVomNutzerTest&#xA;In dieser Zeile legen wir das Passwort vom Nutzer Test fest, was als Umgebungsvariable übergeben wird.&#xA;Jetzt kommen wir zum eigentlichen Sicherungsbefehl:&#xA;&#xA;/usr/bin/pgdump -c -C -f  p /opt/backup/dumps/${date}postgresdump.sql --encoding=UTF-8 -U Test&#xA;&#xA;-c enthält im Dump eine Passage, was beim importieren die bereits vorhandene DB löscht und alles neu anlegt&#xA;-C enthält im Dump eine Passage, mit CREATE TABLE Statments&#xA;-f Speicherort des Dumps (das p bedeutet Plaintext, also SQL)&#xA;--encoding ist glaube ich klar :-)&#xA;-U Angabe des Datenbankbenutzers, hier Test&#xA;&#xA;Und als letztes ein Befehl der alle Dumps älter als 5 Tage löscht:&#xA;&#xA;find /opt/backup/dumps -mtime +5 -exec rm {} \;&#xA;&#xA;Jetzt legen wir noch den jeweiligen Cronjob an und das wars.&#xA;&#xA;Alle Datenbanken sichern&#xA;&#xA;Um alle Datenbank zu sichern, gibt es den Befehl pgdumpall:&#xA;&#xA;pg_dumpall -U postgres   /opt/backup/all.sql&#xA;&#xA;Hier wird der Benutzer postgres verwendet, was der Default Admin Nutzer ist. Entsprechend sein Passwort muss verwendet werden.&#xA;&#xA;Dokumentation&#xA;Weitere Hilfe könnt ihr auch in der Dokumentation finden.]]&gt;</description>
      <content:encoded><![CDATA[<p>In meinem neuen Unternehmen arbeiten wir nur noch mit PostgreSQL Datenbanken. Für ein aktuelles Projekt haben wir jetzt in die Backup Strategie natürlich auch den Dump der jeweiligen Datenbank mit aufgenommen. Im folgenden will ich kurz erklären, wie es schnell unter Linux mit Cron zu lösen ist.</p>

<p>Dazu legen wir eine Datei an, mit dem Name <code>db_backup.sh</code>.
Diese sollte dann die folgenden Rechte gesetzt bekommen:</p>

<pre><code class="language-bash">chmod 700 db_backup.sh
</code></pre>

<p>Grund hierfür ist, dass wir in die Datei, das Passwort des jeweiligen DB Nutzers ablegen müssen.</p>

<p>Als nächstes kommen wir zum Inhalt:</p>

<pre><code class="language-bash">#!/bin/bash

date=$(date +%Y-%m-%d-%H-%M)
export PGPASSWORD=PasswortVomNutzerTest
/usr/bin/pg_dump -C -f /opt/backup/dumps/${date}_postgres_dump_churchevents.dmp --encoding=UTF-8 -U Test

find /opt/backup/dumps -mtime +5 -exec rm {} \;
</code></pre>

<p>Okay, gehen wir Zeile für Zeile durch</p>

<pre><code class="language-bash">date=$(date +%Y-%m-%d-%H-%M)
</code></pre>

<p>Wir legen einen Variabel mit dem Namen <code>date</code> fest, die einen String aus dem aktuellen Datum und Uhrzeit beinhaltet.</p>

<pre><code class="language-bash">export PGPASSWORD=PasswortVomNutzerTest
</code></pre>

<p>In dieser Zeile legen wir das Passwort vom Nutzer <code>Test</code> fest, was als Umgebungsvariable übergeben wird.
Jetzt kommen wir zum eigentlichen Sicherungsbefehl:</p>

<pre><code class="language-bash">/usr/bin/pg_dump -c -C -f  p /opt/backup/dumps/${date}_postgres_dump.sql --encoding=UTF-8 -U Test
</code></pre>
<ul><li>-c enthält im Dump eine Passage, was beim importieren die bereits vorhandene DB löscht und alles neu anlegt</li>
<li>-C enthält im Dump eine Passage, mit CREATE TABLE Statments</li>
<li>-f Speicherort des Dumps (das p bedeutet Plaintext, also SQL)</li>
<li>—encoding ist glaube ich klar :–)</li>
<li>-U Angabe des Datenbankbenutzers, hier <code>Test</code></li></ul>

<p>Und als letztes ein Befehl der alle Dumps älter als 5 Tage löscht:</p>

<pre><code class="language-bash">find /opt/backup/dumps -mtime +5 -exec rm {} \;
</code></pre>

<p>Jetzt legen wir noch den jeweiligen Cronjob an und das wars.</p>

<h3 id="alle-datenbanken-sichern" id="alle-datenbanken-sichern">Alle Datenbanken sichern</h3>

<p>Um alle Datenbank zu sichern, gibt es den Befehl <code>pg_dumpall</code>:</p>

<pre><code class="language-bash">pg_dumpall -U postgres &gt; /opt/backup/all.sql
</code></pre>

<p>Hier wird der Benutzer <code>postgres</code> verwendet, was der Default Admin Nutzer ist. Entsprechend sein Passwort muss verwendet werden.</p>

<h4 id="dokumentation" id="dokumentation">Dokumentation</h4>

<p>Weitere Hilfe könnt ihr auch in der <a href="https://www.postgresql.org/docs/current/app-pgdump.html" rel="nofollow">Dokumentation</a> finden.</p>
]]></content:encoded>
      <guid>https://beli3ver.writeas.com/postgresql-datenbank-dump</guid>
      <pubDate>Mon, 01 Jun 2020 18:00:15 +0000</pubDate>
    </item>
    <item>
      <title>Sicherung von Mailbox auf einer Hetzner Storagebox mit restic</title>
      <link>https://beli3ver.writeas.com/sicherung-von-mailbox-auf-einer-hetzner-storagebox-mit-restic?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[Im folgenden Artikel, möchte ich kurz erläutern, wie ihr eine Sicherung von Mailcow auf einer Hetzner Storagebox auslagern könnt.&#xA;Ich gehe davon aus, dass ihr bereits eine Hetzner Storagebox habt und den SSH sowie den RSYNC Zugriff erlaubt habt.&#xA;&#xA;Storagebox vorbereiten&#xA;&#xA; Es werden einige kleine Schritte benötigt, damit ihr mit der Storagebox problemlos arbeiten könnt. Als erstes generieren wir einen neuen SSH Key:&#xA;&#xA;ssh-keygen -t ed25519&#xA;&#xA;Beantwortet die Fragen nach euren Bedürfnissen, jedoch darf der Key kein Passwort haben. Als nächstes installieren wir sshfs um unsere Storagebox zu mounten:&#xA;&#xA;apt install sshfs -y&#xA;&#xA;Im nächsten Schritt, werden wir die Storagebox mounten:&#xA;&#xA;mkdir /mnt/storagebox&#xA;sshfs u123456@u123456.your-storagebox.de:/ /mnt/storagebox/&#xA;&#xA;Jetzt noch entsprechend den Ordner und die Datei für den Schlüssel anlegen:&#xA;&#xA;mkdir /mnt/storagebox/.ssh&#xA;touch /mnt/storagebox/.ssh/authorizedkeys&#xA;&#xA;Jetzt kopieren wir noch den Key auf die Storagebox:&#xA;&#xA;cat ~/.ssh/ided25519.pub     /mnt/storagebox/.ssh/authorizedkeys&#xA;&#xA;Als vorletzten Schritt legen wir noch das Sicherungsverzeichnis in der Storagebox an und umounten die Storagebox wieder vom System:&#xA;&#xA;mkdir /mnt/storagebox/mailserver&#xA;fusermount -u /mnt/storagebox&#xA;&#xA;Als letzten Schritt, müssen wir noch eine SSH Config Datei anlegen, da die Storagebox einen anderen Port benutzt:&#xA;&#xA;Host u123456.your-storagebox.de&#xA;        User u123456&#xA;        Port 23&#xA;&#xA;Bitte wieder den Nutzer entsprechend anpassen&#xA;&#xA;Danke an Thomas Leister&#xA;Diese Schritte sind im groben von Thomas Leistner kopiert und angepasst worden. Danke&#xA;&#xA;Backup einrichten&#xA;&#xA;Als erstes legen wir mal die Ordner an die wir brauchen&#xA;&#xA;mkdir /backup&#xA;mkdir /opt/backup&#xA;&#xA;Als nächstes legen wir die Datei environment.sh im Verzeichnis /opt/backup mit folgendem Inhalt an:&#xA;&#xA;!/bin/bash&#xA;export RESTICREPOSITORY=&#34;sftp:u1234567.your-storagebox.de:mailserver&#34;&#xA;export RESTICPASSWORD=&#34;MeinSicheresBackupPasswort&#34;&#xA;&#xA;Bitte passt entsprechend u1234567 und MeinSicheresBackupPasswort an!&#xA;&#xA;Jetzt legen wie die Datei backup.files im Verzeichnis /opt/backup mit diesem Inhalt an:&#xA;&#xA;/etc&#xA;/backup&#xA;/root&#xA;/opt&#xA;&#xA;Wie ihr dem Namen vielleicht entnehmen könnt, wollen wir, das restic diese Verzeichnisse sichert. Diese könnt ihr natürlich erweitern.&#xA;Als letztes legen wir die Datei backup.sh im Verzeichnis /opt/backup  mit folgendem Inhalt an:&#xA;&#xA;!/bin/bash&#xA;&#xA;MAILCOWBACKUPLOCATION=/backup /opt/mailcow-dockerized/helper-scripts/backupand_restore.sh backup all --delete-days 30&#xA;&#xA;source /opt/backup/environment.sh&#xA;&#xA;Backup new stuff&#xA;restic backup \&#xA;        --verbose \&#xA;        --files-from /opt/backup/backup.files \&#xA;&#xA;Remove old stuff&#xA;echo &#34;Deleting old backups ...&#34;&#xA;restic forget --prune \&#xA;        --keep-last 7 \&#xA;        --keep-daily 14 \&#xA;        --keep-weekly 4 \&#xA;        --keep-monthly 6 \&#xA;&#xA;restic check&#xA;Hier müsst ihr den Pfad zum Mailcow Verzeichniss anpassen: /opt/mailcow-dockerized&#xA;Zum Schluß machen wir das Script jetzt noch ausführbar:&#xA;&#xA;chmod 700 /opt/backup/backup.sh&#xA;&#xA;Repo initialisieren&#xA;&#xA;Damit restic auch läuft, müsst ihr den folgenden Befehl einmal ausführen, dabei wird die Repo angelegt:&#xA;&#xA;source /opt/backup/environment.sh &amp;&amp; restic init&#xA;&#xA;Crontab&#xA;Jetzt legen wir noch einen Cronjob an, der alle 4 Stunden die Sicherung ausführt, dazu bearbeiten wir die Datei /etc/crontab und fügen folgendes ein:&#xA;&#xA;0 /4          root    /bin/bash /opt/backup/backup.sh&#xA;`]]&gt;</description>
      <content:encoded><![CDATA[<p>Im folgenden Artikel, möchte ich kurz erläutern, wie ihr eine Sicherung von Mailcow auf einer Hetzner Storagebox auslagern könnt.
Ich gehe davon aus, dass ihr bereits eine Hetzner Storagebox habt und den SSH sowie den RSYNC Zugriff erlaubt habt.</p>

<h2 id="storagebox-vorbereiten" id="storagebox-vorbereiten">Storagebox vorbereiten</h2>

<p> Es werden einige kleine Schritte benötigt, damit ihr mit der Storagebox problemlos arbeiten könnt. Als erstes generieren wir einen neuen SSH Key:</p>

<pre><code class="language-bash">ssh-keygen -t ed25519
</code></pre>

<p>Beantwortet die Fragen nach euren Bedürfnissen, jedoch darf der Key kein Passwort haben. Als nächstes installieren wir <code>sshfs</code> um unsere Storagebox zu mounten:</p>

<pre><code class="language-bash">apt install sshfs -y
</code></pre>

<p>Im nächsten Schritt, werden wir die Storagebox mounten:</p>

<pre><code class="language-bash">mkdir /mnt/storagebox
sshfs u123456@u123456.your-storagebox.de:/ /mnt/storagebox/
</code></pre>

<p>Jetzt noch entsprechend den Ordner und die Datei für den Schlüssel anlegen:</p>

<pre><code class="language-bash">mkdir /mnt/storagebox/.ssh
touch /mnt/storagebox/.ssh/authorized_keys
</code></pre>

<p>Jetzt kopieren wir noch den Key auf die Storagebox:</p>

<pre><code class="language-bash">cat ~/.ssh/id_ed25519.pub &gt;&gt; /mnt/storagebox/.ssh/authorized_keys
</code></pre>

<p>Als vorletzten Schritt legen wir noch das Sicherungsverzeichnis in der Storagebox an und umounten die Storagebox wieder vom System:</p>

<pre><code class="language-bash">mkdir /mnt/storagebox/mailserver
fusermount -u /mnt/storagebox
</code></pre>

<p>Als letzten Schritt, müssen wir noch eine SSH Config Datei anlegen, da die Storagebox einen anderen Port benutzt:</p>

<pre><code class="language-bash">Host u123456.your-storagebox.de
        User u123456
        Port 23
</code></pre>

<p>Bitte wieder den Nutzer entsprechend anpassen</p>

<h5 id="danke-an-thomas-leister" id="danke-an-thomas-leister">Danke an Thomas Leister</h5>

<p>Diese Schritte sind im groben von Thomas Leistner kopiert und angepasst worden. Danke</p>

<h2 id="backup-einrichten" id="backup-einrichten">Backup einrichten</h2>

<p>Als erstes legen wir mal die Ordner an die wir brauchen</p>

<pre><code class="language-bash">mkdir /backup
mkdir /opt/backup
</code></pre>

<p>Als nächstes legen wir die Datei <code>environment.sh</code> im Verzeichnis <code>/opt/backup</code> mit folgendem Inhalt an:</p>

<pre><code class="language-bash">#!/bin/bash
export RESTIC_REPOSITORY=&#34;sftp:u1234567.your-storagebox.de:mailserver&#34;
export RESTIC_PASSWORD=&#34;MeinSicheresBackupPasswort&#34;
</code></pre>

<p>Bitte passt entsprechend <code>u1234567</code> und <code>MeinSicheresBackupPasswort</code> an!</p>

<p>Jetzt legen wie die Datei <code>backup.files</code> im Verzeichnis <code>/opt/backup</code> mit diesem Inhalt an:</p>

<pre><code class="language-bash">/etc
/backup
/root
/opt
</code></pre>

<p>Wie ihr dem Namen vielleicht entnehmen könnt, wollen wir, das restic diese Verzeichnisse sichert. Diese könnt ihr natürlich erweitern.
Als letztes legen wir die Datei <code>backup.sh</code> im Verzeichnis <code>/opt/backup</code>  mit folgendem Inhalt an:</p>

<pre><code class="language-bash">#!/bin/bash

MAILCOW_BACKUP_LOCATION=/backup /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup all --delete-days 30

source /opt/backup/environment.sh

### Backup new stuff
restic backup \
        --verbose \
        --files-from /opt/backup/backup.files \

### Remove old stuff
echo &#34;Deleting old backups ...&#34;
restic forget --prune \
        --keep-last 7 \
        --keep-daily 14 \
        --keep-weekly 4 \
        --keep-monthly 6 \


restic check
</code></pre>

<p><strong>Hier müsst ihr den Pfad zum Mailcow Verzeichniss anpassen: <code>/opt/mailcow-dockerized</code></strong>
Zum Schluß machen wir das Script jetzt noch ausführbar:</p>

<pre><code class="language-bash">chmod 700 /opt/backup/backup.sh
</code></pre>

<h2 id="repo-initialisieren" id="repo-initialisieren">Repo initialisieren</h2>

<p>Damit restic auch läuft, müsst ihr den folgenden Befehl einmal ausführen, dabei wird die Repo angelegt:</p>

<pre><code class="language-bash">source /opt/backup/environment.sh &amp;&amp; restic init
</code></pre>

<h2 id="crontab" id="crontab">Crontab</h2>

<p>Jetzt legen wir noch einen Cronjob an, der alle 4 Stunden die Sicherung ausführt, dazu bearbeiten wir die Datei <code>/etc/crontab</code> und fügen folgendes ein:</p>

<pre><code class="language-bash">0 */4    * * *    root    /bin/bash /opt/backup/backup.sh
</code></pre>
]]></content:encoded>
      <guid>https://beli3ver.writeas.com/sicherung-von-mailbox-auf-einer-hetzner-storagebox-mit-restic</guid>
      <pubDate>Mon, 01 Jun 2020 11:26:35 +0000</pubDate>
    </item>
  </channel>
</rss>