1. NIST SP 800-53 概述与邮件安全映射框架

NIST SP 800-53(Security and Privacy Controls for Information Systems and Organizations,Rev. 5,2020年发布)是美国国家标准与技术研究院制定的信息系统安全与隐私控制标准。该标准依据FISMA(Federal Information Security Modernization Act of 2014)的要求,为联邦信息系统提供了一套全面的安全控制目录,同时也被全球各行业广泛采纳作为安全合规的参考框架。

SP 800-53 Rev. 5 包含 20 个控制大类(Control Families),合计超过 400 项安全控制。本指南针对邮件系统实际场景,精选 5 个最相关的控制系列进行深度映射。

表1:邮件系统核心映射的 NIST SP 800-53 控制系列
系列ID控制系列名称控制项数邮件系统映射场景
ACAccess Control(访问控制)25IMAP/POP3 访问策略、SMTP 中继权限、应用层访问控制
AUAudit and Accountability(审计与问责)16syslog 邮件审计、SMTP/IMAP 事件日志、安全事件追溯
CMConfiguration Management(配置管理)14Postfix 基线配置、Dovecot 安全配置、变更管理
IAIdentification and Authentication(标识与认证)14SMTP AUTH、Dovecot SASL、密码策略、多因素认证
SCSystem and Communications Protection(系统和通信保护)57STARTTLS、MTA-STS、DKIM 签名、传输加密、静态加密

本映射指南还参考了 NIST SP 800-177 Rev. 1(Trustworthy Email)中的邮件安全最佳实践。SP 800-177 直接针对企业邮件系统安全,与 800-53 的控制项形成了互补映射关系。在实际合规审计中,建议将两份文档交叉使用,以获得最完整的邮件安全控制覆盖。

2. 访问控制(AC)系列:IMAP/SMTP 策略映射

2.1 AC-2: Account Management(账户管理)

控制描述:定义信息系统中用户账户的创建、激活、修改、审查、禁用和删除规程,确保只有被授权的用户才能访问系统资源。

邮件系统实施:

# Dovecot 账户管理基础配置
# /etc/dovecot/conf.d/auth-passwd.conf
passdb {
  driver = pam
  # 生产环境推荐使用 SQL 后端
  # driver = sql
  # args = /etc/dovecot/dovecot-sql.conf.ext
}

# 创建邮件账户:useradd -m -s /sbin/nologin -G mail user@example.com
passwd user@example.com

# 禁用账户(保留邮箱数据但禁止登录)
passwd -l user@example.com

# 定期审查不活跃账户的脚本
cat > /usr/local/bin/audit-inactive-mail-accounts.sh << 'SH'
#!/bin/bash
# 审查 90 天未登录的邮件账户
INACTIVE_DAYS=${1:-90}
echo "=== 超过 ${INACTIVE_DAYS} 天未登录的账户 ==="
lastlog -b "${INACTIVE_DAYS}" | grep -v "Never logged in" | awk '{print $1}'
echo ""
echo "=== 从未登录过的账户 ==="
lastlog | grep "Never logged in" | awk '{print $1}'
SH
chmod 755 /usr/local/bin/audit-inactive-mail-accounts.sh

# AC-2(3) - 禁用账户的自动审核
cat > /usr/local/bin/check-disabled-accounts.sh << 'SH'
#!/bin/bash
echo "=== 当前被禁用的账户(passwd 状态为 L) ==="
passwd -S -a 2>/dev/null | grep " L " | awk '{print $1}'
SH

2.2 AC-3: Access Enforcement(访问实施)

控制描述:强制实施已授权的访问控制策略,确保主体对客体的访问符合安全策略规定。

邮件系统实施:

  • SMTP 提交认证:强制要求提交端口 587/465 使用 SASL 认证
  • IMAP 访问限制:绑定 IP 范围限制 IMAP 访问来源
  • 中继控制:使用 Postfix smtpd_relay_restrictions 精确控制邮件中继
