背景
我是一名 Web 开发人员,试图确保传出的 IMAP 连接能够安全地完成。不幸的是,我只能使用 PHP 的 IMAP 扩展(暂时)。imap_open ()的文档不够完善。示例:
- 参数的标志顺序
mailbox
显然足够重要,可以破坏不兼容的字符串,但又不至于重要到需要记录下来。 - 显然,该
/ssl
标志确实使用了 TLS。 - 该
/tsl
标志不起作用。 - 该
/secure
标志导致Can't do secure authentication with this server
。
最后一个问题是我关注的用例。文档暗示,如果/secure
未设置标志,密码将以纯文本形式发送!(除非这是类似于加密字符串的事情,尽管连接本身可能已经加密?)如果是这样,那么其他所有内容是否加密并不重要,因为任何攻击者都可以转身使用他们刚刚找到的凭据。不,我们不是在谈论双因素身份验证,因为这明确避开了这个话题,并且是削弱基本身份验证强化的借口。
这有效:{mail.example.com:993/ssl/imap}
。
这不起作用:{mail.example.com:993/ssl/imap/secure}
。
搜索引擎返回的错误页面非常少Can't do secure authentication with this server
,这意味着我看到大多数人做的事情:盲目地复制粘贴代码,只做微小的修改,然后因为它完全有效就假定他们的实现是正确的。
但我坚持要验证外观。这让我想起了 2000 年代后期,微软重新开始开发 Internet Explorer 时 Windows 上的 Fiddler 程序。你可以检查每个网络连接的各种情况。
服务器环境
- 我有 cPanel 和 CloudLinux。
- 我有root权限。
- 我已经查看了一些其他线程;我的服务器已经安装
tshark
好了tcpdump
。 - 如果安装另一个程序能让我的生活更轻松的话,我很乐意。
- 电子邮件消息标题建议使用 TLS 1.2 连接,但我不知道这是我的发送服务器还是接收服务器。
- 我的服务器至少在 443 上配置了 TLS 1.2 和 1.3;443 上禁用了 1.1、1.0 和 SSL。
- 虽然我还没有弄清楚如何在端口 993 上禁用 TLS 1.0 和 1.1(离题,只是想澄清我至少知道一些事情),但 443 和 993 上的 SSL 协议已被禁用。
测试条件
我有意尝试对测试条件进行压力测试,否则我将看不到任何对比,因此不会学到任何东西。发件人和收件人的电子邮件说明:
- 从 example1.com 到 example1.com(永不离开服务器)。
- 从 example1.com 到 example2.com(虽然域名不同但仍未离开服务器)。
- 从 example1.com 到 differentserver.com(故意离开服务器)。
- 我想避免使用
/novalidate-cert
似乎对服务器到同一服务器的请求工作正常的标志。
解释意图
是的,端口 993应该再次加密,重点是验证正在发生的事情,而不是盲目信任。理想情况下,我想做一个明确的纯文本请求来对比加密请求。显然,对比是,使用嗅探器程序,我能够将纯文本请求视为纯文本!然后,我期望的加密示例基本上只是混乱的二进制数据。如果我可以验证请求是我所解释的请求,那么我就得到了我想要的验证!只要我能重复该验证过程,那就是我的答案!最重要的是凭据是加密的,在两个服务器“握手”后,我期望它加密吗?
嗅探器技术细节
虽然我不太熟悉服务器或 Linux,但我可以稍微熟悉一下终端。因此,我希望得到有关嗅探程序的帮助:
- 我应该使用哪个嗅探程序以便检查网络请求的内容(而不仅仅是标题)?
- 如果这些适用:
tshark
和tcpdump
显然都是尾部程序;我如何将它们的输出限制到端口 993? - 如果端口 993 上发生了很多事情(服务器使用率最低但仍然存在),我该如何进一步减少输出以便找到我发出的请求?
- 如果适用的话,我该如何澄清标题、内容或两者,以便我知道我在看什么?
- 有什么简单/容易的方法可以发送纯文本请求(在任何上下文中),我可以使用它来对比(希望)加密的端口 993 请求?
问题
如何以 root 身份从终端检查实时 Linux 服务器上的网络流量,以验证我关注的请求确实已加密?
实际上,在 Windows 上,我可以使用 Notepad++“检查”文本文件并正常读取。如果我打开光栅图像,我会看到二进制数据。我想确保凭据确实被加密,尽管 PHP 函数的文档令人困惑imap_open()
。
答案
非常感谢@grawity。简而言之:
- Windows 到 Linux:PuTTY。
- 列出网络设备:
ifconfig -a | sed 's/[ \t].*//;/^$/d'
。 - 检查传出的 993 端口请求:
tcpdump -A -n -i [NETWORK DEVICE] "port 993"
。
该程序使用术语“SSL”表示在专用端口上直接(又称‘隐式’;‘包装模式’)使用 SSL/TLS,其中 TLS 握手从第 1 个字节开始 - 方式与 HTTPS 相同 - 并且使用术语“TLS”表示在纯文本端口上显式使用 SSL/TLS,其中客户端首先获得纯文本问候语,发出命令
STARTTLS
,然后开始 TLS 握手。虽然两者都使用相同的 TLS 协议,并且都同样安全,但现在人们普遍认为专用端口上的直接 SSL/TLS 更安全,因为它更容易编程 - 它有效地保证了“TLS 或无” - 而纯文本端口上的 STARTTLS 有很多实施错误的机会。
(例如,一些客户端没有明确说明哪个设置是“强制 STARTTLS”(安全)以及哪个设置是“如果提供则使用 STARTTLS”(不安全)。一些客户端存在错误,尽管没有提供 STARTTLS,但仍可以继续;我甚至见过一个 LDAP 客户端,如果将其设置为 STARTTLS,则根本不激活它并以纯文本继续。)
每个服务器的管理员可自行决定是否要在端口 993 上为 IMAP 提供直接 TLS,或是否要在端口 143 上为 IMAP 提供 STARTTLS,或两者兼而有之。Gmail 仅提供直接 TLS。
该
/secure
选项在不同的级别上工作:它不与传输安全性交互(如在 IMAP“下方”运行并加密所有传输数据的 TLS),而是在 IMAP/POP/SMTP 协议级别请求安全身份验证握手。在当今无处不在的 TLS 时代之前创建的大多数协议都倾向于支持某种身份验证握手,这种握手不仅仅发送原始密码 - 通常是一种“质询/响应”的形式 - 这样即使您的邮件是以明文形式传输的,至少您的密码也不会被盗。
例如,HTTP 有 Kerberos 和 Digest;SMB 有 Kerberos 和臭名昭著的 NTLM;同样,POP/IMAP/SMTP 有支持CRAM-MD5和 SCRAM-SHA1 的选项(实际上也有相同的 Kerberos 和 NTLM)。
这就是该
/secure
选项的用途:它要求 IMAP 客户端库将机制的选择限制为不直接显示凭据的机制(将选项从“PLAIN/Kerberos/CRAM/NTLM”限制为仅“Kerberos/CRAM/NTLM”。)因此,总而言之:当选项文档中
/secure
说“以纯文本形式”时,它真正的意思是“除了 IMAP 连接的其余部分之外,没有其他保护” ——在撰写本文时,这确实意味着“没有任何保护”,因为很少有邮件服务器支持 SSL。当然,如果整个连接都使用 TLS,那么“纯”密码也将受到 TLS 的保护。(如今,服务器很少支持 CRAM 或 SCRAM,因为它在使用 TLS 时几乎没有任何优势,更不用说它自身的局限性,而 Kerberos 仅适用于企业内部邮件服务器。)
任何。
旧版本的 tcpdump 确实有一个默认限制,即仅捕获每个数据包的前 64 个字节(可以使用 增加该限制
-s
);现代版本捕获整个数据包。使用-A
或-x
显示数据包的原始内容。Tshark 使用
-V
和-O
选项来扩展单个“协议”(如 Wireshark GUI 中所示),例如-VO imap,data
扩展 IMAP 和/或“原始数据”有效负载。两者都使用 libpcap 并相应地使用pcap-filter(7)语法作为捕获过滤器;tshark 使用选项
-f
来指定捕获过滤器;而 tcpdump 则不然。过滤器
port 993
匹配 TCP 和 UDP。您可以具体一点并使用tcp port 993
。不过,考虑到这个问题,您应该捕获port 993 or 143
。通过 SSH 捕获时,
not port 22
如果您没有通过主机/端口进行限制,请始终至少使用 - 不过滤任何内容会导致每个打印的数据包触发另一个数据包等等,即使网络相当空闲,也会给您大量的输出。host
使用或将其限制为特定服务器的 IP 地址net
。或者,捕获到 .pcap 文件并将其加载到本地安装的 Wireshark,它允许您按特定的“对话”进行过滤 - 右键单击数据包并选择“关注 > TCP 流”以仅查看该连接的数据。
有一种方法可以通过 SSH 直接捕获到本地 Wireshark GUI:
Wireshark 的“TCP 流”将自动提取 TCP 有效负载。
基本 TCP 客户端(例如
nc
、ncat
或 )telnet
可用于连接到任何 TCP 端口并发送纯文本。如果您对端口 993 执行此操作,服务器将断开您的连接,因为它需要有效的 TLS 握手,但您的数据包在捕获中仍可见。为了进行更好的比较,您需要一个 IMAP 服务器,该服务器既接受端口 993 上的 TLS 连接,又接受端口 143 上的纯文本/starttls 连接。由于 Gmail 只执行前者,因此尝试在端口 993 上进行纯文本通信的 IMAP 客户端通常甚至不会进入身份验证步骤 - 它将永远等待 IMAP 服务器发送的初始“问候”。