Postfix权威指南-阅读笔记-架设和维护邮箱服务器

2024-09-05 12:08

本文主要是介绍Postfix权威指南-阅读笔记-架设和维护邮箱服务器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PostFix权威指南 目录

文章目录

  • 适用人群
  • 前言
  • 1. 简介
    • Internet E-mail传递流程
  • 2.基础概念
    • 在线说明书
    • 模拟SMTP对话
      • 常见响应状态码
  • 4.基本的配置与管理
    • 默认安装目录
    • 启动postfix
      • 两件准备工作
    • 配置文件
      • 重新加载
      • 配置变量
        • 对外统一邮箱
          • 创建查询数据库
          • 数据库格式
        • 别名文件
        • 重要考虑事项
        • 转发控制
        • 限制转发访问
        • SMTP身份验证
        • 管理
        • 日志记录
        • 启动、关闭和重新加载
          • 开机时自动启动postfix
            • Sys V风格的启动脚本
        • master.cf
        • 更改daemon端口
        • 收信限制
        • 地址自动补齐
        • 伪装网关主机名称
        • 改变投递地址
        • 不明用户
  • 5.队列管理
    • qmgr运行
    • 等待邮件
    • 队列调度
    • 错误通知函
    • 显示队列邮件列表
    • 重新排队
    • 显示邮件内容
    • 清空邮件
    • E-mail 与 DNS
      • 决定邮件路由
        • 推荐DNS资源
      • Postfix and DNS
        • 配置文件选项
      • 常见问题
  • 7.本地投递与POP/IMAP
    • Postfix 投递代理程序
    • 邮箱内容
      • 转发forward文件
    • Postfix and Cyrus IMAP
  • 8.虚拟网域
    • 虚拟网域的四种处理方式
      • shared domain and system user
      • 自动回信脚本
      • 自动回信程序的设计
        • 需要考虑
        • 假设
  • 9.邮件转发
    • 入站邮件网关
  • 11.反垃圾邮件
    • 挡信机制
      • 客户端判别规则
      • 设置限制条件
      • UBE限制条件
      • 反垃圾邮件的main.cf配置文件样本
  • 12.SASL身份验证
    • 验证架构
    • SASL专用密码
    • 启用SASL验证
      • 避免寄件人冒名
      • 核准授权用户
      • 设定验证机制
    • 设定sasl步骤
      • 测试SASL
        • 链接测试
        • 找不到db文件
  • 13.TLS
    • TLS证书
      • 自己开设认证中心
        • 服务端证书
      • 产生服务器端证书
        • 步骤
          • 第三方CA:
          • 自己做CA:
      • 安装CA证书
        • 安装方法
      • 设定Postfix/TLS
      • 设定过程整理
      • TLS/SMTP client
        • 设定客户端证书验证
        • TLS/SMTP client的服务器设定


适用人群

  • Postfix为Unix系统设计的网络应用系统
  • 如果不习惯Unix,推荐书 《Unix System Administration Handbook》(Prentice-Hall)

前言

  • 1-3章,Postfix与Email基础
  • 4-7章,Postfix Server基本功能
  • 8-15章,各特殊应用

1. 简介

Internet E-mail传递流程

在这里插入图片描述

2.基础概念

在线说明书

  • man mailq

模拟SMTP对话

telnet mail.example.com 25
HELO mail.example.com
MAIL from: info@example.com
rcpt to: destmail
data
xxx
.
quit

常见响应状态码

  • 2xx:完成
  • 3xx:信息不足
  • 4xx:暂时失败
  • 5xx:永久性失败

4.基本的配置与管理

默认安装目录

/etc/postfix/
- 配置文件与查询表
/usr/libexec/postfix/
- postfix的各个服务器程序
/var/spool/postfix/
- 队列文件
/usr/sbin/
- Postfix工具程序
/var/log/maillog
- 邮件日志

启动postfix

两件准备工作

  • 修改houstname
    postconf -e myhostname-mail.example.com
  • 确定db别名
    newaliases
  • 启动: postfix start

配置文件