# /etc/postfix/main.cf 访问控制配置
# 中继权限控制:仅允许可信网络和已认证用户中继
smtpd_relay_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination

# 强制提交端口(587)使用 SASL 认证
# /etc/postfix/master.cf
submission inet n - n - - smtpd
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

# Dovecot 用户名规范化
# /etc/dovecot/conf.d/10-auth.conf
auth_username_format = %Lu
auth_username_translation = %Lu

# IMAP 访问的 IP 限制(iptables)
iptables -A INPUT -p tcp --dport 993 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 993 -s 172.16.0.0/12 -j ACCEPT
iptables -A INPUT -p tcp --dport 993 -j DROP

2.3 AC-6: Least Privilege(最小权限)

控制描述:确保系统用户和服务仅拥有完成任务所需的最小权限,降低权限滥用风险。

邮件系统实施:

# Postfix 进程以最小权限运行(非 root)
# /etc/postfix/main.cf
mail_owner = postfix
setgid_group = postdrop

# Dovecot 进程隔离
# Dovecot 各服务进程以 auth、dovecot 等独立用户运行
# 存储用户使用虚拟用户 vmail 隔离
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/%d/%u
}

# Postfix 使用 smtpd chroot 隔离
# /etc/postfix/main.cf
# smtpd 进程 chroot 到队列目录,降低提权风险
smtpd_chroot = yes

2.4 AC-7: Unsuccessful Logon Attempts(登录失败处理)

控制描述:限制一段时间内允许的连续登录失败次数,并在超过阈值后采取锁定或延迟措施。

邮件系统实施:

# Dovecot 登录失败延迟
# /etc/dovecot/conf.d/10-auth.conf
auth_failure_delay = 2 secs

# Postfix SMTP AUTH 暴力破解防护(fail2ban)
# /etc/fail2ban/jail.d/postfix-auth.conf
[postfix-auth]
enabled  = true
port     = smtp,submission,submissions,smtps
filter   = postfix-auth
logpath  = /var/log/mail.log
maxretry = 5
bantime  = 3600

3. 审计与问责(AU)系列:邮件审计配置

3.1 AU-2: Event Logging(事件日志记录)

控制描述:确定信息系统需要记录的安全事件类型,确保可审计事件得到充分记录。

邮件系统各组件日志映射:

表2:邮件系统可审计事件与日志位置映射
审计事件类型Postfix 日志Dovecot 日志
SMTP 连接/断开/var/log/mail.log不适用
邮件接收与投递/var/log/mail.log不适用
SMTP 认证成功/失败/var/log/mail.log不适用
IMAP/POP3 登录/登出不适用/var/log/dovecot.log 或 mail.log
TLS 握手成功/失败/var/log/mail.log/var/log/dovecot.log
配置变更使用 auditd 监控使用 auditd 监控
账户禁用/状态变更/var/log/auth.log/var/log/auth.log
# Postfix 日志详细级别配置
# /etc/postfix/main.cf
# 开启 TLS 日志以便审计加密连接
smtpd_tls_loglevel = 1          # 1=摘要, 2=详细握手信息
smtp_tls_loglevel = 1

# 通知类别配置
smtpd_log_access_permit_actions = all
notify_classes = resource,software,bounce,2bounce,delay,policy,protocol

# Dovecot 日志配置
# /etc/dovecot/conf.d/10-logging.conf
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log
debug_log_path = /var/log/dovecot-debug.log
auth_verbose = yes
auth_debug = no
mail_debug = no

# 邮件操作日志插件
mail_log_prefix = "%s(%u): "
plugin {
  mail_log_events = delete undelete expunge copy mailbox_create mailbox_delete
  mail_log_fields = uid box msgid size
}

3.2 AU-3: Content of Audit Records(审计记录内容)

控制描述:要求审计记录包含足够的信息以确定事件发生的时间、来源、类型和结果。

