Pluggable Authentication Module (PAM)

PAM ist ein sehr flexibler Authentifizierungsmechanismus für Dienste auf UNIX-Rechnern.
Für einzelne Dienste können verschiedene Konfigurationen vorgenommen werden.
Die Dienste werden über Dateien im Verzeichnis /etc/pam.d/ gesteuert. PAM ist sehr empfindlich. Deshalb sollte man sich bei Einstellungsänderungen immer eine rootkonsole zum Eingreifen offenlassen und alles erstmal ausgiebig testen.

automatische Konfiguration von PAM

pam_unix.so

Mit diesem Modul wird die lokale Authentifizierung eines Benutzers durchgeführt.

nullokkein Passwort nötig,wenn Benutzer keins vergeben hat
nullok_securekein Passwort nötig,wenn Benutzer keins vergeben hat
use_first_passÜbernehme das Passwort vom Modul vorher
use_authtok?
md5Benutzer für die Verschlüsselung des Passwort den MD5-Algoritmus
shadowBenutze die /etc/shadow(sollte standard sein)
remember=20merke die letzten 20 letzten Passwörter(steht in /etc/security/opasswd)

Beispiel:

password    sufficient    pam_unix.so nullok use_authtok md5 shadow remember=20

pam_env.so

administratives Festlegen von Variablen:
z.B. das erzwungene Ausloggen nach einer Stunde Untätigkeit:
in der Datei /etc/pam.d/common-auth muss dazu folgender Eintrag vorhanden sein:

auth  required pam_env.so  

in der Datei /etc/security/pam_env.conf muss dazu folgender Eintrag vorhanden sein:

TMOUT    DEFAULT=3600

Danach sollte bei Neuanmeldung eines Benutzers die Variable TMOUT gesetzt sein.

pam_limits.so

Das Modul stellt bestimmte Limits pro Benutzer ein.
Beispiel: Der Benutzer www-data soll die maximale Anzahl geöffneter Dateien auf 8128 erhöht bekommen.
Standard ist hier 1024.
Editiere die Datei /etc/pam.d/su und entkommentiere folgende Zeile:

session required pam_limits.so

dann editiere die Datei /etc/security/limits.conf und füge folgende Zeilen am Ende ein:

www-data soft nofile 8128
www-data hard nofile 8128

Überprüfe die gemachten Einstellungen mit:

su www-data -
ulimit -n
ulimit -a
exit


pam_tally.so

Benutzer nach 5 Fehlversuchen für 60 Minuten sperren:
in der Datei /etc/pam.d/common-auth muss dazu vor der pam_unix.so folgender Eintrag vorhanden sein:

auth  required pam_tally.so onerr=fail deny=5 unlock_time=3600 no_magic_root
onerr=failBei Anmeldefehlern
deny=5Anzahl der Fehler
unlock_time=3600Zeit für das Aussperren in Sekunden
no_magic_rootkeine root-accounts sperren
fileziel für die Anmeldelogs z.B. /var/log/faillog

pam_tally2.so

Benutzer nach 5 Fehlversuchen für 10 Minuten sperren:
in der Datei /etc/pam.d/common-auth muss dazu vor der pam_unix.so folgender Eintrag vorhanden sein:

auth  required pam_tally2.so deny=5 even_deny_root unlock_time=600 

Dadurch werden jeweils alle die es 5 mal versucht haben(auch root) für 10 Minuten lahmgelegt. Das Modul geht übrigens nach der UID nicht nach dem Namen.
deshalb werden alle Benutzer mit der selben UID gesperrt. ein gespeerter Benutzer kann von root wieder so entsperrt werden:

pam_tally --user meinBenutzer --reset

pam_mkhomedir.so

Bei erstmaliger Anmeldung eines Benutzers wird das HOME-Verzeichnis automatisch angelegt und berechtigt.

pam-auth-update --package mkhomedir

Dabei werden die Einstellungen aus dem Verzeichnis /etc/skel übernommen.
in der Datei /etc/pam.d/common-session muss dazu folgender Eintrag vorhanden sein:

session     required      pam_mkhomedir.so skel=/etc/skel umask=0022

oder auch einfach:

session     required      pam_mkhomedir.so

Achtung! in debian muss der Eintrag manchmal in die /etc/pam.d/common-account .(testen)
eventuell auch mal die Datei /etc/security/pam_winbind.conf ansehen

pam_access.so

Verweigere allen Benutzern den Login, die nicht in der Gruppe users sind:
in der Datei /etc/pam.d/common-account muss dazu vor der pam_unix.so folgender Eintrag vorhanden sein:

account    required     pam_access.so

in der Datei /etc/security/access.conf muss dann dazu folgender Eintrag gemacht werden:

-:ALL EXCEPT users :ALL

pam_cracklib.so

Einstellungen für die Vergabe eines neuen Passworts werden wie folgt festgelegt:
in der Datei /etc/pam.d/common-password muss vor der pam_unix.so folgender Eintrag vorhanden sein:

password     requisite      pam_cracklib.so retry=3 minlen=8 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1

Die einzelnen Einstellungen sind dabei:

