编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

Ubuntu搭建强健的邮箱服务器(四)

wxchong 2024-06-23 19:22:10 开源技术 67 ℃ 0 评论

这节我来讲Postfix的黄金搭档Dovecot。Dovecot是一个邮件管理器,它的功能很多,可以担负起大部的日常管理功能。

Dovecot服务

相关操作命令

  1. 查看配置参数
doveconf
  1. 查看特定配置参数的值
doveconf <参数名称>
## 如:
doveconf mail_location
  1. 查看配置的有效性
    这个命令查看当前所有已配置的所有参数
doveconf -n
  1. 以指定的参数测试参数的有效性(并没有真正更改配置文件)
doveconf -n -c /etc/dovecot/dovecot.conf mail_location=maildir:~/Maildir

Dovecot的安装

sudo apt install dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql dovecot-pop3d dovecot-sieve dovecot-managesieved

配置dovecot.conf

创建管理用户:

groupadd -g 5000 adminmail
useradd -g adminmail -u 5000 adminmail -d /var/mail
chown -R adminmail:adminmail /var/mail

编辑Dovecot主配置文件:

sudo nano /etc/dovecot/dovecot.conf

## 确保以下设置正确
disable_plaintext_auth = no
mail_privileged_group = mail

## mail_location = mbox:~/mail:INBOX=/var/mail/%u
## 使用了 mbox 格式的存储,它将所有邮件存储在一个单独的文件中。
## :INBOX= 指定了 INBOX 的位置。
## %u 是用户的用户名的占位符,它将被实际的用户名替换。
## 邮件存储的位置为 ~/mail 目录。
## 这种格式通常适用于较小的邮件存储需求,但不如 maildir 格式灵活,特别是在多用户同时写入的情况下。

mail_location = maildir:/var/mail/%d/%n
## 使用了 maildir 格式的存储,它将每封邮件存储为一个单独的文件。
## %d 是域名的占位符,%n 是用户名的占位符。
## 邮件存储的位置为 /var/mail/域名/用户名 目录。
## 这种格式更加适用于多用户、高并发写入的情况,因为它避免了 mbox 格式的锁定问题,
## 每封邮件都是一个独立的文件。

## 启用SSL认证
ssl = yes
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem

userdb {
  driver = static
  args = uid=adminmail gid=adminmail home=/var/mail/%d/%n
}
## 如果这里启用mysql来配置的话,则示例如下:
# userdb {
#   driver = sql
#   args = /etc/dovecot/dovecot-sql.conf.ext
# }
# /etc/dovecot/dovecot-sql.conf.ext
# driver = mysql
# connect = host=localhost dbname=users user=dovecot password=your_password
# default_pass_scheme = SHA512-CRYPT
# password_query = SELECT email AS user, password FROM users WHERE email = '%u';
# user_query = SELECT uid, gid, CONCAT('/var/mail/', email) AS home FROM users WHERE email = '%u';

## 启用了autocreate 插件,它会在用户首次登录时自动创建一些常见的邮件箱(Trash、Sent等)。
## 这是一个很好的配置,可以提高用户体验。
protocol imap {
  mail_plugins = "autocreate"
}
## 用于具体指定 autocreate 插件的行为
plugin {
  autocreate = Trash
  autocreate2 = Sent
  autosubscribe = Trash
  autosubscribe2 = Sent
}

protocols = imap pop3 lmtp sieve

配置数据库来管理用户认证

/etc/dovecot/dovecot-sql.conf.ext<br />如何不用上面的文件系统来管理邮件,可采用mysql,配置如下:

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}

创建并编辑Mysql认证配置文件:

sudo nano /etc/dovecot/dovecot-sql.conf.ext

## /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=localhost dbname=dovecotdb user=dovecotuser password=yourpassword
default_pass_scheme = SHA512-CRYPT
password_query = SELECT username, domain, password FROM mail_users WHERE username = '%n' AND domain = '%d'
user_query = SELECT home, uid, gid FROM mail_users WHERE username = '%n' AND domain = '%d'

##关于通配符
%u = 匹配完全的 user@domain
%n = 匹配 user@domain 中的user
%d = 匹配 user@domain 中的domain

创建Mysql数据库和用户


CREATE TABLE mail_users (
    username VARCHAR(128) NOT NULL,
    domain VARCHAR(128) NOT NULL,
    password VARCHAR(64) NOT NULL,
    home VARCHAR(255) NOT NULL,
    uid INTEGER NOT NULL DEFAULT 5000,
    gid INTEGER NOT NULL DEFAULT 5000,
    active CHAR(1) DEFAULT 'Y' NOT NULL,
    PRIMARY KEY (username)
);

