Как отфильтровать логины пользователей ldap в Linux?

Как отфильтровать логины пользователей ldap в Linux?

У меня есть несколько серверов 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

Групповая запись в Edir выглядит так:

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_filterin /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 (гид=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фильтрацию?

решение1

модуль ПАМ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

Заменить имя сервера на$имя_хоста. Будучи членомunix-администраторыилиauth-$hostnameпредоставляет доступ.

Также рассмотрите возможность использования nslcd(0.9+), поскольку он распознает вложенное (косвенное) членство в группах.

решение2

Вы можете использовать pam_groupdnопцию in, /etc/ldap.confчтобы попасть туда, куда хотите. Я использовал ее pam_check_host_attrдля похожей цели в прошлом, и она работала именно так, как я хотел (т. е. запись LDAP должна была иметь атрибут hostс именем хоста, на который вы пытаетесь войти, в качестве значения).

решение3

Просто хотел оставить это здесь для тех, кто ищет что-то подобное. Посмотрите на /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

Связанный контент