/etc/postfix
- master.cf
- main.cf

  • 这两个拥有者必须是root

重新加载

postfix reload

  • 只要修改,就需要重新加载
    (restart) postfix
  • 重新启动

配置变量

mydomain = example.com
myorigin = $mydomain
  • 如果像放入到其他文件里:
mydest = /etc/postfix/destination
对外统一邮箱
  • main.cf中的canonical_maps参数指向外界的文件
canonical_maps = hash:/etc/postfix/canonical_maps
# canonical查询表
# 格式
# key	value
fwx@example.com	kyle.dent@example.com
  • 对外输出value
  • 每个key必须是独一无二的
创建查询数据库

postmap /etc/postfix/canonical

  • 每次修改都必须用postmap来重建数据库文件
  • postmap -q指定要查询的LHS
    postmap -q fwx@example.com /etc/postfix/canonical
数据库格式
  • btree
  • dbm
  • hash
  • 默认数据库类型:postconf default_database_type
别名文件
  • 多组邮件列表有各自的别名文件
  • alias_maps = hash:/etc/aliases, nis:mail.aliases
重要考虑事项
  • MTA标识
    • myhostname
    • mydomain
    • myorigin
    • mydestination
转发控制
  • 11章
限制转发访问
  • mynetworks_style
  • mynetworks
    以上两个决定客户端具备的寄出邮件资格
  • 默认仅容许IP子网相同的转发
  • 服务器自己使用转发服务mynetworks_style设置为host或者是class
  • mynetworks指出主机享受转发服务,常用network/mask- 192.168.0.0/28
SMTP身份验证

服务对象没有固定ip时,使用此机制

  • SASL验证, 12章
  • 验证后,批准客户端转发服务一段时间
管理
  • 检查postfix配置是否存在问题等postfix check
日志记录
  • /etc/syslog.conf决定日志写在哪
  • 查看曾经出现的问题egrep '(reject|warning|error|fatal|panic):' /var/log/maillog
  • 查询非法攻击mail服务器的ip:
#!/bin/bash
#
#       获取非法攻击mail服务器的ip
#LOGFILE="/var/log/maillog"# 统计maillog中authentication failure的IP个数和IP
grep "authentication failure" $LOGFILE | awk '{print $7}' | grep -E -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | sort | uniq -c > af_iplist.txt# 取出AF出现大于50次的IP
awk '$1 > 50 {print $2}' af_iplist.txt > block_ip_list.txt# 大于50次AF的IP添加到iptables中
cat block_ip_list.txt | while read line
do/sbin/iptables -nL | grep $lineif [ $? != 0 ]theniptables -I INPUT -s $line -j DROPfi
done
启动、关闭和重新加载
  • 启动:postfix start
  • 重新加载:postfix reload
  • 关闭:postfix stop
开机时自动启动postfix
  • sendmail-bd -q15m
  • queue_run_delayin main.cf,扫描队列的间隔时间
Sys V风格的启动脚本
#!/sbin/sh
#
#   使用自己的logger和postfix命令
# for linux
#   Logger = "/sbin/syslogd"
#   POSTFIX = "/usr/sbin/postfix"
#
LOGGER="/usr/bin/logger"
POSTFIX="/usr/sbin/postfix"
rc=0if [ ! -f $POSTFIX ]; then$LOGGER -t $0 -s -p mail.err "Unable to locate Postfix"exit 1
fiif [ ! -f /etc/postfix/main.cf ]; then$LOGGER -t $0 -s -p mail.err "Unable to locate Postfix configuration"exit 1
ficase "$1" instart)echo -n "Starting Postfix"$POSTFIX startrc=$?echo ".";;stop)echo -n "Stopping Postfix"$POSTFIX stoprc=$?echo ".";;restart)echo -n "Restarting Postfix"$POSTFIX reloadrc=$?echo ".";;*)echo "Usage: $0 {start|stop|restart}"rc=1
esac
exit $rc
master.cf

所有服务器程序的运行参数,都在此配置

更改daemon端口

/etc/services定义smtp端口

  • 如果要修改端口,直接在smtp后修改端口
  • 可以设置smtp2,但要注释smtp
