Archiv der Kategorie: Linux Howto

THINK UNBLOG GNU/Linux Knowledge Network for Tutorials, Howto’s, Workaround, DevOps Code for Professionals.

FTP-Server Installation mit VSFTPD und härten mit Fail2ban

FTP-Server Installation mit VSFTPD

In diesem Tutorial zeigen wir, wie man den FTP-Daemon vsFTPD auf einem Linux-Server bereitstellt. Schließlich wird vsFTPD durch fail2ban gehärtet.

Very Secure File Transfer Protocol Daemon, wie uns das gleichnamige Dienstprogramm verspricht, ist VSFTPD ein sicherer FTP-Daemon, dieser als Standard-FTP-Server von den meisten Linux Distributionen verwendet wird, so in Debian, Ubuntu, CentOS, Fedora, RHEL und weiteren mehr. VSFTPD ist ein stabiler FTP-Server dieser unter der GNU General Public License autorisiert ist. VSFTPD wurde entwickelt für eine sichere und einfache Unterstützung virtueller Clients mit PAM (Pluggable Authentication Modules). In diesem Tutorial wird gezeigt, wie man VSFTPD installiert und mit Fail2ban auf Debian 10 (buster) oder anderen Linux Versionen implementiert. Fail2ban ist ein in Python geschriebenes Intrusion Prevention System, das auf jedem Linux Betriebssystem läuft, dieses eine manipulierbare Firewall beinhaltet.

Very Secure File Transfer Protocol Daemon – VSFTPD – absichern mit Fail2ban

vsFTPD Installation

Unter Debian und Ubuntu wird VSFTPD mit dem apt Paket Manager aus dem Standard Repository installiert.

$ sudo apt-get install vsftpd -y

Bei CentOS und RHEL wird VSFTPD mit YUM installiert.

$ sudo yum install vsftpd -y

Nach der Installation geht’s zur Konfiguration von VSFTPD.

$ sudo vi /etc/vsftpd.conf

Bei CentOS / RHEL / Fedora ist vsftpd.conf unter /etc/vsftpd.

$ sudo vi /etc/vsftpd/vsftpd.conf

  Wer nicht mit VIM arbeitet, kann mit nano oder ne editieren.

Wir deaktivieren die anonyme Anmeldung und erlauben lokalen Benutzern zu schreiben.

anonymous_enable=NO
local_enable=YES
write_enable=YES

chroot für FTP Benutzer

chroot steht für change root und ist eine Funktion für Unixoide Systeme, um das Rootverzeichnis zu ändern. chroot wirkt sich nur auf den aktuellen Prozess und seine Child-Prozesse aus, es ist ein einfacher Jail-Mechanismus in dem das FTP-Dienstprogramm verhindert das Benutzer auf Dateien ausserhalb seines Verzeichnisses zugreifen können. chroot bietet auch eine einfache Möglichkeit, nicht vertrauenswürdige Daten in eine Sandbox zu versetzen. Die chroot Einstellungen für VSFTPD Benutzer findet man in der Datei vsftpd.conf bei Zeile chroot_local_user und ändere dort auf YES, so auch bei chroot_list_enable.

chroot_local_user=YES
chroot_list_enable=YES

Alle Benutzer werden chroot zugeteilt, bis auf einige die befreit sind, dazu wird die Datei /etc/vsftpd.chroot_list erstellt, diese Benutzer enthält, die von chroot ausgeschlossen werden.

chroot_list_file=/etc/vsftpd.chroot_list
allow_writeable_chroot=YES

  CentOS / RHEL Pfad /etc/vsftpd/vsftpd.chroot_list

Um für bestimmte Benutzer die Anmeldung ganz zu verweigern, fügen wir der Datei vsftpd.conf folgende Zeilen hinzu.

userlist_deny=YES
userlist_enable=YES
userlist_file=/etc/vsftpd.userlist

Erstelle eine Datei vsftpd.userlist und füge Benutzer hinzu diese abgelehnt werden sollen. Abgelehnt werden Service Accounts, da diese gerne für Angriffe genutzt werden. Benutzer pro Zeile hinzufügen, Beispiel: vsftpd.userlist

root
bin
daemon
sys
sync
man
backup
admin
sshd
lp
sync
proxy
list
irc
shutdown
halt
mail
news
uucp
operator
games
nobody
postfix
www-data
ftp
mysql

SFTP verschlüsselte Authentifizierung

Damit Passwörter nicht im Klartext gesendet werden, diese Optionen zur Konfigurationsdatei hinzufügen, einige davon sind bereits verhanden, überprüfe diese und ändere ggf. die Optionen.

ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

Anmerkung: Wird der SSH Server auf dem System ausgeführt, muss beachtet werden, das per Standard SFTP durch den SSH Daemon bereits ausgeführt wird, deshalb die Datei /etc/ssh/sshd_config überprüfen.

