阿江的 Windows 服务器安全设置攻略

 技术学习  没有评论 »
312005
 

其实,在服务器的安全设置方面,我虽然有一些经验,但是还谈不上有研究,所以我写这篇文章的时候心里很不踏实,总害怕说错了会误了别人的事。

本文更侧重于防止ASP漏洞攻击,所以服务器防黑等方面的讲解可能略嫌少了点。

基本的服务器安全设置

安装补丁

安装好操作系统之后,最好能在托管之前就完成补丁的安装,配置好网络后,如果是2000则确定安装上了SP4,如果是2003,则最好安装上SP1,然后点击开始→Windows Update,安装所有的关键更新。

安装杀毒软件

虽然杀毒软件有时候不能解决问题,但是杀毒软件避免了很多问题。我一直在用诺顿2004,据说2005可以杀木马,不过我没试过。还有人用瑞星,瑞星是确定可以杀木马的。更多的人说卡巴司机好,不过我没用过。

不要指望杀毒软件杀掉所有的木马,因为ASP木马的特征是可以通过一定手段来避开杀毒软件的查杀。

设置端口保护和防火墙、删除默认共享

都是服务器防黑的措施,即使你的服务器上没有IIS,这些安全措施都最好做上。这是阿江的盲区,大概知道屏蔽端口用本地安全策略,不过这方面的东西网上攻略很多,大家可以擞出来看看,晚些时候我或者会复制一些到我的网站上。

权限设置

阿江感觉这是防止ASP漏洞攻击的关键所在,优秀的权限设置可以将危害减少在一个IIS站点甚至一个虚拟目录里。我这里讲一下原理和设置思路,聪明的朋友应该看完这个就能解决问题了。

权限设置的原理

WINDOWS用户,在WINNT系统中大多数时候把权限按用户(組)来划分。在【开始→程序→管理工具→计算机管理→本地用户和组】管理系统用户和用户组。 

NTFS权限设置,请记住分区的时候把所有的硬盘都分为NTFS分区,然后我们可以确定每个分区对每个用户开放的权限。【文件(夹)上右键→属性→安全】在这里管理NTFS文件(夹)权限。 

IIS匿名用户,每个IIS站点或者虚拟目录,都可以设置一个匿名访问用户(现在暂且把它叫“IIS匿名用户”),当用户访问你的网站的.ASP文件的时候,这个.ASP文件所具有的权限,就是这个“IIS匿名用户”所具有的权限。 

权限设置的思路

要为每个独立的要保护的个体(比如一个网站或者一个虚拟目录)创建一个系统用户,让这个站点在系统中具有惟一的可以设置权限的身份。 

在IIS的【站点属性或者虚拟目录属性→目录安全性→匿名访问和验证控制→编辑→匿名访问→编辑】填写刚刚创建的那个用户名。 

设置所有的分区禁止这个用户访问,而刚才这个站点的主目录对应的那个文件夹设置允许这个用户访问(要去掉继承父权限,并且要加上超管组和SYSTEM组)。 

这样设置了之后,这个站点里的ASP程序就只有当前这个文件夹的权限了,从探针上看,所有的硬盘都是红叉叉。

我的设置方法

我是先创建一个用户组,以后所有的站点的用户都建在这个組里,然后设置这个组在各个分区没病权限。然后再设置各个IIS用户在各在的文件夹里的权限。

因为比较多,所以我很不想写,其实知道了上面的原理,大多数人都应该懂了,除非不知道怎么添加系统用户和組,不知道怎么设置文件夹权限,不知道IIS站点属性在那里。真的有那样的人,你也不要着急,要沉住气慢慢来,具体的方法其实自己也能摸索出来的,我就是这样。当然,如果我有空,我会写我的具体设置方法,很傲能还会配上图片。

改名或卸载不安全组件

不安全组件不惊人

我的在阿江探针1.9里加入了不安全组件检测功能(其实这是参考7i24的代码写的,只是把界面改的友好了一点,检测方法和他是基本一样的),这个功能让很多站长吃惊不小,因为他发现他的服务器支持很多不安全组件。

其实,只要做好了上面的权限设置,那么FSO、XML、strem都不再是不安全组件了,因为他们都没有跨出自己的文件夹或者站点的权限。那个欢乐时光更不用怕,有杀毒软件在还怕什么时光啊。

最危险的组件是WSH和Shell,因为它可以运行你硬盘里的EXE等程序,比如它可以运行提升程序来提升SERV-U权限甚至用SERVU来运行更高权限的系统程序。