SP 800-53 Rev.5 要求的审计记录字段:

  1. 事件类型
  2. 事件发生时间
  3. 事件来源(用户/进程/IP地址)
  4. 事件结果(成功/失败)
  5. 事件相关的系统组件标识
# Postfix 日志满足 AU-3 要求的示例
# 日志格式(RFC 3164 syslog):
# Jul 20 14:23:45 mx postfix/smtpd[12345]: connect from unknown[203.0.113.5]
# - 事件类型: SMTP 连接
# - 时间戳: Jul 20 14:23:45
# - 来源IP: 203.0.113.5
# - 结果: success (connect)
# - 组件: postfix/smtpd

# 使用 rsyslog 结构化日志(RFC 5424 格式)
# /etc/rsyslog.d/22-mail-structured.conf
$template MailStructured,"<%pri%>1 %timegenerated:::date-rfc3339% %HOSTNAME% %app-name% %procid% %msgid% [mail@28301 source="%syslogtag%" facility="%syslogfacility-text%"] %msg%
"
if $programname startswith 'postfix' or $programname startswith 'dovecot'
  then /var/log/structured-mail.log;MailStructured

# 集中日志审计服务器转发
# 将日志发送到集中式 SIEM 系统(TCP 加密传输)
# /etc/rsyslog.conf
*.* @@logserver.example.com:514    # TCP 传输 (RFC 5425 TLS)

3.3 AU-6: Audit Record Review, Analysis, and Reporting(审计记录审查与分析)

控制描述:定期审查和分析审计记录,识别异常行为并生成安全报告。

# 自动化审计报告生成脚本
cat > /usr/local/bin/daily-auth-audit.sh << 'SH'
#!/bin/bash
# 分析过去 24 小时的登录失败事件
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
REPORT="/var/reports/auth-failures-${YESTERDAY}.txt"

echo "=== SMTP 登录失败统计 ($YESTERDAY) ===" > "$REPORT"
grep "$YESTERDAY" /var/log/mail.log |   grep "SASL LOGIN authentication failed" |   sed 's/.*client=\(.*\)\]$//' |   sort | uniq -c | sort -rn | head -20 >> "$REPORT"

echo "" >> "$REPORT"
echo "=== IMAP 登录失败统计 ($YESTERDAY) ===" >> "$REPORT"
grep "$YESTERDAY" /var/log/dovecot.log |   grep "auth failed" |   sed 's/.*rip=\([^,]*\).*//' |   sort | uniq -c | sort -rn | head -20 >> "$REPORT"

# 阈值告警:超过 50 次失败则发送告警
ABNORMAL_COUNT=$(wc -l < "$REPORT")
if [ "$ABNORMAL_COUNT" -gt 50 ]; then
  mail -s "[SECURITY] 邮件认证异常告警 - ${YESTERDAY} (${ABNORMAL_COUNT}次)"     security@example.com < "$REPORT"
fi
SH
chmod 755 /usr/local/bin/daily-auth-audit.sh

# crontab: 每天早上 08:00 执行
echo "0 8 * * * /usr/local/bin/daily-auth-audit.sh" > /etc/cron.d/mail-auth-audit

3.4 AU-9: Protection of Audit Information(审计信息保护)

控制描述:保护审计记录和审计工具的完整性,防止未授权的访问、修改或删除。

# 审计日志保护措施
# 1. 设置日志文件为 append-only(仅追加)属性
chattr +a /var/log/mail.log
chattr +a /var/log/dovecot.log
chattr +a /var/log/structured-mail.log

# 2. 日志异地备份到专门的日志服务器(防止攻击者篡改本地日志)
# 在 rsyslog 配置中设置远程日志转发
#   $template RemoteMail, "/var/log/remote/%HOSTNAME%/mail.log"
#   if $syslogfacility-text == 'mail' then -?RemoteMail
#   & stop

