У меня есть несколько серверов Linux (ubuntu 12.04) для аутентификации входа пользователей через внешний (для моего филиала) LDAP (в частности, Novell Edirectory). Это работает хорошо, однако я пытаюсь фильтровать логины пользователей по членству в группе LDAP.
Учетная запись пользователя в Edir выглядит так:
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
Групповая запись в Эдире выглядит так:
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
Мне нужны только пользователи в shellacct
группа для входа. Я нашел много примеров, используя pam_filter
в /etc/ldap.conf
но заставили фильтр работать только путем фильтрации по конкретным userDn
такие атрибуты, как:
pam_filter &(objectclass=user)
pam_filter &(objectclass=Person)
pam_filter &(loginShell=/bin/bash)
Я хочу отфильтровать членство в группе. В groupDn
является cn=shellacct,ou=groups,ou=eng,o=lsi
(gid = 2009). Я пробовал в /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)
Будет pam_filter
работать для того, что я хочу делать, или это только смотрит на userDn
для фильтрации?
Модуль PAM pam_succeed_if.so кажется идеальным для этого. Фактически, я использую его таким образом на множестве своих серверов. Пример конфигурации из Ubuntu 14.04, авторизации в домене MS AD, от /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
Заменить имя сервера для $ hostname. Быть членом администраторы unix или auth- $ hostname предоставляет доступ.
Также рассмотрите возможность использования nslcd
(0.9+), поскольку он распознает членство во вложенных (косвенных) группах.
Просто хотел оставить это здесь для всех, кто ищет такого рода вещи. Взгляните на /etc/security/access.conf
. Он распознает пользователей / группы / локальные / LDAP. Вот что я в итоге сделал. Это хороший универсальный магазин для ACL.
Вам нужно будет включить pam_access.conf
в различных файлах в /etc/pam.d/
Знайте системных обновлений, повторно устанавливающих эти правки. Не знаю, как обойти это. возможно упоминание о pam_succeed
выше было бы лучшим местом для этого.
# 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
пример 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
Возможно, вы сможете использовать pam_groupdn
вариант в /etc/ldap.conf
чтобы добраться туда, куда вы хотите. Я использовал pam_check_host_attr
для аналогичной цели в прошлом, и он работал именно так, как я хотел (т.е. запись LDAP должна была иметь host
атрибут с именем хоста, на который вы пытаетесь войти в качестве значения).