Translate

неділя, 14 вересня 2014 р.

OpenLDAP server: installation and configuration

Якщо серверів у компанія лиш декілька - можна просто додавати користувачів на кожен із них. Це просто, проте не далекоглядно. З часом видача прав доступу буде займати все більше часу. Тому в критичний час варто задуматись про аутентифікацію через через центральний сервер, який значно зменшить час на видачу доступів. У цій статті піде мове про установку і конфігурацію OpenLDAP серверу.

OpenLDAP - відкрита реалізація LDAP, розроблена однойменним проектом, поширюється під власною вільною ліцензією OpenLDAP Public License. LDAP — протокол, що використовує TCP/IP і дозволяє проводити операції авторизації (bind), пошуку (search) та порівняння (compare), а також операції додавання, зміни або видалення записів. У якості записів можуть бути різноманітні дані, наприклад, дані виверженні вулкану (тобто зовсім різноманітні) чи перелік користувачів та їхніх даних. Стандарт LDAP не стандартизує як саме має зберігатись інформація в базі данних та ін., тому кожен може реалізувати більшість аспектів серверу по-своєму, головне щоб зберігалась сумісність.

Перейдемо до налаштувань LDAP серверу. Початкові дані такі:

Operating System :  Debian 7 Server / Ubuntu LTS
Hostname         :  ldap.ipeacocks.info
IP Address       :  1.2.3.4

Отже, замініть ці значення на необхідні вам у подальших конфігураційних файлах.

Установлюємо пакети:

# apt-get install slapd ldap-utils

На протязі установки буде запитано пароль майбутнього адміністратора LDAP:



Редагуємо ldap.conf та змінюємо записи наведені жирним на свої:

# vi /etc/ldap/ldap.conf
...
# LDAP Defaults
#
# See ldap.conf(5) for details
# This file should be world readable but not world writable.
BASE    dc=ipeacocks,dc=info
URI     ldap://ldap.ipeacocks.info
#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never
# TLS certificates (needed for GnuTLS)
TLS_CACERT      /etc/ssl/certs/ca-certificates.crt
...

Виконунуємо переконфігурацію демона slapd, для чого відповідаємо на подальші питання:

# dpkg-reconfigure slapd

Обираємо "Ні":



Вводимо доменне ім'я, яким будемо користуватись:


Додаємо ім'я організації (назву компанії, в якій працюєте, чи щось на зразок цього):


Вводимо пароль, котрий вводили раніше, та підтверджуємо його:


Обираємо базу даних для бекенду. Про їхню різницю можна почитати тут. Найшвидша -MDB, проте я не зрозумів як її активувати. При установці, як видно нижче, MDB відсутній, тому я обрав HDB:


Якщо натиснути "Ні", то у випадку видалення slapd, база залишиться:


Тиснемо "Так", щоб забекапити стару базу даних, або ж "Ні":


Підтримка LDAPv2 нам не потрібна:


OpenLDAP сервер налаштовано і запущено. Перевіряємо роботу сервера:

# ldapsearch -x

# extended LDIF
#
# LDAPv3
# base <dc=ipeacocks,dc=info> (default) with scope subtree
# filter: (objectclass=*)
# requesting: ALL
#

# ipeacocks.info
dn: dc=ipeacocks,dc=info
objectClass: top
objectClass: dcObject
objectClass: organization
o: ipeacocks
dc: ipeacocks

# admin, ipeacocks.info
dn: cn=admin,dc=ipeacocks,dc=info
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

# search result
search: 2
result: 0 Success

# numResponses: 3
# numEntries: 2

Власне база майже порожня, описаній лише базовий DN, та адміністратор cn=admin, dc=ipeacocks, dc=info.

Управляти та наповнювати базу можна використовуючи bash, або менш хардкорний метод - LDAP-менеджери. Наприклад,  JXplorer чи щось подібне:


Я користуюсь веб-менеджер phpLDAPadmin і далі розповім про те як його встановити.

phpLDAPadmin - веб-менеджер для LDAP-бази. За допомогою phpLDAPadmin можна виконувати аналогічні дії, що й з командними утилітами, проте значно зручніше. Встановимо пакет:

# aptitude install phpldapadmin

Після установки зробимо сімлінк на /var/www/phpldapadmin:

# ln -s /usr/share/phpldapadmin/ /var/www/phpldapadmin

Як варіант звісно можна просто вказати  /usr/share/phpldapadmin/ як root-директорію для Apache. Відредагуємо деякі конфігураційні файли:

# vim /etc/phpldapadmin/config.php
[...]
// Uncomment and set your timezone //
$config->custom->appearance['timezone'] = 'Europe/Kiev';
[...]
// Set your LDAP server name //
$servers->setValue('server','name','Ipeacocks LDAP Server');
[...]
// Set your LDAP server IP address //
$servers->setValue('server','host','1.2.3.4');
[...]
// Set Server domain name //
$servers->setValue('server','base',array('dc=ipeacocks,dc=info'));
[...]
// Set Server domain name //
$servers->setValue('login','bind_id','cn=admin,dc=ipeacocks,dc=info');
[...]

