现在讨论一种安全访问之前谈论过的RDP服务的方法。实际上,笔者还从来没有看到这种方法被合理并且有效地使用过。这是创建访问控制规则的过程,而这些规则基于客户端试图建立连接的源端口而创建。笔者曾经见过一种端口锁定的实现方法,通过向端口发送特殊序列的数据才能将端口“解锁”为普通的监听端口,SYN报文(或其他数据)就像TCP的钥匙一样被用于打开监听端口。这的确是有趣的主意,但是在正常环境中并不是那么容易实现。

除了使用端口锁定的方法之外,非常合理且(有点)容易部署的控制只能是基于防火墙规则来实现,防火墙规则不仅应用于客户端要连接的目的端口,也应用于客户端连接的源端口。正如你可能已经知道的情况,当建立正常的TCP连接时,客户端试图连接到服务器主机的特殊端口。以HTTP协议为例,端口就是80,IP协议栈会首先伪随机地选择某个本地端口作为源端口,然后才连接服务器的80端口。服务器主机接收连接以后,首先看看源端口是什么,然后向源端口发回服务器端的响应报文和数据。

因为这些连接一般都是使用1024和65535之间的随机端口,所以防火墙规则通常都被配置成允许所有源端口连接到本地端口。但是,显然不一定非要用这种方式设置防火墙规则。前面已经讨论过如何修改RDP主机的监听端口,通过修改监听端口可以保护RDP服务,就像之前说过的,这是部署RDP的好方法。是的,攻击者可以通过完整的端口扫描找到隐藏的那些端口,然后逐个尝试(RDP没有提供欢迎信息)使用RDP连接这些端口。但是,问题的关键是攻击者仍然要做很多事情,对他们来说这是代价昂贵的操作,意味着他们不得不花费更多的时间和尽更大的努力才能完成攻击。挂在低树枝上的果实更有吸引力,然而,这仍然只是一种可能性,让管理员修改RDP主机端口,并且维护哪个系统在哪个端口上确实是一件痛苦的事情。

保持RDP监听端口仍然使用默认的3389端口,但是创建防火墙规则,只允许源端口在某个特定范围内的RDP客户端建立连接。这样就能够保证RDP主机端口不会显示为开放端口,除非客户端不仅知道需要遍历源端口,而且还知道遍历哪些源端口。这是一些简单的事情,攻击者不会做,也不知道怎么做,除非他们从某种程度上知道这是怎么回事。即使他们知道源端口被限定到了指定的范围之内,也仍然需要登录才能访问RDP。在笔者看来,源端口访问规则是十分有效的访问控制方法,能有效地提供深度安全。很多人害怕将RDP服务部署在互联网上,当考虑他们是如何被吓得惊慌失措的时候,就会明白这种方法确实是有帮助的。在使用IP地址过滤这样的标准路线图场景中,这种方法也被证实是有价值的,因为在这种情况下,仍然需要针对连接的额外控制。

那么该如何开始呢?首先要处理的很明显的问题,就是在使用RDP客户端建立连接的时候如何钉死某些源端口号。微软的RDP客户端在建立RDP连接的时候不允许任何对源端口选择的控制。如果有人想做这件事情,他们可以修改一些Linux发行版本的源代码,定制打开RDP客户端使用的源端口,但是在我们的环境中无法这样做,因为需要使用NLA建立连接,必须使用微软的客户端。于是笔者对自己说:“应该为这本书编写RDP客户端,带有内置的TCP重定向功能,使用固定的某些源端口作为连接标识。人们会喜欢,这会是超级酷的工具。”于是笔者这么做了,这个工具已经包含在本书的配套DVD中。永远记住,理论上可以对任何客户端使用这个工具,这仅仅是使用RDP的示例。

ThoRDProxy客户端

很高兴介绍ThoRDProxy客户端,只有《雷神的微软平台安全宝典》一书才提供这个工具。现在介绍一下这个工具的工作原理:既然RDP客户端的行为不能改变,因此决定编写TCP重定向代理,通过这个代理拦截RDP客户端的出站连接,使用新的套接字将之重定向连接到目的服务器,这样就可以伪造源地址的数据。在做了一点研究,弄清楚如何产生推拉(push- and-pull)套接字网络数据流以及如何启动后台进程以处理整个工作之后,编写这个工具也就不是太难的事情了。

