如何统计Postfix/Dovecot环境中收发加密邮件的用户数量
如何统计Postfix/Dovecot环境中收发加密邮件的用户数量
嘿,这个问题我之前帮不少人解决过,结合你手里有/var/log/mail.log和Splunk的情况,咱们可以从两个方向入手来统计——毕竟是客户端用Enigmail/PGP加密的邮件,Postfix和Dovecot本身不会参与加密过程,所以得靠邮件的特征来识别。
一、直接分析/var/log/mail.log日志文件
首先得明确:客户端加密的PGP邮件会带有明显的特征,咱们可以通过这些特征定位到对应的邮件,再关联到收发用户。
1. 识别PGP加密邮件的核心特征
加密邮件通常会满足以下至少一个条件:
- 邮件内容包含
-----BEGIN PGP MESSAGE-----或-----END PGP MESSAGE-----标记 - 邮件头带有
Content-Type: application/pgp-encrypted字段 - 邮件头包含Enigmail的专属标识,比如
X-Enigmail-Version
2. 分步提取用户信息
第一步:定位带有PGP特征的邮件ID
先从日志里筛选出包含PGP特征的记录,提取对应的邮件ID(Postfix日志里的邮件ID一般是类似A1B2C3D4的字符串):
# 搜索包含PGP标记的日志行,提取邮件ID(假设邮件ID在第6列,实际可根据你的日志格式调整) grep -i "pgp\|enigmail\|-----BEGIN PGP MESSAGE-----" /var/log/mail.log | awk '{print $6}'
第二步:关联邮件ID到具体用户
拿到邮件ID后,用它搜索对应的发件人和收件人信息:
# 替换成你拿到的邮件ID grep "A1B2C3D4" /var/log/mail.log | grep -E "(from=<|to=<)"
第三步:统计唯一用户
如果要批量统计,可以把结果整理后去重:
# 提取所有发件人并去重统计 grep -i "pgp\|enigmail" /var/log/mail.log | grep "from=<" | sed 's/.*from=<\([^>]*\)>.*/\1/' | sort | uniq | wc -l # 提取所有收件人并去重统计 grep -i "pgp\|enigmail" /var/log/mail.log | grep "to=<" | sed 's/.*to=<\([^>]*\)>.*/\1/' | sort | uniq | wc -l
二、用Splunk高效统计(更推荐)
既然日志已经同步到Splunk,用它的查询能力能更快完成统计,还能灵活过滤条件。
1. 基础查询:统计收发加密邮件的唯一用户
直接搜索带有PGP特征的日志,提取并统计唯一发件人/收件人:
index=mail sourcetype=postfix_log ("-----BEGIN PGP MESSAGE-----" OR "application/pgp-encrypted" OR "X-Enigmail-Version") | rex field=_raw "from=<(?P<sender>[^>]+)>" | rex field=_raw "to=<(?P<recipient>[^>]+)>" | stats dc(sender) as 加密邮件发送者总数 dc(recipient) as 加密邮件接收者总数
2. 进阶优化:排除无效数据
如果想排除用户给自己发的测试邮件,或者特定域名的用户,可以加过滤条件:
index=mail sourcetype=postfix_log ("-----BEGIN PGP MESSAGE-----" OR "application/pgp-encrypted" OR "X-Enigmail-Version") | rex field=_raw "from=<(?P<sender>[^>]+)>" | rex field=_raw "to=<(?P<recipient>[^>]+)>" | where sender != recipient AND NOT sender LIKE "%@your-internal-domain.com" | stats dc(sender) as 有效加密发送者总数 dc(recipient) as 有效加密接收者总数
3. 补充提示
如果Splunk已经索引了完整的邮件内容(而不只是日志),可以直接搜索邮件内容里的PGP标记,结果会更准确:
index=mail sourcetype=email_content "-----BEGIN PGP MESSAGE-----" | stats dc(sender) as 加密邮件发送者总数 dc(recipient) as 加密邮件接收者总数
备注:内容来源于stack exchange,提问作者GodAtum
相关产品推荐
相关产品推荐