Перевантажуємо Apache (він встановився із залежностями до пакету phpldapadmin):

# /etc/init.d/apache2 restart

Порти 80 та 389 (порт LDAP) мають бути відкритими.
Хорошою ідеєю буде сховати ресурс під https. Для чого необхідно згенерувати ключ та самопідписний сертифікат:

# mkdir /etc/apache2/keys/
# openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3000 -nodes

Та дещо відредагуємо конфігураційний файл:

# vim /etc/apache2/conf-enabled/phpldapadmin.conf
...
<VirtualHost *:80>
    ServerName ldap.ipeacocks.info
    Redirect / https://ldap.ipeacocks.info/
</VirtualHost>


LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so
# You can also use phpLDAPadmin as a VirtualHost
Listen 443
<VirtualHost *:443>
     ServerName ldap.ipeacocks.info
     ServerAdmin admin@ipeacocks.info
     DocumentRoot /var/www/phpldapadmin
     SSLEngine on
     SSLCertificateFile /etc/apache2/keys/cert.pem
     SSLCertificateKeyFile /etc/apache2/keys/key.pem
     ErrorLog /var/log/apache2/ldap.ipeacocks.info-error.log
     CustomLog /var/log/apache2/ldap.ipeacocks.info-access.log common
</VirtualHost>
....

Тож всі звернення на адресу http://ldap.ipeacocks.info будуть перенаправлятись на захищене з'єднання https://ldap.ipeacocks.info. Не завадить буде установити базову авторизацію на phpLDAPadmin:

# vim /etc/apache2/conf-enabled/phpldapadmin.conf
...
<Directory /usr/share/phpldapadmin/htdocs/>

    DirectoryIndex index.php
    Options +FollowSymLinks
    AllowOverride None

    AuthUserFile /etc/apache2/conf-available/.htpasswd
    AuthType Basic
    AuthName "Private Zone"
    Require valid-user
....

</Directory>

Адмінка управління записами LDAP phpLDAPadmin виглядає наступним чином:



Деревовидна схема користувачів виглядає так (якщо схема попередньо була заповнена):


Конфігурацію сервера можна побачити натиснувши кнопку "Info" вгорі ліворуч:



З додаванням нових користувачів також не має виникнути проблем, все достатньо просто. Тиснемо як на малюнку "Create new entry here":


Нагадаю, що мій приклад грунтується на заповненій базі моїми тестовими записами. Далі обираємо тип об'єкту, "Generic Organizational Unit":

Створюємо групу Test, клікаємо на ній ліворуч, і знову обираємо "Create new entry here":


Цього разу обираємо "Generic Posix Group":


Назвемо її "people" та зберігаємо. Звісно, що можна обрати свої власні назви, котрі вам до вподоби:

Тиснемо знову "Create new entry here":


Проте тепер обираємо "Generic: User Account", це власне і буде нашим користувачем:


Заповнюємо даними, хешування паролю раджу обирати в SHA1, так як він досить потужний і може синхронізуватись з гугл-сервісами через GADS (якщо синхронізація з ними необхідна): 

Зберігаємо запис:

І ось він у всій красі: 



Можна додати значення для користувача, створивши додаткові атрибути чи навіть підключити додаткові класи.

Через консоль також можна пересвідчитись в тому, що було додано:

# ldapsearch -x

Можна запитати конкретного користувача таким чином:

$ ldapsearch -x -h ldap.ipeacocks.info -LLL -b 'cn=John Dou,cn=people,ou=Test,dc=ipeacocks,dc=info' -W -D cn=admin,dc=ipeacocks,dc=info
...
dn: cn=John Dou,cn=people,ou=Test,dc=ipeacocks,dc=info
cn: John Dou
gidNumber: 500
givenName: John
homeDirectory: /home/users/jdou
loginShell: /bin/bash
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top
uid: jdou
uidNumber: 1001
userPassword:: e1NIQX14TEs3L0lPN09sbXhZTWxWSi9zVDlVT0xlQWM9
sn: Dou

Використовуючи phpLDAPadmin, є можливість створювати LDIF, файли опису записів LDAP, котрі потім можна інтегрувати, за допомогою функцію експорту адмін-панелі або ж використовуючи shell:

# ldapadd -cxWD cn=admin,dc=ipeacocks,dc=info -f my_ldif.ldif

У попередніх версіяx openLDAP конфігурація проходила через файл slapd.conf, в останніх - заливкою ldif-файлів. На практиці це виглядає так:

# ldapadd -cxWD cn=admin,dc=ipeacocks,dc=info -f conf.ldif

conf.ldif складається з таких записів:

dn: cn=config
add: olcTLSCipherSuite
olcTLSCipherSuite: HIGH
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap.dev.local-key.pem
-
...

Всі основні параметри бази, без інтегрованих класів та схем, можна побачити, виконавши з хосту з інсталяцією LDAP:

# ldapsearch -LLLQY EXTERNAL -H ldapi:/// -b cn=config "(|(cn=config)(olcDatabase={1}hdb))" | less
...
dn: cn=config
objectClass: olcGlobal
cn: config
olcArgsFile: /var/run/slapd/slapd.args
olcLogLevel: stats
olcPidFile: /var/run/slapd/slapd.pid
olcTLSCACertificateFile: /etc/ldap/keys/cert.pem
olcTLSCertificateFile: /etc/ldap/keys/cert.pem
olcTLSCertificateKeyFile: /etc/ldap/keys/key.pem
olcToolThreads: 1

dn: olcDatabase={1}hdb,cn=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=ipeacocks,dc=info
olcAccess: {0}to attrs=userPassword,shadowLastChange by self write by anonymou
 s auth by dn="cn=admin,dc=ipeacocks,dc=info" write by * none
olcAccess: {1}to attrs=loginShell,gecos by dn="cn=admin,dc=ipeacocks,dc=info" write
  by self write by * read
olcAccess: {2}to dn.base="" by * read
...
olcLastMod: TRUE
olcRootDN: cn=admin,dc=ipeacocks,dc=info
olcRootPW: {SSHA}BQglkNTg4xQSFmBs9Kwd0FPmZvcy1wrH
olcDbCheckpoint: 512 30
...
olcDbConfig: {3}set_lk_max_lockers 1500
olcDbIndex: objectClass eq
olcDbIndex: cn pres,sub,eq
olcDbIndex: sn pres,sub,eq
...

Для більшої безпеки трафік між клієнтом і сервером краще шифрувати. Для цього неообхідні SSL-сертифікат та ключ. Звісно можна згенерувати самопідписний, проте певні сервіси можуть його не приймати, а проігнорувати невірний сертифікат вони не зможуть (наприклад, Google Apps Directory Sync). Тому необхідно буде додати СА сертифікат на кожну кліентську машину, але краще за все сертифікат купити.

Установка не має викликати труднощі. Копіюємо сертифікати і ключ:

# mkdir /etc/ldap/ssl/
# cp ~/ssl/ldap.key /etc/ldap/ssl/
# cp ~/ssl/ldap.crt /etc/ldap/ssl/
# cp ~/ssl/cacert.crt /etc/ssl/certs/

Лишаємо лише мінімальні для роботи права:

# chmod go+r /etc/ssl/certs/cacert.crt
# chown -R root:openldap /etc/ldap/ssl
# chmod -R o-rwx /etc/ldap/ssl

Дозволяємо LDAPS протокол:

# vim /etc/default/slapd
...
SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"
...

127.0.0.1:389 я лишив для комунікацій openLDAP-а з phpLDAPadmin, адже він у мене на тому ж хості. Не варто зайвий раз шифрувати трафік.

Конфігуруємо openLDAP на використання SSL/TLS:

# vim tls-config.ldif

dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/cacert.crt
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/ssl/ldap.crt
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap.key

Застосовуємо ldif:

# ldapmodify -QY EXTERNAL -H ldapi:/// -f tls-config.ldif

Та перевантажуємо демон:

# /etc/init.d/slapd restart

Не зайвим буде перевірити порти:

# netstat -tunlp | grep slapd

tcp     0   0 0.0.0.0:636          0.0.0.0:*            LISTEN   2462/slapd      
tcp     0   0 127.0.0.1:389        0.0.0.0:*            LISTEN   2462/slapd 

Здається, на цьому все. В наступних статтях я розповім, як налаштувати аутентифікацію клієнтів із вже налаштованим openLDAP-сервером та як синхронізувати його записи (користувачів) із Google Apps через GADS.

Посилання:

http://www.unixmen.com/openldap-installation-configuration-ubuntu-12-1013-0413-10-debian-67/
https://wiki.debian.org/LDAP/OpenLDAPSetup
https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-a-basic-ldap-server-on-an-ubuntu-12-04-vps
https://help.ubuntu.com/12.04/serverguide/openldap-server.html
https://wiki.archlinux.org/index.php/openLDAP_(%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9)#OpenLDAP_.D0.B8_SSL
http://mindref.blogspot.com/2010/12/debian-openldap-ssl-tls-encryption.html
http://islandlinux.org/howto/installing-secure-ldap-openldap-ssl-ubuntu-using-self-signed-certificate
http://stezz.blogspot.com/2012/05/how-to-add-new-schema-to-openldap-24.html
http://stackoverflow.com/questions/20673186/getting-error-for-setting-password-feild-when-creating-generic-user-account-phpl
http://phpldapadmin.sourceforge.net/wiki/index.php/FAQ
http://techiezone.rottigni.net/2011/12/change-root-dn-password-on-openldap/
http://www.linuxtopia.org/online_books/network_administration_guides/ldap_administration/schema_Extending_Schema.html

Установка OpenLDAP для CentOS гарно описана за наступними посиланнями:

http://docs.adaptivecomputing.com/viewpoint/hpc/Content/topics/1-setup/installSetup/settingUpOpenLDAPOnCentos6.htm
http://wiki.openiam.com/pages/viewpage.action?pageId=7635198
https://linoxide.com/linux-how-to/install-openldap-2-different-hosts-configure-mirror-mode/

Немає коментарів:

Дописати коментар