卸载最不安全的组件

最简单的办法是直接卸载后删除相应的程序文件。将下面的代码保存为一个.BAT文件,

  CODE: [Copy to clipboard]   

regsvr32/u C:\WINNT\System32\wshom.ocx

del C:\WINNT\System32\wshom.ocx

regsvr32/u C:\WINNT\system32\shell32.dll

del C:\WINNT\system32\shell32.dll 

 

然后运行一下,WScript.Shell, Shell.application, WScript.Network就会被卸载了。可能会提示无法删除文件,不用管它,重启一下服务器,你会发现这三个都提示“×安全”了。

改名不安全组件

需要注意的是组件的名称和Clsid都要改,并且要改彻底了。下面以Shell.application为例来介绍方法。

打开注册表编辑器【开始→运行→regedit回车】,然后【编辑→查找→填写Shell.application→查找下一个】,用这个方法能找到两个注册表项:“{13709620-C279-11CE-A49E-444553540000}”和“Shell.application”。为了确保万无一失,把这两个注册表项导出来,保存为 .reg 文件。

比如我们想做这样的更改

  QUOTE: 

13709620-C279-11CE-A49E-444553540000 改名为 13709620-C279-11CE-A49E-444553540001

Shell.application 改名为 Shell.application_ajiang 

那么,就把刚才导出的.reg文件里的内容按上面的对应关系替换掉,然后把修改好的.reg文件导入到注册表中(双击即可),导入了改名后的注册表项之后,别忘记了删除原有的那两个项目。这里需要注意一点,Clsid中只能是十个数字和ABCDEF六个字母。

下面是我修改后的代码(两个文件我合到一起了):

  CODE: [Copy to clipboard]   

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\CLSID\{13709620-C279-11CE-A49E-444553540001}]

@="Shell Automation Service"

[HKEY_CLASSES_ROOT\CLSID\{13709620-C279-11CE-A49E-444553540001}\InProcServer32]

@="C:\\WINNT\\system32\\shell32.dll"

"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT\CLSID\{13709620-C279-11CE-A49E-444553540001}\ProgID]

@="Shell.Application_ajiang.1"

[HKEY_CLASSES_ROOT\CLSID\{13709620-C279-11CE-A49E-444553540001}\TypeLib]

@="{50a7e9b0-70ef-11d1-b75a-00a0c90564fe}"

[HKEY_CLASSES_ROOT\CLSID\{13709620-C279-11CE-A49E-444553540001}\Version]

@="1.1"

[HKEY_CLASSES_ROOT\CLSID\{13709620-C279-11CE-A49E-444553540001}\VersionIndependentProgID]

@="Shell.Application_ajiang"

[HKEY_CLASSES_ROOT\Shell.Application_ajiang]

@="Shell Automation Service"

[HKEY_CLASSES_ROOT\Shell.Application_ajiang\CLSID]

@="{13709620-C279-11CE-A49E-444553540001}"

[HKEY_CLASSES_ROOT\Shell.Application_ajiang\CurVer]

@="Shell.Application_ajiang.1" 

 

你可以把这个保存为一个.reg文件运行试一下,但是可别就此了事,因为万一黑客也看了我的这篇文章,他会试验我改出来的这个名字的。

防止列出用户组和系统进程

我在阿江ASP探针1.9中结合7i24的方法利用getobject("WINNT")获得了系统用户和系统进程的列表,这个列表可能会被黑客利用,我们应当隐藏起来,方法是:

【开始→程序→管理工具→服务】,找到Workstation,停止它,禁用它。

防止Serv-U权限提升

其实,注销了Shell组件之后,侵入者运行提升工具的可能性就很小了,但是prel等别的脚本语言也有shell能力,为防万一,还是设置一下为好。

用Ultraedit打开ServUDaemon.exe查找Ascii:LocalAdministrator,和#l@$ak#.lk;0@P,修改成等长度的其它字符就可以了,ServUAdmin.exe也一样处理。

另外注意设置Serv-U所在的文件夹的权限,不要让IIS匿名用户有读取的权限,否则人家下走你修改过的文件,照样可以分析出你的管理员名和密码。

利用ASP漏洞攻击的常见方法及防范

一般情况下,黑客总是瞄准论坛等程序,因为这些程序都有上传功能,他们很容易的就可以上传ASP木马,即使设置了权限,木马也可以控制当前站点的所有文件了。另外,有了木马就然后用木马上传提升工具来获得更高的权限,我们关闭shell组件的目的很大程度上就是为了防止攻击者运行提升工具。