收信限制
  • main.cf
  • smtpd daemon对邮件加强限制
  • 限制:邮件大小,同一封邮件的收件人数,内容长度上限等等
    • smtpd_recipient_limit收件人数
    • message_size_limit容量上限
  • 如果客户端频繁出错,通常是被攻击,设置延迟时间smtpd_error_sleep_time
  • smtpd_soft_error_limit,累积到错的地方,错一次延迟增加的时间
  • smtpd_hard_error_limit,错误次数超过次数,自动断开
smtpd_error_sleep_time = 1s
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 20
地址自动补齐
  • 避免自动附加邮件地址
  • append_at_myorigin = no
  • append_dot_mydomain = no
伪装网关主机名称
  • masquerade_domains = example.com
  • 排除特定的账户: masquerade_exceptions = admin, root
改变投递地址
  • 不愿意代收邮件的时候,查询表定义的新旧地址对应关系
  • relocated_maps = hash:/etc/postfix/relocated
kdent@ora.com xx@moxii.com
# 全域移动
@example.com	xx@moxixii.com
  • 当收到kdent的信时,都会拒收,并提醒送到xx
不明用户
  • 默认拒收写给不明用户的信
  • 收信:local_recipient_maps =,设置为空,接收不明用户
  • 集中到特定邮箱:luser_relay = catchall, catchall时一个实际的用户

5.队列管理

  • 队列管理单元的服务程序:qmgr
  • 默认队列目录:/var/spool/postfix
    • incoming
    • active
    • deferred
    • corrupt
    • hold

qmgr运行

  • 队列占用空间: queue_minfree

等待邮件

  • 退信: bounce_size_limit

队列调度

  • 失败延迟时间上限:maximal_queue_lifetime
  • 队列扫描间隔:queue_run_delay
  • 重新投递:minimal_backoff_time, maximal_backoff_time

错误通知函

  • main.cf
  • 错误通知类型:notify_classes

显示队列邮件列表

  • 列出队列里的所有邮件:postqueue -p
  • 删除队列邮件: postsuper -d ALL

重新排队

  • postsuper -r ALL

显示邮件内容

  • postcat -q queueId

清空邮件

  • 清空队列里的邮件:postqueue -f

E-mail 与 DNS

DNS是一个世界级的分布式数据库,主要是将“主机名称”和“IP地址”对应

  • 每个网域至少要有两部权威域名服务器
  • 网域数据关于邮件系统的四种资源记录:
    • A:主机名称和ip地址的对应关系
    • CNAME:没有对应ip地址,是一个主机名称的别名
    • MX:邮件的路由信息
    • PTR:ip地址和主机名称的关系,作用与A相反,常用来验证客户端是否可信
  • 只讨论MX资源记录:
    example.com IN MX 10 mail1.example.com
    结构说明:
  • 网域名称
  • IN:资源都在Internet上
  • MX:邮件交换器的资源记录
  • 10:优先值(0~65536)
  • mail1.example.com:主机名称

决定邮件路由

存在多个时,MX会被当作主要的邮件服务器进行投递

推荐DNS资源
  • 软件:BIND
  • 书籍:《DNS & BIND》

Postfix and DNS

  • Postfix从DNS里查出所有MX资源记录,然后根据优先值来排序
配置文件选项
  • smtp_skip_4xx_greeting = no: 寄信出现4xx状态码,放在等待队列,下次投递
  • smtp_skip_5xx_greeting = no: 直接将邮件退回给原寄件人

常见问题

  • DNS设定不当的问题,只能在日志文件里看到结果
  • 常见DNS有关的配置文件
    • /etc/resolv.conf
    • /etc/hosts
    • /etc/nsswitch

7.本地投递与POP/IMAP

  • 取走邮件的协议是IMAP/POP
  • Postfix将收下的邮件放入邮箱
  • POP/IMAP是Postfix之外的软件提供
    • POP/IMAP服务器软件:Popper, WU IMAP Kit等
    • Postfix 与 Cyrus IMAP server

