Я уверен, что некоторые из вас уже сталкивались с этой проблемой. Я надеюсь, что у кого-то есть лучший ответ, чем то, что я делаю сейчас.
Итак, у вас есть несколько пользователей в каталоге LDAP, и однажды вы говорите: «Эй! Я могу пройти аутентификацию по этой штуке для SSH!» И это хорошо.
Затем в один прекрасный день вы понимаете, что хотите, чтобы только определенные пользователи могли получить доступ к машине. Скажем, разработчики должны иметь доступ только к разработчикам, но не к продуктам. Вы погуглите и найдете pam_groupdn
который входит в вашу конфигурацию LDAP (/etc/ldap.conf
) вот так:
pam_groupdn CN=developers,OU=groups,DC=yourcompany
И, опять же, хорошо. Вы создаете еще одну группу для продуктов, другую для QA и т. Д. Может быть, однажды у вас появится вторая группа разработчиков продукта, и они получат свою собственную группу. Без разницы.
Затем в один прекрасный день у вас есть сервер, на который должны войти и разработчики, и QA. Эээ ... Оказывается, pam_groupdn
не принимает несколько значений. Чем ты занимаешься? Что ж, если вы мало думаете, вы говорите: «О, я просто создам группу разработчиков и QA!».
pam_groupdn CN=developers-and-QA,OU=groups,DC=yourcompany
Это ... нехорошо, но все в порядке, правда?
Затем в один прекрасный день у вас появляется другой разработчик, и вы понимаете, что вам нужно добавить его в 15 групп, потому что есть developers-and-QA
, product1-and-product2
, developers-who-have-access-to-prod
и так далее. Дерьмо.
Должен быть способ сделать это лучше, верно? Я написал разработчикам pam_ldap
, и они сказали, что, к сожалению, нет возможности сделать pam_groupdn
принимать несколько значений (без взлома кода).
Кто-нибудь хочет поделиться тем, как они управляют группами групп в LDAP, не прибегая к копированию / вставке?
Рабочее решение - применить pam_filter
вместо того pam_groupdn
в /etc/ldap.conf
:
# Filter to AND with uid=%s
pam_filter |(member=CN=developers,OU=groups,DC=yourcompany)(member=CN=QA,OU=groups,DC=yourcompany)
«Фильтровать по И с uid =% s» означает, что фильтр, отправленный на LDAP-сервер, будет иметь следующий вид: &(uid=<your username>)(<your pam_filter>)
Пользователь должен быть членом developers
или QA
. Если он не является членом одной из этих групп, в ответе сервера LDAP будет сообщение об ошибке, и пароль даже не будет отправлен на сервер LDAP.
Работает для моей среды RHEL 5.8.
Чтобы узнать о различных вариантах фильтра, поищите в Google "синтаксис фильтра ldap" ...
Если вы используете NSS, вы можете установить AllowGroups
параметр в /etc/ssh/sshd_config
. Если нет, вам следует изучить динамические списки:
dn: cn=devandqa,ou=groups,dc=company,dc=com
cn: devandqa
objectClass: groupOfNames
labeledURI: ldap:///ou=groups,dc=company,dc=com?memberUid?one?(|(cn=developers)(cn=qa))
Что-то такое. Вам также необходимо включить схему и наложение и т. Д. Итак, это начало.
Предполагая, что у вас есть некоторая система управления конфигурацией, такая как марионетка, вы можете разработать решение на основе PAM (так что оно более общее, чем AllowGroups
в sshd_config) с помощью pam_listfile. Пусть марионетка управляет чем-то вроде /etc/allowed_groups
для каждой группы серверов / серверов и добавьте в конфигурацию PAM:
required pam_listfile.so onerr=fail item=group sense=allow file=/etc/allowed_groups
Как и решение SSH, здесь предполагается, что LDAP подключен к NSS.
Мое решение здесь довольно уродливое, но немного менее уродливое, чем то, что вы описали выше: группа, которую я указываю в pam_groupdn
группа "машинного класса", например cn=database,ou=NY,dc=mydomain,dc=com
Группы определяют, кто должен иметь доступ к определенному классу систем на определенном сайте (в приведенном выше примере, database
серверы в NY
).
Это действительно работает только благодаря тому факту, что в моей среде предоставление пользователю доступа к одной машине в определенном классе практически бессмысленно (потому что все они фактически идентичны), поэтому, если я разрешаю кому-то войти в db01
нет причин, по которым им не следует также входить в систему db02
. (Квалификация "сайта" проистекает из логики, согласно которой я могу нанять кого-нибудь для управления Калифорнией, но я не хочу, чтобы они входили в систему на машинах Нью-Йорка.)
Этот дизайн действительно предполагает некоторое дублирование в группах, что затрудняет глобальный отзыв доступа (например, моя учетная запись указана в каждой группе на каждом сайте: чтобы заблокировать моего пользователя, вам придется отредактировать каждую группу и отозвать мое членство), но это дает Группы - это логическая / управляемая структура, которая растет только при добавлении новых узлов / машинных классов.
Если вы используете RHEL6 +, файл conf находится по адресу /etc/pam_ldap.conf
и нет /etc/openldap/ldap.conf
. Если поставить pam_groupdn
войдите туда, тогда он будет работать как задумано. Лучший способ сделать это - скопировать ваш ldap.conf
к pam_ldap.conf
или создайте символическую ссылку.