如果论坛管理员关闭了上传功能,则黑客会想办法获得超管密码,比如,如果你用动网论坛并且数据库忘记了改名,人家就可以直接下载你的数据库了,然后距离找到论坛管理员密码就不远了。

作为管理员,我们首先要检查我们的ASP程序,做好必要的设置,防止网站被黑客进入。另外就是防止攻击者使用一个被黑的网站来控制整个服务器,因为如果你的服务器上还为朋友开了站点,你可能无法确定你的朋友会把他上传的论坛做好安全设置。这就用到了前面所说的那一大堆东西,做了那些权限设置和防提升之后,黑客就算是进入了一个站点,也无法破坏这个网站以外的东西。

后记

也许有安全高手或者破坏高手看了我的文章会嘲笑或者窃喜,但我想我的经验里毕竟还是存在很多正确的地方,有千千万万的比我知道的更少的人像我刚开始完全不懂的时候那样在渴求着这样一篇文章,所以我必须写,我不管别人怎么说我,我也不怕后世会有千千万万的人对我唾骂,我一个人承担下来,我也没有娘子需要交代的……

因为这其实只是抛砖引玉的做法,从别人的笑声中,我和我的读者们都可以学到更多有用的东西。

GRANT用法简介

 技术学习  没有评论 »
302005
 

SQL Server 2000的GRANT语句用于向用户、角色和组授予使用数据库对象以及运行某些存储过程和函数的权限。

GRANT的语法非常简单——虽然它是SQL Server 2000中功能最强大的语句之一。下面的例子授予皮特(Pete)对pubs数据库中的authors表进行 INSERT、UPDATE和DELETE的权限。WITH GRANT OPTION表示皮特也可以用这些语句来向其它用户授权。

USE pubs

GO

GRANT INSERT, UPDATE, DELETE

ON authors

TO Pete

WITH GRANT OPTION

GO

你也可以授予皮特ALL权限,这样他还可以使用CREATE DATABASE、CREATE FUNCTION、CREATE RULE、CREATE TABLE、BACKUP DATABASE以及其它语句。不过,我们一般都希望限制用户的访问和操作数据库的权限。

除了对单独的用户外,你还可以对SQL Server角色、Windows NT用户以及Windows NT组使用GRANT语句。如果用户和(或者)组或者角色之间存在授权冲突,那么按照最严格的授权处理。不能对其它数据库的用户、角色或者组进行授权。

你可以用REVOKE语句来解除已经授予的权限。你也可以用DENY语句来停止阻止用户从他(她)所从属的组(或者角色)那里来得到授予该组(或者角色)的权限。

在下面的例子中,我们将会看到拥有pubs数据库中的authors表权限的人有哪些。然后,我们给予皮特访问数据库的权限。最后,我们再给他对authors表执行INSERT、UPDATE和DELETE的权限。

首先,我们运行sp_helpprotect来看看authors表格上哪些人有哪些权限。

Exec sp_helprotect authors

GO

结果应该与下面类似:

Owner  Object   Grantee  Grantor   ProtectType  Action            Column

—-        ——       ——-    ———-    ————-     ———             ——-

dbo       authors  guest    dbo           Grant              Delete

dbo       authors  guest    dbo           Grant              Insert

dbo       authors  guest    dbo           Grant              References    (All+New)

dbo       authors  guest    dbo           Grant              Select             (All+New)

dbo       authors  guest    dbo           Grant              Update          (All+New)

由于在皮特得到访问数据库的权限之前,我们不能向他授以执行任何语句的权限,因此,我们应该首先让皮特获得访问数据库的权限。(实际上,为了可以使用已授予的权限,皮特需要一个SQL Server 2000登录帐号和访问该数据库的许可。这个例子为一个SQL Server 2000中尚未存在的用户创建访问数据库的许可。)

EXEC sp_grantdbaccess Pete

GO

你将会看到“Granted database access to ‘Pete”。

让我们运行较早前提到的GRANT INSERT, UPDATE, DELETE语句。现在重新执行sp_helpprotect,最后三行应该显示皮特以及他刚才所获得授权的信息。

江南

 心情随笔  没有评论 »
232005
 

再一次聆听林俊杰的《江南》,以为模糊的记忆再次如幻灯片闪于脑海。反复,不停反复的听着,直到百事喝完,直到烟熄灭,直到眼睛酸的睁不开。。。

 

