Postfix-Dovecot-Sun Direcory Server

21 мая 2009 г.
Comments

Была поставлена задача создать почтовую систему и связать ее с Active Directory, но если служба каталогов не будет доступна по какой-то причине, пользователям не будет доставляться почта. И мы решили развернуть еще одну службу каталогов. Выбор остановили на SUN ONE Directory Server. Он бесплатный, документация отличная и что немало важно управлять ним можно через WEB или java консоль, а синхронизировать Active Direcory и Sun Direcory мы будем с помощью ILM 2007 (Microsoft Identity Lifecycle Manager).


Общая схема показана на рис.
image
После установки Sun Directory Server создадим скрипт для запуска Directory Server и Administration Server (смотрим пост). Ставим у себя Sun Java(TM) System Server Console.
Создаем в ILM 2007 агент управления для Sun Directory
Определяемся какие атрибуты мы будем синхронизировать:
image
настройка правил слияния:
image
настройка переноса атрибутов:
image
Атрибут mailQuota я поставил 50МБ
И создадим профили Full Import – Full Synchronization – Exprort
Вставим в процедуру Provision код

Public Sub Provision(ByVal mventry As MVEntry) Implements IMVSynchronization.Provision.
Const SUN_OU = "ou=People,dc=dn,dc=local"      
' ======================================= 
SUN ONE Directory                  
' =======================================      
adMA = mventry.ConnectedMAs(Sun_MA)      
Connectors = adMA.Connectors.Count        
If 0 = Connectors Then          
Dim objClass As ValueCollection          
Select Case mventry.ObjectType.ToLower()              
Case "person"                  
Container = SUN_OU
dn = adMA.EscapeDNComponent("uid=" + mventry("uid").Value).Concat(Container)
csentry = adMA.Connectors.StartNewConnector("inetOrgPerson")
csentry.DN = dn                  
SetSunDirPW(csentry, "1Q2w3e4r5")                  
csentry.CommitNewConnector()                  
objClass = Utils.ValueCollection(csentry.ObjectClass.ToStringArray())
objClass.Add("mailRecipient")
csentry.ObjectClass = objClass              
Case "group"                   
Container = "ou=Groups," + SUN_OU                   
dn = adMA.EscapeDNComponent("uid=" + mventry("uid").Value).Concat(Container)
csentry = adMA.Connectors.StartNewConnector("groupOfUniqueNames")
csentry.DN = dn                   
csentry.CommitNewConnector()
objClass = Utils.ValueCollection(csentry.ObjectClass.ToStringArray())                   
objClass.Add("mailRecipient")                   
csentry.ObjectClass = objClass            
End Select      
ElseIf 1 = Connectors Then          
Select Case mventry.ObjectType.ToLower()              
Case "group"                  
Container = "ou=Groups," + SUN_OU              
Case "person"                  
Container = SUN_OU          
End Select          
dn = adMA.EscapeDNComponent("uid=" + mventry("uid").Value).Concat(Container)          
csentry = adMA.Connectors.ByIndex(0)          
If csentry.DN.ToString.ToLower <> dn.ToString.ToLower Then              
csentry.DN = dn          
End If      
Else          
Throw New UnexpectedDataException("multiple connectors:" + Connectors.ToString)      
End If


На этом настройка ILM закончена. Теперь пример конфигов Postfix:


main.cf :


virtual_mailbox_domains = $mydomain 
virtual_mailbox_base = /home/vmail/ 
virtual_uid_maps = static:800 
virtual_gid_maps = static:800 
virtual_transport = virtual 
virtual_create_maildirsize = yes 
virtual_mailbox_maps = ldap:/etc/postfix/ldap-users-sun.cf 
virtual_alias_maps = ldap:/etc/postfix/ldap-groups-sun.cf 
virtual_mailbox_limit_maps = ldap:/etc/postfix/ldap-quota.cf 
virtual_mailbox_limit_override = yes

ldap-users-sun.cf:




server_host = sunldap.dn.local 
search_base = ou=People,dc=dn,dc=local 
version = 3 
query_filter = (&(objectclass=inetOrgPerson)(|(mail=%s)(mailAlternateAddress=%s))(nsAccountLock=false)) 
result_attribute = uid 
result_format = %s/Maildir/ 
bind = yes 
bind_dn = uid=ldap,dc=dn,dc=local 
bind_pw = password


ldap-groups-sun.cf:


server_host = sunldap.dn.local 
search_base = ou=People,dc=dn,dc=local 
version = 3 
query_filter = (&(objectclass=groupOfUniqueNames)(|(mailAlternateAddress=%s)(mail=%s))) 
leaf_result_attribute = mail 
result_attribute = mail 
special_result_attribute = uniqueMember 
bind = yes 
bind_dn = uid=ldap,dc=dn,dc=local 
bind_pw = password 

ldap-quota.cf:




server_host = sunldap.dn.local 
search_base = ou=People,dc=dn,dc=local 
version = 3 
query_filter = (&(objectclass=inetOrgPerson)(|(mail=%s)(mailalternativeadderss=%s))(!(nsaccountlock=false))) 
result_attribute = mailQuota 
bind = yes 
bind_dn = uid=ldap,dc=dn,dc=local 
bind_pw = password

Конфиги Dovecot:




dovecot.conf:


protocols = pop3 
listen = * 
ssl_disable = yes 
disable_plaintext_auth=no 
mail_location = maildir:~/Maildir 
mail_access_groups = vmail 
protocol pop3 { 
pop3_uidl_format = %08Xu%08Xv 
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh 
} 
auth_cache_size = 1024 
auth_username_format = %Lu 
mail_uid=800 
mail_gid=800 
auth_ntlm_use_winbind = yes 
auth_winbind_helper_path = /usr/bin/ntlm_auth 
auth default { 
mechanisms = plain login ntlm 
passdb ldap { 
args = /etc/dovecot-ldap-sun.cf 
} 
userdb prefetch { 
} 
userdb ldap { 
args = /etc/dovecot-ldap-sun.cf 
} 
}


dovecot-ldap-sun.cf:


hosts = sunldap.dn.local 
base = ou=People,dc=dn,dc=local 
dn = uid=ldap,dc=dn,dc=local 
dnpass=password 
ldap_version = 3 
deref = never 
scope=subtree 
user_filter = (&(objectClass=mailRecipient)(uid=%n)(nsAccountLock=false)) 
pass_filter = (&(ObjectClass=person)(uid=%n)) 
user_attrs = uid=home=/home/vmail/%$ 
default_pass_scheme = CRYPT
debug_level = 0 


Вот и все…