Subsystem    sftp  /usr/lib/openssh/sftp-server
Weitere empfohlene VSFTPD Einstellungen
# chroot() jail at times vsftpd does not require filesystem.
secure_chroot_dir=/var/run/vsftpd/empty
# This string is the name of the PAM service vsftpd will use.
pam_service_name=ftp
# Uncomment this to indicate that vsftpd use a utf8 filesystem.
utf8_filesystem=YES
# passive mode FTP port range this allows by firewall.
pasv_min_port=40000
pasv_max_port=50000

Anmerkung: Eine FTP-Verbindung besteht aus dem Befehlskanal und dem Datenkanal. Der passive Modus ermöglicht es dem FTP-Client, beide Kanäle zu erstellen, so dass die Firewall die FTP-Verbindung nicht blockieren darf, daher muss der Portbereich von pasv_min_port bis pasv_max_port auf der Firewall geöffnet sein.

VSFTPD schützen und härten mit Fail2ban

Um den FTP-Server vor Brute-Force Angriffe zu schützen, wird Fail2ban (Fehlschlag führt zum Bann) für VSFTPD aktiviert. Bei einer definierten Anzahl fehlgeschlagener Anmeldeversuche, wird der verdächtige Host für eine bestimmte Zeit gesperrt. Fail2ban liest die Anmeldeversuche aus den Logdateien. Hierzu wird Fail2ban auf dem FTP-Server installiert.

$ sudo apt install -y fail2ban

Für Fail2ban und VSFTPD die Datei jail.local erstellen, falls nicht bereits vorhanden.

$ sudo vi /etc/fail2ban/jail.local

  Weiter kann die Datei jail.conf kopiert werden, oder es werden einzelne Blöcke der Services in jail.local hinzugefügt.

[vsftpd]
enabled = true
# or overwrite it in jails.local to be
# logpath = %(syslog_authpriv)s
# if you want to rely on PAM failed login attempts
# vsftpd's failregex should match both of those formats
port     = ftp,ftp-data,ftps,ftps-data
logpath  = %(vsftpd_log)s
findtime=1800
bantime = 7200
maxretry = 4

Der Fail2ban Filter für VSFTPD enthält die Datei unter /etc/fail2ban/filter.d/vsftpd.conf

[INCLUDES]

before = common.conf

[Definition]

__pam_re=\(?%(__pam_auth)s(?:\(\S+\))?\)?:?
_daemon =  vsftpd

failregex = ^%(__prefix_line)s%(__pam_re)s\s+authentication failure; logname=\S* uid=\S* euid=\S* tty=(ftp)? ruser=\S* rhost=<HOST>(?:\s+user=.*)?\s*$
            ^ \[pid \d+\] \[[^\]]+\] FAIL LOGIN: Client "<HOST>"(?:\s*$|,)

ignoreregex =

  Im Standard wird /var/log/vsftpd.log ausgelesen, was mit der Variable %(vsftpd_log)s vordefiniert ist.

Für die funktionsweise von Fail2ban sind die Logs von bedeutung. Der FTP-Server (VSFTPD) protokolliert in der Logdatei /var/log/vsftpd.log. Fail2ban ist flexibel und kann für die meisten Anforderungen angepasst werden, wird zusätzlich ein weiteres Diensprogramm eingesetzt, dieses xferlog voraussetzt, kann mit dual_log_enable=YES in beide Logdateien protokolliert werden.

xferlog_enable=YES
log_ftp_protocol=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=NO

Um änderungen von Fail2ban zu übernehmen, muss der Daemon neu gestartet werden.

$ sudo systemctl restart fail2ban

Die von Fail2ban gesperrten IP Adressen können überprüft werden, hier als root mit folgendem fail2ban-client Kommando.

$ fail2ban-client status vsftpd
Status for the jail: vsftpd
|- Filter
|  |- Currently failed: 0
|  |- Total failed:     3
|  `- File list:        /var/log/vsftpd.log
`- Actions
   |- Currently banned: 17
   |- Total banned:     126
   `- Banned IP list:

Firewall-cmd Firewalld: 5 Tipps für Linux Host-Schutz

Blockiere Brute-Force Angriffe mithilfe von firewall-cmd (firewalld) für den Linux Host-Schutz. Ein bash-Skript, das eine IP-Adresse mit firewall-cmd (firewalld) sperrt, und es ermöglicht eine IP-Adresse durch firewall-cmd (firewalld) entfernen.

Firewall Daemon („firewalld“) für den Schutz vor laufenden Brute-Force Attacken, bei der Erkennung versuchter Angriffe auf ein Linux Host. Blockiere verdächtige Quellen schnell. 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 Repositorys verfügbar. Die Installation ist unschwer wie folgender Ablauf zeigt.

$ sudo apt update
$ sudo apt -y install firewalld

Firewalld Bereitstellung

Bereitstellung von Firewalld im Terminal als root.

$ 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.

Firewalld Zonen und Interfaces

Ein Netzwerk Interface zur Default Zone public zuweisen, unter Verwendung des firewall-cmd Tools, mit dem Befehl 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 wird wie folgt wieder entfernt.

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

Jede änderung muss mit firewall-cmd –reload aktiviert werden.

$ 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