不知道是THE9服务器的问题还是公司网络的异常,今天魔兽世界三区的服务器经常掉线。索性把游戏关了,打开FLASHGET下几本电影。洗个澡,冲了杯咖啡,静静的坐了下来。不知道在医院的表妹今天状况怎么样,小灵通关了之后就不知道如何联系了。有时候真不了解,没有网络,没有电话的古代,人类是通过一种什么样的方式来进行的交流与沟通。工作以后,我始终以自己是一个IT人士而感到有点虚荣,一年多,第一次体会到加薪的感觉,有点开心,也有点失落。开心于每个月可以多存几百块钱,失落于自己现实到因为钱而开心。

前天跟一个N年没有见过面的高中同学聊天,我说三年后我想出国,去加拿大。说这些话的时候有一种轻飘飘的感觉,大学里的年少轻狂在当初招聘会上被打击的毫无残留。有梦想是件好事,只是当这样的年龄需要开始规划自己的将来的时候,梦想显得有点渺茫。今天联系到了高中的挚友,他说他在北京闯,问我最近身体如何?工作顺利不?我不知道再次面对他的时候是一种什么样的状况,只是回忆那段久远的时光,我不禁觉得校园生活离我真的已经是越来越遥远了。微说她的灵魂依旧留在了学校,好象始终无法带走的样子。我说再回去看看吧,把该带走的全部带走,人长大了,不能一直生活在梦里。看到笨蛋以及几位将要毕业的POPWINDer毕业前留下的文字,学校的感觉一次又一次的冲击着我的内心。玩魔兽的时候让我想起了大学里,从开始的文字MUD,夕阳在线,到后来的奇迹MU,买个鸡蛋饼当夜宵,抽根一品梅当咖啡的日子已经一去不再复返了,也令我疯狂的想念我的大学同学们,不知道曾经嬉笑打闹的兄弟们过的如何。聚一下吧,再喝一次金山城,六月份,不见不散,我也该把我残留的灵魂带回来了。

老大问我有没有兴趣再一起去一次西湖,我笑而没答。2005年,应该是看海的时候,我记住了10年前定下的誓言,2005年看大海。很多人都惊讶,我居然从来没看过大海,从来不相信山盟海誓,可是这样一个给自己定下的誓言却眼睁睁的摆在了眼前,白云下蔚蓝的大海,沙滩,海鸥……那是一个梦,美丽的即将成为现实的梦。

请老大从台湾带回来的 DunHill,虽然很淡,但是很香,犹如平淡生命里的那些回忆,远远的,纯纯的……

Static 的意義與實作方式

 技术学习  没有评论 »
132005
 

「將某 class 產生出一個 instance 之後,此 class 所有的 instance field 都會新增一份,那麼所有的 instance method 是否也會新增一份?」我常常看到網路上有人在討論此問題,所以寫了這篇文章,以為解釋。

Member 的種類
類別(class)的內部組成統稱為成員(member),如果依據成員是「資料」還是「程式」來區分,可以分成:
資料,被稱為 field
程式,被稱為 method
如果再依據有無使用 static 修飾而細分,則成員可細分成四種:
class field:有用 static 修飾的 field
class method:有用 static 修飾的 method
instance field:沒有用 static 修飾的 field
instance method:沒有用 static 修飾的 method
顧名思義,class field/method 和 class 本身有密切的關係,而 instance field/method 則與 instance(也就是物件)有密切的關係。請看下面的範例程式。

public class Class1 {
public static int classField;
public static void classMethod1() {
// …
}
public static void classMethod2() {
// …
}
public int instanceField;
public void instanceMethod1() {
// …
}
public void instanceMethod2() {
// …
}
}
public class Class2 {
public static void classMethod () {
// …
}
public void instanceMethod() {
// …
}
}

Field
宣告 field 時,如果前面加上 static 的修飾字,就會使得此 field 變成是 class field。一個 class field 永遠只佔用一塊記憶體,而且此記憶體空間是在此 class 一被載入(load)記憶體之後就立刻配置的(allocate),感覺就如同此 field 與該 class 本身相關,而不是與該 class 的 instance 相關。class field 可以被同一個 class 的 class method 內部所直接使用,舉例來說,上述的 classMethod1() 內部可以出現 classField。如果 Class1 的 class method 或 instance method 欲使用到 Class2 的 class field,就必須在前面冠上 Class2,例如:Class2.classField。

