
Ich habe mehrere Linux-Server (Ubuntu 12.04) eingerichtet, um Benutzeranmeldungen über ein externes (zu meiner Zweigstelle) LDAP (insbesondere Novell Edirectory) zu authentifizieren. Das funktioniert gut, ich versuche jedoch, Benutzeranmeldungen nach Mitgliedschaft in einer LDAP-Gruppe zu filtern.
Ein Benutzerkonto sieht in Edir folgendermaßen aus:
dn: cn=mmcloud,ou=eng,o=lsi
loginShell: /bin/bash
homeDirectory: /home/mmcloud
gidNumber: 2001
uidNumber: 9418
mail: xxxxxx@xxxxxxxxx
uid: mmcloud
initials: Q
givenName: Moran
sn: McCloud
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: ndsLoginProperties
objectClass: Person
objectClass: Top
objectClass: posixAccount
eMailAddress: 7#xxxxx@xxxxxxxxxxxx
cn: mmcloud
Ein Gruppeneintrag sieht in Edir folgendermaßen aus:
dn: cn=shellacct,ou=groups,ou=eng,o=lsi
memberUid: jbarlin
memberUid: mmccloud
memberUid: ssemryn
memberUid: cdesmon
gidNumber: 2009
objectClass: groupOfNames
objectClass: Top
objectClass: posixGroup
Ich möchte, dass sich nur Benutzer in der shellacct
Gruppe anmelden. Ich habe viele Beispiele für die Verwendung von „ pam_filter
in“ gefunden /etc/ldap.conf
, aber der Filter funktionierte nur, wenn ich nach bestimmten userDn
Attributen filterte, wie zum Beispiel:
pam_filter &(objectclass=user)
pam_filter &(objectclass=Person)
pam_filter &(loginShell=/bin/bash)
Ich möchte nach Gruppenmitgliedschaft filtern. Das groupDn
istcn=shellacct,ou=groups,ou=eng,o=lsi
(gid=2009). Ich habe es versucht in /etc/ldap.conf
:
pam_filter &(objectclass=posixAccount)(|(gidNumber=2009))
pam_filter |(member=cn=shellacct,ou=groups,ou=eng,o=lsi)
pam_filter |(memberUid=cn=shellacct,ou=groups,ou=eng,o=lsi)
Funktioniert pam_filter
es für das, was ich tun möchte, oder dient es nur zum userDn
Filtern?
Antwort1
PAM-Modulpam_succeed_if.soscheint dafür ideal zu sein. Tatsächlich verwende ich es auf vielen meiner Server so. Eine Beispielkonfiguration von Ubuntu 14.04 mit Autorisierung für die MS AD-Domäne, von /etc/pam.d/common-account
:
account sufficient pam_unix.so
account requisite pam_ldap.so
account sufficient pam_succeed_if.so user ingroup unix-admins
account sufficient pam_succeed_if.so user ingroup auth-$hostname
account requisite pam_deny.so
Servernamen ersetzen für$HostnameAls Mitglied vonUnix-Administratorenoderauth-$hostnamegewährt Zugriff.
Erwägen Sie auch die Verwendung von nslcd
(0.9+), da es verschachtelte (indirekte) Gruppenmitgliedschaften erkennt.
Antwort2
Möglicherweise können Sie die pam_groupdn
Option in verwenden /etc/ldap.conf
, um dorthin zu gelangen, wo Sie hin möchten. Ich habe es pam_check_host_attr
in der Vergangenheit für einen ähnlichen Zweck verwendet und es hat genau so funktioniert, wie ich es wollte (d. h. der LDAP-Eintrag musste ein host
Attribut mit dem Hostnamen haben, bei dem Sie sich anmelden möchten, als Wert).
Antwort3
Ich wollte das nur hier lassen, für alle anderen, die nach so etwas suchen. Schauen Sie sich das an /etc/security/access.conf
. Es erkennt Benutzer/Gruppen/Lokales/LDAP. Das ist, was ich letztendlich gemacht habe. Es ist ein netter One-Stop-Shop für ACLs.
Sie müssen pam_access.conf
in verschiedenen Dateien aktivieren in/etc/pam.d/
Seien Sie sich bewusstvon Systemupdates, die diese Änderungen zurücksetzen. Ich bin mir nicht sicher, wie ich das umgehen soll. Vielleicht pam_succeed
wäre die Erwähnung oben ein besserer Platz dafür.
# grep access /etc/pam.d/*
...
/etc/pam.d/login:# Uncomment and edit /etc/security/access.conf if you need to
...
/etc/pam.d/login:account required pam_access.so
/etc/pam.d/sshd:# Uncomment and edit /etc/security/access.conf if you need to set complex
...
/etc/pam.d/sshd:account required pam_access.so
Beispiel access.conf
:
# allow root from the backup system
+ : root : 10.10.16.2
# allow root from cron, serial port and tty consoles
+ : root : cron crond :0 ttyS0 tty1 tty2 tty3 tty4 tty5 tty6
# allow ldapusers on 10.0.0.0/8 subnet
+ : ldapuser4 ldapuser1 ldapuser7: 10.0.0.0/8
# allow users in ldap posixGroup on 10.10.16.0 subnet
+ : ldapssh : 10.10.16.0/24
# allow everyone in the localhost sftponly group from anywhere
+ : sftponly : ALL
# drop everyone else from anywhere
- : ALL : ALL