问题就是使RDP客户端连接到我们的代理,然后由代理连接到实际RDP客户端需要交互的服务器主机。不能创建两个独立的连接,因为要确保NLA能正常工作。同时,也不希望整个过程太复杂。虽然有创造性的安全控制很酷也很有趣,但是如果不容易使用和理解,就没有人会使用。如果没有人使用,就不是真的安全控制。这意味着实例化单独运行的代理,并为之设置连接参数,让它接管RDP客户端的连接。对于仅仅建立RDP连接来说,做这么多事情太难了。最终,笔者决定采用的模型是使用单个应用程序,在内部同时启动代理和RDP客户端,并控制两方面的连接。这个软件的整体架构如图1所示。

图1  ThoRDPProxy应用程序的设计规范和工作流图

这个程序包含两个主要组件:RDP ActiveX可再分发控件和TCP代理。程序在运行时先搜索本地的IP协议栈,使用找到的第一个本地IPv4地址作为代理监听地址,输入希望连接的RDP主机的名称并启动代理,代理会监听3389端口的连接。遗憾的是,这个控件的客户端实现不允许设置目的端口,这有点糟糕,因为无法让RDP主机在第一个IP地址监听客户端连接。但这也不是什么大不了的问题,一旦代理完成初始化并开始监听端口,就初始化RDP控件,RDP控件会自动连接到与代理绑定的IP地址的3389端口。只要收到RDP客户端的连接,代理就会创建两个TCP套接字:一个用于连接服务器(实际的RDP主机),一个用于代理返回数据(到RDP客户端)。在用于连接服务器的套接字创建好以后,就会为之绑定IP终结点配置,这个配置指定源地址从前面定义好的源端口范围中选择。这样一来,从代理到RDP主机的连接使用的源端口就和防火墙配置的源端口范围一致了。代理可以使用特定的端口(当然是在端口范围之内),但是笔者更喜欢在10个或更多的端口范围中自由选择。

代理在连接到服务器(RDP主机)后,就将从服务器接收到的数据流中转给RDP控件,这个控件会以为自己实际连接的是RDP主机。代理在RDP客户端和RDP主机之间建立管道,网络数据在这里中转传递。观察RDP客户端和服务器之间的流量是一件有趣的事情,所以在代理程序中启动控制台窗口。代理将TCP数据导出一份到控制台窗口中显示,这样就可以通过这个窗口中显示的数据了解发生了什么事情。当解决完所有问题并且在完成这个功能的时候,我才意识到自己是多么傻,因为客户端和服务器之间的数据显然都是加过密的,看起来就是一堆毫无意义的乱码,但这些乱码也是有吸引力的,通过这些乱码可以观察到一些有意思的东西。比如移动一下鼠标,可以看看客户端是如何告诉服务器鼠标被移动的情况。事实上,这些乱码的价值主要体现在可以通过这些信息观察RDP会话是如何被加密的。举个例子,如果在会话中打开记事本程序,然后在记事本程序中重复不停地按字符“n”键,就会发现客户端每次发送的加密数据都是不同的,这很有意思,加密密钥(或初始向量)显然每次都发生了变化。这是一些小事情,但是很有趣,图2 显示的是程序启动后,代理处于等待连接状态。

图2  ThorRDProxy启动并开始监听

现在启动RDP连接,结果如图3所示。
 
图3  ThoRDProxy显示使用预定义的源端口发送连接请求

注意,RDP客户端以为连接的是机器的本地IP地址,但实际连接的是RDP客户端中由主机名(Hostname)字段指定的RDP主机。还要注意,实际使用的源端口是27451,这使得连接可以穿过服务器上对应的防火墙规则。最后,我们将通过服务器的身份验证,得到如图4所示的结果。
 
图4  ThoRDProxy连接到RDP主机,RDP Sniffer功能处于启用状态
现在,可以在ThoRDProxy应用程序中启动RDP会话。使用这个程序,可以从任何地方安全地连接到RDP服务器的3389端口,而其他人如果尝试进行连接,就可能无法接触到服务器(被防火墙规则阻挡)。然而,还是有x/64511(65535-1024)的可能性,使得任何人在随机尝试连接服务器的过程中刚好碰到了被允许的那些源端口,x的值就是使用的源端口范围中的端口数量。不过,这个结果已经很令人满意了。

《雷神的微软平台安全宝典》试读电子书免费提供,有需要的留下邮箱。

