Назад | Перейти на главную страницу

Интеграция postfix с LDAP для пользователей электронной почты с доступом к определенному хосту

У меня есть рабочая установка openLDAP v3 под Ubuntu 14.04 (slapd 2.4.31-1) с участием phpldapadmin, sudo-ldap и другие установленные пакеты. Я пытаюсь интегрировать postfix с LDAP, чтобы я мог отправлять электронные письма, например, на users@host2.example.com или users@host10.example.com.

Текущая настройка

В рамках этой установки у меня есть host атрибуты для каждого хоста, к которому пользователю разрешен доступ (или просто * для разрешения доступа ко всем хостам). Я использую это на моих клиентах ldap, чтобы предоставить или запретить доступ к определенным хостам. Также с каждым пользователем связан его корпоративный адрес электронной почты в mail атрибут. Ниже приведен пример LDIF для пользователя:

dn: uid=auser,ou=People,dc=example,dc=com
cn: A User
displayname: A User
gecos: A User
gidnumber: 1011
givenname: A
homedirectory: /home/auser
host: host1
host: host2
host: host3
host: host4
mailacceptinggeneralid: root
loginshell: /bin/bash
mail: a.user@example.com
objectclass: inetOrgPerson
objectclass: posixAccount
objectclass: shadowAccount
objectclass: hostObject
objectclass: postfixUser
objectclass: top
sn: User
uid: auser
uidnumber: 1001

Постфиксный поиск адресов электронной почты пользователей в LDAP

у меня есть /etc/postfix/ldap-aliases.cf файл со следующим содержимым для достижения этой цели:

server_host = ldap.example.com
search_base = dc=example, dc=com

# look for entries with this
query_filter = (|(uid=%s)(mailacceptinggeneralid=%s)(mail=%s@example.com))

# what attribute from the search result is returned
result_attribute = mail

# the format in which the result is returned
result_format = %s

Эта конфигурация работает до сих пор и подтверждается следующими postmap команды, возвращающие ожидаемые адреса:

# A query using the uid of the user
postmap -q auser ldap:/etc/postfix/ldap-mail.cf
a.user@example.com

# A query using the corporate username
postmap -q a.user ldap:/etc/postfix/ldap-mail.cf
a.user@example.com

# A query for a user specified in mailacceptinggeneralid
postmap -q root ldap:/etc/postfix/ldap-mail.cf
a.user@example.com

Постфиксный поиск пользователей с доступом к хосту

Я хочу иметь возможность отправлять электронные письма на адрес users@host2.example.com например, и получить адреса из LDAP для всех пользователей, которые имеют доступ к host2 (т.е. host атрибут установлен на host2 или *. Здесь мне нужна помощь.

Пока у меня есть файл /etc/postfix/ldap-host-users.cf который содержит:

server_host = ldap.example.com
search_base = dc=example, dc=com
query_filter = (|(host=%3)(host=\*))
result_attribute = mail
result_format = %s

Предполагается, что запрос содержит полное доменное имя, но я думаю postfix использует только username (возможно, из-за того, что я использовал alias_maps в /etc/postfix/main.cf?). Во всяком случае, тестирование выше:

postmap -q users@host2.example.com ldap:/etc/postfix/ldap-host-users.cf
a.user@example.com

# The following also returns a list of email addresses, but shouldn't:
postmap -q any_group@host2.example.com ldap:/etc/postfix/ldap-host-users.cf
a.user@example.com

postconf -n Вывод

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases, ldap:/etc/postfix/ldap-mail.cf, ldap:/etc/postfix/ldap-host-users.cf
append_dot_mydomain = no
biff = no
config_directory = /etc/postfix
inet_interfaces = all
inet_protocols = all
mailbox_size_limit = 0
mydestination = $myhostname, localhost.example.com, , localhost
myhostname = host2.example.com
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
readme_directory = no
recipient_delimiter = +
relayhost =
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls = yes

Вопросы

Некоторые частичные ответы:

1. Postfix запрашивает только локальное имя пользователя и не включает полное доменное имя в запросе? Это потому, что я использую alias_maps в /etc/postfix/main.cf?

ДА, согласно alias_maps документация, нам нужно сослаться на man 5 псевдонимы чтобы узнать подробности синтаксиса.

Имя - это локальный адрес (без доменной части). Используйте двойные кавычки, если имя содержит специальные символы, такие как пробелы, #',: 'или `@'. Имя переводится в нижний регистр, чтобы поиск в базе данных не учитывал регистр.

Итак, это ожидаемое поведение от postfix.


3. Есть ли лучший / другой способ добиться этого?

Использовать virtual_alias_maps. Согласно этому ответу на Смущает насчет alias_maps и virtual_alias_maps, virtual_alias_maps будет вводить "user @ domain".