retry=3
minlen=8Mindestlänge 8 Zeichen
lcredit=-1Mindestens ein Kleinbuchstabe
ucredit=-1Mindestens ein Großbuchstabe
dcredit=-1Mindestens eine Zahl
ocredit=-1Mindestens ein Sonderzeichen
difok=2In mindestens 2 Zeichen müssen sich das neue und das alte Passwort unterscheiden

Wenn man mal ein Passwort ändern möchte ohne Komplexitätsregel (z.B. beim root) wurde die obige Zeile deaktiviert. Jedoch trat dann der folgende Fehler auf:

passwd root
passwd: Authentication information cannot be recovered
passwd: password unchanged

die Lösung war dann das temporäre Löschen von use_authtok in der Zeile:

password required   pam_unix.so use_authtok nullok md5

Nach der erfolgten Passwortänderung habe ich die Zeile und den Wert wieder eingetragen.

pam_passwdqc.so

Das Modul setzt strenge Regeln für die Passwortvergabe durch.(lästig)
Beispiel:
Erzwinge die Benutzung von Zufallspasswörtern.Die Benutzer können keine eigenen Passwörter mehr vergeben sondern müssen das angezeigte Passwort akzeptieren.(gemein aber sehr sicher)
editiere die Datei /etc/pam.d/common-password:

password requisite   pam_passwdc.so random=50,only

Passwortpolicy entschärfen:

password requisite pam_passwdqc.so retry=3 min=0,0,0,0,0

pam_wheel.so

Erlaube allen Mitgliedern der Gruppe wheel das ausführen des Befehls su ohne Passwort!!!:
in der Datei /etc/pam.d/common-auth muss dazu vor der pam_unix.so folgender Eintrag vorhanden sein:

auth       required     /lib/security/pam_wheel.so use_uid group=wheel trust

pam_winbind.so

Winbind erfordert umfangreiche Konfigurationsarbeiten. Deshalb siehe dazu: Winbind

Wichtig ist in jedemfall der Eintrag use_first_pass.
Dieser Schalter bewirkt,dass ein gecachtes Passwort schon aus einem vorherigen Modul übernommen wird.
Dadurch muss man nur noch einmal sein Passwort angeben.
/etc/pam.d/common-account:

account sufficient   pam_winbind.so use_first_pass

/etc/pam.d/common-auth:

auth    sufficient   pam_winbind.so use_first_pass

/etc/pam.d/common-session:

session    sufficient   pam_winbind.so use_first_pass mkhomedir

Die Anmeldeeinschränkung auf Mitglieder von ein paar NT-Gruppen ( hier myNTGroup1 und myNTGroup2 ) kann wie folgt festgelegt werden:

auth sufficient   pam_winbind.so use_first_pass require_membership_of=myNTGroup1,myNTGroup2

oder ein anderes Beispiel:

auth sufficient   pam_winbind.so use_first_pass cached_login warn_pwd_expire

winbind per Programm konfigurieren und anschalten:

#suse:
pam-config -a --winbind
#debian:
pam-auth-update --package winbind --force

winbind per Programm wieder deaktivieren:

pam-config -d --winbind


pam_mount.so

mountet bei Benutzeranmeldungen z.B. persönliche Freigaben auf cifs- oder nfs-Servern.
wird gerne angewendet wenn winbind konfiguriert wurde. Macht dann aber eventuell Probleme bei einer Ansibleanwendung.
Dateikonfiguration in /etc/security/pam_mount.conf.xml
hier z.B. ein Domänenhomeverzeichnis eines sich anmeldenden Benutzers in seinem eigenen home erstellen und mit cifs mounten:

...
<volume fstype="cifs" server="myfilesrv"  path="userhome$/%(USER)" mountpoint="~/myuserhome" options="sec=krb5" />
</pam_mount>

Es z.B. wird hier ein Verzeichnis /home/myuser/myuserhome erstellt und mit dem Share \\myfilesrv\userhome$\myuser verbunden.
Bei Benutzerabmeldung wird das lokale Verzeichnis(myuserhome) wieder abgehängt und gelöscht.

pam_ldap.so

ldap erfordert umfangreiche Konfigurationsarbeiten. Deshalb siehe dazu: ldap

pam_motd.so

Zeigt bei erfolgreicher Benutzeranmeldung einen Text an.
Dieser wird in der Datei /etc/motd festgelegt.
eventuell ist die Datei nur ein Link auf die Datei /etc/motd.tail. Dann werden die Einträge bei jedem Neustart wieder überschrieben.
Dann den gewünschten Text in die Datei /etc/motd.tail einfügen.
in der Datei /etc/pam.d/common-session muss vor allen als erstes folgender Eintrag vorhanden sein:

session optional   pam_motd.so

wenn man eine andere Messagdatei benutzen will so kann man diese so konfigurieren:

session optional   pam_motd.so motd=/etc/motd

Im Gegensatz zeigt die Datei /etc/issue einen Text vor der Anmeldung an.
Beispiel:

Welcome on \l
users currently logged in : \u


pam_echo.so

