приветствую
реализован пробный вариант SSO в exim для схемы интеграции exim с Active
Directory.
exim должен быть собран с поддержкой GSSAPI (переменная
AUTH_HEIMDAL_GSSAPI в Makefile exim'а).
среди опций сборки порта exim в FreeBSD нет опции для сборки exim с
поддержкой GSSAPI.
сборка обеспечивается при применении соответствующего патча:
https://mta.org.ua/exim-4.83-conf/patches/exim-4.86-gssapi-freebsd/patch-src__exim-4.86-gssapi-freebsd.patch
данный патч включен в механизм сборки сборки порта exim для FreeBSD:
https://mta.org.ua/exim-4.83-conf/packages/ports-freebsd/exim-4.86_1/
для сборки с поддержкой GSSAPI нужно в Makefile.local указать YES в
качестве значения переменной WITH_HEIMDAL_GSSAPI
тесты проводились на FreeBSD 10.1, использовался GSSAPI из базовой системы.
здесь и далее:
DOMAIN - NetBIOS имя домена Windows
domain.local - полное название домена Windows
dc.domain.local - адрес контроллера домена Windows
dc2.domain.local - адрес контроллера домена Windows
smtp - учетная запись пользователя в домене Windows
mail.domain.local - адрес почтового сервера
user - учетная запись системного пользователя почтового сервера
1. на домен контроллере необходимо создать A запись для mail1.domain.local
2. на домен контроллере необходимо создать учетную запись пользователя smtp
3. на домен контроллере необходимо сгенерировать keytab с указанием
servicePrincipalName:
ktpass -princ smtp/mail.domain.local на DOMAIN.LOCAL -mapuser DOMAIN\smtp
-pass XXXXXXXXXX -ptype KRB5_NT_SRV_HST -out smtp.keytab
4. необходимо скопировать сгенерированный keytab на почтовый сервер:
pscp smtp.keytab user на mail1.domain.local:
5. на почтовом сервере необходимо создать/отредактировать файл
/etc/krb5.conf:
[libdefaults]
default_realm = DOMAIN.LOCAL
dns_lookup_realm = false
dns_lookup_kdc = false
default_keytab_name = /etc/krb5.keytab
ccache_type = 4
forwardable = true
proxiable = true
ticket_lifetime = 24h
[realms]
# use "kdc = ..." if realm admins haven't put SRV records into DNS
DOMAIN.LOCAL = {
kdc = dc.domain.local
kdc = dc2.domain.local
admin_server = dc.domain.local
default_domain = domain.local
}
[domain_realm]
.domain.local = DOMAIN.LOCAL
domain.local = DOMAIN.LOCAL
[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}
[logging]
default = FILE:/var/log/krb5libs.log
[login]
krb4_convert = true
krb4_get_tickets = false
6. на почтовом сервере необходимо либо скопировать сгенерированный
keytab файл в /etc/krb5.keytab, либо добавить данные из него в
/etc/krb5.keytab:
cp /home/user/smtp.keytab /etc/krb5.keytab
или
ktutil copy /home/user/smtp.keytab /etc/krb5.keytab
7. на почтовом сервер необходимо урезать права на /etc/krb5.keytab. на
сколько - это зависит от того, какие сервисы будут использовать kerberos:
chown mailnull:mail /etc/krb5.keytab
chmod 440 /etc/krb5.keytab
8. на почтовом сервере необходимо настроить запуск kdc и kadmind (на
FreeBSD 9 kerberos и kadmind):
echo 'kadmind_enable="YES"'>>/etc/rc.conf
echo 'kdc_enable="YES"'>>/etc/rc.conf
/etc/rc.d/kdc start
/etc/rc.d/kadmind start
9. на почтовом сервере необходимо проверить ключи в keytab:
# ktutil -k /etc/krb5.keytab list
/etc/krb5.keytab:
Vno Type Principal Aliases
8 arcfour-hmac-md5 smtp/mail.domain.local на DOMAIN.LOCAL
10. на почтовом сервере необходимо получить тикет:
kinit -k smtp/mail.domain.local
11. на почтовом сервере необходимо проверить полученный тикет:
# klist -v
Credentials cache: FILE:/tmp/krb5cc_0
Principal: smtp/mail.domain.local на DOMAIN.LOCAL
Cache version: 4
Server: krbtgt/DOMAIN.LOCAL на DOMAIN.LOCAL
Client: smtp/mail.domain.local на DOMAIN.LOCAL
Ticket etype: aes256-cts-hmac-sha1-96, kvno 2
Session key: arcfour-hmac-md5
Ticket length: 1107
Auth time: Sep 15 21:36:08 2015
End time: Sep 16 07:36:08 2015
Ticket flags: pre-authent, initial, proxiable, forwardable
Addresses: addressless
12. на почтовом сервере необходимо настроить периодическое обновление
тикета:
echo '55 * * * * root /usr/bin/kinit -t /etc/krb5.keytab' >> /etc/crontab
13. на почтовом сервере в настройках паровоза в site/conf нужно указать:
define(`confSMTP_AUTH_GSSAPI', `YES')dnl
define(`confSMTP_AUTH_GSSAPI_SERVER_SERVICE', `smtp')dnl
define(`confSMTP_AUTH_GSSAPI_SERVER_HOSTNAME', `mail.domain.local')dnl
define(`confSMTP_AUTH_GSSAPI_SERVER_KEYTAB', `/etc/krb5.keytab')dnl
14. на почтовом сервере нужно пересобрать конфиг exim'а.
при этом должен был сгенерирован аутентификатор следующего вида:
srv_auth_gssapi:
driver = heimdal_gssapi
public_name = GSSAPI
server_service = smtp
server_hostname = mail.domain.local
server_keytab = /etc/krb5.keytab
server_set_id = $auth1
после этого можно в настройках почтового клиента указывать в качестве
адреса SMTP сервера имя хоста mail.domain.local, в качестве метода
аутентификации Kerberos/GSSAPI, в качестве имени пользователя нужно
указывать имя пользователя домена Windows (без указания самого домена).
это простейший случай реализации SSO.
для случаев, когда домен Windows является публичным, т. е. резолвится не
только в локальной сети, а и во внешнем мире (на практике нередко домены
Windows имеют вид domain.local, при этом для почтовой системы и внешних
сервисов регистрируется какой-нибудь domain.tld), этой схемы будет
достаточно.
для случая, когда публичный домен и домен Windows отличаются, для
отправки писем удаленным пользователям нужно либо использовать VPN, либо
где-то в hosts прописывать соответствие mail.domain.local и IP адреса
внешнего интерфейса почтового сервера.
пока добиться устойчивой работоспособности данной схемы при
использовании в настройках почтового клиента адреса SMTP сервера из
публичного домена, отличного от домена Windows, не удалось.
--
Best wishes Victor Ustugov mailto:victor на corvax.kiev.ua
public GnuPG/PGP key: http://victor.corvax.kiev.ua/corvax.asc
ICQ UIN: 371808614 JID: corvax_at_nb на jabber.corvax.kiev.ua
nic-handle: CRV-UANIC