Postfix 投递代理程序

  • 三种网域邮件:local, relay, virtual

邮箱内容

  • POP/IMAP读取邮件时:
  • postconf -l查看系统提供了哪些锁定机制
  • man flock查看锁定机制的详细信息

转发forward文件

  • 用来依据其设定内容来转寄邮件
  • 文件而已让用户设置自己的别名,格式与RHS-value格式一样

Postfix and Cyrus IMAP

  • 验证用户的身份
  1. 安装Cyrus SASL函数库
  2. 建构Cyrus IMAP server

不能将所有邮件都交付给Cyrus IMAP server:

  • 选择mailbox_transport指向lmtp MDA,并确定master.cf里的lmtp服务能否传递
  • Cyrus配置文件/etc/cyrus.conf

8.虚拟网域

  • 同一台主机搭建多个网域。
  • 例如:xxnet.comorr.com
  • 共享网域,独立网域;
  • 系统用户,虚拟用户

虚拟网域的四种处理方式

  • 共享网域搭配系统账户
  • 独立网域搭配系统账户
  • 独立网域搭配虚拟账户
  • 虚拟网域搭配飞Postfix控制管理的特殊格式邮箱

shared domain and system user

  • 每位用户都可以收到每个网域的邮件
  • 一个邮箱有多个地址
  1. 设定虚拟网域的DNS,MX指向此服务器
  2. 修改mydestination
# 正式网域
mydomain = xxx.com
# 虚拟网域
mydestination = $myhostname, $mydomain, ora.com, xxxy.com
  • 重新启动postfix reload

自动回信脚本

#!/usr/bin/perl -w
#
#   inforeply.pl    - Automatic E-mail reply.
#
# 所有信息都记录在邮件日志文件(/var/log/maillog)
# 运行本程序后,可以从日志文件看到结果
# 
# 使用本程序之前,你可能需要调整某些变量的值,
# 以下是各项重要的变量的说明:
# 
# $UID是本程序的运行标识
# 正确值应该是master.cf中调用本程序的那一行,
#   其user=属性所设的UID
#   如果想在命令行测试本程序,则$UID就是你的UID
#
# $ENV_FROM是回信信封上的FROM地址
# 默认是空白,<>表示使用空地址
# 可以将它设定为一个专用来接退信的地址
#   注意:不要使用触发本程序的那个地址,
#   否则会造成邮件循环
#
# $INFOFILE是含有回信内容的文本文件
#   此文件应该包含完整的回信
#       包括Subject:与From:等必要的标题
#   唯一例外的是To:字段,本程序使用来信这的地址来自动设定此栏
#   注意:标题和正文之间至少药隔一空白行
#
#   $MAILBIN是sendmail程序文件的完整路径
#   如果你的sendmail不是安装在/usr/sbin/sendmail
#   如实修改
#
#   @MAILOPTS是一个包含sendmail命令行选项的数组
#
#   本程序调用了syslog,所以Perl环境必须先安装Sys::Syslog模块
## Sys::Syslog模块的setlogsock
require 5.004;
use strict;
use Sys::Syslog qw(:DEFAULT setlogsock);#
# 配置变量。
#
my $UID = 500;
my $ENV_FROM = "";
my $INFOFILE = "/etc/postfix/common/inforeply.txt";
my $MAILBIN = "/usr/sbin/sendmail";
my @MAILOPTS = ("-oi", "-tr", "$ENV_FROM");
my $SELF = "inforeply.pl";#
#   main
#
my $EX_TEMPFAIL = 75;
my $EX_UNAVAILABLE = 69;
my $EX_OK = 0;
my $sender;
my $euid = $>;$SIG{PIPE} = \&PipeHandler;
$ENV{PATH} = "/bin:/usr/bin:/sbin:/usr/sbin";setlogsock('unix');
openlog($SELF, 'ndelay,pid', 'user');#
# 检查环境
#
if ( $euid != $UID ) {syslog('mail|err', "error:invalid uid: $> (expecting: $UID)");exit($EX_TEMPFAIL);
}if ( @ARGV != 1 ) {syslog('mail|err', "error: invalid invocation (expecting 1 argument)");exit($EX_TEMPFAIL);
} else {$sender = $ARGV[0];if ( $sender =~ /([\w\-.%]+\@[\w.-]+)/ ) {$sender = $1;} else {syslog('mail|err', "error: Illegal sender address");exit($EX_UNAVAILABLE);}
}if ( ! -x $MAILBIN ) {syslog('mail|err', "error: $MAILBIN not found or not executable");exit($EX_TEMPFAIL);
}if( ! -f $INFOFILE ) {syslog('mail|err', "error: $INFOFILE not found");exit($EX_TEMPFAIL);
}#
#   检查异常寄件人
#
if ( $sender eq "" || $sender =~ /^owner-|-(request|pwner)\@|^(mailer-daemon|postmaster)\@/i )
{exit($EX_OK);
}#
#   检查来信标头里的Prededence字段
#
while ( <STDIN> ) {last if (/~$/);exit($EX_OK)    if(/^Precedence:\s+(bulk|list|junk)/i);
}#
#   开启邮件文件
#
if ( !open(INFO, "<$INFOFILE") ) {syslog('mail|err', "error: can't open $INFOFILE: %m");exit($EX_TEMPFAIL);
}#
#   将本程序的输出接到寄信程序的输入
#
my $pid = open(MAIL, "|-") || exec("$MAILBIN", @MAILOPTS);#
#   送出回信
#
print MAIL "To: $sender\n";
print MAIL while (<INFO>);if ( ! close(MAIL) ) {syslog('mail|err', "error: failure invoking $MAILBIN: %m");exit($EX_UNAVAILABLE);
}close(INFO);
syslog('mail|info', "sent reply to $sender");
exit($EX_OK);sub PipeHandler {syslog('mail|err', "error: broken pipe to mailer");
}

