Debian: Аутентификация и авторизация пользователей с помощью LDAP

Написал admin . Опубликовано в Unix просмотров 4 647

Так себеПойдетХорошоПонравилосьОтличный пост (1 votes, average: 5,00 out of 5)
Загрузка...

Начнем с того, что хранение всей информации для аутентификации пользователя, в одном месте — это и хорошо и плохо. Хорошо, потому что удобно администрировать аккаунты пользователей, быстро разворачивать системы и сервисы в сети и тд. Плохо, потому что опасно как со стороны безопасности, так и со стороны отказоустойчивости. Но от этих минусов есть рецепты, поэтому единое хранилище больше хорошо, чем плохо…

Теперь о том, чего нам необходимо добиться.

1. Получить резолвинг имен пользователей и групп из каталога LDAP
2. Разрешить аутентификацию пользователей с помощью LDAP
3. Разграничить права доступа на тот или иной сервер (не всем нужно иметь доступ на все сервера допустим по ssh)
4. Разрешить использовать sudo информацию из LDAP
5. Хранить и спользовать публичные ssh ключи пользователей для аутентификации в ssh

И так по порядку:

1. NSS-LDAP (Name Services Switch) необходим для подтягивания из LDAP в систему таких данных как имена пользователей, группы и другой информации, которая обычно хранится в файлах каталога /etc

aliases, ethers, group, hosts, netgroup, networks, passwd, protocols, rpc, services , shadow

Есть еще такой забавный сервис nscd (Name Service Caching Daemon) который по умолчанию запущен. Он призван снизить нагрузку с того же LDAP на продакшен серверах, кэширую запросы на резолвинг имен. Во время настройки его желательно отключить.

# /etc/init.d/nscd stop

И так, устанавливаем nss-ldap

# apt-get install libnss-ldap

Перед началом конфигурации этого сервиса, хотелось бы отдельно остановиться на расположении конфигурационных файлов и их именах. Не знаю почему, но во многих система эти файлы расположены в разных местах и называются по-разному. В Debian конфигурационный файл nss-ldap находится /etc/libnss-ldap.conf, в то время как на других системах он может называться /etc/ldap.conf. Я сделал проще — использовал один файл для всего, который находится /etc/ldap/ldap.conf а для каждого сервиса сделал на него ссылку.

# vim /etc/ldap/ldap.conf

host 1.1.1.1 2.2.2.2
base dc=mydomain,dc=com
ldap_version 3
binddn cn=proxyuser,dc=mydomain,dc=com
bindpw mypassforproxyuser
rootbinddn cn=manager,dc=mydomain,dc=com
port 389
scope one
timelimit 20
bind_timelimit 10
bind_policy soft
idle_timelimit 3600
sudoers_base   ou=sudoers,dc=mydomain,dc=com
pam_filter |(&(accessTo=myhost.mydomain.com)(trustModel=byhost))(trustModel=fullaccess)
pam_login_attribute uid
pam_min_uid 10000
pam_max_uid 65530
pam_password exop
pam_password_prohibit_message Please visit https://accounts.mydomain.com to change your password.
nss_base_passwd         dc=mydomain,dc=com?sub
nss_base_shadow         dc=mydomain,dc=com?sub
nss_base_group          dc=mydomain,dc=com?sub

Если указан rootbinddn, то в /etc/ldap.secret надо указать пароль админа каталога. Права на файл 600.

Теперь надо сделать так, чтобы система искала то, что нам надо (группы и пользователи) в каталоге LDAP. Для это вносим изменения в файл /etc/nsswitch.conf (указываем, что искать в ldap надо после локальных файлов, это важно)

  passwd:         files ldap
  group:          files ldap
  shadow:         files ldap

  hosts:          files dns ldap
  networks:       files ldap

  protocols:      db files
  services:       db files
  ethers:         db files
  rpc:            db files

  netgroup:       nis

После этого можно проверить, запросив список пользователей или групп

# getent passwd
# getent group

Все результаты должны браться из LDAP. Не забываем при необходимости включить демон nscd.

2. PAM-LDAP нам необходим для аутентификации пользователя по каталогу LDAP.

Устанавливаем как обычно

# apt-get install libpam-ldap

Как я уже говорил, конфиг у этого сервиса в Debian тоже свой, но содержание тоже, поэтому мы просто сделаем линк

# ln -s /etc/ldap/ldap.conf /etc/pam_ldap.conf

Для автосоздания домашних директорий добавим еще пакет

# apt-get install libpam-mkhomedir

Теперь надо поправить конфиги pam для того, чтобы pam ходил в ldap

/etc/pam.d/common-account:

account     required      pam_unix.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     [default=bad success=ok user_unknown=ignore] pam_ldap.so
account     required      pam_permit.so

/etc/pam.d/common-auth:

auth    sufficient      pam_unix.so nullok_secure
auth    requisite       pam_succeed_if.so uid >= 1000 quiet
auth    sufficient      pam_ldap.so use_first_pass
auth    required        pam_deny.so

