К основному контенту

Авторизация через ldap на Linux сервере

В системах с большим числом машин почти всегда встает вопрос централизованного управления пользователями и группами (авторизации, аутентификации т.д.). Для этого удобно использовать LDAP. В этой статье я расскажу как настроить аутентификацию через LDAP и ограничить доступ к машине только для определенных групп.

Настройка авторизации через LDAP

Для начала нужно установить пакеты обеспечивающие нужные нам функции:
sudo apt-get install ldap-auth-client nscd
Во время установки нас спросят следующее:
  1. URI of LDAP server - URI нашего сервера, например, ldap://ldapserver.corp.local (ldap может быть доступен по протоколам ldaps и ldapi).
  2. Name of the LDAP search base - базовый каталог для поиска, обычно он похож на домен на котором расположен сервер, в нашем примере это будет dc=corp,dc=local
  3. Make local admin database admin - позволит локальным администраторам изменять учетные записи в LDAP, обычно нужно ответить нет.
  4. Does the LDAP database require login - требуется ли логиниться в LDAP для того чтобы авторизовать пользователя, как правило нет.
После этого нужно немного подправить файл /etc/ldap.conf:
# Базовый каталог для поиска
base dc=corp,dc=local

# LDAP URI
uri ldap://ldap.corp.local
# Версия протокола
ldap_version 3

# Политика соединения
# hard - будет долго пытаться соединиться при ошибках
# soft - при ошибке сразу же вернет ошибку модулю авторизации
bind_policy soft

# Искать ли политику управления паролями в LDAP
pam_lookup_policy yes

# Политика изменения пароля (exop через LDAP)
pam_password exop

# Задаем синонимы атрибутов(uniqueMember значит то же, что и member т.е. вхождение в группы)
nss_map_attribute uniqueMember member
# Если сервер ldap использует tls для шифрования указываем эти опцию
ssl start_tls

# Требовать и проверять сертификат сервера
tls_checkpeer yes

# Директория с корневыми сертификатами
tls_cacertfile /etc/ssl/certs/you-ca.pem

# Группы членство в которых не будет браться из LDAP
nss_initgroups_ignoreusers backup,bin,daemon,games,gnats,irc,landscape,libuuid,libvirt-dnsmasq,libvirt-qemu,list,lp,mail,man,messagebus,news,proxy,root,sshd,statd,sync,sys,syslog,uucp,whoopsie,www-data,zabbix

# Расположение директорий с пользователями, паролями и группами
nss_base_passwd ou=people,dc=corp,dc=local
nss_base_shadow ou=people,dc=corp,dc=local
nss_base_group  ou=group,dc=corp,dc=local

Если ваш LDAP сервер использует зашифрованное соединение, то нужно скопировать корневой сертификат, которым подписан сертификат сервера LDAP в папку /etc/ssl/certs.

Включаем авторизацию через ldap:
sudo auth-client-config -t nss -p lac_ldap
И перезапускаем демоны отвечающие за авторизацию, чтобы новая конфигурация применилась:
sudo pam-auth-update
sudo /etc/init.d/nscd restart
Если все настроено верно, то мы сможем получить информацию о каком-либо пользователе из LDAP
id ldap-user
uid=10001(ldap-user) gid=10003(users) группы=10001(admins),10003(users)
Теперь пользователи из LDAP смогут авторизоваться на нашем компьютере и даже менять свой пароль при помощи passwd.

Автоматическое создание домашних директорий пользователям из LDAP

С текущей настройкой пользователи из LDAP смогут авторизоваться на компьютере, но у них не будет домашней директории. Чтобы исправить это давайте настроим модуль pam_mkhomedir, для этого нужно создать файл настроек pam модулей /usr/share/pam-configs/my_mkhomedir с вот таким содержимым:
Name: activate mkhomedir
Default: yes
Priority: 900
Session-Type: Additional
Session:
        required                        pam_mkhomedir.so umask=0022 skel=/etc/skel
И активируем его командой: pam-auth-update. Теперь любой пользователь из LDAP сможет авторизоваться и у него будет собственный домашний каталог. Каталог будет создан по указанному шаблону (в примере /etc/skel) и с правами соответсвующими маске (в примере 755).

Ограничение авторизации

Сейчас любой пользователь из LDAP сможет авторизоваться на нашей машине, если мы хотим ограничить доступ для некоторых пользователей или групп или разрешить авторизацию только определенным пользователям или группам. Для этого можно использовать модуль pam pam_listfile.so. 
Обязательно, сначала создайте файл /etc/login.group.allowed со список групп которым разрешено заходить на хост, иначе потом придется делать это с live-cd:
adm
root
wheel
admins
Также лучше добавить в список пользователя root, иначе не сможете под ним залогиниться, даже локально.
Теперь добавляем в начало /etc/pam.d/common-auth следующую строку:
auth required pam_listfile.so onerr=fail item=group sense=allow file=/etc/login.group.allowed
Более подробно о опциях модуля можно прочитать в документации, кратко:
  • onerr - что делать в случае ошибок.
  • item - что записано в указанный файл (имена пользователей - user, групп - group, хостов и т.д.)
  • sense - что делать, когда запись найдена в файле, allow - разрешить, deny=запретить авторизоваться.
  • file - полный путь до файла со списком.
Помимо этого метода можно сделать через nss_base_<map> это позволит указывать LDAP на какие машины разрешено заходить пользователю или группе.

На этом все.



Комментарии

Популярные сообщения из этого блога

Настройка VIM'а для разработки на C/C++

Наверняка вы уже слышали, что Vim - это мощнейший текстовый редактор не уступающий в функционале и удобстве большим тяжеловесным аналогам, наподобие Eclipse или XCode . Вот и я слышал, однако в базовой комплектации Vim умеет очень мало, подсвечивать синтаксис, расставлять отступы и подсказывать код на основе тэгов (но это не совсем то автодополнение которое мне бы нравилось). В этой статье я бы хотел рассказать, как Vim можно превратить в полноценную IDE для C/C++ с поддержкой проектов, автодополнения кода, поиском и подсвечиванием ошибок и генерацией по шаблонам. Предполагается, что у вас есть базовые умения в работе с Vim'ом.

Операторы && и || в bash

Доброго времени суток, сегодня я расскажу вам о операторах && и || в bash скриптинге. Итак все мы знаем что в Си эти операторы обозначают логическое И и Или . В bash в условиях оператора if while или ещё каких либо они имеют точно такое же применение. А вот что делать если мы хотим запустить одну команду, а за ней другую?