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中设置的代理连接到公司服务器了,加快了服务器的访问速度。

Saturday, March 11, 2006

Ruby on Rails

1. 什么是RUBY ?
Ruby 是由日本人松本行弘发明的一种面向对象的脚本语言.声称,更快,更通俗易懂的面向对象的语言,本人接触这段时间,感觉到关于面向对象的确做得不错.一些特点:

1)一切都是对象,例如:
数据类型转换提供如 to_ary,to_i,to_s 等方法,
@i = "2".to_i //字符串转数值类型
puts @i+1
不再象java中的诸如:
Integer.parseInt()
String.valueOf()
那样难看与及难以理解

Time.now.strftime(fmt) 
Time.now对象通过strftime格式化日期类型  
再如koalant在它那本ruby on rails实践中说到 -166.abs 可以直接取其-166绝对值 ………………

2)代码块非强制用{} ,无需 ; 作分行标识;

3)语法灵活,一种可以功能可多种实现,随个人爱好;

4)语法简洁等,做一个应用只要用到几行代码,这也是脚本语言的优势所在

更详细可参考 http://www.ruby-lang.org/ 以及下面提供的些文档资料.

2. 什么是Rails
RAILS是丹麦的小伙子David用RUBY开发的一个web框架. 也叫Ruby On Rails(ROR),它采用模型/视图/控制器(model/view/controller,MVC)架构。
实现一站式开发. http://www.rubyonrails.org/ 有比较详细的介绍.
声称用更少的代码实现web applications。
此框架主要包括三部分
Active Record 一个ORM实现 , 是 Rails 的一个核心组成部分,它将关系型表映射为 Ruby 对象,应用程序的 app/models/ 目录中的 Ruby 文件能够调用 ActiveRecord 的多种验证方法。
Action Pack View 以及controller
控制器以其抽象形式执行应用程序的逻辑。也就是说,应用程序的 app/controllers/ 目录中的 Ruby 脚本能把模型数据导入为变量,保存回去,或对其进行修改和处理。不过,控制器不关心用户如何适当地显示或者输入数据。
视图是我们编写 Ruby 代码的地方。Rails 包含有一门用于 .rhtml 的非常好的模板语言,它将纯粹的 HTML 与嵌入的 Ruby 代码组合起来。 Rails 应用程序界面的最表层外观通常是由 CSS 样式表单控制的。.rhtml 格式是一种增强的 HTML。
Action Mailer 应该是关于mail方面的东西

3. ROR设计思想: 新兴的Web Application快速开发框架
和Python, PHP, VBScript类似, Ruby也是一种动态脚本语言, 但相比Python有更广泛的应用范围, 同时Python有一大特性:Python能够与C无缝集成,现在IronPython又能够与C#集成.
在Python下类似ROR的开发框架有:CherryPyKarrigellTurboGearsDjango, 它们的比较可以看这里http://perhaps.cnblogs.com/archive/2005/10/14/254670.aspx, 和中国的Pathon社区中的一篇文章[Karrigell学习]我为什么选择了Karrigell .
.Net阵营中,CASTLE就是.Net里的ROR设计思想的实现, 主页看这里http://castleproject.org/index.php/ActiveRecord.

一些资料
Really Getting Started in Rails
Rolling with Ruby on Rails Part1 Part 2
Ajax on Rails
Top 12 Ruby on Rails Tutorials
[rails] 我的订餐系统 -- 小试ruby on rails
http://www-128.ibm.com/developerworks/cn/linux/l-rubyrails/#resources 使用 Ruby on Rails 快速开发 Web 应用程序
http://www-128.ibm.com/developerworks/cn/java/wa-rubyonrails/ Ruby on Rails 和 J2EE:两者能否共存?
http://www.rubycentral.com/book/index.html Programming Ruby

Friday, March 03, 2006

AJAX

老赵点滴

Dflying Chen @ cnblogs

