Konfiguration der host- und benutzer-basierten Sicherheit des Dienstes
vsftpd
Die Standard-Konfiguration von vsftpd sieht vor allen in der Datei /etc/vsftpd/user_list angeführten Benutzern den Zugriff zu verweigern. Alle Benutzer, die nicht in dieser Datei enthalten sind können sich also am FTP-Server einloggen. Umgekehrt – Benutzer denen der Zugriff verweigert werden soll werden hier eingetragen.
# vsftpd userlist # If userlist_deny=NO, only allow users in this file # If userlist_deny=YES (default), never allow users in this file, and # do not even prompt for a password. # Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers # for users that are denied. # ... # Verweigere folgende Benutzer: bill steve
Dieses Verhalten macht auch meistens Sinn – vom Login ausgeschlossen sind nur System-Accounts und root. Gelegentlich will man aber nur einigen wenigen Benutzern den Zugriff auf den FTP-Server erlauben. In diesem Fall ist es praktischer die Bedeutung der Datei /etc/vsftpd/user_list umzukehren, um ausschließlich darin enthaltenen Benutzern FTP-Zugriff zu erlauben. Dazu wird der Eintrag userlist_deny in /etc/vsftpd/vsftpd.conf auf NO gesetzt:
userlist_deny=NO
Es folgt der Eintrag erlaubter Benutzer in /etc/vsftpd/user_list:
# Erlaube folgende Benutzer: alice bob sam
Es können sich nun ausschließlich die Benutzer alice, bob und sam an dem FTP-Server anmelden.
Host-basierte Sicherheit
Die Direktive tcp_wrappers in /etc/vsftpd/vsftpd.conf sollte bereits standardmäßig aktiv sein:
tcp_wrappers=YES
Es können nun Host-basierte Zugangsbeschränkungen über die Dateien /etc/hosts.allow und /etc/hosts.deny gesetzt werden:
/etc/hosts.allow
vsftpd : 192.168.100.0/255.255.255.0 EXCEPT 192.168.100.12
/etc/hosts.deny
vsftpd : ALL
Auf diese Weise abgewiesene Clients bekommen die Antwort
421 Service not available
Samba
Host- und Benutzerbasierte Sicherheit wird am einfachsten in der Konfigurationsdatei des Samba-Servers, /etc/samba/smb.conf festgelegt. Unter global eingetragene Beschränkungen gelten global, unter den einzelnen Freigaben eingetragene Beschränkungen ausschließlich für die jeweilige Freigabe. Verwendet werden dazu die Direktiven hosts allow, hosts deny sowie valid users und invalid users.
Die localhost Addresse 127.0.0.1 ist immer erlaubt (wenn nicht explizit in hosts deny angeführt).
Erlaube alle IPs in 150.203.*.* außer einer
hosts allow = 150.203. EXCEPT 150.203.6.66
Erlaube gesamtes Netzwerk
hosts allow = 150.203.15.0/255.255.255.0
Erlaube einige Hosts
hosts allow = lapland, arvidsjaur
Erlaube Hosts in NIS netgroup „foonet“, verweigere einen bestimmten Host
hosts allow = @foonet hosts deny = pirate
Erlaube Benutzer bob, sam, alice und lokale Gruppe team2, verweigere bill den Zugriff
valid users = bob sam alice +team2 invalid users = bill
SSH
User-basierte Sicherheit für SSH wird in der Konfigurationsdatei /etc/ssh/sshd_config festgelegt. Am wichtigsten ist dabei die Direktive AllowUsers – falls diese angegeben wird können sich ausschließlich die hier angegebenen Benutzer anmelden. Es ist auch möglich, Benutzer ein Login nur von bestimmten Hosts aus zu erlauben.
AllowUsers john fred AllowUsers bob@192.168.100.102 michael@192.168.150.12 AllowGroups team1 DenyUsers steve bill alice DenyGroups team2
Benutzer, denen der Zugriff nicht erlaubt ist bekommen nach Eingabe ihres Kennwortes die Meldung
Permission denied, please try again.
Es ist dabei nicht ersichtlich, ob das eingegebene Kennwort falsch war oder dem Benutzer das Login verweigert wurde.
Host-basierte Sicherheit wird am einfachsten über die Dateien /etc/hosts.allow und /etc/hosts.deny konfiguriert:
/etc/hosts.allow
sshd : 127. 192.168.100. EXCEPT 192.168.100.101
/etc/hosts.deny:
sshd : ALL
Per TCP-Wrappers abgelehnte Verbindungsversuche werden mit
ssh_exchange_identification: Connection closed by remote host
beantwortet. Es wird gar nicht erst die Eingabe eines Kennwortes verlangt.
NFS
Host-basierte Zugriffssteuerung sollte bereits bei der Erstellung von NFS-Freigaben konfiguriert sein.
/etc/exports
/mynfsshare 192.168.100.0/255.255.255.0(rw) 192.168.12.1(ro) /projects proj*.local.domain(rw) /usr *.local.domain(ro) @trusted(rw) /home/joe pc001(rw,all_squash,anonuid=150,anongid=100) /pub *(ro,insecure,all_squash)
Beschränkungen auf Benutzerebene werden über das Dateisystem festgelegt, entweder über die normalen UNIX-Rechte oder auch unter Verwendung von ACLs.
HTTP
Benutzer- und Hostbasierte Sicherheit wird in der Konfigurationsdatei /etc/httpd/conf/httpd.conf festgelegt. Erlaubte bzw. zu verweigernde Hosts werden über die Direktiven Order, Allow from und Deny from für jedes Verzeichnis einzeln angegeben. Ein Eintrag innerhalb <Directory „/var/www/html“> wird jedoch an alle Unterverzeichnisse vererbt, soweit dort nicht anders angegeben.
<Directory "/var/www/html"> # ... # # Controls who can get stuff from this server. # Order allow,deny Allow from all Deny from 192.168.100.103 </Directory>
Host 192.168.100.103 bekommt nun beim Versuch die Seite anzuzeigen den HTML-Error 403:
Forbidden You don't have permission to access / on this server.
Benutzerbasierte Sicherheit wird ebenfalls für jedes Verzeichnis einzeln konfiguriert. In folgendem Beispiel wird das Verzeichnis myprivatedir nur nach Eingabe eines gültigen Benutzernamens und des zugehörigen Kennwortes angezeigt:
<Directory "/var/www/html/myprivatedir"> AuthType Basic AuthName "Eingabe eines Kennwortes erforderlich" AuthUserFile /etc/httpd/users require valid-user </Directory>
Möglich nach require sind valid-user, valid-group, user und group.
Bei Verwendung von Gruppen ist zusätzlich zu AuthUserFile das AuthGroupFile bekanntzugeben:
AuthType Basic AuthName "Geschützte Ressource" AuthUserFile /web/users AuthGroupFile /web/groups Require group admin
Benutzer anlegen:
htpasswd -c /etc/httpd/users alice htpasswd /etc/httpd/users bob htpasswd /etc/httpd/users sam
Gruppen werden in einer einfachen Textdatei verwaltet, z.B. /etc/httpd/groups:
admin: bob sam alice team1: bill steve
FTP: rein anonymer Download, anonymer Dropbox-Upload (provisorisch)
Anonyme Dateifreigabe via FTP ist bereits in der Standardkonfiguration des vsftpd (Very Secure FTP Daemon) aktiviert. Dieses Prüfungsziel ist also bereits nach Installation und Aktivierung des FTP-Servers erfüllt. Freizugebende Dateien sind einfach in das Verzeichnis /var/ftp/pub (Heimatverzeichnis des Benutzers ftp) zu kopieren.
Installation des FTP-Servers vsftpd und des Werkzeuges für die Firewallkonfiguration:
yum install vsftpd system-config-firewall-tui
Anpassung der Konfiguration für rein anonymen Download
Anonymer Download ist zwar schon in der Standardkonfiguration möglich, jedoch ist auch ein Login lokal vorhandener Benutzer möglich. Falls der FTP-Server ausschließlich für anonyme Benutzer verwendbar sein soll ist die Direktive local_enable in /etc/vsftpd/vsftpd.conf entsprechend abzuändern oder auch einfach auszukommentieren:
local_enable=NO
Nach erfolgreicher Installation und Konfiguration wird vsftpd gestartet und außerdem sichergestellt, dass der Dienst beim Hochfahren des Systems automatisch startet:
service vsftpd start chkconfig vsftpd on
Mit Hilfe von system-config-firewall-tui erlauben wir noch den Zugriff auf den FTP-Dienst:
system-config-firewall-tui
–> Anpassen –> „FTP“ markieren –> Schließen
Der FTP-Server ist danach unter der IP-Adresse bzw. dem Hostnamen des Servers erreichbar.
Dateien für anonymen Download bereitstellen
Freizugebende Dateien werden einfach in das Heimatverzeichnis des Benutzers ftp kopiert:
cp myfile /var/ftp
Wichig ist hierbei, dass Dateien kopiert und nicht verschoben werden. Bei Kopieren wird der SELinux-Kontext des Zielverzeichnisses übernommen, bei Verschieben der Datei bleibt der Kontext der Datei erhalten, was ziemlich sicher zu Problemen mit SELinux führen wird. In einer normalen Arbeitsumgebung ist das kein Problem, der Kontext kann mit einem Aufruf von
restorecon -R /var/ftp
korrigiert werden. Für die Prüfung sollte man aber einfach cp verwenden.
Anonymer Dropbox-Upload
Um anonymen FTP-Benutzern Schreibrechte zu geben sind weitere Änderungen notwendig. Zunächst muss die Konfigurationsdatei entsprechend abgeändert werden. Danach sind ausreichende Zugriffsrechte für das Verzeichnis zu setzen und zuletzt der SELinux-Kontext und ein SELinux Boolean setzen.
Ein Dateiupload für anonyme Benutzer kann durch Entfernung des Kommentar-Zeichens vor anon_upload_enable in /etc/vsftpd/vsftpd.conf erlaubt werden. Falls anonyme Benutzer auch Verzeichnisse erstellen sollen können, muss auch anon_mkdir_write_enable gesetzt sein:
anon_upload_enable=YES anon_mkdir_write_enable=YES
Das Upload-Verzeichnis (hier: /var/ftp/pub) inklusive aller eventuell vorhandener Unterverzeichnisse für den Benutzer ftp beschreibbar machen:
chown -R ftp /var/ftp/pub
Um möglichst unkompliziert SELinux-Kontexte ändern zu können ist die Installation des Pakets policycoreutils-python empfehlenswert:
yum install policycoreutils-python
Der SELinux-Sicherheitskontext des Verzeichnisses muss von public_content_t auf public_content_rw_t geändert werden, um vsftpd schreibenden Zugriff auf das enstprechende Verzeichnis zu erlauben:
semanage fcontext -a -t public_content_rw_t /var/ftp/pub restorecon -R /var/ftp/pub
Zuletzt wird der SELinux Boolean allow_ftpd_anon_write permanent (-P) gesetzt, um vsftpd Schreiboperationen anonymer Benutzer zu erlauben:
setsebool -P allow_ftpd_anon_write 1
man vsftpd man ftpd_selinux getsebool -a | grep ftp semanage boolean -l
Sicheres FTP – vsftpd für SSL/TLS konfigurieren
FTP ist standardmäßig recht unsicher – Benutzername, Passwort und Daten werden im Klartext übertragen und können somit relativ einfach mitgeschnitten werden. Es besteht jedoch die Möglichkeit SSL/TLS zu verwenden um eine sichere Übertragung zu gewährleisten. vsftpd (Very Secure File Transfer Daemon) lässt sich sehr einfach hierfür konfigurieren.
vsftpd – Installation
yum install vsftpd
yum installiert vsftpd und kümmert sich automatisch um eventuell vorhandene Abhängigkeiten. Die Installation sollte schnell und problemlos erfolgen. Die Konfigurationsdateien von vsftpd liegen im Verzeichnis /etc/vsftpd.
Ein Zertifikat generieren
Mit Hilfe von OpenSSL wird ein Zertifikat generiert und unter /etc/vsftpd abgelegt. Der Backslash im Beispiel ist nur für den Zeilenumbruch notwendig, der Befehl kann so direkt in die Shell kopiert werden.
openssl req -x509 -nodes -newkey rsa:1024 -keyout \ /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem -days 3650
Wichtig ist dabei unter „Common Name“ den voll qualifizierten Domainnamen (z.B. ftp.example.com) des Servers zu verwenden, die Angabe eines Passworts ist nicht notwendig. Das hier erstellte Zertifikat hat eine Gültigkeitsdauer von 10 Jahren (-days 3650).
Konfiguration von vsftpd
vsftpd wird über die Datei /etc/vsftpd/vsftpd.conf konfiguriert, die Optionen sind größtenteils selbsterklärend. Anonyme Logins sind im folgenden Beispiel nicht erlaubt, die Verwendung von TLS (Nachfolger von SSL) wird erzwungen. Die Benutzer haben ausschließlich auf ihr Heimatverzeichnis Zugriff.
anonymous_enable=NO local_enable=YES write_enable=YES local_umask=0002 dirmessage_enable=YES xferlog_enable=YES xferlog_std_format=YES ftpd_banner=Welcome at ftp.foo.bar chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list listen=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES port_enable=NO pasv_enable=YES ssl_enable=YES allow_anon_ssl=NO force_local_data_ssl=NO force_local_logins_ssl=YES ssl_tlsv1=YES ssl_sslv2=NO ssl_sslv3=NO rsa_cert_file=/etc/vsftpd/vsftpd.pem ssl_ciphers=HIGH chroot_local_user=YES pasv_min_port=40000 pasv_max_port=40100
chroot_local_user beschränkt den Zugriff auf die jeweiligen Benutzerverzeichnisse. Ausnahmen werden in chroot_list_file angegeben – hier eingetragene Benutzer sind nicht auf ihr Heimatverzeichnis beschränkt. Mit der Option force_local_data_ssl=YES könnte problemlos auch der gesamte Datenverkehr verschlüsselt werden, was jedoch naturgemäß auch mehr Rechenleistung erfordert. In den meisten Fällen wird ein verschlüsselter Steuerkanal ausreichen. Mit pasv_min_port und pasv_max_port wird vsftpd angewiesen bei Verwendung des FTP PASV Kommandos Ports zwischen 40000 und 40100 zu verwenden. Wichtig für die Konfiguration der Firewall, diese Ports müssen von außen erreichbar sein.
FTP Server starten
service vsftpd start # vsftpd starten chkconfig vsftpd on # vsftpd beim Hochfahren starten
Bei Änderungen an der Konfigurationsdatei ist vsftpd neu zu starten um geänderte Einstellungen wirksam zu machen:
service vsftpd restart
Ausnahmen in die Firewall hinzufügen
Die Ports für FTP müssen in der Firewall noch geöffnet werden. Da Connection-tracking bei verschlüsselten Verbindungen nicht funktioniert muss außerdem noch ein Bereich festgelegt werden der für passive Verbindungen geöffnet ist.
system-config-securitylevel
- Eingang ermöglichen: FTP
- Erlauben der Ports 40000-40100
Port / Port-Bereich: 40000-40100 Protokoll: tcp
Konfiguration von SeLinux
SeLinux verhindert standardmäßig den Zugriff von vsftpd auf Benutzerverzeichnisse. Diese Einstellung muss noch geändert werden, falls SeLinux aktiviert ist (was auch unbedingt zu empfehlen ist).
setsebool -P ftp_home_dir 1
Benutzer anlegen
Im System vorhandene Benutzer können sich nun bereits via FTP anmelden und auf ihr Heimatverzeichnis zugreifen. Wenn auschließlich FTP Zugriff erforderlich ist und die Benutzer sich nicht am System selbst anmelden sollte die Login-Shell aus Sicherheitsgründen auf /sbin/nologin gesetzt sein.
useradd -s /sbin/nologin -m tux # Benutzer tux anlegen passwd tux # Passwort zuweisen
Das Anlegen von neuen Benutzern ist natürlich auch mit dem grafischen Tool zur Benutzerverwaltung möglich. Wichtig ist auch hier dass als Login-Shell /sbin/nologin gewählt und ein Heimatverzeichnis angelegt wird:
system-config-users
Neu angelegte Benutzer können sich sofort am FTP Server anmelden, ein Neustart von vsftpd ist nicht erforderlich.