宣告field時,如果前面「不」加上 static 的修飾字,就會使得此 field 變成是 instance field。對 instance field 而言,每產生一個instance(物件)就多一塊 instance field 的記憶體,每少一個 instance 就少一塊 instance field 的記憶體。instance field 可以被同一個 instanc e的 instance method 內部所直接使用,舉例來說,上述的 instanceMethod1() 內部可以出現 instanceField。如果某 class 的class method 或 instance method 欲使用到某 instance 的 instance field,就必須在前面冠上 instance 名稱,例如:obj.classField。

Method
宣告 method 時,如果前面加上 static 的修飾字,就會使得此 method 變成是 class method。對 class method 而言,永遠只佔用一塊記憶體,而且此記憶體空間是在此 class 一被載入進記憶體之後就立刻配置的,就如同此 method 是與該 class 本身相關,而不是與該 class 的 instance 相關。class method 可以被同一個 class 的任何 class method 內部所直接使用,舉例來說,上述的classMethod1() 內部可以出現 classMethod2()。如果 Class1 的 class method 或 instance method 欲使用到 Class2 的 classMethod(),就必須在前面冠上 Class2,也就是 Class2.classMethod()。

宣告 method 時,如果前面「不」加上 static 的修飾字,就會使得此 method 變成是 instance method。對 instance method 而言,每產生一個 instance「並不會」多一塊 instance method 的記憶體。同一個 method 不管被調用(invoke)幾次,也不管被調用時的instance 是何者,每次的程式碼完全都一樣,差別只在每次執行時資料不同,而資料是存放在 call stack 中,所以不會混淆。在 instance method 內,資料的來源包括了參數和 instance field。參數被傳進來變成 call stack 內的 entry,所以不會混淆,這很容易理解,但是 instance field 是如何區隔開來的(前面剛提過:instance field 會隨著 instance 數目增加而增加),這是透過隱匿(implicit)的 this 參數來達到了,稍後會有說明。instance method 可以被同一個 instance 的 instance method 內部所直接使用,舉例來說,上述的 instanceMethod1() 內部可以出現 instanceMethod2()。如果某 class 的 class method 或 instance method 欲使用到某 instance 的某 instance method,就必須在前面冠上此 instance 名稱,例如:obj.classMethod()。

隱匿的 this 參數
綜合上面的敘述來看:
class field:共用一塊記憶體
class method:共用一塊記憶體
instance field:隨著每個 instance 各有一塊記憶體
instance method:共用一塊記憶體
instance method 為什麼不是隨著每個 instance 佔有一塊記憶體,反倒是共用一塊記憶體?其實,讓每個 instance method 如同instance field 一樣,隨著每個 instance 佔有一塊記憶體,這麼做當然是可以的,只是 Java 編譯器和 JVM 都不這麼做,因為太浪費記憶體空間了。一個 field 少則佔用一個 byte,多則佔用數百 Byte,但是 method 少則數個 byte,多則數百 Kilo Byte。Mehtod耗費的記憶體是 field 的數百倍,甚至數千倍,當然是能共用就盡量共用,比較不會消耗記憶體。既然 JVM 讓一個 class 的所有instance 共用相同的 instance method,下面兩行程式碼在 instanceMethod() 內部時,如何區分是 instance1 或 instance2?

instance1.instanceMethod();
instance2.instanceMethod();

因為編譯器會幫我們在把 instance1 和 instance2 個別傳入 instanceMethod() 中當作第一個參數。也就是說,任何 instance method 參數的實際個數都會比表面上多一個,這個多出來的參數是由 Java 編譯器幫我們加上去的,用來代表對應的 instance。此參數的變數名稱為 this,也是 Java 的一個關鍵字(keyword)。

當調用某個 instance method 或使用某個 instance field 時,你必須在前面加上該 instance 的名稱,如果該 instance method/field 相關的 instance 和當時程式碼所在的 instance method 的 instance 指的是同一個 instance 時,該 instance 的名稱就是 this,這種情況下,你也可以選擇不在前面加上「this.」。

然而,在某些狀況下,非得在前面加上「this.」不可。例如,當method中的參數或區域變數和 instance field 名稱完全相同時,如果不在前面冠上「this.」,那麼指的是參數或區域變數;如果在前面冠上「this.」,那麼指的才是 instance field。

妈妈,节日快乐

 心情随笔  没有评论 »
082005
 

妈妈,节日快乐

Powered by WordPress 3.3.1 CopyRight 2004~2012, Sonic Tang

虚拟主机赞助商:海波,苏ICP备11082989号

Suffusion theme by Sayontan Sinha