/etc/pam.d/common-password:

password    sufficient    pam_unix.so md5 obscure min=4 max=8 nullok try_first_pass
password    sufficient    pam_ldap.so
password    required      pam_deny.so

/etc/pam.d/common-session:

session     required      pam_limits.so
session     required      pam_unix.so
session     optional      pam_ldap.so
session     required      pam_mkhomedir.so skel=/etc/skel umask=0022

3. Доступ ограничим средствами pam_access

Ставим модуль

# apt-get install libpam-modules

И добавляем в /etc/pam.d/common-auth

account required    pam_access.so

Все, модуль задействован и мы можем ограничить доступ с помощью конфигурационного файла /etc/security/access.conf

К примеру сделаем в LDAP группу ssh.myhost — пользователи только этой группы и root у нас должны иметь возможность логина по ssh к нашему серверу.

-:ALL EXCEPT root ssh.myhost:ALL EXCEPT LOCAL

4. Для этого надо использовать не стандарный пакет sudo, а sudo-ldap. И так ставим и делаем линк на конфиг.

# apt-get install sudo-ldap
# ln -s /etc/ldap/ldap.conf /etc/sudo_ldap.conf

В какой ветке искать о членах sudo, мы говорим в конфиге этой строчкой

sudoers_base   ou=sudoers,dc=mydomain,dc=com

5. Для это нам надо собрать openssh пропатченый патчем lpk (Ldap PubKey) или скачать уже готовый deb. О том, как собрать пакет, лучше меня напишет его автор.

This is the easiest way to create a Debian package of Openssh, with LPK AND HPN patches. You can also apply one of these patches only.

At the moment as I wrote these lines, OpenSSH was version 5.1p1 (portable version).

We need the two patches: LPK and HPN. They are downloadable from the projects websites.

Although, when OpenSSH 5.1 was released, the patches were not compatible. Now, they certainly are. If not, you can act as me: get patches from the OpenSSH Mandriva source RPM:

  1. Install rpm
  2. Install the source rpm (srpm)
  3. Get the LPK and HPN patches (from /usr/src/rpm/SOURCES)

Or get it from the official websites…

Then:

  1. Get the Debian OpenSSH sources:
     [email protected] $ apt-get source openssh 
  2. If the Debian’s OpenSSH version isn’t the good one (here, 5.1), get the official OpenSSH sources and untar the tarball
  3. Copy the debian/ directory from Debian’s OpenSSH sources into the stock OpenSSH source directory.
  4. Modify debian/changelog, to raise the version number and add comment about LPK and HPN
  5. modify debian/rules, to add to the two lines containing “./configure”:
  6. Patch !
     [email protected] $ patch -p1 < ../patch-lpk.diff [email protected] $ patch -p1 < ../patch-hpn.diff 

    A few lines are rejected when applying the second patch. We just need to read servconf.c.rej and add the missing lines into the servconf.c file. That’s all !

  7. Build the package, without signature verification (because you aren’t the Debian maintainer, so you don’t have the keys)
     dpkg-buildpackage -us -uc 

That’s it ! The packages are created !

--with-libs="-lldap" --with-ldflags="-L/usr/lib" --with-cppflags="-I/usr/include -DWITH_LDAP_PUBKEY"

Теперь в конфиг sshd мы можем добавить следующие ключи

UseLPK yes
#LpkLdapConf /etc/ldap/ldap.conf
LpkServers         ldap://1.1.1.1 ldap://2.2.2.2
LpkUserDN          ou=people,ou=System,dc=mydomain,dc=com
LpkGroupDN         ou=groups,ou=System,dc=mydomain,dc=com
LpkBindDN          cn=proxyuser,dc=mydomain,dc=com
LpkBindPw          mypassforproxyuser
#LpkServerGroup     ssh-group
LpkForceTLS        no
LpkSearchTimelimit 3
LpkBindTimelimit   3

На этом вроде все.

Похожие статьи:

Метки: , , , , , , , ,

Trackback from your site.

Comments (4)

  • Ma_X_X

    |

    Цитата: «2. PAM-LDAP нам необходим для аутентификации пользователя по каталогу LDAP.

    Устанавливаем как обычно

    # apt-get install libnss-ldap»

    Точно libnss-ldap? Может, libpam-ldap?

    Reply

  • Владимир

    |

    при попытке поиска чего либо в ldap получаю такую ошибку:
    # search result
    search: 2
    result: 1 Operations error
    text: 00000000: LdapErr: DSID-0C090627, comment: In order to perform this ope
    ration a successful bind must be completed on the connection., data 0, vece

    не подскажите, с чем это связано? спасибо!

    Reply

  • mik0s

    |

    Покажите полную строчку где и как ищете?

    Reply

  • Alexey

    |

    Спасибо большое, отличный пост, очень помогло! Как раз внедрять надо:)

    Reply

Leave a comment