[exim-conf] реализация Single Sign-On в exim на базе аутентификации GSSAPI в Active Directory

Victor Ustugov victor на corvax.kiev.ua
Ср Сен 16 19:56:33 EEST 2015


приветствую

реализован пробный вариант 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



Подробная информация о списке рассылки exim-conf