# 3. 可选:使用 syslog-ng + HSM 审计日志哈希验证
# /etc/syslog-ng/conf.d/mail-hash.conf
# 需要 syslog-ng PE 版本 + Linux Audit 子系统

4. 配置管理(CM)系列:Postfix/Dovecot 基线

4.1 CM-2: Baseline Configuration(基线配置)

控制描述:制定和维护信息系统的基线配置,确保系统部署和运行的一致性。

# 邮件系统基线配置文件(参考 SP 800-177 Rev.1)
cat > /etc/mail-baseline.conf << 'CONF'
# ===== Postfix TLS 基线 (SP 800-177 Rev.1 要求) =====
SMTPD_TLS_SECURITY_LEVEL = may
SMTPD_TLS_MANDATORY_PROTOCOLS = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
SMTPD_TLS_PROTOCOLS = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
SMTP_TLS_SECURITY_LEVEL = may
SMTP_TLS_MANDATORY_PROTOCOLS = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1

# ===== Dovecot 基线配置 =====
SSL = required
SSL_MIN_PROTOCOL = TLSv1.2
AUTH_FAILURE_DELAY = 2

# ===== 审计日志基线 =====
SMTPD_TLS_LOGLEVEL >= 1
SMTP_TLS_LOGLEVEL >= 1
AUTH_VERBOSE = yes
CONF

# 基线合规检查脚本
cat > /usr/local/bin/check-mail-baseline.sh << 'SH'
#!/bin/bash
# 自动比对 Postfix 当前配置与基线配置
echo "=== Postfix 基线检查 ==="
BASELINE="/etc/mail-baseline.conf"
CURRENT_POSTFIX=$(postconf -n)

while IFS='=' read -r param value; do
  param=$(echo "$param" | xargs)
  value=$(echo "$value" | xargs)
  [ -z "$param" ] && continue

  current=$(postconf -n "$param" 2>/dev/null | cut -d= -f2 | xargs)
  if [ "$current" != "$value" ]; then
    echo "  不符合: $param = $current (期望值: $value)"
    FAIL=1
  else
    echo "  符合: $param = $current"
  fi
done < <(grep -E '^[A-Z_]+\s*=' "$BASELINE" | grep -v '^#')

echo ""
echo "=== Dovecot 基线检查 ==="
doveconf -n 2>/dev/null | grep -E "ssl|auth_failure" | while read line; do
  echo "  $line"
done
SH
chmod 755 /usr/local/bin/check-mail-baseline.sh

4.2 CM-6: Configuration Settings(配置设置)

控制描述:建立和维护信息系统的安全配置清单(checklist),通常参考 CIS Benchmarks 或 DISA STIG 等业界标准。

# Postfix 安全配置清单(参考 CIS Postfix Benchmark v2.0)
# 1. banner 隐藏 — 不泄露软件版本
smtpd_banner = $myhostname ESMTP
# /etc/postfix/main.cf

# 2. 禁用 VRFY 和 EXPN 命令
disable_vrfy_command = yes

# 3. 限制邮件大小(防止 DoS 攻击)
message_size_limit = 25600000

# 4. 限制单次连接收件人数
smtpd_recipient_limit = 100

# 5. 限制错误次数
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 20

# 6. 禁用不必要的内部服务
# /etc/postfix/master.cf 中注释掉不需要的服务
# 127.0.0.1:10025 inet n - n - - smtpd
# pickup    fifo  n - n 60 1 pickup

4.3 CM-8: Information System Component Inventory(系统组件清单)

控制描述:建立信息系统的组件清单,包括软硬件版本和配置状态。

