邮件身份可信
前言
邮件钓鱼已经是老生常谈。不同的场景下当然有不一样的选择。在攻防演练中,我更加偏向于选择现有知名的邮件服务供应商,例如163、QQ等。因为是国内的演练,不会选择使用国外的邮件服务,更加别提臭名昭著的OutLook邮箱。在国内使用 163 可信度高,能让邮件的送达率高,但是往往在发送邮件的频率上有限制。
在邮件钓鱼演练服务,针对企业大批量的钓鱼,我们可以选择自建邮件服务器。这样可以没有发件频率的限制,你可以伪造发件人,也可以改变发件人的IP,但有很多因素导致邮件信任度不高无法抵达对方的邮件,也有可能会被当做垃圾邮件处理。此篇文章讲述了一些提高邮件可信度的设置方法。
其实邮件可信一方面是身份可信,一方面是内容可信。在身份可信上就有很多重校验,这一方面是需要我们第一步摆平的。这里涉及到IP地区、IP信任、IP网络可达;域名相似、域名信誉、域名购买时间;SPF/DKIM/DMARC/PTR身份认证;TLS/SSL证书、 S/MIME证书传输认证等。内容可信可以涉及到发件人名称、地址;邮件内容;邮件附件等。
前提条件选择
前提条件选的好,那就成功一半了。
邮件服务的选择
搭建邮件服务已经非常常见了,然而在选择邮件服务上还存在一些选项。
我接触过 sendmail 、Ewoemail、iRedMail 其他的暂未了解,其中 sendmail 只提供了邮件服务没有可视化管理的界面。但好在小巧,安装方便,自定义程度高。Ewoemail和iRedMail,都有后台和用户邮件管理系统,体积大,可以省去很多功夫。这里我使用 sendmail 达到我们的目的。
不想折腾可以直接看 iRedMail 安装以及其他配置教程:https://v2rayssr.com/iredmail.html#%E5%87%86%E5%A4%87%E5%B7%A5%E5%85%B7
VPS的选择
为了更好的搭建邮件服务,增加可信度,我们需要有一台满足以下条件的VPS:
- 25 端口开放且没有VPS提供商监管
- 可以设置 PTR Records
- 内存大于 1 GB
在国内,VPS提供商有的限制25端口,有的禁止25端口,大多都不允许自建提供于公网的邮件服务器;PTR 的设置需要VPS提供商设置,有的需要付费,有的禁止。这里我选择了国外的VPS提供商 hostinger,也是国内多少从业外贸商的选择。当然也可以从众选择搬瓦工,也可以选择小众或个人提供的VPS。尽管选择很多,但需要注意IP的信誉度。
域名提供商和域名的选择
全球有数不清的域名提供商,其中比较出名的是 Godaddy、Enom、TuCows。国内的域名注册用 Whois 查询可能可以获取到注册人的信息,但使用 Godaddy 可以不用担心这个。
域名的选择可以参考这个 https://www.maigoo.com/top/428603.html。其中 .com 、.cn、.us比较常见,这些TLDs 顶级域名可信度较高。如果你选择使用类似于 .space 的域名,会碰到这种情况。
设置身份验证
通过身份验证的邮件:
- 有助于为收件人防范钓鱼式攻击邮件等恶意电子邮件。
- 不容易被 Gmail 拒收或标记为垃圾邮件。
邮件必须通过 SPF 或 DKIM 检查,才能通过身份验证。要通过 DMARC 检查,邮件必须先通过 SPF 或 DKIM 身份验证,而且身份验证网域必须与邮件的 From: 标头中的网域相同。
邮件可信度测试地址
一天只能免费测试三封邮件,注意把控次数。
设置域名:mydomain.com
文中的这个域名请你自行替换成自己的域名。
根据以下内容设置完后邮件可信度测试如下所示,其中扣分的地方是我购买的域名还没超过28天。
还有一种被动检查方式
https://en.internet.nl/test-mail/
关于DANE设置可以看这篇 https://blog.apnic.net/2019/11/20/better-mail-security-with-dane-for-smtp/
设置 SPF 记录
SPF 记录是为了防止垃圾邮件而设定的,告知收件方,从设置的允许列表中发出的邮件都是合法的,设置方式为添加一条根域名的 TXT 解析记录
内容为 <font style="color:rgb(214, 50, 0);background-color:rgb(248, 248, 248);">v=spf1 mx ~all</font>
检测方式:<font style="color:rgb(214, 50, 0);background-color:rgb(248, 248, 248);">nslookup -type=txt mydomain.com</font>
在实践中,这样的设置可能会造成邮件伪造漏洞。原因是SPF设置不够严格,上面的 ~all
前缀代表软拒绝,对接收方来说,遇到有软拒绝的域名没有通过SPF校验,通常采取的策略是放行或者标记为垃圾邮件。
对于这种情况,我们可以使用 v=spf1 include:mail.mydomain.com -all
作为我们的SPF值。设置完成后可以使用这个地址来测试你的SPF。https://www.kitterman.com/spf/validate.html
了解更多SPF相关内容可以参考:https://github.com/internetstandards/toolbox-wiki/blob/main/SPF-how-to.md
了解如何绕过SPF:https://www.freebuf.com/articles/system/238215.html
设置 A 记录
将 mail.mydomain.com
的 A 记录指向你的 VPS 服务器(邮件服务器)IPv4地址
检测方式:nslookup mail.mydomain.com
设置 AAAA 记录
将 mail.mydomain.com
的 AAAA 记录指向你的 VPS 服务器(邮件服务器)IPv6地址
检测方式:nslookup mail.mydomain.com
设置 MX 记录
MX 记录就是邮件的解析记录,非常重要的一条记录,配置根域名的 MX 记录为自己的邮件域名地址,优先级为 10
检测方式:nslookup -type=mx mydomain.com
设置 DMARC 记录
DMARC 记录是当收件方检测到伪造邮件等行为时,将根据您的配置进行操作的一个记录,比如拒绝邮件或放入垃圾邮件以及不做处理等,同时会反馈一份检测报告到配置的邮箱地址内。
添加方法就是增加一条 _dmarc 的 TXT 解析,内容为配置选项,v=DMARC1; p=none; pct=100; rua=mailto:dmarc@mydomain.com
检测方式:nslookup -type=txt _dmarc.mydomain.com
在检测中可能会遇到 DMARC 政策不够严格,我们可以设置成 p=quarantine
或者 p=reject
,分别是隔离和拒绝政策,我们可以直接设置成 v=DMARC1; p=reject; pct=100; rua=mailto:dmarc@mydomain.com
了解更多关于DMARC相关知识参考:https://github.com/internetstandards/toolbox-wiki/blob/main/DMARC-how-to.md
DMARC记录生成器:https://powerdmarc.com/zh/dmarc-record-generator/
启用并设置 DNSSEC
域名系统安全扩展(DNS Security Extensions,简称DNSSEC)是用于确定源域名可靠性的数字签名 ,通过在域名中添加DNSSEC记录,可以增强对DNS域名服务器的身份认证,有效防止DNS缓存污染等攻击。本文为您介绍如何在阿里云域名服务控制台上添加及同步DNSSEC记录。
阿里云域名用户可以看这篇 https://help.aliyun.com/document_detail/101717.html
这里我使用的是 CF,到域名管理控制台左侧栏找到 DNS 中的 Settings,进入 DNS 设置页面启用 DNSSEC。
开启后会给出几个值。
到你的域名注册商设置 DS 记录,我的域名注册商是Godaddy 到域名DNS设置处找到 DNSSEC。
官方教程 https://sg.godaddy.com/help/enable-dnssec-on-my-domain-6420
其中的 Key tag、Algorithm、Digest Type、Digest按照提供的数据填写后点击 Update 即可。
设置 DKIM 记录 【重点】
DKIM 可说是避免被判定为垃圾邮件的一大利器,DKIM 属于一种类似加密签名的解析记录,只有包含此加密数据,且公钥与密钥相匹配才属于合法邮件,要设置 DKIM 记录,首先要查询 DKIM 信息。
了解更多DKIM相关知识可以参考:https://github.com/internetstandards/toolbox-wiki/blob/main/DKIM-how-to.md
Amavisd 查询
如果你的邮件服务器使用的是类似 EwoMail 或者 iRedMail 等大型邮件服务器就可以使用这个方法。
查询 DKIM 可以使用系统命令
<font style="color:rgb(214, 50, 0);background-color:rgb(248, 248, 248);">amavisd showkeys</font>
OR
<font style="color:rgb(214, 50, 0);background-color:rgb(248, 248, 248);">amavisd -c /etc/amavisd/amavisd.conf showkeys</font>
如果不存在 amavisd 可以使用命令安装 yum --enablerepo=rpmforge,rpmforge-extras install amavisd-new -y
OpenDKIM 签名 【比较繁琐】
文中这节如果有一些描述没有读懂可以看这篇参考文章https://meumobi.github.io/sendmail/2015/09/18/install-configure-dkim-sendmail-debian.html
sendmail 的配置文件
- /etc/mail/sendmail.cf 主配置文件
- /etc/mail/sendmail.mc 模板文件
- /etc/mail/access 完成中继转发功能,即加入允许访问的域名
- /etc/aliases 该文件包含 sendmail 程序所用到的别名数据库的文本形式。
- /etc/mail/local-host-names 本地主机名和域名的列表决定收到的邮件是本地邮件,还是远程邮件,然后决定是地投送还是转发。
- /etc/mail/sendmail.cw 当一个主机有多个域名时,在此加入这些域名
- /var/spool/mqueue 邮件队列临时存放的目录
- /var/mail 存放所有收到的邮件
- /var/log/maillog 日志文件
1、设置主机名
如果以及设置过可以跳过这一步。
vim /etc/hosts
在hosts 文件添加一段
127.0.0.1 mail.mydomain.com mail |
这里的 127.0.0.1 替换成你的 VPS IP。
echo mail > /etc/hostname
修改你的 hostname
验证 hostname -f
即可看到 mail.mydomain.com
,而不加选项则是短名称,如果你的不是这样可以使用 sudo hostname mail
强制修改。
2、安装服务
我使用的是 sendmail 作为我的邮件服务器,并安装 OpenDKIM 。安装命令如下。
yum install sendmail sendmail-cf mailutils sharutils opendkim opendkim-tools -y |
为您的密钥创建新目录
mkdir -p /etc/opendkim/keys/mydomain.com |
3、生成签名密钥并配置opendkim
上面的命令将在新创建的目录下创建两个文件 default.private 和 default.txt 如果您对创建密钥时可用的其他选项感兴趣,可以执行 man opendkim-genkey
查看更多选项。在此示例中,我使用了 -D(目录)选项、-d(域)选项和 -s(选择器)选项。
请留意这里的 -s 选项,这里可以默认为 default 你可以选择自定义任意字符。
opendkim-genkey -D /etc/opendkim/keys/mydomain.com -d mydomain.com -s default |
将所有权更改为 opendkim 这一步是必须的,不然opendkim没有权限访问 /etc/opendkim/keys/mydomain.com 文件夹,导致无法正常对邮件进行签名。
chown -R opendkim:opendkim /etc/opendkim/keys/mydomain.com |
<font style="color:rgb(44, 62, 80);">vim /etc/opendkim.conf</font>
配置 OpenDKIM,这是我配置的文件。请对照着修改。
PidFile /var/run/opendkim/opendkim.pid |
<font style="color:rgb(44, 62, 80);">vim /etc/opendkim/KeyTable</font>
在该文件添加下面一行。
default._domainkey.mydomain.com mydomain.com:default:/etc/opendkim/keys/mydomain.com/default.private |
vim <font style="color:rgb(44, 62, 80);">/etc/opendkim/SigningTable</font>
在该文件添加下面一行。
*@mydomain.com default._domainkey.mydomain.com |
vim <font style="color:rgb(44, 62, 80);">/etc/opendkim/TrustedHosts</font>
在该文件添加下面一行。
127.0.0.1 |
也可以直接用这个命令设置,但同样的你需要替换其中的 mydomain.com
echo 'default._domainkey.mydomain.com mydomain.com:default:/etc/opendkim/keys/mydomain.com/default.private' >> /etc/opendkim/KeyTable |
4、配置 sendmail
设置 sendmail 每一封邮件都要经过 OpenDKIM 签名
vim <font style="color:rgb(44, 62, 80);"> /etc/mail/sendmail.mc</font>
在该文件添加下面一行。
INPUT_MAIL_FILTER(`opendkim', `S=inet:8891@127.0.0.1') |
其他的 sendmail 配置可以参考这篇 https://max.book118.com/html/2021/1018/8040072020004022.shtm
<font style="color:rgb(102, 102, 102);">m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf</font>
使用 m4 生成Sendmail的配置文件。
启动需要的服务并查看他们的状态
systemctl restart sendmail saslauthd opendkim |
5、添加 DNS 记录
这个是必须的,上面的配置是在每封邮件发出时进行签名,而这个 DNS 记录就是用来验证邮件里的 DKIM 签名的。其中我们需要注意的是这条 TXT 记录的 Name。
它的构成是 Select._domainkey。这里的 Select 其实就是上面第2小节里生成签名密钥命令里的 -s default
所以这里我们的命名为 default._domainkey。而内容可以通过 cat /etc/opendkim/keys/mydomain.com/default.txt
命令获取。
想进一步了解 DKIM 可以参考这篇 https://www.konghaidashi.com/post/4376.html
6、发送测试
选择使用 sendEmail 服务进行邮件发送测试,注意不要和 sendmail 服务搞混。
yum install sendEmail -y
安装服务,使用下面的命令进行测试。
sendEmail -f test@mydomain.com -t receiver@mail.com -u TestSendEmail -m Hi -s 127.0.0.1 |
使用说明:
-f 表示发送者的邮箱 |
使用样例:
$ sendEmail -f sender@mail.com \ |
之后在邮件的头部就会包含 DKIM 标识了。
申请并设置 TLS/SSL 证书
有关邮件加密的相关描述 https://support.google.com/mail/answer/6330403?visit_id=638066867880173220-2329511212&p=tls&hl=zh-Hans&rd=1
加密邮件的方式有 S/MIME 增强型加密 和 TLS/SSL - 标准加密 两种,因为 S/MIME 比较繁琐,我们选择使用 TLS,即使用 TLS/SSL 自签证书加密。
Acme 脚本申请证书
Acme 脚本申请证书,是我们用到的最常见的一种证书的申请方式,它有很多的申请方法,大家只需要找到一种适合自己的也就好了。
安装 Acme 脚本
<font style="color:rgb(214, 50, 0);background-color:rgb(248, 248, 248);">curl https://get.acme.sh | sh</font>
2021 年 6 月 17 日更新:从 acme.sh v 3.0.0 开始,acme.sh 使用 Zerossl 作为默认 ca,您必须先注册帐户(一次),然后才能颁发新证书。
<font style="color:rgb(214, 50, 0);background-color:rgb(248, 248, 248);">~/.acme.sh/acme.sh --register-account -m ca@mydomain.com</font>
其中 ca@mydomain.com,ca 可以任意变更。
(1)两种方式申请验证
国内腾讯云的VPS,类似于 80、443、8080、8443 等WEB应用常用端口的使用都是需要备案的。然而很不幸的是,我们如果使用Web 验证申请证书,我们就需要使用 80 端口。如果你是使用的腾讯云的VPS,可以直接看第二种证书申请方式。
Web 验证申请证书
这种方式,需要开放 80 端口,并保持不被占用的状态,这种方式不支持泛域名。
申请SSL证书时,需要先进行验证,确保你是该域名的所有者。以下有三种方式,可以按照自己的情况来继续进行验证申请。
80 端口空闲的验证申请
如果你还没有运行任何 web 服务, 80 端口是空闲的, 那么 Acme.sh 还能假装自己是一个 WebServer, 临时监听在 80 端口,完成验证。这里需要安装 socat 来完成伪装。
yum install socat -y |
Nginx 的方式验证申请
这种方式需要你的服务器上面已经部署了 Nginx 环境,并且保证你申请的域名已经在 Nginx 进行了 conf 部署。(被申请的域名可以正常被打开)
~/.acme.sh/acme.sh --issue -d mydomain.com -d mail.mydomain.com --nginx |
http 的方式验证申请
这种方式需要你的服务器上面已经部署了网站环境。(被申请的域名可以正常被打开)
原理:Acme 自动在你的网站根目录下放置一个文件, (这个文件可以被互联网访问)来验证你的域名所有权,完成验证. 然后就可以生成证书了。
实例代码:(后面的路径请更改为你的 网站根目录 绝对路径 )
~/.acme.sh/acme.sh --issue -d mydomain.com -d mail.mydomain.com --webroot /home/wwwroot/mydomain.com/ |
DNS 验证申请证书 【推荐】
这种方式的好处是, 你不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证。坏处是,如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。
Acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商。该方式可以申请多域名、泛域名证书,达到很多域名可以共用一张证书的目的。
为域名更换 cloudflare 域名服务器
这里我们使用常见的 cloudflare 来申请。
首先进入到 cloudflare 控制台添加你的域名。https://dash.cloudflare.com/
填入你的域名然后点击添加。
然后到你的域名商控制台,将域名服务器更换成 cloudflare 提供的域名服务器。
差不多过半个钟或者一个钟就能解析了。需要注意,更换域名服务器未生效期间无法进行DNS验证SSL证书申请。
在等待期间我们可以先设置API Keys。先到 https://dash.cloudflare.com/profile/api-tokens
export CF_Key="你的Global API Key" |
设置完之后就可以申请证书了。
~/.acme.sh/acme.sh --issue --dns dns_cf -d mydomain.com -d *.mydomain.com |
(2)更新证书
如果中间没有故障,最终可以申请到SSL证书,如图所示,生成了很多的文件。
禁止直接使用 ACME 目录下面的证书文件,因此我们需要复制到自己的文件夹内。
mkdir /etc/mail/certs |
为了解决 STARTTLS: CRLFile missing 问题,这里我下载了 revoke.crl 文件。参考http://www.linuxweblog.com/blogs/sandip/20071019/starttls-crlfile-missing-resolved
我们需要从 OpenSSL 那里获取到 ca-bundle.crt
文件。
里面标注了常见目录 http://gagravarr.org/writing/openssl-certs/others.shtml#selfsigned-openssl
我们可以直接通过 openssl version -d
找到 SSL 文件存放目录
而ca-bundle.crt
文件一般放置于 certs 目录下
cp /etc/pki/tls/certs/ca-bundle.crt /etc/mail/certs/ca-bundle.crt |
将 fullchain.pem
追加到 ca-bundle.crt
,需要注意不能直接复制保存,而是在每一个证书开头加一个换行。
vim <font style="color:rgb(44, 62, 80);"> /etc/mail/sendmail.mc</font>
对照下面修改项进行修改
dnl define(`confLOG_LEVEL', `20')dnl |
使用 m4 生成Sendmail的配置文件并重启 sendmail 服务。
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf |
通过发送邮件查看日志测试 SSL 验证。
sendmail recipient@mail.com |
注意最后的 .
tail -20 /var/log/maillog |
看到接收方邮件服务器验证 verify=OK
即可。
如果是 verify=FAIL
可以根据 verifymsg
来判断问题。
FreeSSL 申请证书
这种方式申请证书,比较简单,而且还可以申请到为期一年的 “亚洲诚信” 的证书,但是,目前此网站申请证书需要进行手机验证,暂时先不演示。
设置 PTR 反向解析 【重点】
反向域名解析纪录(RDNS)就是和正向的DNS解析相反的一种反向解析,正向DNS解析把域名解析成IP地址,RDNS恰恰相反,就是反过来把 IP 解析成域名。反向域名格式如:X.X.X.in-addr.arpa。可逆 DNS(RDNS)的原理和 DNS 解析是完全相同的。
这里详细介绍了 PTR 拦截垃圾邮件是如何运作的。https://www.800188.com/index.php/home/reference-news/86-technology/2044-rdns-3?tmpl=component&print=1
国内的VPS我不清楚有哪些可以设置 PTR,像腾讯云如果需要设置 PTR 是需要付费的,如果你使用的是腾讯云可以看官方的说明。https://cloud.tencent.com/document/product/302/79828
为了能够免费设置 PTR 我特地从 hostinger 供应商购买了VPS。
这个 hostinger 供应商提供的最优惠价格都是购买4年的,如果你购买一个月那价格可能会是个灾难。
购买后到 https://hpanel.hostinger.com/ 开始设置你的服务器。
在 《2021中国企业邮箱安全性研究报告》中提到一段话:“在所有钓鱼邮件中,来自美国的钓鱼邮件最多,占国内企业用户收到的钓鱼邮件的41.0%;其次是中国,约占11.7%;新加坡排名第三,约占5.3%。”新加坡有垃圾邮件法,而美国监管不够严格。这里选择美国。
后面选择 Centos 7 系统镜像,在设置机器名字时,我们可以写 mail.mydomain.com,就可以跳过设置 VPS 主机名。创建完成后按照官方说明设置 PTR https://support.hostinger.com/en/articles/4805528-how-to-use-ptr-at-vps,IPv6的也设置上。
在设置解析的域名,我们需要填写 mail.mydomain.com 而不是 mydomain.com。
检测方式:nslookup VPSIP