雷神的微软平台安全宝典:使用源端口访问规则来限制访问相关推荐

  1. 精创之作 雷神的微软平台安全宝典 诚邀译者

    <雷神的微软平台安全宝典>雷与不雷?雷神精创之作就在这里.CSDN博客频道携手清华大学出版社诚邀天才的你,翻译本书. 一.活动时间 2012年5月14日至2012年6月3日 二.活动规则 ...

  2. 雷神的微软平台安全宝典

    为什么80%的码农都做不了架构师?>>>    雷神的微软平台安全宝典 <雷神的微软平台安全宝典>为读者学习微软平台相关的安全技术提供了"一站式"解决 ...

  3. 雷神的微软平台安全宝典---第二章 简介

    INTRODUCTION 简介 在我参与微软基础设施和企业部署的这么多年里,微软的文件加密系统(EFS)是迄今我所见的安全性能最强大,却也是最未被充分利用的技术之一.我很少见它在企业里甚至是中等规模的 ...

  4. 《雷神的微软平台安全宝典》简介

    在使用微软基础设施和企业部署这么多年的过程中,微软的文件加密系统(EPS)是我迄今为止见过的最安全但也是最未被充分应用的技术之一.在企业级或者中等规模的开发过程中很少被使用,无论是个人还是团队在安全控 ...

  5. 雷神的微软平台安全宝典---第二章 RSA和AES

    RSA是一种非对称加密算法,这意味着它需要一个密钥加密数据,另一个不同的密钥解密数据.这种加密算法的计算量不容小视,通常会导致处理器资源紧张,而且使用相同长度的密钥加密和解密数据的速度也比对称加密算法 ...

  6. 雷神的安全平台安全宝典

    深度安全 我们来看一下另一个IT安全要求:深度安全.简单来说,深度安全是一系列建立防御的措施,即使某个防御失效,另外有防御机制可以阻止攻击者的攻击.银行安全控制是一个深度安全的典型实例.银行中设有各种 ...

  7. 用matlab怎么画视电阻率拟断面图,在MATLAB平台上实现可控源音频大地电磁反演数据三维可视化显示...

    第29卷 增刊 物探化探计算技术 2007年10月 收稿日期6文章编号:1001-1749(2007)增刊(1)-0068-04 在MAT LAB 平台上实现可控源音频大地 电磁反演数据三维可视化显示 ...

  8. 长短视频之争,长视频平台和短视频源码谁主沉浮?

    文/布谷安妮 来源/山东布谷鸟网络 飞速飙升的用户流量,让以抖音和快手为代表的短视频收割了大量的关注度,从个体用户到媒体,短视频源码在短短时间内成为互联网行业最炙手可热的话题.腾讯重新启用微视,百度推 ...

  9. NDC 2010视频下载:看看其他微软平台程序员们都在做什么

    原文地址:<NDC 2010视频下载:看看其他微软平台程序员们都在做什么> NDC(Norwegian Developers Conference,挪威开发者大会)是一年一度的挪威最大的微 ...

最新文章

  1. Hibernate 所有缓存机制详解
  2. python fastapi_Python|介绍一下我的新伙伴fastapi(一)
  3. 【数学基础】运筹学:拉格朗日乘子法和KKT条件(上)
  4. 用户dsn保存位置‘_苹果iOS 13.6终于能保存文章阅读进度了 朋友都等秃了
  5. volatile指令重排_有多少人面试栽到Volatile上?面试问题都总结到这儿了
  6. [NOI2009]管道取珠
  7. ts怎么转换成m3u8直播源_HLS及M3U8介绍
  8. 思科五个高危漏洞 CDPwn 影响数千万台企业设备
  9. 转:Nginx 性能优化有这篇就够了!
  10. 选择器、像素和百分比、颜色单位、文档流-css基础
  11. android Toast五种特效
  12. python中print说法正确的是_python中的print()输出
  13. uniapp阿里云STS上传文件
  14. android开发学习计划
  15. 深度学习之目标检测--Pytorch实战
  16. qnx 资源管理器一(转载)
  17. pytorch(仅供自己参考勿看)
  18. SpringBoot2.6.x集成swagger: Failed to start bean ‘documentationPluginsBootstrapper问题解决
  19. python文本txt处理
  20. SQL Server 存储过程的运用

热门文章

  1. 杭州电子科技大学保研计算机,杭州电子科技大学计算机学院计算机技术(专业学位)保研细则...
  2. 使用MybatisPlus遇到的问题 , 时间为null时不能添加数据库
  3. 全息投影是计算机技术吗,什么是3D全息投影沙盘技术?
  4. 记录局域网内金蝶云无法访问服务器故障
  5. java社团管理系统文库_学生社团管理系统的设计与实现
  6. @JsonFormat注解未设置时区导致的返回时间错误
  7. 非结构化数据传统管理的弊端
  8. 智邦国际ERP系统解决生产质检管理难题
  9. 【面向对象】继承和多态的弊端
  10. 自助柜员机属于微型计算机吗,银行自助柜员机语音提示很给力