Postfix虚拟主机与LDAP后端和Dovecot作为IMAP / POP3服务器在Ubuntu Kamic考拉9.10
这将如何让您逐步配置带有虚拟主机的Postfix邮件服务器。 虚拟主机意味着您可以根据需要添加尽可能多的邮件域,并按顺序为这些域按顺序分配任意数量的邮箱。
在这里,我们为MTA(Postfix)和POP3 / IMAP服务器(Dovecot)和基于Web的管理界面使用LDAP后端。
可选在这里怎么使用Roundcube webmail和proftpd。
新版本的Roundcube 0.3允许网络邮件用户更改(ldap)密码,使用ldap(插件)集成ldap通讯录和休假。 这些功能与在此使用的设置很好地对齐,并为邮件用户提供了一个简单的界面。
这是如何是Ubuntu Intrepid版本的升级和增强版本。 请注意,Roundcube和Proftpd的配置可以添加到Intrepid / Jaunty设置中。
要在这个软件中使用如何:
Postfix MTA, Dovecot IMAP / POP3, OpenLDAP , Gnarwl作为自动回复(假期), Proftpd作为ftp服务器, Phamm作为管理界面, MySQL作为数据库后端的webmail和Roundcube作为Webmail。
这对我来说是有效的,但我不能保证这个设置会为你工作,所以这个如何进来没有任何保证。
假设:
这样如何假设以下配置,如果您的安装与此不同,则将以下条目替换为您的实际配置。
邮件传递(邮箱)路径:
/home/vmail/domains
用户vmail
:
UID:1000, GID:1000
用户Postfix
:
UID: 108, GID:108
OpenLDAP base dn:
dc=example,dc=tld
OpenLDAP管理员帐号:
cn=admin,dc=example,dc=tld
Phamm搜索dn:
o=hosting,dc=example,dc=tld
一个只读帐户的o = hosting,dc = example,dc = tld tree:
cn=phamm,o=hosting,dc=example,dc=tld
本指南中您正在使用root用户。
如果你想要例如o = maildomains或ou = domains,请确保替换o = hosting与你想要的,特别是在acl.ldif中。 这个acl文件是严格的,如果不完全一样,phamm将无法正常工作。 如果你想要一个不同于phamm的只读用户,而不是用cn = wat替换cn = phamm,你到底该怎么办?
第1步:安装和配置Ubuntu服务器
我建议您遵循以下指南(我不需要重写或重新设计别人做得比我更好):
完美的服务器 - Ubuntu 9.10 [ISPConfig 3]
更换以下第4页:
aptitude install postfix postfix-mysql postfix-doc mysql-client mysql-server courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl getmail4 rkhunter binutils
通过
aptitude install postfix postfix-ldap mysql-client mysql-server dovecot-imapd dovecot-pop3d libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl getmail4 rkhunter binutils
并跳过postfix的配置。 我们将在本指南中进一步安装和配置Postfix和Dovecot。
注意:所有的URL和包名在编写本文时都是有效的。 最佳做法是检查是否有新版本可用。
下载和提取的软件包的目录名称需要更改为下载的各个软件包的版本号,例如:phamm-0.5.17 to phamm-0.5.xx
所以让我们开始休息。
下载一些我们需要的软件包和openldap模式:
cd /usr/src
获取最新版本的phamm:
wget http://open.rhx.it/phamm/phamm-0.5.17.tar.gz
解压缩档案:
tar xvzf phamm-0.5.17.tar.gz
第2步:安装和配置openldap
OpenLDAP的配置有点(更复杂)。仍然使用cn = config,但是从存储库安装软件包时,只会安装openldap的骨架配置。 当安装软件包并且发出“dpkg-reconfigure slapd”
只能将openldap限制在骨架配置中时,您不再需要提供密码。 您将必须使用root帐户(或sudo)设置openldap数据库,root dn和acl的自己才能配置openldap。
安装openldap和ldap-utils:
aptitude install slapd ldap-utils
更改为/ etc / ldap
目录:
cd /etc/ldap
将phamm.schema和perversia.net.schema从phamm包复制到模式目录:
cp /usr/src/phamm-0.5.17/schema/phamm.schema /etc/ldap/schema.
cp /usr/src/phamm-0.5.17/schema/contrib/perversia.net.schema /etc/ldap/schema.
获取我们需要的更多模式。
cd schema
wget http://open.rhx.it/phamm/schema/ISPEnv2.schema
wget http://open.rhx.it/phamm/schema/amavis.schema
wget http://open.rhx.it/phamm/schema/pureftpd.schema
cd ../
现在我们需要将模式转换为ldif格式。
创建一个名为convert的文件并粘贴下面的文本。
vi convert
转换内容:
include /etc/ldap/schema/core.schema include /etc/ldap/schema/cosine.schema include /etc/ldap/schema/nis.schema include /etc/ldap/schema/inetorgperson.schema include /etc/ldap/schema/phamm.schema include /etc/ldap/schema/ISPEnv2.schema include /etc/ldap/schema/amavis.schema include /etc/ldap/schema/pureftpd.schema include /etc/ldap/schema/perversia.net.schema
现在我们将转换shemas:
mkdir ldif
slaptest -f convert -F ldif
现在我们更改到包含转换模式的目录:
cd ldif/cn\=config/cn\=schema
该目录应包含以下文件:
cn={0}core.ldif cn={3}inetorgperson.ldif cn={6}amavis.ldif
cn={1}cosine.ldif cn={4}phamm.ldif cn={7}pureftpd.ldif
cn={2}nis.ldif cn={5}ISPEnv2.ldif cn={8}perversia.ldif
我们需要编辑phamm,amavis,pureftpd,ISPEnv2和perversia模式。 对于每一个,您需要执行以下操作(phamm模式的示例):
更改:
dn: cn={4}phamm objectClass: olcSchemaConfig cn: {4}phamm
至
dn: cn=phamm,cn=schema,cn=config objectClass: olcSchemaConfig cn: phamm
并删除:
structuralObjectClass: olcSchemaConfig entryUUID: c27532b2-6a27-102e-88a5-e92372c94d84 creatorsName: cn=config createTimestamp: 20091120135300Z entryCSN: 20091120135300.238121Z#000000#000#000000 modifiersName: cn=config modifyTimestamp: 20091120135300Z
所以对于每一个这些做的都是做出如上所述的改变:
vi cn\=\{4\}phamm.ldif
vi cn\=\{5\}ISPEnv2.ldif
vi cn\=\{6\}amavis.ldif
vi cn\=\{7\}pureftpd.ldif
vi cn\=\{8\}perversia.ldif
注意:该示例中的enry phamm是其他ldif中的ISPEnv2,amavis,pureftpd和pervisia。
现在我们将ldifs复制到/ etc / ldap / schema
目录中(这是不需要的,但是当需要ldif时,它是方便的)。
cp cn\=\{4\}phamm.ldif /etc/ldap/schema/phamm.ldif
cp cn\=\{5\}ISPEnv2.ldif /etc/ldap/schema/ISPEnv2.ldif
cp cn\=\{6\}amavis.ldif /etc/ldap/schema/amavis.ldif
cp cn\=\{7\}pureftpd.ldif /etc/ldap/schema/pureftpd.ldif
cp cn\=\{8\}perversia.ldif /etc/ldap/schema/perversia.ldif
我们现在可以删除ldif目录,因为我们不再需要它了,也可以避免任何混淆,并转回到/ etc / ldap
目录。
cd /etc/ldap
rm -R ldif
现在我们将模式添加到openldap。
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/phamm.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/ISPEnv2.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/amavis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/pureftpd.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/perversia.ldif
我们需要加载数据库后端模块并创建数据库。
创建一个名为db.ldif
的文件,并将以下文本粘贴到其中:
vi db.ldif
db.ldif的
内容:
# Load dynamic backend modules dn: cn=module{0},cn=config objectClass: olcModuleList cn: module olcModulepath: /usr/lib/ldap olcModuleload: {0}back_hdb # Create the database dn: olcDatabase={1}hdb,cn=config objectClass: olcDatabaseConfig objectClass: olcHdbConfig olcDatabase: {1}hdb olcDbDirectory: /var/lib/ldap olcSuffix: dc=example,dc=com olcRootDN: cn=admin,dc=example,dc=com olcRootPW: example olcDbConfig: {0}set_cachesize 0 2097152 0 olcDbConfig: {1}set_lk_max_objects 1500 olcDbConfig: {2}set_lk_max_locks 1500 olcDbConfig: {3}set_lk_max_lockers 1500 olcLastMod: TRUE olcDbCheckpoint: 512 30 olcDbIndex: cn,mail,givenname eq,subinitial olcDbIndex: vd,delete eq,pres olcDbIndex: accountActive,forwardActive eq,pres olcDbIndex: smtpAuth eq,pres olcDbIndex: sn,displayName eq,pres,sub olcDbIndex: default sub olcDbIndex: uid eq,pres olcDbIndex: objectClass eq
安装文件并发出以下命令来加载模块并初始化数据库:
ldapadd -Y EXTERNAL -H ldapi:// -f db.ldif
请注意olcRootPW:
将RootPW
设置为示例的示例。 替换示例,使用您选择的密码。
现在,我们为openldap服务器以及o = hosting和phamm帐户创建基础dn和管理员帐户。
修改下面的文本以满足您的需求,并为管理员帐户生成密码。 此文件中的哈希将密码设置为示例。 phamm帐户的隐藏导致密码只读。
要为管理员帐户创建密码,请输入以下命令:
slappasswd -h {MD5}
键入想要的pasword两次,并将结果复制到下面的文本。
创建base.ldif
:
vi base.ldif
base.ldif的
内容
dn: dc=example,dc=tld objectClass: dcObject objectclass: organization o: example.tld dc: example description: My LDAP Root dn: cn=admin,dc=example,dc=tld objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin userPassword: {MD5}Gnmk1g3mcY6OWzJuM4rlMw== description: LDAP administrator dn: o=hosting,dc=example,dc=tld objectClass: organizationalUnit objectClass: top ou: domains description: Hosting Organization # Read only account dn: cn=phamm,o=hosting,dc=example,dc=tld objectClass: simpleSecurityObject objectClass: organizationalRole cn: phamm userPassword: {MD5}M267sheb6qc0Ck8WIPOvQA== description: Read only account
使用以下命令将基础dn加载到数据库中:
ldapadd -Y EXTERNAL -H ldapi:// -f base.ldif
我们修改系统acl的。
在openldap设置中有一些acl设置,阻止phpldapadmin与目录进行接口,所以我们现在将其删除,并将openldap设置为默认的cn = admin,cn = config。 从这一刻起,openldap可以像以前一样配置和操作,但不再通过发出命令,如ldapadd -Y EXTERNAL -H ldapi:// -f文件
,而是ldapadd -x -Y EXTERNAL -H ldapi:// -D cn = admin,cn = config -W -f文件
。
创建一个名为config.ldif的文件,并粘贴下面的文本。 但是不要忘记用上面创建的哈希替换olcRootPW
哈希。
vi config.ldif
config.ldif的
内容:
dn: cn=config changetype: modify delete: olcAuthzRegexp dn: olcDatabase={-1}frontend,cn=config changetype: modify delete: olcAccess dn: olcDatabase={0}config,cn=config changetype: modify delete: olcRootDN dn: olcDatabase={0}config,cn=config changetype: modify add: olcRootDN olcRootDN: cn=admin,cn=config dn: olcDatabase={0}config,cn=config changetype: modify add: olcRootPW olcRootPW: {MD5}Gnmk1g3mcY6OWzJuM4rlMw== dn: olcDatabase={0}config,cn=config changetype: modify delete: olcAccess
将config.ldif
加载到openldap服务器:
ldapadd -Y EXTERNAL -H ldapi:// -f config.ldif
设置ldap acl的phamm。
创建一个名为acl.ldif
的文件,并将下面的文本粘贴到其中:
vi acl.ldif
acl.ldif的
内容:
dn: olcDatabase={1}hdb,cn=config add: olcAccess olcAccess: to dn.regex=".+,vd=([^,]+),o=hosting,dc=example,dc=tld$" attrs=userPassword by dn="cn=admin,dc=example,dc=tld" write by self write by anonymous auth by dn.exact,expand="cn=postmaster,vd=$1,o=hosting,dc=example,dc=tld" write by set.expand="user/vd & [$1]" write olcAccess: to dn.regex=".+,vd=([^,]+),o=hosting,dc=example,dc=tld$" attrs=amavisBypassVirusChecks,quota,smtpAuth,accountActive by dn="cn=admin,dc=example,dc=tld" write by self read by dn.exact="cn=phamm,o=hosting,dc=example,dc=tld" read by set.expand="user/editAccounts & [TRUE]" write by dn.exact,expand="cn=postmaster,vd=$1,o=hosting,dc=example,dc=tld" read by set.expand="user/vd & [$1]" write olcAccess: to dn.regex=".+,vd=([^,]+),o=hosting,dc=example,dc=tld$" attrs=cn,sn,uid,forwardActive,vacationActive,vacationInfo,vacationStart,vacationEnd,vacationForward,amavisSpamTagLevel,amavisSpamTag2Level,amavisSpamKillLevel by dn="cn=admin,dc=example,dc=tld" write by self write by dn.exact="cn=phamm,o=hosting,dc=example,dc=tld" read by dn.exact,expand="cn=postmaster,vd=$1,o=hosting,dc=example,dc=tld" write by set.expand="user/vd & [$1]" write olcAccess: to dn.regex="^.*,vd=([^,]+),o=hosting,dc=example,dc=tld$" attrs=editAccounts by dn="cn=admin,dc=example,dc=tld" write by self read by set.expand="user/editAccounts & [TRUE]" write by dn.exact="cn=phamm,o=hosting,dc=example,dc=tld" read by * none olcAccess: to dn.regex=".+,vd=([^,]+),o=hosting,dc=example,dc=tld$" attrs=objectClass,entry by dn="cn=admin,dc=example,dc=tld" write by self write by anonymous read by dn.exact="cn=phamm,o=hosting,dc=example,dc=tld" read by set.expand="user/editAccounts & [TRUE]" write by dn.exact,expand="cn=postmaster,vd=$1,o=hosting,dc=example,dc=tld" read olcAccess: to dn.regex=".+,vd=([^,]+),o=hosting,dc=example,dc=tld$" attrs=amavisBypassSpamChecks,accountActive,delete by dn="cn=admin,dc=example,dc=tld" write by self read by dn.exact="cn=phamm,o=hosting,dc=example,dc=tld" read by dn.exact,expand="cn=postmaster,vd=$1,o=hosting,dc=example,dc=tld" write by set.expand="user/vd & [$1]" write olcAccess: to dn.regex=".+,vd=([^,]+),o=hosting,dc=example,dc=tld$" attrs=otherPath by dn="cn=admin,dc=example,dc=tld" write by anonymous read by self read by dn.exact="cn=phamm,o=hosting,dc=example,dc=tld" read by dn.exact,expand="cn=postmaster,vd=$1,o=hosting,dc=example,dc=tld" read by set.expand="user/vd & [$1]" write olcAccess: to dn.regex=".+,vd=([^,]+),o=hosting,dc=example,dc=tld$" attrs=createMaildir,vdHome,mailbox,otherTransport by dn="cn=admin,dc=example,dc=tld" write by self read by dn.exact="cn=phamm,o=hosting,dc=example,dc=tld" read by set.expand="user/vd & [$1]" read olcAccess: to dn.regex="^(.+,)?vd=([^,]+),o=hosting,dc=example,dc=tld$" attrs=vd by dn="cn=admin,dc=example,dc=tld" write by self write by dn.exact="cn=phamm,o=hosting,dc=example,dc=tld" read by dn.exact,expand="cn=postmaster,vd=$2,o=hosting,dc=example,dc=tld" write by set.expand="user/vd & [$2]" write olcAccess: to dn.regex="^(.+,)?vd=([^,]+),o=hosting,dc=example,dc=tld$" by dn="cn=admin,dc=example,dc=tld" write by self write by dn.exact="cn=phamm,o=hosting,dc=example,dc=tld" read by set.expand="user/editAccounts & [FALSE]" read by dn.exact,expand="cn=postmaster,vd=$2,o=hosting,dc=example,dc=tld" write by set.expand="user/vd & [$2]" write olcAccess: to dn.regex=".+,o=hosting,dc=example,dc=tld$" by dn="cn=admin,dc=example,dc=tld" write by self write by dn.exact="cn=phamm,o=hosting,dc=example,dc=tld" read by anonymous auth olcAccess: to dn.regex=".+,dc=tld$" by dn="cn=admin,dc=example,dc=tld" write by dn.exact="cn=phamm,o=hosting,dc=example,dc=tld" read by anonymous auth olcAccess: to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=example,dc=tld" write by anonymous auth by self write by * none olcAccess: to dn.base="" by * read olcAccess: to * by dn="cn=admin,dc=example,dc=tld" write by * read
现在将acl加载到openldap服务器中:
ldapmodify -x -D cn=admin,cn=config -W -f acl.ldif
现在我们已经配置了openldap,我们可以去下一步。