Das Modul zeigt bei erfolgreicher Benutzeranmeldung den Text einer Datei an.
Dieser wird in einer Datei z.B. /etc/echo.txt festgelegt.
in der Datei /etc/pam.d/common-auth muss vor allen als erstes folgender Eintrag vorhanden sein:

session optional   pam_echo.so file=/etc/echo.txt

Das Modul kann verschiedene Variablen auflösen. Beispieldatei /etc/echo.txt:

Hallo
remotehost   %H
lokaler Host %h
servicename  %s
terminal     %t
remoteuser   %U
localuser    %u


pam_nologin.so

dieses Modul verhindert bei Vorhandensein der Datei /etc/nologin die Anmeldung von normalen Benutzern.
root-Benutzer können sich aber weiterhin anmelden.
Bei Aktivierung dieses Module werden aber aktuell angemeldete Benutzer nicht zwangsweise abgemeldet.
in der Datei /etc/pam.d/common-account muss vor allen erstes folgender Eintrag vorhanden sein:

account required   pam_nologin.so


pam_listfile.so

dieses Module überprüft eine vorgegebene Textdatei mit Benutzernamen und erlaubt oder verweigert dann den Zugriff auf einen Dienst oder die Anmeldung.
Beispiel FTP:
die in der Datei ftpd.users.deny aufgeführten Benutzer dürfen sich nicht über FTP am Server anmelden.

auth   required   pam_listfile.so   item=user sense=deny file=/etc/ftpd.users.deny onerr=succeed

die in der Datei suauth.users.nopass aufgeführten Benutzer brauchen beim su-Befehl kein Passwort angeben:

auth   sufficient   pam_listfile.so   item=ruser sense=allow file=/etc/suauth.users.nopass onerr=fail


pam_umask.so

dieses Modul setzt ähnlich wie umask die Standardrechte von neu erstellten Dateien und Ordnern.
um z.B. auch der Gruppe Schreibrechte zuzuordnen muss folgende Zeile in der Datei /etc/pam.d/common-session geschrieben werden:

session optional   pam_umask.so  umask=0002

Das ist nützlich, wenn man mit verschiedenen Accounts an seinem Rechner rumhantiert, stellt jedoch in Firmenumgebungen ein Risiko dar.
Um alle Rechte auszuknipsen und damit seine Dateien vollständig allen Benutzern gegenseitig auszuliefern , hilft ein :

session optional   pam_umask.so  umask=0000

Wenn man paranoid ist, kann man die Dateien der einzelnen Benutzer so sehr schützen dass sie jeweils nur noch selbst rankommen:

session optional   pam_umask.so  umask=0077

dieses PAM-Modul wird gern in /etc/profile überschrieben und bleibt dann somit unwirksam.

pam_securetty.so

dieses Modul verbietet das direkte interaktive Anmelden von Root an einem Rechner.
Erst muss sich ein normaler Benutzer anmelden, dann kann dieser mittels su eine rootshell öffnen.
Datei /etc/pam.d/common-auth mit folgender erster Zeile editieren:

auth    required    pam_securetty.so


pam_time.so

Modul für die zeitliche Einschränkung von Benutzern und Diensten
Datei /etc/pam.d/common-account mit folgender letzter Zeile editieren:

account    required    pam_time.so

dann Datei /etc/security/time.conf mit folgender Zeile editieren:

#erlaube dem Benutzer doedel nur am Montag von 08Uhr bis 16Uhr sich per login anzumelden:
login ; tty* & !ttyp* ; doedel;Mo0800-1600
#erlaube dem Benutzer pitti NICHT sich am Wochenende per login oder ssh anzumelden:
login & ssh  ; * ; pitti ; !Wd0000-2400
#erlaube ihm alles nur innerhalb der Woche von täglich 07Uhr bis 20Uhr
*;*;pitti;Wk0700-2000
#verhindere alle Anmeldungen von normalen Benutzern außer root immer täglich von 20Uhr abends bis 07Uhr morgens
#auch root soll sich nicht mehr von 23Uhr abends bis 06Uhr morgens anmelden dürfen.
*;*;!root;!Al2000-0700
*;*;root;!Al2300-0600



pam_group

nehme den Benutzer myansible in der Woche von 07:00 bis 21:00 in die Gruppe sudo auf wenn die Anmeldung über den sshd aus kommt,
sonst aber nicht. editiere /etc/security/group.conf

...
sshd;*;myansible;Wk0700-2100;sudo


pam_succeed_if.so

Benutzer Paul die Anmeldung verweigern:

auth required  pam_succeed_if.so user !=paul quiet_success

Nur Benutzer der Gruppe wheel dürfen sich am Modul anmelden:

auth required pam_succeed_if.so quiet user ingroup wheel 

Nur Benutzer mit UID größer 1000 dürfen sich am Modul anmelden:

auth requisite pam_succeed_if.so uid >= 1000 quiet 

pam_opie.so

Modul für die Einmalige Authentifizierung.

pam_exec.so

Modul zum ausführen eines Skripts

session optional pam_exec.so /usr/local/bin/mailme.sh