У меня настроено несколько серверов, и я хотел бы централизовать доступ для пользователей, использующих LDAP. У меня есть основной сервер, на котором размещается электронная почта с использованием iRedMail, и там уже есть база данных LDAP, настроенная с помощью iRedMail. Теперь я бы хотел, чтобы мои учетные записи пользователей были привязаны к их учетным записям электронной почты (например, изменение пароля электронной почты также изменяет их пароль на серверах, к которым у них есть доступ). Я немного искал (DuckDuckGoing?), Как использовать базу данных LDAP iRedMail в качестве базы данных аутентификации пользователей для учетных записей UNIX, но мне еще не удалось найти что-нибудь хоть сколько-нибудь полезное. Кто-нибудь когда-либо делал это, есть какие-нибудь советы?
Итак, я разобрался. Вот краткое и грязное руководство о том, как я это сделал:
Во-первых, iRedMail автоматически генерирует сертификат SSL при установке. Если ваше имя хоста не то, что вы хотите, чтобы CN для сертификата был, вам нужно будет создать новый сертификат SSL. На самом деле, я бы сделал это в любом случае. Вот как выполнить первый шаг:
$ cd iRedMail-0.8.5/tools
$ vi generate_ssl_keys.sh
# Modify the following line
export HOSTNAME="*.yourdomain.com" # I created a wildcard cert
# Set the rest (e.g., TLS_COUNTRY) to match your information
Теперь нам нужно сгенерировать наши сертификаты SSL:
$ sh generate_ssl_keys.sh
$ mv certs/iRedMail_CA.pem /etc/pki/tls/certs/
$ mv private/iRedMail.key /etc/pki/tls/private/
На этом пионте я перезагрузил свою систему. Для меня это было проще, чем перезапускать кучу сервисов.
Теперь, прежде чем мы перейдем к нашим клиентам LDAP, нам нужно внести некоторые изменения в наш сервер LDAP. Первое изменение, которое мы сделаем, - это добавление unixHomeDirectory в объектный класс posixAccount. Причина: я не хотел, чтобы мои пользователи застревали в домашнем каталоге, который iRedMail связывает с их учетной записью.
$ vi /etc/openldap/schema/nis.schema
# Add the following under attributetype nisMapEntry (1.3.6.1.1.1.1.27)
attributetype ( 1.3.6.1.1.1.1.28 NAME 'unixHomeDirectory'
DESC 'The absolute path to the users home directory'
EQUALITY caseExactIA5Match
SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 SINGLE-VALUE )
# Associate unixHomeDirectory with the posixAccount objectclass
objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount'
DESC 'Abstraction of an account with POSIX attributes'
SUP top AUXILIARY
MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )
MAY ( userPassword $ loginShell $ gecos $ unixHomeDirectory $ description ) )
Теперь мы собираемся добавить атрибут obMemberOf для наших пользователей. Это будет использоваться позже с sssd.
$ vi /etc/openldap/schema/iredmail.schema
# I added this under listAllowedUser attributetype (1.3.6.1.4.1.32349.1.2.3.3)
attributetype ( 1.3.6.1.4.1.32359.1.2.3.4 NAME 'obMemberOf'
DESC 'Distinguished name of a group of which the object is a member'
EQUALITY distinguishedNameMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
# And then I associated it with the objectclass mailUser
objectclass ( 1.3.6.1.4.1.32349.1.2.4.3 NAME 'mailUser'
DESC 'Mail User' SUP top AUXILIARY
MUST ( mail $ uid )
MAY ( storageBaseDirectory $ mailMessageStore $ homeDirectory $
userPassword $ mailHost $ mailUID $ mailGID $
mailQuota $ mailQuotaMessageLimit $
mailForwardingAddress $ shadowAddress $ accountStatus $
userRecipientBccAddress $ userSenderBccAddress $
enabledService $ telephoneNumber $ backupMailAddress $
mtaTransport $ memberOfGroup $ expiredDate $
lastLoginDate $ lastLoginIP $ lastLoginProtocol $
preferredLanguage $ disclaimer $ accountSetting $
title $ userManager $
mailWhitelistRecipient $ mailBlacklistRecipient $
domainGlobalAdmin $ obMemberOf ))
Я внес следующие изменения в /etc/openldap/slapd.conf
# Comment out disallow bind_anon
# Disallow bind as anonymous.
#disallow bind_anon
# Uncommented this line
# Uncomment below line to allow binding as anonymouse.
allow bind_anon_cred
#
access to dn.regex="cn=[^,]+,dc=domain,dc=com"
by anonymous auth
by self write
by users none
# Added these two lines
access to dn.exact=""
by * read
# And these two
access to dn.exact="cn=Subschema"
by * read
# And gave anonymous read access
# Set default permission.
access to *
by anonymous read
by self write
by users read
Теперь я пошел в https://www.mydomain.com/iredadmin и добавил пользователя. После добавления пользователя ldapsearch возвращает следующее:
# user1@mydomain.com, Users, mydomain.com, domains, mydomain.com
dn: mail=user1@mydomain.com,ou=Users,domainName=mydomain.com,o=domains,dc=mydomain,dc=com
objectClass: inetOrgPerson
objectClass: mailUser
objectClass: shadowAccount
objectClass: amavisAccount
mail: user1@mydomain.com
userPassword:: XXX
uid: user1
storageBaseDirectory: /var/vmail
mailMessageStore: vmail1/mydomain.com/d/a/w/user1-2013.11.19.17.43.46/
homeDirectory: /var/vmail/vmail1/mydomain.com/d/a/w/user1-2013.11.19.17.43.46/
enabledService: mail
enabledService: deliver
enabledService: lda
enabledService: smtp
enabledService: smtpsecured
enabledService: pop3
enabledService: pop3secured
enabledService: imap
enabledService: imapsecured
enabledService: managesieve
enabledService: managesievesecured
enabledService: sieve
enabledService: sievesecured
enabledService: forward
enabledService: senderbcc
enabledService: recipientbcc
enabledService: internal
enabledService: lib-storage
enabledService: shadowaddress
enabledService: displayedInGlobalAddressBook
shadowLastChange: 0
amavisLocal: TRUE
mailQuota: 0
cn: Good User
givenName: user1
sn: user1
preferredLanguage: en_US
employeeNumber: Application Developer
accountStatus: active
Как мы видим, все, что нужно для создания posixAccount, отсутствует. Итак, вот что мы собираемся сделать:
$ vi /tmp/user1.modify
# Now, I create a file called /tmp/user1.modify that looks like this
dn: mail=user1@mydomain.com,ou=Users,domainName=mydomain.com,o=domains,dc=mydomain,dc=com
changetype: modify
add: objectClass
objectClass: posixAccount
-
add: loginShell
loginShell: /bin/bash
-
add: uidNumber
uidNumber: 2006
-
add: gidNumber
gidNumber: 2006
-
add: unixHomeDirectory
unixHomeDirectory: /home/user1
И мы запускаем ldapmodify, чтобы добавить атрибуты в учетную запись
ldapmodify -x -D "cn=Manager,dc=mydomain,dc=com" -W -f /tmp/user1.modify
Теперь создаю группу LDAP.
vi /tmp/devgroup.ldif
# Paste the following in there
dn: cn=developers,ou=Groups,domainName=mydomain.com,o=domains,dc=mydomain,dc=com
objectClass: posixGroup
objectClass: top
cn: developers
userPassword:: {crypt}x
gidNumber: 1500
memberUid: user1
# And add to LDAP
ldapadd -x -D "cn=Manager,dc=mydomain,dc=com" -W -f /tmp/devgroup.ldif
Добавить пользователя user1 в качестве объекта-участника группы разработчиков
vi /tmp/user1.modify
# It should now look like this
dn: mail=user1@mydomain.com,ou=Users,domainName=mydomain.com,o=domains,dc=mydomain,dc=com
changetype: modify
add: obMemberOf
obMemberOf: cn=developers,ou=Groups,domainName=mydomain.com,o=domains,dc=mydomain,dc=com
# Run ldapmodify
ldapmodify -x -D "cn=Manager,dc=mydomain,dc=com" -W -f /tmp/user1.modify
На данный момент у нас есть user1, два настраиваемых атрибута (obMemberOf, unixHomeDirectory) и группа LDAP для разработчиков. Пришло время настроить несколько клиентов. Первый клиент, который я установил, работал с сервером Ubuntu 12.04. Вот шаги для этого клиента:
# First install all the relevant packages
$ apt-get install ldap-utils libpam-ldap libnss-ldap nslcd
# I need the SSL cert from my iRedMail host
scp user@mydomain.com:/etc/pki/tls/certs/iRedMail_CA.pem /etc/ssl/certs/cacert.pem
# Now we configure the LDAP client
$ vi /etc/ldap.conf
# Here's what my ldap.conf ended up looking like:
# BEGIN /etc/ldap.conf
host ldap.mydomain.com
base dc=mydomain,dc=com
ldap_version 3
# You can user cn=Manager,dc=yourdomain,dc=com if you'd like. iRedMail sets up this vmail account as read-only, so I went with that instead.
rootbinddn cn=vmail,dc=mydomain,dc=com
pam_password ssha
nss_base_passwd ou=Users,domainName=mydomain.com,o=domains,dc=mydomain,dc=com
nss_base_shadow ou=Users,domainName=mydomain.com,o=domains,dc=mydomain,dc=com
nss_base_group ou=Groups,domainName=mydomain.com,o=domains,dc=mydomain,dc=com
nss_map_attribute homeDirectory unixHomeDirectory
pam_login_attribute uid
ssl start_tls
tls_checkpeer yes
tls_cacertfile /etc/ssl/certs/cacert.pem
# END /etc/ldap.conf
# Create file /etc/ldap.secret and put the plain text password for your rootbinddnn in there, then 'chmod 600 /etc/ldap.secret (root:root ownership).
# Next I edit /etc/nslcd.conf. Here is that file
# BEGIN /etc/nslcd.conf
uid nslcd
gid nslcd
uri ldap://ldap.mydomain.com
base dc=mydomain,dc=com
ldap_version 3
ssl start_tls
tls_reqcert demand
tls_cacertfile /etc/ssl/certs/cacert.pem
# END /etc/nslcd.conf
# Now I edit /etc/ldap/ldap.conf and add the following line to the bottom
# It is the only uncommented line in the file
TLS_CACERT /etc/ssl/certs/cacert.pem
# My PAM files look as follows
# BEGIN /etc/pam.d/common-account
account [success=2 new_authtok_reqd=done default=ignore] pam_unix.so
account [success=1 default=ignore] pam_ldap.so
account requisite pam_deny.so
account required pam_permit.so
# END /etc/pam.d/common-account
# BEGIN /etc/pam.d/common-auth
auth [success=2 default=ignore] pam_unix.so nullok_secure
auth [success=1 default=ignore] pam_ldap.so use_first_pass
auth requisite pam_deny.so
auth required pam_permit.so
# END /etc/pam.d/common-auth
# BEGIN /etc/pam.d/common-password
password [success=2 default=ignore] pam_unix.so obscure sha512
password [success=1 user_unknown=ignore default=die] pam_ldap.so try_first_pass
password requisite pam_deny.so
password required pam_permit.so
# END /etc/pam.d/common-password
# BEGIN /etc/pam.d/common-session
session [default=1] pam_permit.so
session requisite pam_deny.so
session required pam_permit.so
session optional pam_umask.so
session required pam_unix.so
session optional pam_ldap.so
session optional pam_systemd.so
session required pam_mkhomedir.so skel=/etc/skel umask=0022
# END /etc/pam.d/common-session
# I then edit /etc/nsswitch.conf and added ldap at the end of the passwd, group and shadow lines
passwd: compat ldap
group: compat ldap
shadow: compat ldap
# Enable the service and restart it
$ update-rc.d nslcd enable
$ /etc/init.d/nscd restart
# Test things out
$ gnutls-cli --x509cafile /etc/ssl/certs/cacert.pem ldap.mydomain.com
$ ldapsearch -H"ldap://ldap.mydomain.com" -D "cn=vmail,dc=mydomain,dc=com" -b "dc=mydomain,dc=com" -W -d-1 -Z
$ getent passwd
$ id user1
# You should now be able to su to user1 and ssh in as user1.
Следующим клиентом, который я установил, был сервер CentOS 6.4 с sssd.
# Install the relevant packages
$ yum install openldap-clients sssd
$ chkconfig sssd on
# For now I set SELinux to permissive
$ echo 0 > /selinux/enforce
# scp my cert over
$ scp user@mydomain.com:/etc/pki/tls/certs/iRedMail_CA.pem /tmp
$ scp user@mydomain.com:/etc/pki/tls/private/iRedMail.key /tmp
# combine the two certs
$ awk 'FNR==1{print ""}1' /tmp/iRedMail.key /tmp/iRedMail_CA.pem > /etc/openldap/cacerts/iRedMail_CA.pem
$ cacertdir_rehash /etc/openldap/cacerts/
# Enable sssd.
$ authconfig --enableldap --enableldapauth --ldapserver=ldaps://ldap.mydomain.com --ldapbasedn="dc=mydomain,dc=com" --update
# I modified my /etc/sssd.conf file to look like this:
[sssd]
config_file_version = 2
services = nss, pam
domains = LDAP
[nss]
filter_users = root,named,avahi,haldaemon,dbus,radiusd,news,nscd
[pam]
[domain/LDAP]
ldap_search_base = dc=mydomain,dc=com
ldap_access_filter = obMemberOf=cn=developers,ou=Groups,domainName=mydomain.com,o=domains,dc=mydomain,dc=com
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
access_provider = ldap
ldap_schema = rfc2307
ldap_uri = ldap://ldap.mydomain.com
ldap_user_name = uid
ldap_user_home_directory = unixHomeDirectory
ldap_user_search_base = ou=Users,domainName=mydomain.com,o=domains,dc=mydomain,dc=com
ldap_group_search_base = ou=Groups,domainName=mydomain.com,o=domains,dc=mydomain,dc=com
ldap_default_bind_dn = cn=vmail,dc=mydomain,dc=com
ldap_default_authtok_type = password
ldap_default_authtok = p4ssw0rd
enumerate = true
cache_credentials = true
ldap_tls_reqcert = never
ldap_tls_cacertdir = /etc/openldap/cacerts
# Start sssd in the foreground with debugging on.
$ /usr/sbin/sssd -i -d7
# Open another terminal and do the following
$ getent passwd
$ id user1
$ ssh user1@localhost
$ su - user1
# Check the other terminal for any errors and fix as necessary.
# If no errors... break the sssd process with Ctrl+C
$ service sssd start
Вот некоторые из ошибок, с которыми я столкнулся во время этого процесса, и что я сделал, чтобы исправить каждую из них.
Предупреждение: «Фильтр» правила доступа LDAP установлен, но не настроен ldap_access_filter. Всем пользователям домена будет отказано в доступе.
Вот почему я добавил группу LDAP на свой сервер и атрибут obMemberOf. Затем я использовал его на клиенте sssd в качестве моего ldap_access_filter (то есть любой, у кого атрибут obMemberOf установлен на DN для группы разработки, имеет доступ к системе.
TLS: пропуск 'iRedMail_CA.pem' - имя файла не имеет ожидаемого формата (хэш сертификата с числовым суффиксом)
Запуск 'cacertdir_rehash / etc / openldap / cacerts /', похоже, исправил ситуацию. Он создал символическую ссылку (хэш сертификата с числовым суффиксом), которая указывает на iRedMail_CA.pem
Я столкнулся с множеством других ошибок (множество «Недействительные учетные данные», «Доступ запрещен» и других ошибок, связанных с доступом). Я обновлю это позже, чтобы охватить и их.
Интересно, можете ли вы настроить sssd для использования гибкого фильтра ldap и поиска различных (не по умолчанию) атрибутов ldap в этом случае.
Если вы изменили файл схемы iRedMail LDAP, вам следует обратить внимание на синхронизацию этой схемы с восходящим потоком.