自动回信程序的设计

需要考虑
  • 程序的数据来源是网络,是不可信赖的数据源
  • 永远不要用shell处理不可信的外来数据
  • 回信前,检查寄件人的地址是否是owner-list或者list-request
假设

假设邮件服务器规范网域是:example.com,虚拟网域是:ora.com,客服请求信息提供的服务邮箱是info@ora.cominforeply.pl自动回复客户寄到info@ora.com的邮件,需要以下步骤:

  1. 创建可用inforeply.pl的虚账户,确定有足够的权限
  2. master.cf里,为inforeply.pl设置新的投递服务,名字改成inforeply
inforeply	unix	-	n	n	-	-	pipe	flags= user=autoresp argv=/usr/local/bin/inforeply.pl ${sender}
  • ${sender}代表寄件人地址
  • ${recipient}代表收件人地址
  1. 没有传输机制的话,main.cftransport_maps参数指向一个传输表
    transport_maps = hash:/etc/postfix/transport
  2. 传输表结构:收件地址 -> 投递服务
    autoresp@ora.com inforeply
  3. 使用postmap将传输表换成数据库格式postmap /etc/postfix/transport
  4. virtual_alias_maps指向虚拟别名查询表:
    virtual_alias_maps = hash:/etc/postfix/virtual_alias
  5. 虚拟别名表定义服务地址与收件地址:info@ora.com autoresp@ora.com, service@oreilly.com
  6. 虚拟别名转换成数据库:postmap /etc/postfix/virtual_alias
    所有送去info@ora.com的邮件都会被投递到autoresp@ora.comservice@oreilly.com
  7. 重新读取配置文件:postfix reload
    处理流程:
    外界的信 -> info@ora.com
    postfix:
  • 先检查virtual_alias
  • 展开地址
  • 查看transport,利用设定的reply执行投递
  • infoply使用pipe传送给外部,回信给原寄件人

9.邮件转发

入站邮件网关

网关的两个意义:

  1. 网络之间的联络
  2. 协议的转换

企业网络:
一家企业有多个部门,各部门有自己的子网域,有内部服务器。
网关系统:gw.example.com,负责手下所有的邮件。
人力资源:位于mail.example.com, 员工是user@hr.example.com
业务部门:位于mail2.example.com, 员工是user@sales.example.com