请确保替换 'hashedpassword' 为实际的哈希密码。你可以使用以下方式生成哈希密码:

doveadm pw -s SHA512-CRYPT

完整配置如下 :

# CREATE TABLE users (
#     username VARCHAR(128) NOT NULL,
#     domain VARCHAR(128) NOT NULL,
#     password VARCHAR(64) NOT NULL,
#     home VARCHAR(255) NOT NULL,
#     uid INTEGER NOT NULL,
#     gid INTEGER NOT NULL,
#     active CHAR(1) DEFAULT 'Y' NOT NULL
# );

# Database driver: mysql, pgsql, sqlite
driver = mysql


#connect =
connect = host=localhost dbname=exampledb user=exampleuser password=examplepw
# Default password scheme.
#
# List of supported schemes is in
# http://wiki2.dovecot.org/Authentication/PasswordSchemes
#
default_pass_scheme = SHA512-CRYPT
password_query = SELECT username, domain, password FROM mail_users WHERE username = '%n' AND domain = '%d'

# Examples:
#   user_query = SELECT home, uid, gid FROM users WHERE userid = '%u'
#   user_query = SELECT dir AS home, user AS uid, group AS gid FROM users where userid = '%u'
#   user_query = SELECT home, 501 AS uid, 501 AS gid FROM users WHERE userid = '%u'
#
user_query = SELECT home, uid, gid FROM mail_users WHERE username = '%n' AND domain = '%d'

监听器配置

/etc/dovecot/conf.d/10-master.conf

  1. 通过限制监听器的 IP 地址,可以减少未经授权的访问。确保只有信任的 IP 地址可以连接到 Dovecot。例如:
## 这个设置是非安全加密通道的连接。一般不启用。
service imap-login {
  inet_listener imap {
    address = 192.168.1.1 ## 如果为*的话则任意终端都可连接
    port = 143
  }
}

在这个示例中,只有 IP 地址为 192.168.1.1 的客户端才能连接到 IMAP 服务。

  1. 启用SSL/TLS

对于安全性考虑,建议始终使用 SSL/TLS 加密通信。确保启用 TLS,并配置相应的证书和私钥路径。示例:

service imap-login {
  inet_listener imaps {
    address = *
    port = 993
    ssl = yes
  }
}

这将启用 IMAPS 监听器,使用 SSL 加密通信,端口为 993。

  1. 限制认证监听器
service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
}

完整的示例如下:

service imap-login {
  inet_listener imap {
    #port = 143
    #禁用未加密的imap连接
    port = 0
  }
  inet_listener imaps {
    address = *
    port = 993
    ssl = yes
  }
}

service pop3-login {
  inet_listener pop3 {
    #port = 110
    # 禁用未加密的接口
    port = 0
  }
  inet_listener pop3s {
    address = 0
    port = 995
    ssl = yes
  }
}

service submission-login {
  inet_listener submission {
    port = 587
  }
}

service lmtp {
   unix_listener lmtp {
     mode = 0666
   }

   mail_plugins = $mail_plugins sieve

  # Create inet listener only if you can't use the above UNIX socket
  inet_listener lmtp {
    # Avoid making LMTP visible for the entire internet
    address = 127.0.0.1
    port = 24
  }
}

service imap {
  # Most of the memory goes to mmap()ing files. You may need to increase this
  # limit if you have huge mailboxes.
  #vsz_limit = $default_vsz_limit

  # Max. number of IMAP processes (connections)
  process_limit = 1024
}

service pop3 {
  # Max. number of POP3 processes (connections)
  process_limit = 1024
}

service submission {
  # Max. number of SMTP Submission processes (connections)
  process_limit = 1024
}

service auth {
  unix_listener auth-userdb {
    mode = 0666
    user = adminmail
    group = adminmail
  }

  # Postfix smtp-auth
  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }

  # Auth process is run as this user.
  #user = $default_internal_user
}

service auth-worker {
  # Auth worker process is run as root by default, so that it can access
  # /etc/shadow. If this isn't necessary, the user should be changed to
  # $default_internal_user.
  #user = root
   user = adminmail
}

