讨论一种基于tcp代理的SMTP防火墙和双因子认证及安全审计系统

邮箱和VPN安全,是企业安全运营的一大重点。而邮箱安全,却又常常成为企业安全的薄弱环节,攻击者经常借邮箱作为突破口,渗透企业内网。

简单地说,若没有有效的二次认证手段,VPN安全和邮箱安全是无法从根本上得到保证的。

今天讨论一种简单SMTP二次认证的实现方法。

概述

首先,SMTP服务不再直接暴露于外部不受信任的网络中,搬到内网。对内通过修改private DNS,内网主机可直接访问smtp服务器,因此,内网中所有服务均不受影响。

外部网络 <—> [SMTP防火墙] <—> 内网SMTP服务器 <–> 内网主机

外网必须通过防火墙(or 代理)来访问SMTP服务器。

代理的作用

1. 实现双因子认证

2. 主动拦截异常访问,主动报警

3. 安全审计

双因子认证功能的实现

SMTP是一个很简单的协议,考虑可以加入双因子认证的元素,只能是“用户名”、“密码”、“域名”、“端口”中的某一个。

我们考虑将这个因子附加到用户名中。

于是,用户在PC或手机上配置SMTP时,必须将用户名修改成系统提供的转换后的值,方可认证成功。而直接使用用户名,则是无法完成认证的。

举个例子,我的邮箱是[email protected],配置必须是:

Server:  smtpProxy.security.com      (代理服务器)

Port:      25                                    (TCP代理的端口号)

Username: lijiejie.188.test.py    (这里的用户名必须填入系统转换后的值)

Password: 原来的密码

这个lijiejie.188.test.py如何得来呢? 可以下发手机短信,当代理检查到用户名直接登录的情况,向用户手机上发送一个新的用户名,用户使用短信中的用户名进行认证。

如果有动态口令APP或者rsa securid,可以把动态密码附加到用户名后面。而一旦认证成功,完成一次绑定。今后的一个月中,用户都可以使用绑定的动态口令在任何外网的设备上登陆SMTP服务器。一个月之后,绑定过期,必须重新绑定新的口令。

代理检测到用户名和绑定的值不匹配,主动断开连接。

代理检查到用户名和绑定匹配,主动把用户名后面的字符串删除,再转发给内网的SMTP服务器。

双因子认证有什么好处?

1. 内网主机不需要绑定,因此,如果攻击者通过web漏洞获取到了某个邮箱的账号密码,在外网无法登入我们的SMTP服务器

2. 不改变原有SMTP协议,实施双因子认证。但缺点是这个因子实际是一个月才变化一次(One-Month-Password),而不是真正的One-Time-Password。

3. 这个绑定位于用户的PC和手机上,可以随时解绑。

一个简单的例子

这个demo是一个代理程序,它代理到applesmtp.163.com,只有在用户名后面加上.iqiyi.com,才可以完成认证。

https://gist.github.com/lijiejie/012e564ee0aae5283029

当然,这只是最基本的思路,非常不完善。

各种缺点也非常明显,本篇仅作原始的记录。