# 邮件系统组件清单生成脚本
cat > /usr/local/bin/mail-component-inventory.sh << 'SH'
#!/bin/bash
# 生成 JSON 格式的组件清单元数据
VERSION=$(date +%Y%m%d)
cat << JSON
{
  "inventory_version": "$VERSION",
  "system_name": "ztpop-email",
  "components": [
    {
      "name": "postfix",
      "version": "$(postconf -d mail_version 2>/dev/null | cut -d= -f2 | xargs || echo 'unknown')",
      "role": "MTA (SMTP daemon)",
      "config_files": ["/etc/postfix/main.cf", "/etc/postfix/master.cf"]
    },
    {
      "name": "dovecot",
      "version": "$(dovecot --version 2>/dev/null || echo 'unknown')",
      "role": "MDA/IMAP/POP3",
      "config_files": ["/etc/dovecot/dovecot.conf", "/etc/dovecot/conf.d/*.conf"]
    },
    {
      "name": "opendkim",
      "version": "$(opendkim -V 2>&1 | head -1 || echo 'unknown')",
      "role": "DKIM signing and verification",
      "config_files": ["/etc/opendkim.conf"]
    }
  ],
  "listening_ports": [
    $(ss -tlnp | grep -E 'master|dovecot' | awk '{printf "{"port":%s,"process":"%s"},", $4, $7}')
  ]
}
JSON
SH
chmod 755 /usr/local/bin/mail-component-inventory.sh

5. 标识与认证(IA)系列:SMTP AUTH/SASL 映射

5.1 IA-2: Identification and Authentication (Organizational Users)(用户标识与认证)

控制描述:要求信息系统为组织用户提供唯一的标识,并采用安全的认证机制验证用户身份。

# Dovecot 认证配置
# /etc/dovecot/conf.d/10-auth.conf
auth_mechanisms = plain login

# IA-2(1) 要求使用网络级认证——启用 CRAM-MD5
# auth_mechanisms = cram-md5 plain login

# IA-5 要求的密码查询策略
# /etc/dovecot/conf.d/auth-sql.conf.ext
password_query = SELECT username AS user, password AS password,   'maildir:/var/mail/%d/%n' AS userdb_mail   FROM mailbox WHERE username = '%u' AND active = '1'

# 密码存储使用强哈希算法(SHA512-CRYPT / BLF-CRYPT)
# Dovecot 密码生成:doveadm pw -s SHA512-CRYPT
# 生成格式:{SHA512-CRYPT}$6$rounds=5000$...

5.2 IA-5: Authenticator Management(认证凭据管理)

控制描述:管理信息系统认证凭据的生成、分发、存储、变更、撤销和销毁全生命周期。

# 密码复杂度策略(PAM 配置)
# /etc/pam.d/dovecot 和 /etc/pam.d/passwd
password requisite pam_pwquality.so   minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1   enforce_for_root

# Dovecot 密码过期检查脚本
cat > /usr/local/bin/password-expiry-check.sh << 'SH'
#!/bin/bash
# 检查 Dovecot 用户密码到期情况
# 依赖 passwd-file 存储或系统 shadow 文件
PASSWD_FILE="/etc/dovecot/users"

if [ ! -f "$PASSWD_FILE" ]; then
  echo "password-file 未配置,使用系统 shadow 审计"
  exit 0
fi

while IFS=':' read -r user passwd_info; do
  # 从系统 shadow 获取过期信息
  shadow_entry=$(grep "^${user}:" /etc/shadow)
  if [ -n "$shadow_entry" ]; then
    last_change=$(echo "$shadow_entry" | cut -d: -f3)
    max_days=$(echo "$shadow_entry" | cut -d: -f5)
    if [ -n "$max_days" ] && [ "$max_days" -gt 0 ]; then
      days_left=$(( last_change + max_days - $(date +%s) / 86400 ))
      if [ "$days_left" -lt 30 ]; then
        echo "WARNING: Password for $user expires in $days_left days"
      fi
    fi
  fi
done < /etc/passwd | grep -E '^/{0,1}home' 2>/dev/null || true
SH

5.3 IA-2(1): Multi-factor Authentication(多因素认证)

控制描述:对特权账户和远程访问实施多因素认证,提升邮件系统登录安全性。