11.反垃圾邮件

目前Postfix没有表示垃圾邮件的机制,但可和Spamassassin搭配

挡信机制

  • 客户端判别规则
  • 语法检查参数
  • 内容检查
  • 自定义过滤规则

客户端判别规则

  • smtpd_client_restrictions
  • smtpd_helo_restrictions
  • smtpd_sender_restrictions
  • smtpd_recipient_restrictions
  • smtpd_data_restrictions

设置限制条件

smtpd_client_restrictions = 
smtpd_helo_restrictions = 
smtpd_sender_restrictions =
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
  • 只允许寄给postfix所统辖局域网的用户

UBE限制条件

任何限制条件都可以用于任何过滤规则
例如:

  • check_helo_access适用于smtpd_helo_restrictions和smptd_sender_restrictions或者其他
  • postfix不会立刻返回拒收信,如果要立刻拒收,需要在main.cf里修改smtpd_delay_reject = no

反垃圾邮件的main.cf配置文件样本

#
#   本文件为postfix下的main.cf的配置文件的样本
#   功能:
#       反垃圾文件的配置
#
smtpd_restrictions_classes = spamloverspamhaterspamhater = reject_invalid_hostnamereject_non_fqdn_hostnamereject_unknown_sender_domainreject_rbl_client nospam.example.comspamlover = permitsmtpd_helo_required = yes
smtpd_client_restrictions = check_client_access hash:/etc/postfix/check_client_access
smtpd_helo_restrictions =reject_invalid_hostnamecheck_helo_access hash:/etc/postfix/check_helo_access
smtpd_sender_restrictions =reject_non_fqdn_senderreject_unknown_sender_domaincheck_sender_access hash:/etc/postfix/check_sender_access
smtpd_recipient_restrictions =permit_mynetworksreject_unauth_destinationreject_non_fqdn_recipientreject_unknown_recipient_domain
smtpd_data_restrictions = reject_unauth_pipelining
header_checks = /etc/postfix/header_checks
body_checks = /etc/postfix/body_checks                             

12.SASL身份验证

验证架构

Cyrus SASL提供配置文件是smtpd.conf,位于/usr/local/lib/sasl2/smtpd.conf

SASL专用密码

  • smtpd.conf配置文件:pwcheck_method: auxprop
  • auxprop要求使用外部的SASL密码文件
  • /etc/sasldb2密码文件
  • saslpasswd2 -c -u \postconf -h myhostname` username`
    -c:创建用户,-u:指出所属网域,值都取自postfix配置文件

启用SASL验证

smtpd_sasl_auth_enable = yes

避免寄件人冒名

建立对应关系查询表:
kdent@example.com kdent
进入main.cf文件中,修改:
smtpd_sender_login_maps = hash:/etc/postfix/sasl_senders

核准授权用户

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

设定验证机制

smtpd_sasl_security_options = xx

  • noplaintext:不允许明文流经网络,但是不能使用saslauthd
  • noactive: 排除主动攻击
  • nodictionary:字典攻击
  • noanonymous: 排除匿名登录
  • mutual auth:双方验证协议

设定sasl步骤

  1. 确定验证机制和架构
  2. 安装SASL
  3. 重新安装Postfix
  4. 创建/etc/sasl2/smtpd.conf,将pwcheck_method参数设定为saslauthd
    • saslauthd: 使用SASL saslauthd与系统密码
    • auxprop: SASL的专属密码文件
  5. 如果验证架构是Unix系统密码,启动saslauthd daemon,指出系统验证方式。否则使用saslpasswd2在系统上创建SMTP client的账户和密码
  6. 进入main.cf,启动SASL验证功能
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated, reject_unauth destination
  1. 重新加载postfix

测试SASL

#!/usr/bin/perl
#
#   产生测试用的base64字符串
#   需要用到MIME::Base64模块,如果没有,去CPAN下载一个
#use strict;
use MIME::Base64;if ( $#ARGV != 1 ) {die "Usage: encode_sasl_plain.pl <username> <password>\n";
}print encode_base64("$ARGV[0]\0$ARGV[0]\0$ARGV[1]");
exit 0;
  • 运行程序perl encode_sasl_plain.pl user pwd
