У меня есть рабочая установка 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
у меня есть /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
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
postfix
только запрос с использованием локального username
и не включает полное доменное имя в запрос? alias_maps
в /etc/postfix/main.cf
?username
часть запроса users
и ничего не вернуть, если это что-то другое? например В query_filter
могу я сделать что-нибудь вроде %u="users"
?Некоторые частичные ответы:
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".