# Dovecot 多因素认证实施(密码 + TOTP)
# 第一因素:密码(something you know)
# 第二因素:TOTP(something you have)通过 PAM oath 模块集成

# 安装依赖
apt install oathtool libpam-oath

# 为用户配置 TOTP 密钥
cat > /usr/local/bin/setup-totp-for-user.sh << 'SH'
#!/bin/bash
USER=$1
if [ -z "$USER" ]; then
  echo "使用方法: $0 "
  exit 1
fi

SECRET=$(head -c 1024 /dev/urandom | base32 | head -1 | tr -d '=' | cut -c1-32)
echo "${USER}:${SECRET}" >> /etc/oath/users.oath
echo "TOTP 密钥: $SECRET"
echo "URI: otpauth://totp/${USER}?secret=${SECRET}&issuer=email.example.com"
echo "请使用 Authenticator App 扫描配置"
SH

# /etc/pam.d/dovecot 配置
# auth required pam_oath.so usersfile=/etc/oath/users.oath
# @include common-auth  # 保留密码认证作为第一因素

6. 系统和通信保护(SC)系列:TLS/加密/反恶意邮件

6.1 SC-8: Transmission Confidentiality and Integrity(传输机密性与完整性)

控制描述:保护信息在传输过程中的机密性和完整性,防止未授权的数据泄露和篡改。

针对 SC-8 的邮件系统实施:参考 SP 800-177 Rev.1 传输安全要求

  • SMTP 机会式 TLS(STARTTLS,RFC 3207)
  • MTA-STS(RFC 8461)强制出站 TLS
  • IMAP/POP3 强制 TLS(RFC 8314 不再支持明文)
  • HTTPS 管理接口强制 TLS 1.2+
# Postfix 传输加密配置
# /etc/postfix/main.cf
# 入站 TLS(接收邮件时)
smtpd_tls_security_level = may
smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtpd_tls_mandatory_ciphers = high
smtpd_tls_eecdh_grade = strong

# 出站 TLS(发送邮件时,使用 STARTTLS)
smtp_tls_security_level = may
smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1
smtp_tls_mandatory_ciphers = high
smtp_tls_eecdh_grade = strong

# 启用 MTA-STS 策略查询
smtp_tls_policy_maps = socketmap:inet:127.0.0.1:8461:postfix

6.2 SC-12: Cryptographic Key Establishment and Management(密码密钥建立与管理)

控制描述:建立和管理用于加密保护的密码密钥,包括密钥的生成、分发、存储、轮换和销毁。

# DKIM 密钥生成与管理
# 生成 DKIM 密钥对(2048 位 RSA)
opendkim-genkey -D /etc/opendkim/keys/ -d example.com -s 20260701

# /etc/opendkim.conf
Domain                  example.com
Selector                20260701
KeyFile                 /etc/opendkim/keys/20260701.private
Socket                  inet:8891@localhost
Canonicalization        relaxed/simple
Mode                    sv
SubDomains              no
AutoRestart             yes
AutoRestartRate         5/1M
Background              yes
DNSTimeout              5
SignatureAlgorithm      rsa-sha256

# 密钥轮换策略(参考 NIST SP 800-57 Part 1 Rev.5)
# - RSA 2048 位密钥:1-2 年轮换一次
# - ECDSA P-256:2-3 年轮换一次
# - 旧密钥保留 30 天用于验证过渡期
cat > /usr/local/bin/dkim-key-rotation.sh << 'SH'
#!/bin/bash
# DKIM 密钥自动轮换脚本
DOMAIN="$1"
NEW_SELECTOR=$(date +%Y%m%d)
KEY_DIR="/etc/opendkim/keys"

# 生成新密钥
opendkim-genkey -D "$KEY_DIR" -d "$DOMAIN" -s "$NEW_SELECTOR"
chown opendkim:opendkim "$KEY_DIR/${NEW_SELECTOR}.private"
chmod 600 "$KEY_DIR/${NEW_SELECTOR}.private"