链接测试
telnet mail.example.com portEHLO mail.example.com
AUTH PLAIN base64string
mail from:xx@example.com
rcpt to:xxx@example.com
data
sss
.
quit
找不到db文件

确定saslpasswd2所产生的密码文件在/etc文件下

13.TLS

传输层安全协议TLS

TLS证书

  • yum install OpenSSL
  • openssl管理证书
  • OpenSSL默认在/usr/local/ssl/

自己开设认证中心

自己收信

服务端证书

自己签署证书:

  • OpenSSL安装目录下:misc/CA.pl -newca
  • ./demoCA开设CA所需的全部文件
  • 获取CA数字签名

产生服务器端证书

  1. openssl工具,产生一对公钥和私钥
  2. 产生一个证书签署请求,CSR
  3. CSR+公钥->CA签署
  4. 私钥保密
步骤
  • 产生公私钥
    openssl req -new -nodes -keyout mailkey.pem -out mailreq.pem -days 365
  • new: 产生公私+CSR
  • nodes:不加密
  • keyout: 私钥文件名
  • out: CSR文件名
  • days: 有效期
第三方CA:
  • 提出mailreq.pem来签署
自己做CA:

openssl ca -out mail_signed_cert.pem -infiles mailreq.pem

  • mail_signed_cert.pem就是CA核发的证书

证书位置:
Postfix目录下

  • cp /usr/local/ssl/mailkey.pem /etc/postfix
  • cp /usr/local/ssl/mail_signed_cert.pem /etc/postfix
    由于postfix不能使用密封的私钥文件,应该用严格权限
chown root /etc/postfix/mailkey.pem
chmod 400 /etc/postfix/mailkey.pem

安装CA证书

Postfix/TLS server 必须能够访问CA的公开证书

  • 如果服务端证书是自己签发给自己,将CA.pl脚本产生的cacert.pem文件复制到postfix目录下
    cp /usr/local/ssl/demoCA/cacert.pem /etc/postfix
  • 如果是第三方,获取PEM,然后放在/etc/postfix/cacert.pem
安装方法
  1. 所有根证书集中在一个文件,smtpd_tls_CAfile指向此文件
    只需要将新证书附加在现有文件末端:
  • 原有CA在/etc/postfix/cacert.pem, 新CA在newCA.pem
    新纳入认同:
    cp /etc/postfix/cacet.pem /etc/postfix/cacert.pem.old
    cat newCA.pem >> /etc/postfix/cacert.pem
  1. 每个CA根证书集中在专用目录下的个别文件里,smtpd_tls_CApath指向目录
    每当需要安装新的CA证书时,只要将新的证书文件放到目录下就行,然后执行一次OpenSSL的c_rehash命令
    新证书:newCA.pem 根证书目录:/etc/postfix/certs/
    cp newCA.pem /etc/postfix/certs
    c_rehash /etc/postfix/certs

postfix reload

设定Postfix/TLS

main.cf配置文件中设置
smtpd_use_tls = yes: 启动TLS支持
smtpd_tls_key_file = /etc/postfix/mailkey.pem: 指向服务器私钥文件
smtpd_tls_cert_file = /etc/postfix/mail_signed_cert.pem: 指向经过CA的PEM证书
smtpd_tls_CAfile = /etc/postfix/cacert.pem: 指向CA根证书
smtpd_tls_CApath = /etc/postfix/certs: 指向CA证书文件目录

  • postfix reload重启

设定过程整理

  1. 安装OpenSSL,产生TLS证书
  2. 产生CSR,CA签署(自己或第三方)
  3. 密钥,CSR,CA放在Postfix下
  4. 编辑main.cf
  5. 重启

TLS/SMTP client

客户端

  1. openssl req -new -keyout kdentkey.pem -out kdentreq.pem -days 365
  2. openssl ca -out kdent_signed_cert.pem -infiles kdentreq.pem
  3. 转换格式:
