Top

在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应该是根据哈希的头部来判断加密方式的。
完全可以将系统账号的密码复制进来直接使用。
字符串加密,头部含义:
头部字符串 含义
$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目录中。其中:

注释掉/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/conf.d/中创建两个文件:
然后重启dovecot即可。