echo "新密钥选择器: $NEW_SELECTOR"
echo "DNS TXT 记录:"
cat "$KEY_DIR/${NEW_SELECTOR}.txt"
echo ""
echo "操作步骤:"
echo "1. 将上述 DNS TXT 记录发布到 ${NEW_SELECTOR}._domainkey.${DOMAIN}"
echo "2. 等待 48 小时确保 DNS 传播完毕"
echo "3. 更新 opendkim.conf 中的 Selector 为 $NEW_SELECTOR"
echo "4. 重启 opendkim 服务"
echo "5. 保留旧密钥 30 天后从 DNS 中移除"
SH

6.3 SC-13: Cryptographic Protection(密码保护)

控制描述:使用 FIPS 140-3 验证过的密码模块实现系统的密码保护功能。

# OpenSSL FIPS 模式配置(OpenSSL 3.x + FIPS 模块)
# /etc/ssl/openssl.cnf
# .include /etc/ssl/fipsmodule.cnf
# [openssl_init]
# fips = fips_sect

# 验证 OpenSSL 是否启用 FIPS 提供者
openssl list -providers | grep fips

# Postfix TLS 密码套件(符合 FIPS 140-3 要求)
# 参考 NIST SP 800-52 Rev.2 指南
smtpd_tls_mandatory_ciphers = high
smtpd_tls_eecdh_grade = strong
# 仅允许强密码套件
smtpd_tls_ciphers = high
tls_high_cipherlist = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384

# Dovecot TLS 密码套件
# /etc/dovecot/conf.d/10-ssl.conf
ssl_cipher_list = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384

6.4 SC-28: Protection of Information at Rest(静态信息保护)

控制描述:保护存储在介质上的信息的机密性和完整性,防止未授权的访问和篡改。

# 邮件存储卷加密(dm-crypt/LUKS)
# 使用全盘加密保护邮件存储
cryptsetup luksFormat /dev/sdb1
cryptsetup luksOpen /dev/sdb1 mailstore_vault
mkfs.ext4 /dev/mapper/mailstore_vault
mount /dev/mapper/mailstore_vault /var/mail

# /etc/crypttab
mailstore_vault /dev/sdb1 none luks,discard,keyscript=/usr/local/bin/open-mail-keyscript.sh

# 可选:使用 eCryptfs 实现每个用户的加密存储
# 适用于多租户环境
ecryptfs-setup-private