Atlas三月份CTP版发布,文档同时大幅更新
http://atlas.asp.net/Default.aspx?tabid=47
atlas.asp.net上Scott Guthrie的Atlas演示录像非常值得一看

Resources:
http://atlas.asp.net/ ATLAS ASP.NET AJAX
Atlas 实现机制浅析
http://ajaxpatterns.org/ AJAX Pattern
http://ajax.schwarz-interactive.de/csharpsample/default.aspx free library for the Microsoft .NET Framework
Bitkraft Integrated Client/Server approach to Ajax Development in the ASP.NET environment PowerWEB LiveControls for ASP.NET Ajax for Visual Studio ASP.NET

Multiplatform
Backbase Community Edition includes all presentation client (Ajax) functions and full utilization of BXML (B-tags).
WebORB by Midnight Coders. .NET and Java Server platform for Ajax-based applications.
http://all.allnet.cn/News/Details.aspx?aid=132 Ajax 学习资源

AJAX经典应用网站  
http://maps.google.com
http://www.writely.com
http://www.meebo.com  
http://local.live.com   
http://www.google.com/ig  
http://www.live.com  
http://www.netvibes.com/  
http://www.pageflakes.com/  
http://www.favoor.com/  
http://www.eskobo.com/  
http://www.protopage.com/v2  
http://www.zoozio.com/  
http://webserver002.goowy.com/  
http://www.wrickr.com/  
http://www.cfempire.com/home  
http://www.okrss.com/  
http://labs.systemone.at/retrievr
http://www.fcsoft.com.cn/ 方成正康软件

Javascript on Firefox & IE

Javascript on Firefox & IE

JavaScript语言中的Literal Syntax特性
http://www.cnblogs.com/birdshome/archive/2005/02/26/105867.html

1. XmlHttp: IE是用ActiveX方式,而Firefox是内置实现的
xmlHttp=new ActiveXObject('Msxml2.XMLHTTP'); //IE
xmlHttp=new XMLHttpRequest(); //FF
可以用下面的写法,可以比较好的兼容IE和Firefox:
function createXH(){
var A=null;
try { A=new ActiveXObject('Msxml2.XMLHTTP') } catch(e) {
try{A=new ActiveXObject('Microsoft.XMLHTTP') } catch(oc) { A=null }
}
if ( !A && typeof XMLHttpRequest != 'undefined' ) { A=new XMLHttpRequest() }
return A
}

请求和接收回应
var xmlhttp=createXH();
xmlhttp.open('POST', 'Message/CheckNew.aspx', false); //false - 同步执行的方式 ; true - 异步执行的方式
xmlhttp.send(''); // 这里也可以在请求时发送一些数据,如果没有数据,也要发个空数据
var rt=xmlhttp.responseText;

异步执行下接收回应:
var xmlhttp = createXH();
function checkNewMessages(){
xmlhttp.open('POST', 'Message/CheckNew.aspx', true);
xmlhttp.onreadystatechange=continue;
xmlhttp.send('');
}
function continue(){
if(xmlhttp.readyState==4){
var rt = xmlhttp.responseText;
}
}

2. event object
In Firefox, it's passed in to the event handler
Unfortunately, IE holds the event in a window attribute instead of passing it in
function shutdown(ev) {
ev = window.ev ev;
....
}

3. What attributes of the Event should be inspected
Element - target (Firefox), srcElement (IE)
Event type - type
Key code - which (Firefox), keyCode (IE)
Key modifiers - altKey, ctrlKey, shiftKey
Mouse buttons - button: In IE, 1 is left, 2 is right, and middle is 4. Value represents the sum of all buttons being pressed
In Firefox, 0 is left, 1 is middle, and 2 is right.
Mouse position - clientX, clientY

4. How should event handlers be dynamically registered
quitButton.onclick = shutdown (IE)
quitButton.attachEvent('onclick', shutdown) (IE)
quitButton.addEventListener('click', shutdown, false) (Firefox)