在Debian上安装邮件系统
使用虚拟账号
本次操作主要参考Postfix Dovecot Virtual Users详细配置邮件系统
以及Password Schemes
默认情况下,postfix和dovecot都使用系统账号进行认证,如果邮局需要管理很多个账号,就要在系统中建很多本地账号,这会对系统带来很多安全隐患。
另一方面,默认情况下所有邮件都保存在/var/mail/目录下,且每个用户的邮件都统一放在一个txt文件中(即所谓的mbox模式),这对于某些接收很多邮件的邮箱来说是很危险的,因为用来保存它邮件的那个文件会迅速长大,甚至超过数十G。
基于以上两个方面的因素,大多数邮件服务器都采用虚拟账号来管理邮件用户,且一般使用maildir模式(即以目录形式对邮件进行分类,且每个邮件保存为一个文件)保存邮件。
maildir目录下一般有三个目录:tmp(写邮件时的临时目录)、cur(客户端已收取邮件保存在这个目录中)、new(客户端未收取的邮件保存在此目录中)。
使用虚拟账号的话,需要在系统中创建一个账号用来管理所有的邮件,按管理,这个账号一般叫做vmail。
以下命令直接创建一个vmail用户和一个vmail组,不需要设置vmail账号的密码、主目录。
# groupadd -g 500 vmail 创建vmail组,组id为500
# useradd -g 500 -u 500 vmail 创建vmail用户,用户id为500,且为vmail组成员
然后创建一个用于存放所有邮件的目录,并授权给vmail用户:
mkdir -p /var/vmail
chown vmail:vmail /var/vmail
然后在/etc/dovecot/目录下创建一个文本文件passwd-user-auth用于保存虚拟账号和密码,每行一个账号信息,格式为:
abc@test.com:{plain}pass123
第一段为账户名(含域名);第二段为密码,其中花括号里面注明密码的加密方式,plain表示不加密。
如果要使用加密密码,可以使用dovecot的doveadm pw -p命令生成{$2y$}格式的密码:
root@mail:/etc/dovecot# doveadm pw -p pass123
{CRYPT}$2y$05$aa.dmN2oO/lMMRJJ.xbvhu26pPQ32pN7Uu5dZhWVSYjxLg8FtTI9i
将生成的加密密码写入passwd-user-auth文件中:
root@mail:/etc/dovecot# cat passwd-users-auth
abc@test.com:{CRYPT}$2y$05$aa.dmN2oO/lMMRJJ.xbvhu26pPQ32pN7Uu5dZhWVSYjxLg8FtTI9i
实测,{CRYPT}可以不要,dovecot应该是根据哈希的头部来判断加密方式的。
完全可以将系统账号的密码复制进来直接使用。
- Debian的密码文件是/etc/shadow
- FreeBSD的密码文件是/etc/master.passwd
字符串加密,头部含义:
头部字符串 |
含义 |
$1$ |
MD5-CRYPT |
$2b$ |
bcrypt定的$2$的后续版本,iRedMail 0.9.7版采用 |
$5$ |
SHA256-CRYPT |
$6$ |
SHA512-CRYPT(freebsd、Debian用)
另,iRedMail 1.6版的密码加密方式头部写{SSHA512}不知道是不是这个 |
$y$ |
未知(Debian11用) |
$2y$ |
BLF-CRYPT(doveadm默认生成的密码) |
$argon2i$/$argon2id$ |
ARGON2I/ARGON2ID,据说最强 |
在使用telnet连接邮件服务器的110端口时,依然可以使用pass123这个明文密码登录。
接下来修改dovecot的配置文件,默认情况下dovecot有一系列的配置文件,保存在/etc/dovecot目录中。其中:
- dovecot.conf
是总配置文件,默认情况下它里面并没有写明任何配置项,而是包含三句引用:
- !include_try /usr/share/dovecot/protocols.d/*.protocol
根据安装的dovecot相关包而有所不同,比如安装了dovecot-pop3d、dovecot-imapd、dovecot-lmtpd的话,该目录里就会有imapd.portocol、lmtpd.protocol、pop3d.protocol。
一般情况下这里的文件不需要修改。
- !include conf.d/*.conf
- !include_try local/conf
- conf.d/
里面分类存放所有配置文件
文件名 |
配置内容 |
10-auth.conf |
身份验证过程 |
10-director.conf |
特定于控制器的设置 |
10-logging.conf |
日志目的地 |
10-mail.conf |
邮箱位置和命名空间 |
10-master.conf |
(存疑)主配置文件,常用来设置配合其他程序,比如postfix等 |
10-ssl.conf |
SSL设置 |
10-tcpwrapper.conf |
|
15-lda.conf |
LDA——local delivery agent,本地传送代理,从MTA接收邮件并传送到用户的邮箱。参考LMTP |
15-mailboxes.conf |
定义邮箱的内部文件夹,比如收件箱(inbox)下面的\Junk、\Trash;发件箱(Sent)下面的\Sent等 |
20-imap.conf |
IMAP指定设置 |
20-lmtp.conf |
LMTP指定设置 |
20-pop3.conf |
POP3指定设置 |
90-acl.conf |
邮箱访问控制列表 |
90-plugin.conf |
插件设置 |
90-quota.conf |
配额设置 |
90-sieve.conf |
设置过滤器 |
90-sieve-extprograms.conf |
过滤器插件Extprograms配置 |
auth-*.conf.ext |
可能会被10-auth.conf引用的配置文件,默认仅auth-system.conf.ext被引用,其余引用被注释掉。
- auth-checkpassword.conf.ext
- auth-deny.conf.ext
- auth-dict.conf.ext
- auto-master.conf.ext
- auto-passwdfile.conf.ext
- auto-sql.conf.ext
- auto-static.conf.ext
- auto-system.conf.ext
|
- private/
里面有两个密钥文件dovecot.key、dovecot.pem(实际上是两个软连接,指向/etc/ssl里面对应的文件)
- dovecot-dict-suth.conf.ext
注释掉/etc/dovecot/conf.d/10-auth.conf中的!include auth-system.conf.ext,并取消!include auth-passwdfile.conf.ext的注释,变成如下:
#!include auth-system.conf.ext 此文件配置系统用户认证
!include auth-passwdfile.conf.ext 此文件配置密码文件认证
备份现有/etc/dovecot/conf.d/auth-passwdfile.conf.ext文件为auth-passwdfile.conf.ext.old,然后新建auth-passwdfile.conf.ext,内容如下:
passdb {
driver = passwd-file
args = scheme=CRYPT username_format=%u /etc/dovecot/passwd-users-auth 此处指定密码加密,以及用户名格式。%u表示完整的邮件地址。
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/vmail/%d/%n %d表示邮件地址的域名部分;%n表示邮件地址的用户名部分。这样设置是表示将相同域名的虚拟邮箱放到同一个目录下,然后按用户再分。
}
注:虚拟账号的邮箱目录可以不用手动创建,dovecot和postfix设置完成后,一旦用户使用客户端连接过来,系统会自动创建相应的目录。
修改/etc/dovecot/conf.d/10-mail.conf,设置mail_location:
mail_location = maildir:~/Maildir
重启dovecot服务:service dovecot restart
测试如下:
root@mail:/var/vmail/abc@test.com# telnet localhost 110
Trying ::1...
Connected to localhost.
Escape character is '^]'.
+OK Dovecot (Debian) ready.
user abc@test.com
+OK
pass pass123
+OK Logged in.
list
+OK 0 messages:
.
quit
此时dovecot的配置为:
root@mail:/etc/dovecot/conf.d# doveconf -n -P
# 2.3.13 (89f716dc2): /etc/dovecot/dovecot.conf
# Pigeonhole version 0.5.13 (cdd19fe3)
# OS: Linux 5.10.0-15-amd64 x86_64 Debian 11.3
# Hostname: mail.test.com
mail_location = maildir:~/Maildir
mail_privileged_group = mail
namespace inbox {
inbox = yes
location =
mailbox Drafts {
special_use = \Drafts
}
mailbox Junk {
special_use = \Junk
}
mailbox Sent {
special_use = \Sent
}
mailbox "Sent Messages" {
special_use = \Sent
}
mailbox Trash {
special_use = \Trash
}
prefix =
}
passdb {
args = scheme=CRYPT username_format=%u /etc/dovecot/passwd-users-auth
driver = passwd-file
}
plugin {
sieve = file:~/sieve;active=~/.dovecot.sieve
}
protocols = " imap lmtp pop3"
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
}
}
ssl_cert = </etc/dovecot/private/dovecot.pem
ssl_client_ca_dir = /etc/ssl/certs
ssl_dh = </usr/share/dovecot/dh.pem
ssl_key = </etc/dovecot/private/dovecot.key
userdb {
args = uid=vmail gid=vmail home=/var/vmail/%d/%n
driver = static
}
最后一步,为了使postfix能使用dovecot的认证信息,需要更改/etc/dovecot/conf.d/10-master.conf文件,将以下三行的注释取消:
unix_listener /var/spool/postfix/private/auth {
mode = 0666
}
然后重启dovecot。
接下来设置postfix。
首先在/etc/postfix/目录下创建一个文本文件用于保存虚拟域名,每行一个虚拟域名,每行的左侧是虚拟域名,右侧据说可以随意写,一般写ok:
vi /etc/postfix/vmail_domains
test.com ok
然后创建一个文本文件用于保存每个虚拟用户邮件存放的位置:
vi /etc/postfix/vmail_mailbox
abc@test.com test.com/abc/Maildir/ 由于前面dovecot中设置了相同域名的虚拟账号放在同一个目录下,所以此处针对每个不同的用户需要写下相对路径。
注意,以上每行定义一个虚拟用户邮件的存放位置,该位置为相对路径,需要在main.cf中统一定义虚拟邮箱的基础路径:virtual_mailbox_base = /var/vmail
然后使用postmap命令创建map文件:
postmap vmail_domains vmail_mailbox
接下来修改postfix的主配置文件/etc/postfix/mail.cf,在默认配置文件后面追加以下内容:
smtpd_sasl_type = dovecot
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_path = private/auth
virtual_mailbox_base = /var/vmail
virtual_mailbox_domains = hash:/etc/postfix/vmail_domains
virtual_mailbox_maps = hash:/etc/postfix/vmail_mailbox
virtual_transport = virtual
virtual_uid_maps = static:500
virtual_gid_maps = static:500
测试如下:
root@mail:/etc/postfix# telnet localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 mail.test.com ESMTP Postfix (Debian/GNU)
mail from: abc@test.com
250 2.1.0 Ok
rcpt to: abc@test.com
250 2.1.5 Ok
data
354 End data with .
999
000
.
250 2.0.0 Ok: queued as 2C6AD42C07F7
quit
221 2.0.0 Bye
Connection closed by foreign host.
root@mail:/etc/postfix# ls /var/vmail/abc@test.com/Maildir/new/
1655102849.V802I42c07feM499267.mail
以上完成之后,一个基本的邮件服务器就算是搭好了。
此时服务器开放了与邮件相关的端口有:
端口号 |
含义 |
是否已在 |
25 |
smtp |
是 |
110 |
pop3 |
是 |
143 |
imap |
是 |
465 |
smtps(SSL/TLS) |
否 |
587 |
STARTTLS端口 |
否 |
993 |
imaps |
是 |
995 |
pop3s |
是 |
但是这个邮件服务器如果放到公网上,很容易被人当作垃圾中转站(smtp不需要认证)。所以后续还需要设置smtp认证及加密、反垃圾邮件、加密虚拟账号密码、邮件杀毒等一系列设置才能正式上线。
可以将账号密码文件写到不同文件中,以因应多虚拟域名的状况——虽然多虚拟域名可以写在同一个文件里,但是不便于后期管理。
方法是创建多个passwd-users-auth文件,例如:
- /etc/dovecot/passwd-users-auth/abc.com
内容为:
testuser@abc.com:$2y$05$0zYbWJtS4Z7dOFsBLbBpROVxX9GxOkStJ/.R7PX0wmcX58y9Psi/m
- /etc/dovecot/passwd-users-auth/xyz.com
内容为:
testuser@xyz.com:$2y$05$U7NBP0gK76I0lE317Ur8QewElJZpL7AD5cXKxecF3S72M5uZ.MTNi
然后在/etc/dovecot/conf.d/中创建两个文件:
- auth-passwdfile.conf-1.ext文件
内容为:
passdb {
driver = passwd-file
args = scheme=CRYPT username_fomat=%u /etc/dovecot/passwd-users-auth/abc.com
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}
- auth-passwdfile.conf-2.ext文件
内容为:
passdb {
driver = passwd-file
args = scheme=CRYPT username_fomat=%u /etc/dovecot/passwd-users-auth/xyz.com
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}
然后重启dovecot即可。