Friday, March 17, 2006

配置比较安全的远程控制服务器

提到远程控制软件,大家并不陌生,比较出色的远程控制软件有 VNC, Symantec pcanywhere, Microsoft Romote Desktop Connection等等。

但是vnc凭借着他比较小的体积,比较快的速度,以及比较好的跨平台性能而出众,我用vnc远程连接windows95,98,nt,2000,xp,2003当然还有unix家族的系统。

RealVNC--小巧、有效、免费、跨平台、使用简单,而且也有必要的安全机制(原版VNC的安全机制还是有些稍嫌简陋,不过有一群俄国人正在做更安全的改版)。对于跟我一样的个人用户来说,VNC太棒了。

UltraVNC--基于RealVNC的一个很棒的改进版,速度狂快,内建文件传送。在带宽足够的情况下,客户端连接时指定占用带宽最大的Ultra模式(2Mbits/s),则几乎不再出现屏幕刷新不及时的问题,效果几乎和微软的远程桌面一样好,超越了pcanywhere。

TightVNC also offers a number of improvements, including compression to optimize transfer over slower connections, graphical support for advanced configuration options, and automatic SSH tunneling for Unix systems.

但是vnc并不支持安全加密的传输网络中的数据,这便是个遗憾了,因此,我找到了stunnel这个软件来弥补这个不足,这个软件是对socket端口进行加密解密传输的软件,需要openssl库的支持,具体做法如下:

现在先划分一下结构,一台vnc服务器,一台vnc客户端。

在两台机器上分别安装了vnc后,客户端可以很顺利的连接到vnc服务器,但是这个连接是不安全的。

下面只需要在两台机器上分别安装好stunnel软件,在两台机器上还要进行一下配置

首先在服务器方面,在c:\program files安装stunnel

在客户端的c:\program files安装stunnel

接下来要生成证书,这个证书是基于3方验证的,有一个安全中心来验证服务器和客户端的身份信息

具体方法如下:

安装openssl到c:\program files\openssl

下载2个文件,一个配置文件, openssl.conf,可以从http://www.securityfocus.com/data/tools/openssl.conf下载
ca.bat 脚本文件,用来生成证书,下载地址: http://www.securityfocus.com/data/tools/ca.bat

这2个文件也必须放置到C:\Program Files\OpenSSL.文件夹


接下来生成证书,用来鉴别VNC的服务器和客户端.
生成密匙和证书
CA认证
这个过程首先应该产生一个私人/公共密钥对,同时产生一个第三方信任的证书.在随后的过程中私人密匙将用来签发VNC服务端和客户端的证书,CA证书将被分配给所有的VNC服务端和客户端.因为CA私人密匙是PKI执行过程中最重要的基础之一,所以密匙应该被赋予一个通行码(pass phrase)。 通行码也可以被称做为口令,是用来保护私匙的密码,用户可以自由选择。不用口令是不能使用私匙的,因此口令和私匙同样重要。需要选取一个安全的口令。.
我们通过ca.bat这个批处理文件来产生密匙对和证书:
C:\program files\OpenSSL\ca genca

完成以上步骤之后,CA证书将存储在c:\ca\cacert.pem文件中,私人/公共密匙对存储在C:\CA\private\CAkey.pem文件中。


VNC服务端
接下来产生服务端的密匙对和证书。
~OpenSSL\ca genca\OpenSSL\ca server

于是,在C:\CA\temp\vnc_server生成如下文件:
server.key – 私人/公共密匙对
server.crt – 服务器端的证书
server.pem - server.key + server.crt (在使用Stunnel时将用到)
应该强调的是,服务端的私匙并没有通行码来加密,使用通行码来加密私匙的方法并没有在这里派上用场,主要是因为Stunnel尚不支持通行码,其次,是用通行码加密后的私匙将不能被用于Stunnel软件。

VNC客户端

最后一步是产生客户端的密匙对和证书。
~OpenSSL\ca client


跟服务端类似,在C:\CA\temp\vnc_client文件夹中将产生如下文件:

client.key –私人/公共密匙对r
client.crt – 客户端证书
client.pem – client.key + client.crt (在使用Stunnel时将用到)


最后就要设置stunnel了

在vnc服务器端,c:\program files\stunnel中建立配置文件stunnel.conf

CAfile = CAcert.pem
CApath = certificates
cert = server.pem
client = no
verify = 3

[vnc]
accept = 443 ;将所有的443端口的请求转发到127.0.0.1:5900上
connect = 127.0.0.1:5900

接下来,将刚刚生成的ca证书(C:\CA\CAcert.pem)和VNC服务端的密匙,证书(C:\CA\temp\vnc_server\server.pem)放到C:\Program Files\Stunnel
最后我们也必须安装VNC客户端证书,要想使隧道程序在鉴定过程中找到证书,我们必须按照以下方法来更改证书名称。(以下命令必须在产生证书的服务器上运行,其中value为运行openssl x509命令之后的输出结果,在使用copy命令时,value必须要用这个实际的输出结果代替。)
cd C:\CA\temp\vnc_client
C:\progra~1\openssl\openssl x509 -hash -noout -in client.crt
value(假设这个值为6a03212)
copy client.crt 6a03212.0

然后这 6a03212.0文件应该被放到vnc服务器的C:\Program Files\Stunnel\certificates

VNC客户端

在客户端配置的情况和以上的步骤类似
首先C:\Program Files\Stunnel\新建一个stunnel.conf文件
内容:
CAfile = CAcert.pem
CApath = certificates
cert = client.pem
client = yes
verify = 3

[vnc]
accept = 127.0.0.1:5900
connect = VNC_server_IP_address:443

接下来,将ca证书(C:\CA\CAcert.pem)和VNC客户端的密匙,证书(C:\CA\temp\vnc_client\client.pem)放到C:\Program Files\Stunnel
同样我们需要按照以下方法来更改证书名称。

cd C:\CA\temp\vnc_server
C:\progra~1\openssl\openssl x509 -hash -noout -in server.crt
value(假设这个值为6a03212)
copy client.crt 551234.0

然后这 551234.0文件应该被放到vnc服务器的C:\Program Files\Stunnel\certificates

到这里所有的操作就完成了,需要注意的是,我们再用vnc连接vnc服务器的时候,ip地址就不要输入服务器的地址了,因为那样依然没有通过stunnel做加密。正确的做法应该是使用127.0.0.1这个ip,我们从客户端stunnel配置文件可以看出来,在客户端所有的127.0.0.1:5900(vnc连接请求)都会通过443这个端口转发到vnc_server_ip_address这个ip上。而这个ip就是我们的vnc服务器ip。当数据通过443传达到vnc服务器的时候,由于vnc服务器的设置,他会将443端口过来的信息转发到它本地(127.0.0.1)的5900端口上,这样便使得我们的数据发送到了vnc服务器中,整个的过程图示如下:



附: UltraVNC进阶技巧

1. 开机就玩远程控制
在“开始→运行”中输入“C:\winsock\UltraVNC\winvnc.exe -install”(不含引号)完成服务的安装,这样以\winsock\UltraVNC\winvnc.exe -remove”(不含引号),可以卸载服务。

2. 隐藏系统托盘图标


有时我们不需要UltraVNC在任务栏上显示图标,甚至希望UltraVNC在后台“默默”地运行,那么你可以打开“记事本”,输入如下内容,保存为REG文件,并运行将其导入注册表(Windows 9x用户修改第一行为REGEDIT4):

  Windows Registry Editor Version 5.00
  
  [HKEY_LOCAL_MACHINE\SOFTWARE\ORL\WinVNC3]
  "DebugMode"=dword:00000002
  "DebugLevel"=dword:0000000a
  "AllowLoopback"=dword:00000001
  "MSLogonRequired"=dword:00000000
  "UseDSMPlugin"=dword:00000000
  "DisableTrayIcon"=dword:00000001

3. 禁止使用UltraVNC
打开“注册表编辑器”,依次展开[HKEY_LOCAL_MACHINE\Software\ORL\WinVNC3\Default],在其下建立“双字节值”,键名为“AllowProperties”,键值为“0”。设置后,其他人就无法再修改启动“UltraVNC服务器”了。

4. 局域网外如何使服务器端发出连接信号
控制端在公网, 而服务器端在内网, 用到“反向发起连接”的功能。
a. 在控制端,运行“Run UltraVNC Viewer (Listen Mode)”,这时,客户端在进行监听,等待请求连接的信号。
b. 在服务器端,添加新客户,直接填写,控制端的公网ip地址,这样就发送了请求控制的信号给客户端。之后连接成功,就可以从公网直接穿过防火墙,透过路由器,控制了在局域网内的机器。
c. 在局域网外如何使服务器端发出连接信号呢?可以利用windows的任务计划功能,添加如下的任务,
"c:/program files/ultravnc/winvnc.exe" - connect 202.158.14.36:display用你自己客户端之ip地址来代替上面的,就可以了,修改任务为在指定时间开始,如11点开始,每过5分钟运行一次。
这样就完成了设置。
如果多个人想控制一台服务器,也需要反向连接,否则按照一般办法,谁最后发控制命令,VNC server 会断开之前的连接,始终只有最后一个与服务器进行成功连接的客户端!除非反向连接。

附: Window Remote Desktop Connection设置
自Windows 2000开始,微软就提供一项终端服务(Terminal Server)这项服务可以将远程的桌面传递到本地。通过该服务,可视化的远程管理可以非常方便的实现。继Windows 2000之后,Windows XP也提供这项服务。在Windows XP 中的Terminal Server Client程序比Windows 2000中的那个有了进一步的发展,许多功能都强大了许多。

Windows Server 2003 Service Pack 1 Administration Tools Pack


技巧一:默认端口也修改

大家应该知道远程桌面连接默认使用的端口是3389

将下列两个注册表键中的 PortNumber 均改成自定义的端口即可:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\Wds\Repwd\Tds\Tcp

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp

值得注意的是在输入被访问计算机IP地址时需要使用类似ip:port的形式。

技巧二:"The remote computer has ended the connection" 的问题
把以下设成0就可以了,表示Enable Distributed File System.
HKLM\System\CurrentControlSet\Services\Mup\DisableDFS = 0

技巧三:二次远程混淆解决方法

技巧描述:大家看到这个技巧名字可能不太明白,其实意思就是说我们从家中计算机A通过远程桌面连接到单位计算机B后,在计算机B上再使用远程桌面连接到计算机C,这就称为二次远程。

混淆现象:家中计算机A使用ADSL上网,单位接入服务器B(外网IP为211.154.80.29,内网IP为10.82.0.29),单位内部服务器C(IP地址为10.82.0.240)。由于服务器C没有公网IP地址在家是不能直接访问的,所以要想在家能够通过远程桌面连接到服务器C进行控制就必须进行二次远程连接,即从计算机A远程连接到服务器B211.154.80.29上,再从服务器B连接到服务器C。由于采用全屏幕操作所以从B连接到服务器C上后远程桌面界面上方显示的IP地址仍为211.154.80.29,并不是10.82.0.240。这时候想将服务器C与服务器B的桌面连接断开就不行了,因为一旦点右上的关闭按钮则会关闭A与B的连接,以后再用远程桌面连接到B时界面仍是在服务器C上。如果选择注销虽然可以断开B与C的连接但刚刚登录C运行的程序会立即关闭。

解决方法:其实有两种方法来解决这个混淆问题。
√ 方法一:窗口法
不使用全屏幕模式而改用窗口模式。(如图4)这样窗口的标题将显示出211.154.80.29,而窗口内显示的是正常的10.82.0.240,从而直接点窗口中10.82.0.240旁边的关闭按钮就可以断开B与C的连接了。

图4 点击看大图


√ 方法二:隐藏浮动条法
在使用远程桌面成功连接到远程计算机上后会在界面最上方有一个条状区域显示当前IP地址,我们点这个条状区域最左边的那个按钮就可以让条状区自动隐藏,(如图5)这样在C上使211.154.80.29浮动条自动隐藏后则真正的IP地址10.82.0.240就显示出来了,这时候直接点关闭按钮就可以断开C与B的连接了,而C上运行的程序也不会被关闭。


图5



技巧四:非管理员也玩远程桌面连接

环境描述:大家都知道只有管理员组用户才可以通过远程桌面连接程序管理服务器,非管理员组用户是没有远程桌面使用权限的,不过笔者所在公司有专门的人负责服务器上数据库的管理工作,而本人负责只服务器的日常维护。为了提高安全数据库管理人员不是管理员组的用户而他们又需要在家中登录服务器管理数据库。这时候就涉及到非管理员组用户也要使用远程桌面连接的问题。

WIN2000解决方法:我们通过任务栏的“开始->设置->控制面板->管理工具->终端服务配置”,在“连接”的“RDP-Tcp”属性里进行设置。(如图6)RDP-TCP属性中选择“权限”标签,通过“添加”按钮将你容许远程访问的用户组添加近来并配置相应的权限即可完成非管理员组的远程桌面访问。

图6

WIN2003解决方法:在WIN2003中的配置相对简单,因为系统内置了一个REMOTE DESKTOP USERS组,(如图7)我们把容许远程访问的用户添加到REMOTE DESKTOP USERS组中即可完成非管理员组的远程桌面访问。

图7 点击看大图


技巧五:远程桌面也玩代理

环境描述:由于公司处在教育网内,所以在家通过ADSL访问公司服务器速度非常慢,可是远程桌面程序选项中也没有提供设置代理服务器的地方,这时我们可以通过第三方代理工具来解决远程桌面用代理的问题。

实现方法:远程桌面程序只能使用SOCKS代理,我们可以下载sockscap32代理程序,然后把终端连接程序加到代理列表中即可,(如图8)这样我们使用终端连接程序时就可以通过sockscap32中设置的代理连接到公司服务器了,加快了服务器的访问速度。

1 comment:

Anonymous said...

[url=http://www.pi7.ru/foto/1527-prikolnye-lyudi-18-foto.html ]Шоколадное обертывание в домашних условиях [/url]
Всем привет! Уже 2 месяца встречаюсь с парнем, все у нас (тьфу-тьфу), хорошо - он чуткий, заботливый, отзывчивый, но... Есть одно НО: он каждый день с теплом вспоминает о собственной бывшей... Точнее она (судя по его словам) не абсолютно была его девушкой - у него был курортный роман с замужней (т.е. с ней). Но пребывание мужа не помешало ей иметь с ним связь (у моего тогда никого не было). Он даже приезжал в её город (она живет в Красноярске, соседнем регионе), и они там втайне от её мужа продолжали свои отношения. Теперь мой молодой человек созванивается с этой дамой некоторое количество раз в год, а в последствии очередного диалога с ней мне сообщает что она звонила, и буквально неделю про неё вспоминает, но меня убеждает, что она ему "чисто друг"...Что делать? Меня, в случае в случае если откровенно это задевает, я начинаю думать, что она - это и есть главная любовь его жизни, а я - так себе, извините за выражение "девочка напотрахаться"... Прошу, помогите советом, как мне быть?