openssl pkcs12 -in kdent_signed_cert.pem \-inkey kdentkey.pem -certfile /etc/postfix/cacert.pem \-out kdent.p12 - export -name "kdent@ora.com"
  • 生成的文件可以交给用户
设定客户端证书验证
  1. 计算指纹:openssl x509 -fingerprint -noout -in kdent_signed_cert.pem | cut -d= -f2
  2. 集中在/etc/postfix/clientcerts文件,并注明辨别名称
    xxxxx:xx kdent@ora.com
  3. postmap /etc/postfix/clientcerts
  4. main.cf配置
relay_clientcerts = hash:/etc/postfix/clientcerts
smtpd_tls_ask_ccert = yes
smtpd_recipient_restrictions =permit_mynetworkspermit_tls_clientcertsreject_unauth_destination
  1. 重启
TLS/SMTP client的服务器设定

寄信到其他服务器。

  1. 打算让smtp和smtpd用相同的证书.
    smtp_use_tls = yes: 启动TLS支持
    smtp_tls_key_file = /etc/postfix/mailkey.pem: 指向服务器私钥文件
    smtp_tls_cert_file = /etc/postfix/mail_signed_cert.pem: 指向经过CA的PEM证书
    smtp_tls_CAfile = /etc/postfix/cacert.pem: 指向CA根证书
    smtp_tls_CApath = /etc/postfix/certs: 指向CA证书文件目录
  • postfix reload重启

这篇关于Postfix权威指南-阅读笔记-架设和维护邮箱服务器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138922

相关文章

JavaWeb-WebSocket浏览器服务器双向通信方式

《JavaWeb-WebSocket浏览器服务器双向通信方式》文章介绍了WebSocket协议的工作原理和应用场景,包括与HTTP的对比,接着,详细介绍了如何在Java中使用WebSocket,包括配... 目录一、概述二、入门2.1 POM依赖2.2 编写配置类2.3 编写WebSocket服务2.4 浏

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

SQL Server数据库迁移到MySQL的完整指南

《SQLServer数据库迁移到MySQL的完整指南》在企业应用开发中,数据库迁移是一个常见的需求,随着业务的发展,企业可能会从SQLServer转向MySQL,原因可能是成本、性能、跨平台兼容性等... 目录一、迁移前的准备工作1.1 确定迁移范围1.2 评估兼容性1.3 备份数据二、迁移工具的选择2.1

在 Windows 上安装 DeepSeek 的完整指南(最新推荐)

《在Windows上安装DeepSeek的完整指南(最新推荐)》在Windows上安装DeepSeek的完整指南,包括下载和安装Ollama、下载DeepSeekRXNUMX模型、运行Deep... 目录在www.chinasem.cn Windows 上安装 DeepSeek 的完整指南步骤 1:下载并安装

nginx-rtmp-module构建流媒体直播服务器实战指南

《nginx-rtmp-module构建流媒体直播服务器实战指南》本文主要介绍了nginx-rtmp-module构建流媒体直播服务器实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. RTMP协议介绍与应用RTMP协议的原理RTMP协议的应用RTMP与现代流媒体技术的关系2

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

电脑密码怎么设置? 一文读懂电脑密码的详细指南

《电脑密码怎么设置?一文读懂电脑密码的详细指南》为了保护个人隐私和数据安全,设置电脑密码显得尤为重要,那么,如何在电脑上设置密码呢?详细请看下文介绍... 设置电脑密码是保护个人隐私、数据安全以及系统安全的重要措施,下面以Windows 11系统为例,跟大家分享一下设置电脑密码的具体办php法。Windo

VScode连接远程Linux服务器环境配置图文教程

《VScode连接远程Linux服务器环境配置图文教程》:本文主要介绍如何安装和配置VSCode,包括安装步骤、环境配置(如汉化包、远程SSH连接)、语言包安装(如C/C++插件)等,文中给出了详... 目录一、安装vscode二、环境配置1.中文汉化包2.安装remote-ssh,用于远程连接2.1安装2

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser