Archiv der Kategorie: Linux Howto Tutorials

GNU/Linux Howto’s and Tutorials unblog technical contribution for Professionals

Verdächtige IP mit Linux Firewall Daemon sperren

Brute-Force Angriffe mit Firewall Daemon blockieren aus Bash Script

Firewall Daemon für den Schutz vor laufenden Brute-Force Attacken, bei der Erkennung versuchter Angriffe auf den Linux Host. Um den Host permanent zu schützen, können verdächte Anfragen von angreifenden Quellen schnell gesperrt werden. Das folgende bash Script sperrt die IP, diese als Argument übergeben wird und von firewall-cmd auf reject gesetzt wird.

#!/bin/bash
# permanently reject or remove suspicious sources by kernel firewall
# dependency: firewalld (fail2ban optional)
if [[ $1 == "add" && $2 =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
   echo "$2 add to reject"
   firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="'$2'" reject'

elif [[ $1 == "remove" && $2 =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
   echo "$2 being to remove"
   firewall-cmd --permanent --zone=public --remove-rich-rule='rule family="ipv4" source address="'$2'" reject'

 elif [[ $1 == "add6" && $2 =~ ^[A-Za-z0-9]{1,4}\:[A-Za-z0-9]{1,4}\: ]]; then
    echo "$2 add to reject"
    firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv6" source address="'$2'" reject'

  elif [[ $1 == "remove6" && $2 =~ ^[A-Za-z0-9]{1,4}\:[A-Za-z0-9]{1,4}\: ]]; then
    echo "$2 being to remove"
    firewall-cmd --permanent --zone=public --remove-rich-rule='rule family="ipv6" source address="'$2'" reject'

  else
    echo "Usage: fw add|remove [source IPv4]"
    echo "       fw add6|remove6 [source IPv6]"
    exit 0
fi
firewall-cmd --reload
sleep 1
if [[ -f /run/fail2ban/fail2ban.pid ]]; then
  systemctl restart fail2ban
else
  echo "fail2ban not running"
fi
sleep 2
firewall-cmd --list-all

Das Script wurde auf Debian 10 (buster) geschrieben, bei Debian muss firewalld erst installiert werden, wie auch unter Ubuntu 20. Bei RHEL und CentOS Linux 7 und höher wie auch bei Fedora ist firewalld im Standard und das Script ist gleich anwendbar.

Speichere die Skriptzeilen in eine Datei, beispielsweise als fw und mache sie ausführbar, dann führe das Skript aus, um eine IP-Adresse mit add zu blockieren.

chmod u+x fw
./fw add 192.168.89.56

Mit remove kann die IP Adresse wieder aus der Kette entfernt werden.

Firewalld Installation auf Debian

Das firewalld-Paket ist in den offiziellen Debian 10 Repositorys verfügbar. Die Installation ist unschwer wie folgender Ablauf zeigt.

$ sudo apt update
$ sudo apt -y install firewalld

Bereitstellung von Firewalld im Terminal mit Root Privileg.

$ sudo ufw disable

Wenn ufw aktiviert ist, muss die Uncomplicated Firewall (ufw) zur Verwaltung der Netfilter deaktiviert werden, um firewalld zur Standard-Firewall zu machen.

$ sudo systemctl enable firewalld
$ sudo systemctl start firewalld

Den Firewall daemon starten und für den Systemstart aktivieren.

$ sudo firewall-cmd --state
running

Ausführung und Erreichbarkeit überprüfen.

$ sudo firewall-cmd --reload

Laden der neuen Firewall-Regeln unter beibehalten des Status.

Es erscheint bei Debian nach firewall-cmd --reload der Fehler:

Error: COMMAND_FAILED: ‚/usr/sbin/ip6tables-restore -w -n‘ failed: ip6tables-restore v1.8.2 (nf_tables:
line 4: RULE_REPLACE failed (no such file or directory): rule in chain OUTPUT

Die Lösung ist das Ausführen von update-alternatives, um die Verlinkung für iptables und ip6tables anstelle von nftables zu verwenden.

$ sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
$ sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy

Nach dem wechsel von nftables zu iptables den Linux Rechner mit reboot neu starten.

Firewalld Konfiguration

Firewalld ist eine Firewall-Verwaltungslösung als Frontend für das vom Linux-Kernel bereitgestellte iptables-Paketfiltersystem. firewall-cmd ist das Dienstprogramm zum Verwalten der Firewall-Konfiguration. Der firewalld Daemon verwaltet Gruppen von Regeln mithilfe von Entitäten, die als „Zonen“ bezeichnet werden. Zonen sind wie Regelsätze, die festlegen, welcher Datenverkehr zugelassen werden soll, anhand des Vertrauen der Netzwerke, mit denen der Computer verbunden ist. Den Netzwerkschnittstellen wird eine Zone zugewiesen, um das Verhalten festzulegen, das die Firewall zulassen soll.

Ein Netzwerk Interface zur Default Zone public zuweisen, unter Verwendung des firewall-cmd Tools, mit dem Kommand zur Überprüfung von Zonen und Interfaces.

$ sudo firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: dhcpv6-client https ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
        rule family="ipv4" source address="10.10.10.1" reject

Erscheint bei interfaces keine Netzwerk Schnittstelle, muss dieses der Zone noch zugeweisen werden, dazu mit ip oder ifconfig (net-tools) die Schnittstellen abfragen.

$ ip link
$ ip addr
$ ifconfig

Hier bei einem virtuellen Debian (buster) ist es Link 2 ens33.

Das Interface ens33 wird zur Default Zone public zugewiesen.

$ sudo firewall-cmd --zone=public --change-interface=ens33

Das zur Zone zugewiesene Interface überprüfen mit der Ausgabe.

$ firewall-cmd --get-active-zones
public
  interfaces: ens33
$ sudo firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources:
  services: dhcpv6-client https ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
        rule family="ipv4" source address="10.10.10.1" reject

Das Interface ens33 ist nun mit der Zone verbunden.

Fail2ban und Firewalld Interaktion

Fail2ban (Fehlschlag führt zum Bann) ist ein in Python entwickeltes IPS und Framework zur Vorbeugung gegen Einbrüche, das für alle Unixoide OS verfügbar ist, die ein manipulierbares Paketfiltersystem oder eine Firewall besitzen wie iptables oder firewalld.

Beim Script (oben), wird falls vorhanden und ausgeführt, die von Fail2ban verbannten (banned) Adressen nach der manipulation von firewalld, von fail2ban wieder hergestellt.

firewall-cmd add | remove source addr

Mit firewall-cmd verdächtige Anfragen durch die Firewall ablehnen.

$ sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.10.10.1" reject'

Die abgelehnte IP-Adresse kann wieder entfernt werden.

$ sudo firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="10.10.10.1" reject'

Jede änderung wird mit firewall-cmd –reload aktiviert.

$ sudo firewall-cmd --reload

Anwendung und Hilfe zu firewall-cmd

$ sudo firewall-cmd --zone=public --list-all

Ausgabe der geänderten und aktivierten Regel der Zone Public.

$ sudo firewall-cmd --list-all

Aktuelle Firewall Regeln überprüfen mit iptables.

$ sudo iptables -vxnL

Standardzone für Verbindungen und Schnittstellen ausgeben.

$ firewall-cmd --get-default-zone

Eine Zone zur Defaultzone festlegen.

$ sudo firewall-cmd --set-default-zone=zone_name

Derzeit aktive Zonen ausgeben.

$ firewall-cmd --get-active-zones

Vordefinierte Zonen ausgeben.

$ firewall-cmd --get-zones

Hilfe und man page von firewall-cmd ausgeben.

$ firewall-cmd --help
$ man firewall-cmd

Network Time Protocol Linux Installation

Linux Systemzeit Synchronisation mit Network Time Protocol (NTP)

Network Time Protocol – NTP Synchronisation der Systemzeit mit der Atomzeit der NTP-Server. Dieser Beitrag zeigt die NTP-Service Bereitstellung und Konfiguration in der Linux Befehlszeile. Eine korrekte Systemzeit ist für Computersysteme essentiell und schafft überhaupt die Voraussetzung für ein reibungslosen Beitrieb der interagierenden Dienste. Zur Überprüfung und ändern der Systemzeit dienen folgende Befehlszeilentools.

Zur Abfrage der aktuellen Systemzeit mit date und timedatectl:

$ date
Fr 19. Feb 10:15:46 CET 2021
$ timedatectl
               Local time: Fr 2021-02-19 10:15:46 CET
           Universal time: Fr 2021-02-19 09:15:46 UTC
                 RTC time: Fr 2021-02-19 09:15:44
                Time zone: Europe/Zurich (CET, +0100)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Der Zeitabgleich auf einem Server wird von einem NTP-Daemon ausgeführt, mit Synchronisation der Systemzeit für eine ordnungsgemässe Funktion der Systeme. Die Atomzeit kann von NTP-Server im Internet synchronisiert werden, wie zum Beispiel Google Public Network Time Protocol (NTP) time.google.com

Die NTP-Daemon Bereitstellung

Der NTP-Daemon auf Debian Linux basiertem System Installieren:

$ sudo apt install ntp ntpdate -y

Der NTP-Daemon auf RHEL/CentOS/Fedora System Installieren:

$ sudo dnf install ntp ntpdate -y

NTP Pool Server pool.ntp.org versucht den nächstgelegenen verfügbaren Server zu finden. Das Projekt NTP-Pool ist ein dynamischer Pool von Zeitservern. Die NTP Pool Server kann man in /etc/ntp.conf editieren.

pool time.google.com
pool europe.pool.ntp.org

Bevor der ntpd-Dienst gestartet werden kann, muss die Systemzeit grob (im Bereich weniger Minuten) eingestellt werden. Das kann manuell mit date oder hier mit timedatectl set-time oder über den NTP Pool mit ntpdate pool.ntp.org gemacht werden.

$ sudo ntpdate pool.ntp.org
$ sudo ntpq -pn
$ sudo ntpq -c rv

Nach einigen Minuten kann der Status des Dienstes abgerufen werden. Die Ausgabe des Kommandos ntpq -p sollte in etwa wie folgt aussehen.

Die Abweichungen der aktuellen Systemzeit von den Zeiten der Server im NTP-Pool können mit ntpq abgefragt werden

Der bereitgestellte NTP-Daemon nun ausführen und in systemd für den automatischen start verlinken:

$ sudo systemctl start ntp.service
$ sudo systemctl enable ntp.service

Die systemd-timesyncd Konfiguration

Der Service systemd-timesyncd ist bei vielen Distributionen bereits installliert. Die Konfigurationsdateien steuern die Zeitsynchronisation des NTP-Netzwerks.

Die Network Time Synchronization für den Service systemd-timesyncd beinhaltet die Datei /etc/systemd/timesyncd.conf

Die Konfigurationsdatei timesyncd.conf kann wie folgt sein.

# See timesyncd.conf(5) for details.

[Time]
NTP=ch.pool.ntp.org
FallbackNTP=0.ch.pool.ntp.org 1.ch.pool.ntp.org 2.ch.pool.ntp.org 3.ch.pool.ntp.org 4.ch.pool.ntp.org
RootDistanceMaxSec=5
PollIntervalMinSec=32
PollIntervalMaxSec=2048

Damit systemd-timesyncd automatisch gestartet wird, aktiviert der Befehl enable den Service entsprechend:

$ sudo systemctl enable systemd-timesyncd
$ sudo systemctl start systemd-timesyncd

Bei einem systemd-basierten System führt man folgenden Befehl aus, um den Servicestatus zu überprüfen:

$ timedatectl status
               Local time: Fr 2021-02-19 10:15:46 CET
           Universal time: Fr 2021-02-19 09:15:46 UTC
                 RTC time: Fr 2021-02-19 09:15:44
                Time zone: Europe/Zurich (CET, +0100)
System clock synchronized: no
              NTP service: n/a
          RTC in local TZ: no

Die Ausgabe auf Zeile 7 und 8 bedeutet, dass der Zeitabgleich nicht ausgeführt wird. Mit folgendem Befehl wird die Synchronisation aktiviert:

$ sudo timedatectl set-ntp true

Der NTP Servicestatus erneut abfragen, nach einigen Sekunden zeigt die Ausgabe System clock synchronized: yes und NTP service: active:

$ timedatectl status
               Local time: Fr 2021-02-19 10:15:46 CET
           Universal time: Fr 2021-02-19 09:15:46 UTC
                 RTC time: Fr 2021-02-19 09:15:44
                Time zone: Europe/Zurich (CET, +0100)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Die Kerberos-Authentifizierung

Die Kerberos-Authentifizierung ist gegenwärtig die Standard-Authentifizierungstechnologie unter Windows, auch Apple macOS, FreeBSD und Linux Systeme nutzen Kerberos-Implementierungen. Bei der Authentifizierung in einer Umgebung mit Kerberos, kommt eine synchrone Systemzeit für interagierende System eine fundamentale Bedeutung zu.

Die Kerberos Authentifizierung verlangt drei Entitäten, für die Ticket-Autorisierung durch eine dritte Partei, dabei darf die Systemzeit eine bestimmte Drift Limite nicht überschreiten, ein Ticket das durch Kerberos erstellt wird, ist nach einer gewissen Zeit abgelaufen, das Ticket wird ungültig.

Kerberos ist auch für Websites und SSO-Implementierungen plattformübergreifend zum Standard geworden. In Active Directory Domain Services (AD DS), ist bei der Integration von NAS und anderen Geräte, für den Zugriff auf Netzwerkressourcen für eine übereinstimmende Systemzeit zu sorgen. Für die Protokollierung wie Syslog ist die präzise Zeit, der Timestamp für die Auswertung der Ereignisse, und bei der Fehler Analyse bedeutend.

apt install ntp ntpdate -y
Linux Mint 20 Cinnamon: apt install ntp ntpdate

Linux Zeitzone in Console Festlegen

Zeitzone ändern bei RHEL/CentOS und Fedora

Dieser Beitrag zeigt die Abfrage und das festlegen der Zeitzone in der Befehlszeile bei RHEL/CentOS 8 und Fedora 30. Eine korrekte Systemzeit ist für Computersysteme essentiell und schafft überhaupt die Voraussetzung für ein reibungslosen Beitrieb der interagierenden Dienste. Zur Überprüfung und Bearbeitung der Zeitzoneneinstellung dient das Befehlszeilentool timedatectl.

Hier die Zeitzoneneinstellung Abfrage ohne zusätzliche Argumente:

$ timedatectl
               Local time: Mi 2021-02-17 17:04:29 GMT
           Universal time: Mi 2021-02-17 17:04:29 UTC
                 RTC time: Mi 2021-02-17 16:57:58
                Time zone: Europe/London (GMT, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Die Zeitzoneneinstellung ändern und festlegen:

$ sudo timedatectl set-timezone Europe/Zurich

Abfragen der geänderten Zeitzoneneinstellung:

$ timedatectl
               Local time: Mi 2021-02-17 18:05:58 CET
           Universal time: Mi 2021-02-17 17:05:58 UTC
                 RTC time: Mi 2021-02-17 16:59:27
                Time zone: Europe/Zurich (CET, +0100)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

Die verfügbaren Zeitzonen mit folgendem Command ausgeben:

$ timedatectl list-timezones

Da es viele Zeitzonen gibt, wird die Abfrage sehr lange, mit grep die Abfrage eingegrenzt:

$ timedatectl list-timezones | grep Europe