service dict {
  # If dict proxy is used, mail processes should have access to its socket.
  # For example: mode=0660, group=vmail and global mail_access_groups=vmail
  unix_listener dict {
    mode = 0600
    user = adminmail
    group = adminmail
  }
}

SSL/TLS

/etc/dovecot/conf.d/10-ssl.conf<br />在 Dovecot 的配置中,/etc/dovecot/conf.d/10-ssl.conf 文件中的 SSL 配置项是为了提供更细粒度的控制,可以覆盖主配置文件 (dovecot.conf) 中的相同配置项。当存在多个配置文件时,Dovecot 会按照一定的优先级和覆盖规则来确定最终的配置。

通常情况下,如果在 /etc/dovecot/conf.d/10-ssl.conf 中配置了 SSL
相关的选项,它们会覆盖主配置文件中的相同选项。这使得你可以在不修改主配置文件的情况下,通过增加或修改
/etc/dovecot/conf.d/10-ssl.conf 中的设置来调整 SSL/TLS 配置。

如果在主配置文件 dovecot.conf 中有以下设置:

ssl = yes
ssl_cert = </etc/ssl/certs/dovecot.pem
ssl_key = </etc/ssl/private/dovecot.key

然后在 /etc/dovecot/conf.d/10-ssl.conf 中有以下设置:

# 启用 SSL/TLS
ssl = required

# SSL/TLS 使用的证书和私钥文件路径
ssl_cert = </etc/ssl/certs/dovecot.pem
ssl_key = </etc/ssl/private/dovecot.key

# 配置支持的加密协议和密码套件
ssl_protocols = TLSv1.2 TLSv1.3
ssl_cipher_list = TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384

# 是否使用强制加密,如果设置为 yes,只有支持 SSL/TLS 的连接将被接受
ssl_require_ciphers = yes
ssl_ciphers = HIGH

# 是否启用 SSL/TLS session 缓存
ssl_session_cache = built-in:1000
ssl_session_timeout = 1 hour

# 配置 Diffie-Hellman 参数的长度,用于支持 Perfect Forward Secrecy (PFS)。
ssl_dh_parameters_length = 2048

# 是否启用 SSL/TLS 的客户端证书验证
# ssl_client_require_cert = no
# ssl_client_cert_file = </etc/dovecot/client.pem
# ssl_client_key_file = </etc/dovecot/client.key

在这种情况下,ssl_protocols 和 ssl_ciphers 会使用 /etc/dovecot/conf.d/10-ssl.conf 中的设置,而 ssl, ssl_cert, 和 ssl_key 仍然使用主配置文件 dovecot.conf 中的设置。
这种设计使得 Dovecot 的配置更加模块化和可扩展,方便管理员通过不同的配置文件对特定部分进行调整而不影响其他配置。

关于证书,如果是在Let's上申请的证书,则:

证书的fullchain文件放到服务器的/etc/ssl/certs/xxxx.com.pem下。证书的密钥文件放到服务器的/etc/ssl/private/xxxx.com.key下。上述二者权限设置为400,属主设置为root:root

验证 SSL 连接

  • 你可以使用 OpenSSL 工具验证 Dovecot 是否正确配置了 SSL。例如,使用以下命令连接到 Dovecot 服务器:
openssl s_client -connect your_mail_server:993

确保连接成功,且 SSL 证书链和信息正确显示。

认证配置

/etc/dovecot/conf.d/10-auth.conf

# /etc/dovecot/conf.d/10-auth.conf

# 启用认证机制
disable_plaintext_auth = yes ##禁止明文登录
auth_mechanisms = plain login

# 认证缓存的配置
auth_cache_size = 1M
auth_cache_ttl = 1 hour
auth_cache_negative_ttl = 1 hour

# 认证进程的配置
auth_worker_max_count = 30
auth_username_chars = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@

# 是否启用安全机制,例如在失败的登录尝试后暂时禁用用户
# auth_fail2ban = yes

# 认证的监听器配置
# 这里可以配置 Unix socket 或网络端口,具体取决于你的需求
# 例如,如果你使用 LMTP,可能需要配置 unix_listener 来监听 LMTP 的请求
# 请根据你的实际情况进行配置
# 以下是一个简单的示例,监听 Unix socket
unix_listener auth-userdb {
  mode = 0600
  user = adminmail
  group = adminmail
}

服务的启用

sudo systemctl enable dovecot.service

## 其它命令
sudo systemctl start dovecot.service
sudo systemctl stop dovecot.service

## 查看服务状态
sudo systemctl status dovecot.service

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表