# Dovecot 邮件加密插件(mail_crypt)
# 实现存储层自动加密
mail_plugins = $mail_plugins mail_crypt
plugin {
  mail_crypt_save_version = 2
  mail_crypt_global_private_key = 

6.5 跨控制系列综合映射表

以下综合映射表展示了邮件系统各安全机制与多个 NIST SP 800-53 控制系列的交叉关联:

表3:邮件系统安全机制与多控制系列的交叉映射
邮件安全机制关联控制系列详细映射
SMTP 认证 + Dovecot SASLIA + AC + AUIA-2 用户标识 | AC-3 访问实施 | AU-2 事件日志
TLS 传输加密SC + CM + AUSC-8 传输保护 | CM-2 基线配置 | AU-2 TLS握手日志
DKIM 域名签名SC + CM + IASC-12 密钥管理 | CM-3 配置变更 | IA-5 凭证管理
密码策略与多因素认证IA + AC + AUIA-5 密码管理 | AC-7 失败处理 | AU-6 审计分析

6.6 OpenSCAP 自动化合规检查

# 使用 OpenSCAP 自动化 NIST SP 800-53 合规扫描
apt install libopenscap8 scap-security-guide

# 查看可用的 NIST SP 800-53 Rev.5 Profile
# 例如:DISA STIG for Postfix
oscap info /usr/share/scap-security-guide/ssg-rhel9-ds.xml | grep -i postfix

# 执行 CIS 基准扫描
oscap oval eval   --results /tmp/postfix-oval-results.xml   /usr/share/scap-security-guide/ssg-rhel9-ds.xml   --profile xccdf_org.ssgproject.content_profile_cis

# 自定义邮件合规检查脚本
cat > /usr/local/bin/scap-mail-scan.sh << 'SH'
#!/bin/bash
# NIST SP 800-53 邮件系统自动化合规检查
REPORT_DIR="/var/reports/scap"
mkdir -p "$REPORT_DIR"

DATE=$(date +%Y%m%d)
REPORT="${REPORT_DIR}/mail-scap-${DATE}.html"

cat > /tmp/mail-check-probes.sh << 'CHK'
#!/bin/bash
SCORE=0
TOTAL=0

# AC-2: 检查不活跃账户数量
TOTAL=$((TOTAL + 1))
INACTIVE=$(lastlog -b 90 | grep -v "Never logged in" | grep -v "^Username" | wc -l)
if [ "$INACTIVE" -le 5 ]; then SCORE=$((SCORE + 1)); fi

# AC-7: 检查 fail2ban 是否运行
TOTAL=$((TOTAL + 1))
if systemctl is-active --quiet fail2ban; then SCORE=$((SCORE + 1)); fi

# SC-8: 检查 TLS 配置
TOTAL=$((TOTAL + 1))
if postconf -n smtpd_tls_security_level 2>/dev/null | grep -q "may\|encrypt"; then
  SCORE=$((SCORE + 1))
fi

# SC-12: 检查 DKIM 密钥是否发布
TOTAL=$((TOTAL + 1))
if dig TXT 20260701._domainkey.example.com +short | grep -q 'v=DKIM1'; then
  SCORE=$((SCORE + 1))
fi

# AU-2: 检查日志轮转是否正常运行
TOTAL=$((TOTAL + 1))
if [ -f /var/log/mail.log.1 ]; then SCORE=$((SCORE + 1)); fi

echo "Compliance Score: ${SCORE}/${TOTAL}"
CHK
bash /tmp/mail-check-probes.sh > "$REPORT" 2>&1

# 将结果发送到安全团队
mail -s "[COMPLIANCE] 邮件系统 NIST SP 800-53 合规检查报告"   security-team@example.com < "$REPORT"
SH
chmod 755 /usr/local/bin/scap-mail-scan.sh

参考文献

  1. NIST SP 800-53 Rev. 5. "Security and Privacy Controls for Information Systems and Organizations." NIST, September 2020.
  2. NIST SP 800-177 Rev. 1. "Trustworthy Email." NIST, June 2021 (Updated 2026 Draft).
  3. NIST SP 800-45 Version 2. "Guidelines on Electronic Mail Security." NIST, February 2007.
  4. NIST SP 800-52 Rev. 2. "Guidelines for the Selection, Configuration, and Use of Transport Layer Security (TLS) Implementations." NIST, August 2019.
  5. NIST SP 800-57 Part 1 Rev. 5. "Recommendation for Key Management, Part 1: General." NIST, May 2020.
  6. FIPS 140-3. "Security Requirements for Cryptographic Modules." NIST, March 2019.
  7. RFC 8314. "Cleartext Considered Obsolete: Use of TLS for Email Submission and Access." IETF, February 2018.
  8. CIS Benchmark for Postfix. Center for Internet Security, Version 2.0 (2025).
  9. DISA Application Security and Development STIG V5R1. "Postfix SRG Requirements."
  10. M3AAWG. "Email Security Controls Mapping to NIST SP 800-53 (2025 Technical Reference)."

引用本文

ztpop.net 知识库编辑. "NIST SP 800-53 邮件系统安全控制映射指南:从 AU/Access Control 到 SI/SC 系列全系控制落地" ztpop.net 知识库. 2026年7月24日.

本站技术文章采用 CC-BY 4.0 许可,可自由引用,仅需标注来源 ztpop.net。