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
SMB: Einrichtung eines gemeinsamen Verzeichnisses für einzelne Clients, gemeinsames Verzeichnis für die Zusammenarbeit
Die Einrichtung eines gemeinsamen Verzeichnisses für die Zusammenarbeit mehrerer Benutzer sollte zuerst auf Dateisystemebene funktionieren und erst danach über CIFS exportiert werden.
Die Installation des Samba-Servers erfolgt durch Aufruf von
yum install samba
Erstellung von Benutzerkonten
Der erste Schritt ist die Erstellung einer Gruppe und das Hinzufügen/Erstellen der jeweiligen Mitglieder der Gruppe:
groupadd team1 useradd -s /sbin/nologin -g team1 alice useradd -s /sbin/nologin -g team1 bob useradd -s /sbin/nologin -g team1 sam
In obigem Beispiel wurde die Gruppe team1 und die Benutzer bob, sam und alice als deren Mitglieder erstellt. Da ein Login auf dem lokalen System für diese Benutzer nicht notwendig ist wurde den Benutzern die Login-Shell /sbin/nologin zugewiesen.
Zuweisen von Benutzerkennworten
Kennworte werden von Samba in einer eigenen Datenbank geführt. Die Erstellung eines Kennwortes für einen Benutzer erfolgt durch Aufruf von smbpasswd. Nachfolgend werden Kennworte für die Mitglieder der Gruppe team1 erstellt:
smbpasswd -a bob smbpasswd -a sam smbpasswd -a alice
Erstellung eines gemeinsamen Verzeichnisses
Wichtig bei der Erstellung des gemeinsamen Verzeichnisses zur Zusammenarbeit sind korrekt gesetzte Zugriffsrechte, falls nötig ein gesetztes Sticky-Bit sowie der entsprechende SELinux-Sicherheitskontext.
mkdir /share chgrp team1 /share chmod 3770 /share
Das Verzeichnis zur Zusammenarbeit wird mit Hilfe des Befehls mkdir erstellt, chgrp ändert die Hauptgruppe des Verzeichnisses zu team1. Mit chmod werden ausreichende Zugriffsrechte gesetzt, um den Mitgliedern der Gruppe team1 eine Zusammenarbeit zu ermöglichen. Die Bedeutung der oktal angegebenen Unix-Rechte ist hier noch einmal im Detail aufgeschlüsselt:
3 Set Group ID (2) + Sticky Bit (1)
Durch Setzen von Set Group ID (oktal 2) befinden sich neu erstellte Dateien und Verzeichnisse automatisch im Eigentum der Gruppe team1. Das gesetzte Sticky-Bit (oktal 1) bewirkt dass nur der jeweilige Eigentümer einer Datei diese auch löschen darf – obwohl die gesamte Gruppe Schreibrechte hat. Das Sticky-Bit sollte nur dann gesetzt werden wenn diese Funktionalität gewünscht ist.
7 Benutzer: Lesen (4) + Schreiben (2) + Ausführen (1)
7 Gruppe: Lesen (4) + Schreiben (2) + Ausführen (1)
0 Andere: keine Rechte
Benutzer und Gruppe haben Lese- (oktal 4), Schreib- (oktal 2) und execute-Rechte (oktal 1), in Summe also jeweils oktal 7 (rwx). Alle Anderen haben keine gesetzten Rechte, können also weder den Inhalt des Verzeichnisses einsehen, in das Verzeichnis wechseln oder Dateien bzw. Verzeichnisse anlegen oder ändern.
Konfiguration von SELinux
Von Samba freigegebene Verzeichnisse und Dateien müssen den Kontext samba_share_t haben. Zur einfacheren Konfiguration von Sicherheitskontexten ist es empfehlenswert, das Paket policycoreutils-python zu installieren. Dieses stellt unter anderem den Befehl semanage bereit:
yum install policycoreutils-python semanage fcontext -a -t samba_share_t /share restorecon -R /share
Wichtig ist der genaue Syntax bei Aufruf von semanage – kein Forward-Slash nach Angabe des Verzeichnisses (BASH fügt dieses bei Tab-Vervollständigung automatisch an). semanage setzt den Type samba_share_t auf das Verzeichnis /share, restorecon führt diese Änderung dann auch tatsächlich durch.
Ausnahme in die Firewall hinzufügen
Die Firewall wird am unkompliziertesten mit dem Werkzeug system-config-firewall-tui angepasst. Eine Installation erfolgt durch
yum install system-config-firewall-tui
Aufruf der Werkzeugs zur Firewallkonfiguration:
system-config-firewall-tui
–> Anpassen –> „Samba“ markieren –> Schließen
Konfiguration von Samba
Die eigentliche Konfiguration von Samba ist recht einfach. Es wird eine Freigabe mit Angabe des Pfades erstellt und ausreichende Rechte darauf gesetzt.
Zu editieren ist dabei die Konfigurationsdatei /etc/samba/smb.conf. Erforderlich ist eine Anpassung von workgroup und netbios name, sowie das Hinzufügen der eigentlichen Freigabe.
workgroup = MYGROUP netbios name = MYSERVER [myshare] path = /share writable = yes valid users = +team1 create mask = 660 directory mask = 770 hosts allow = 192.168.100. hosts deny = 192.168.100.103
Mit workgroup wird der Name der Arbeitsgruppe angegeben, netbios name setzt den Rechnernamen, der im Netzwerk angezeigt wird. Unter interfaces kann noch angegeben werden auf welchen Netzwerkschnittstellen Samba erreichbar ist. writable ermöglicht schreibenden Zugriff auf die Freigabe, create mask und directory mask geben an, mit welchen Rechten neu erstellte Dateien bzw. Verzeichnisse angelegt werden. valid users enthält durch Leerzeichen getrennt Benutzer, die Zugriff auf die jeweilige Freigabe haben sollen. Gruppen werden durch vorangestelltes + gekennzeichnet. Hostbasierte Zugriffssteuerung kann mit hosts allow bzw. hosts deny erreicht werden.
Nach erfolgter Anpassung der Konfiguration muss der Netbios-Name Daemon nmb sowie der Samba-Server smb (neu) gestartet werden:
service nmb start service smb start chkconfig nmb on chkconfig smb on
Die Freigabe sollte nun in der Netzwerkumgebung sichtbar sein und von den Benutzern bob, sam und alice zu benutzen sein.
Weiterführende Informationen bieten die Befehle
man samba man samba_selinux man smb.conf tail -f /var/log/messages tail -f /var/log/audit/audit.log getsebool -a | grep samba
Transfer von Windows Benutzerkonten in Samba Benutzerdatenbank
Accounts aus Windows SAM-Datenbank extrahieren:
Um Benutzer- sowie Computerkonten im laufenden Betrieb aus der Windows SAM-Datenbank auszulesen kann beispielsweise das Programm fgdump verwendet werden. fgdump muss dabei mit Administrator-Privilegien gestartet werden um die Datenbank auslesen zu können. Das Programm erstellt dabei eine simple ASCII Textdatei die beliebig weiter verwendet werden kann.
fgdump lässt sich unter folgender Adresse herunterladen:
http://www.foofus.net/~fizzgig/fgdump/fgdump-usage.htm
Nach einem Doppelklick auf die ausführbare Datei wird im selben Verzeichnis eine einfache Textdatei mit den enthaltenen Kennwort-Hashes erstellt, z.B. 127.0.0.1-fgdump. Diese Datei müssen wir nun auf unseren Linux Server kopieren
Ergebnis in die Datei smbpasswd eintragen
Ein Zeilenumbruch in Microsoft Betriebssystemen wird mit Carriage Return/Linefeed dargestellt. Auf UNIX bzw. Linux Systemen wird dieser jedoch nur mit Linefeed dargestellt, daher entfernen wir nun das für uns unnötige Carriage Return aus unserer Textdatei und legen die nun konvertierte Datei in /var/lib/samba/private/smbpasswd ab. Dies ist der default-Speicherort für die Datei smbpasswd in CentOS 6.
tr -d "\r" < 127.0.0.1-pwdump > /var/lib/samba/private/smbpasswd
Benutzer lokal anlegen und Heimatverzeichnis erstellen
Da für einen Betrieb eines Samba Servers in den meisten Fällen Benutzerkonten auch lokal angelegt sein müssen legen wir für jeden angeführten Benutzer in der Datei smbpasswd ein Konto samt Heimatverzeichnis an. Dabei sollten vorher nicht benötigte Zeilen aus der Datei entfernt werden, z.B. Maschinenaccounts (enden mit „$), falls der Samba Server nicht als Domain Controller arbeiten soll.
for line in `cat smbpasswd`; do useradd -u `echo line | cut -d: -f 2` -m `echo line | cut -d: -f 1`; done
Dabei wird der im ersten Feld angeführte Benutzer erstellt und mit der im zweiten Feld angegebenen User-ID versehen. Da die User-IDs bei Microsoft Betriebssystemen recht hoch sind sollte es normalerweise zu keinen Konflikten beim Erstellen der Accounts kommen, falls jedoch eine User-ID im System bereits vergeben ist muss diese in smbpasswd von Hand geändert werden.
Benutzer aus smbpasswd in tdbsam übertragen:
Der Import der Benutzer aus der Datei smbpasswd in das Samba Backend ist sehr einfach:
pdbedit -i smbpasswd -e tdbsam
Vorraussetzung ist dabei natürlich dass in smb.conf tdbsam als Backend gewählt ist, was dem default Wert entspricht. Es ist also in den meisten Fällen keine Änderung dieses Parameters in smb.conf erforderlich. Natürlich kann auch ein Import in andere Backends, wie zum Beispiel ldap erfolgen. Die manpage zu pdbedit gibt hierzu weiterführende Informationen.
Account Control Block Flag X hinzufügen
Durch Hinzufügen des X-Control Block Flags wird ein Ablaufen des Kennwortes verhindert, das heißt dass das Kennwort für unbeschränkte Zeit gültig ist.
for i in `cut -d: -f 1 smbpasswd`; do pdbedit -c "[X]" -u $i; done
Weiter Informationen zu Control Block Flags sind auf der Website des Samba-Projekts zu finden:
http://www.samba.org/samba/docs/man/Samba-HOWTO-Collection/passdb.html
Nach einem Neustart des Samba-Servers sollten nun die importierten Benutzer- sowie Maschinenaccounts problemlos verwendbar sein.
Samba Server als Active Directory Domänenmitglied
Es ist mittlerweile sehr einfach einen Linux basierten Samba-Server als Domänenmitglied einer Microsoft Active-Directory Struktur zu betreiben. Damit fallen die Kosten für Client-Zugriffslizenzen auf Windows Server weg. Es bleiben die Vorteile einer zentralen Benutzerverwaltung und Single Sign-On durch Windows Server sowie Stabilität und Kostenersparnis durch die Verwendung eines Linux Systems erhalten.
Wichtig bei der Konfiguration von Samba ist der richtig gesetzte Hostname und die Verwendung des Active Directory Servers als DNS und NTP Server. Distributionseigene Tools erledigen den Domänenbeitritt sehr komfortabel (CentOS/Red Hat: authconfig-tui) und meist problemlos, hier soll nur der „harte“ Weg gezeigt werden: Manuelle Anpassung aller Konfigurationsdateien.
Windows Domäne: example.com
Active Directory Server: win2008.example.com
Netbios Name des AD-Servers: win2008
Hostname setzen:
Der Hostname ist entweder manuell in den Dateien /etc/sysconfig/network und /etc/hosts oder durch die entsprechenden Distributionseigenen Tools zu setzen, Im Falle von Red Hat Enterprise Linux durch system-config-network.
hostname suse.example.com
/etc/resolv.conf editieren:
search example.com nameserver 192.168.10.1 # Active Directory Server
/etc/samba/smb.conf editieren:
[global] realm = EXAMPLE.COM security = ads # nur verwenden wenn nicht automatisch gefunden password server = win2008
/etc/krb5.conf editieren:
[libdefaults] Default_realm = EXAMPLE.COM [realms] EXAMPLE.COM = { kdc = win2008.example.com admin_server = win2008.example.com }
Samba und Netbios-Name Daemon aktivieren und starten:
chkconfig nmb on # Dienste bei Systemstart starten chkconfig smb on service nmb start # Dienste jetzt starten service smb start
Netbios Namensauflösung testen:
nmblookup win2008
Domain beitreten
Kerberos verlangt eine gleichgeschaltete Systemzeit zur Authentifizierung. Falls die Abweichung mehr als fünf Minuten beträgt schlägt eine Anmeldung fehl. Hier wird die Systemzeit manuell gesetzt, es ist aber empfehlenswert den Linux Server als NTP-Client des Windows Servers zu konfigurieren. Der Windows Active Directory Server stellt auch automatisch einen NTP-Server zu Verfügung. Die Konfiguration des Linux NTP-Clients erfolgt in /etc/ntp.conf.
ntpdate win2008 ; hwclock --systohc # Zeit synchronisieren, Toleranz 5 min net ads join –U Administrator –S win2008 # verlangt Domain-Admin Passwort
Domain-Benutzer Accounts aus AD auslesen und lokal anlegen:
Um Dateirechte richtig setzen zu können sollten Domänenbenutzer auch lokal auf dem Samba-Server existieren. Diese dienen nicht zur Anmeldung, benötigen keine Login-Shell, kein Heimatverzeichnis und kein Passwort.
cd /tmp net rpc user –U Administrator –S win2008 > users for i in `cat users` ; do useradd –d /tmp/tmpADUSER –s /dev/null $i ; done cat /etc/passwd | sed s_/tmp/tmpADUSER_/dev/null_g > passwd.tmp mv passwd.tmp /etc/passwd
Die Unix-Dateirechte der Samba Freigabe müssen den Zugriff erlauben!