网站运维、系统运维管理研究
2006/04/24杂七杂八

44条评论
50 views

一个完整的ftp远程批量shell!!

主文件为main.sh内容格式固定,调用程序autopro.sh文件可根据传送文件及目录随时更改

main.sh文件内容如下:

hostlist='198.1.1.1 198.1.1.2 198.1.1.3 …………………..'   #有多少主机IP,就一起写上吧!

echo

echo "—–远程FTP批量数据传送——"

echo -n "
请输入登录用户名:";read username

echo -n " 请输入用户口令 :"

stty -echo                         #将输入的口令隐起来

read userpwd

stty echo

echo "
发往以下主机:[用户名:$username]"

echo " $hostlist"

echo "
开始传送程序,按回车键开始 ………."

read goenter

for host in $hostlist            #所有主机IP循环语句

do

echo "正在向服务器 $host 正在传送数据 ………."

sh autopro.sh $host $username $userpwd #参数一为主机IP,参数二为用户名,参数三为口令

echo "服务器 $host 传送数据完成!!"

echo "OK"

sleep 2

done

echo "
全部数据传送完毕
"

autopro.sh 文件内容如下:

ftp -niv $1 <<!

user $2 $3          #参数2和3

bin

mkdir 20060415 #在远程主机上建一个目录

cd 20060415

mput /20060415/readme.txt  #注意本地文件存放目录必须与远程主机目录相同 

bye

!

一段Mysql 备份脚本

#/usr/bin/dbbackup.sh

#! /bin/bash

dbsum=$#

if [ &#34;${dbsum}&#34; -eq 0 ];then

echo &#34;Error:no database chosed&#34;

exit 1

fi

mkdir -p /backup/

backdir=/backup/

touch /var/log/dbbackup.log

datetime=`date +&#34;%Y%m%d&#34;`

filesum=`ls ${backdir} | wc -l`

if [ &#34;${filesum}&#34; -ge 3 ];then

cd ${backdir}

rm -rf `ls | head -1`

fi

cd /usr/local/mysql/bin

for i in $*;do

echo &#34;backing up for database $i starting …&#34;

mysqldump -u root -ppassword -e –extended-ins&#101;rt=false –default-character-set=utf8 $i > ${backdir}$i.sql

echo &#34;backing up for database $i completed&#34;

done

echo &#34;tar and gzip the backed file now …&#34;

cd ${backdir}

tar -c *.sql | gzip >./${datetime}.tar.gz

rm -rf *.sql

echo &#34;all success ! you can find the backed file in ${backdir} suffixed by .tar.gz&#34;

exit 0

编辑crontab,每晚11:30备份数据

crontab -e 加入如下内容:

30 23 * * * /usr/bin/dbbackup dbname1 dbname2 > /var/log/dbbackup.log 2>&amp;1

(转)Heartbeat_2.0.3配置MySQL5.0.18为高可用集群(工作记录)

测试环境为:rehdat linux 9.0

hostname eth0 eth1

mysql5 192.168.0.50/24 10.4.66.35/24

mysql6 192.168.0.60/24 10.4.66.36/24

heartbeat interface eth0, with crosscab

service ip 10.4.66.88/24, by eth1, default gateway 10.4.66.2

共享存储采用NAS服务器,数据访问地址为10.4.66.251:/data

在服务器本地的挂在目录也是/data

1. 安装MySQL5.0,安装到默认目录

清除准备安装MySQL的服务器上linux自带的mysql-server,

[root@c0101 bin]# rpm -e mysql-server

[root@c0101 bin]# rpm -qa|grep mysql

mysql-3.23.54a-11

[root@c0101 bin]# userdel mysql

[root@c0101 bin]# mv /etc/my.cnf /etc/my.cnf.bak

(1)首先在第一台服务器(HA系统的主节点服务器),

开始安装

1056 useradd mysql

1057 tar xzvf mysql-max-5.0.18-linux-i686-glibc23.tar.gz

1059 mv mysql-max-5.0.18-linux-i686-glibc23 /usr/local/mysql

1060 cd /usr/local/mysql

1088 chown -R root .

1089 chown -R mysql ./data/

1090 chgrp -R mysql .

设置数据路径,把数据库数据文件放在共享的NFS目录下(NAS服务器),

PID和innioDB文件要放到服务器本地目录上,才能正常启动、停止服务:

1125 vi /etc/my.cnf

[mysqld]

#Wh&#101;re to install a database data

datadir=/data/mysqldata

#Wh&#101;re to install a innoDB engine

innodb_data_home_dir = /usr/local/mysql/data

innodb_log_group_home_dir= /usr/local/mysql/data

innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend

1106 cp ./support-files/mysql.server /etc/rc.d/init.d/

vi /etc/rc.d/init.d/mysql.server

编译第222开始的相关的两行,把PID文件放在服务器本地目录上:

pid_file=/usr/local/mysql/data/mysqlmanager-`/bin/hostname`.pid

server_pid_file=/usr/local/mysql/data/`/bin/hostname`.pid

安装MySQL的基本数据库:

1123 mount 10.4.66.251:/data /data

1124 mkdir /data/mysqldata

1127 ./scripts/mysql_install_db –user=mysql

1145 chown -R mysql.mysql /data/mysqldata/

如果正常的话,可以看到mysql正常启动了;

1146 /etc/rc.d/init.d/mysql.server start

1146 /etc/rc.d/init.d/mysql.server stop

配置HA高可用,不要设置NFS挂载和mysql服务在启动服务器时自动运行;

(2)然后在第二台服务器(HA系统的备份节点服务器),

1090 tar xzvf mysql-max-5.0.18-linux-i686-glibc23.tar.gz

1092 mv mysql-max-5.0.18-linux-i686-glibc23 /usr/local/mysql

1093 cd /usr/local/mysql/

1095 chown -R root .

1096 chown -R mysql ./data/

1097 chgrp -R mysql .

设置数据路径,把数据库数据文件放在共享的NFS目录下(NAS服务器),

PID和innioDB文件要放到服务器本地目录上,才能正常启动、停止服务:

1125 vi /etc/my.cnf

[mysqld]

#Wh&#101;re to install a database data

datadir=/data/mysqldata

#Wh&#101;re to install a innoDB engine

innodb_data_home_dir = /usr/local/mysql/data

innodb_log_group_home_dir= /usr/local/mysql/data

innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend

1106 cp ./support-files/mysql.server /etc/rc.d/init.d/

vi /etc/rc.d/init.d/mysql.server

编译第222开始的相关的两行,把PID文件放在服务器本地目录上:

pid_file=/usr/local/mysql/data/mysqlmanager-`/bin/hostname`.pid

server_pid_file=/usr/local/mysql/data/`/bin/hostname`.pid

在NFS目录/data/下,已经有了基本数据库,所以只需要

设置一下,就可以启动了,

1123 mount 10.4.66.251:/data /data

1149 /etc/rc.d/init.d/mysql.server start

如果首次启动失败,察看一下日志,

使用ps -A命令查看进程,杀掉失败的进程,应该可以正常启动的;

killall -9 mysqld_safe

killall -9 mysqld

(3)保证在两台服务器上,都可以正常启动、停止MySQL服务,

由于数据共享的原因,要注意保证,同时只有1台服务器启动MySQL服务

/etc/rc.d/init.d/mysql.server start

/etc/rc.d/init.d/mysql.server stop

2.安装Heartbeat HA,安装到默认目录,

两台服务器安装方法相同:

(1)安装libnet,这是编译Heartbeat HA需要的:

1046 tar xzvf libnet.tar.gz

1047 cd libnet

1048 ls

1049 ./configure

1051 make

1052 make install

(2)编译安装Heartbeat HA

1019 groupadd haclient

1020 useradd hacluster -g haclient

1058 tar xzvf heartbeat-2.0.3.tar.gz

1059 ls

1060 cd heartbeat-2.0.3

1061 ls

1062 ./ConfigureMe configure

1063 make

1064 make install

3. 编辑Heartbeat HA的三个配置文件,配置MySQL的HA服务

两台服务器配置方法相同:

1067 cd /etc/ha.d

1068 cp /root/heartbeat-2.0.3/doc/ha.cf .

1069 vi ha.cf

logfile /var/log/ha-log # Log file

keepalive 2 # Heartbeat interval

deadtime 30 # How long to say the server&#39;s death

warntime 10

udpport 694 # Heartbeat port

bcast eth0 # Linux Heartbeat interface

auto_failback on # How to do when the failure server comes back

node mysql5 # How many servers in the HA system

node mysql6

ping 10.4.66.2 #ping a robust server to ensure the server&#39;s health;

#here is the default gateway

respawn hacluster /usr/lib/heartbeat/ipfail

配置心跳的加密,本次测试因为采用交叉电缆,所以采用最简单的crc方式:

1076 cp /root/heartbeat-2.0.3/doc/authkeys .

1077 vi authkeys

auth 1

1 crc

1078 chmod 600 authkeys

1073 cp /root/heartbeat-2.0.3/doc/haresources .

配置资源,本次测试mysql服务的迁移,配置资源文件是关键

1074 vi haresources

mysql5 IPaddr::10.4.66.88/24/eth1 Filesystem::10.4.66.251:/data::/data::nfs mysql.server

这一行配置了3个资源,第一个是IP地址,第二个是NFS共享数据,

第三个是mysql.server服务,文件在/etc/rc.d/init.d/目录,

可以使用mysql.server start或stop来启动或停止服务。

4.设置Heartbeat HA服务自动启动,

heartbeat会自动把/data目录挂载,会自动启动MySQL Server;

配置HA高可用,不要设置NFS挂载和mysql服务在启动服务器时自动运行,

也就是说,把与HA相关资源交给Heartbeat HA去自动管理,

cd /etc/rc.d/rc0.d ; ln -s ../init.d/heartbeat K05heartbeat

cd /etc/rc.d/rc3.d ; ln -s ../init.d/heartbeat S75heartbeat

cd /etc/rc.d/rc5.d ; ln -s ../init.d/heartbeat S75heartbeat

cd /etc/rc.d/rc6.d ; ln -s ../init.d/heartbeat K05heartbeat

可以拔掉主节点服务器的网线,看看有什么情况发生,测试是否正常?

然后再把网线插回去,看看HA服务是否运行,MySQL服务能否自动切换回来?

2006/04/21Windows系统

51条评论
38 views

ASP.NET虚拟主机安全漏洞解决方案(转)

曾经很早就在网上看到一篇关于的文章,当时并不在意,做过asp虚拟主机的朋友可能都知道,即对每一个用户都设置一个独立的服务器用户和单个目录的操作权限,能够基本上解决asp的fso问题。

  在网上无意中发现了一个叫做webadmin的asp.net-webshell,对自己的服务器进行测试的时候,让我大吃一惊,居然对我服务器的c盘有读取的权限。以及对整个硬盘的修改删除权限。这样的话,那么我的服务器的安全……

  为了进一步证实,本人曾在国内一些著名的虚拟主机提供商上作过测试,均有和我一样的问题。

  有必要先介绍一下漏洞的原因。

  ASP中常用的标准组件:FileSystemObject,这个组件为 ASP 提供了强大的文件系统访问能力,可以对服务器硬盘上的任何有权限的目录和文件进行读写、删除、改名等操作。FSO对象来自微软提供的脚本运行库scrrun.dll中。

  在ASP.NET中我们发现这一问题仍然存在,并且变得更加难以解决。这是因为.NET中关于系统IO操作的功能变得更加强大,而使这一问题更严重的是ASP.NET所具有的一项新功能,这就组件不需要象ASP那样必须要使用regsvr32来注册了,只需将Dll类库文件上传到bin目录下就可以直接使用了。这一功能确实给开发ASP.NET带来了很大的方便,但是却使我们在ASP中将此dll删除或者改名的解决方法失去效用了,防范此问题就变得更加复杂。需要进一步了解的朋友可以看一文,本文就不再重复。只针对此问题引出虚拟主机的安全设置。

  网上提出针对此问题用Microsoft .NET Framework Configration设置System.io的对目录读取的权限,经过我们长时间的测试没有成功,可能是.net framework1.1机制改革了?

  废话不说。先说说解决的思路:在 IIS 6 中,Web 应用程序的工作进程设置为以进程标识&#34;Network Service&#34;运行。在 IIS 5 中,进程外 Web 应用程序则设置为以 IWAM_<服务器名> 帐户运行,这个帐户是普通的本地用户帐户。

  Network Service 是 Windows Server 2003 中的内置帐户。了解 IIS 5 上的本地用户帐户(IUSR 和 IWAM)与这个内置帐户之间的区别是非常重要的。Windows 操作系统中的所有帐户都分配了一个 SID(安全标识,Security ID)。服务器是根据 SID,而不是与 SID 相关的名称来识别服务器上所有帐户的,而我们在与用户界面进行交互时,则是使用名称进行交互的。服务器上创建的绝大部分帐户都是本地帐户,都具有一个唯一的 SID,用于标识此帐户隶属于该服务器用户数据库的成员。由于 SID 只是相对于服务器是唯一的,因此它在任何其他系统上无效。所以,如果您为本地帐户分配了针对某文件或文件夹的 NTFS 权限,然后将该文件及其权限复制到另一台计算机上时,目标计算机上并没有针对这个迁移 SID 的用户帐户,即使其上有一个同名帐户也是如此。这使得包含 NTFS 权限的内容复制可能出现问题。

  内置帐户是由操作系统创建的、一类较为特别的帐户或组,例如 System 帐户、Network Service 和 Everyone 组。这些对象的重要特征之一就是,它们在所有系统上都拥有一个相同的、众所周知的 SID。当将分配了 NTFS 权限的文件复制到内置帐户时,权限在服务器之间是有效的,因为内置帐户的 SID 在所有服务器上都是相同的。Windows Server 2003 服务中的 Network Service 帐户是特别设计的,专用于为应用程序提供访问网络的足够权限,而且在 IIS 6 中,无需提升权限即可运行 Web 应用程序。这对于 IIS 安全性来说,是一个特大的消息,因为不存在缓冲溢出,怀有恶意的应用程序无法破译进程标识,或是对应用程序的攻击不能进入 System 用户环境。更为重要的一点是,再也不能形成针对 System 帐户的&#34;后门&#34;,例如,再也无法通过 InProcessIsapiApps 元数据库项利用加载到 Inetinfo 的应用程序。

  Network Service 帐户在创建时不仅仅考虑了在 IIS 6 中的应用。它还具有进程标识 W3WP.exe 的绝大部分(并不是全部)权限。如同 ASPNET 用户为了运行 ASP.net 应用程序,需要具有 IIS 5 服务器上某些位置的访问权限,进程标识 W3WP.exe 也需要具有类似位置的访问权限,而且还需要一些默认情况下没有指派给内置组的权限。

  为了管理的方便,在安装 IIS 6 时创建了 IIS_WPG 组(也称为 IIS 工作进程组,IIS Worker Process Group),而且它的成员包括 Local System(本地系统)、Local Service(本地服务)、Network Service(网络服务)和 IWAM 帐户。IIS_WPG 的成员具有适当的 NTFS 权限和必要的用户权限,可以充当 IIS 6 中工作进程的进程标识。

  因此,Network Service 帐户提供了访问上述位置的权限,具有充当 IIS 6 工作进程的进程标识的充足权限,以及具有访问网络的权限。

  Msdn上说:在 Windows Server 2003 中,用户上下文称为 NETWORK SERVICE。这些用户帐户是在 .NET Framework 安装过程中创建的,它具有唯一的不易破解的密码,并仅被授予有限的权限。ASPNET 或 NETWORK SERVICE 用户只能访问运行 Web 应用程序所需的特定文件夹,如 Web 应用程序存储已编译文件的 /bin 目录。

  要将进程标识设置为特定用户名,以取代 ASPNET 或 NETWORK SERVICE 用户标识,您提供的用户名和密码都必须存储在 machine.config 文件中。

  但是根据实际情况,asp.net的system.io可以无限制访问不设防的服务器路径。不知道这算不算一个ms的重大漏洞。而且根本不能使iis以machine.config的用户执行asp.net程序。J

  如何解决呢?答案就是—应用程序池。

  IIS 6.0 在被称为应用程序隔离模式(隔离模式)的两种不同操作模式下运行,它们是:工作进程隔离模式和 IIS 5.0 隔离模式。这两种模式都要依赖于 HTTP.sys 作为超文本传输协议 (HTTP) 侦听程序;然而,它们内部的工作原理是截然不同的。

  工作进程隔离模式利用 IIS 6.0 的重新设计的体系结构并且使用工作进程的核心组件。IIS 5.0 隔离模式用于依赖 IIS 5.0 的特定功能和行为的应用程序。该隔离模式由 IIs5IsolationModeEnabled 配置数据库属性指定。

  您所选择的 IIS 应用程序隔离模式对性能、可靠性、安全性和功能可用性都会产生影响。工作进程隔离模式是 IIS 6.0 操作的推荐模式,因为它为应用程序提供了更可靠的平台。工作进程隔离模式也提供了更高级别的安全性,因为运行在工作进程中的应用程序的默认标识为 NetworkService。

  以 IIS 5.0 隔离模式运行的应用程序的默认标识为 LocalSystem,该标识允许访问并具有更改计算机上几乎所有资源的能力。

  由此可见,我们只能使用工作进程隔离模式解决.net的安全问题。

  默认情况下,IIS 6.0在工作进程隔离模式下运行,如图五所示。在这种模式中,对于每一个Web应用,IIS 6.0都用一个独立的w3wp.exe的实例来运行它。w3wp.exe也称为工作进程(Worker Process),或W3Core。

  可靠性和安全性。可靠性的提高是因为一个Web应用的故障不会影响到其他Web应用,也不会影响http.sys,每一个Web应用由W3SVC单独地监视其健康状况。安全性的提高是由于应用程序不再象IIS 5.0和IIS 4.0的进程内应用那样用System帐户运行,默认情况下,w3wp.exe的所有实例都在一个权限有限的&#34;网络服务&#34;帐户下运行,如图六所示,必要时,还可以将工作进程配置成用其他用户帐户运行。

 对,这里,这里就是我们解决的核心。

  我们把每一个网站都分配一个独立的应用程序池,并赋予不同的权限。不就能解决这个问题了吗?

  具体如何做呢,下面我就针对建立一个网站来做一个示范:

  首先,我们为网站创建两个用户(一个是app_test_user、密码为appuser,一个是iis_test_user、密码为iisuser)

  1. 打开 计算机管理器

  2. 单击控制台树中的用户→计算机管理→系统工具→本地用户和组→用户

  3. 单击&#34;操作&#34;菜单上的&#34;新用户&#34;输入用户名为。app_test_user、密码为appuser

  4. 在对话框中键入适当的信息。

  5. 选中复选框:

   用户不能更改密码

   密码永不过期

  6. 单击&#34;创建&#34;,然后单击&#34;关闭&#34;。

  按照此方法在创建iis_test_user账户

  然后分别把app_test_user添加到iis_wpg组,把iis_test_user添加到Guests组。删除其他组。

  然后,建立相应的应用程序池。

  依次打开Internet 信息服务→本地计算机→应用程序池→新建→应用程序池

  新建一个名字为test的应用程序池

  编辑test应用程序池的属性→标示→配置→用户名→浏览→把用户名改为我们刚才建立的app_test_user并输入相应的密码

  其次建立相应的网站。

  依次打开Internet 信息服务→本地计算机→网站→新建→test的网站,目录为d:/test →编辑test网站的属性→主目录→应用程序池→app_test_user →目录安全性→身份验证和访问控制→编辑,选择我们刚才建立的iis_test_user,并输入相应的密码iisuser→保存并退出。

  最后设定服务器的安全。

  C:只给administrators和system完全控制的权利,删除掉其他所有的权限,不替换子目录

  C:/Documents and Settings继承父项,并替换子目录。

  C:/Program Files继承父项,并替换子目录,并把C:/Program Files/Common Files/Microsoft Shared继承属性删除并复制现有属性,增加users的读取权限并替换子目录(这样做是为了能够让asp,asp.net使用access等数据库)。

  C:/windows删除继承,并复制现有属性,只给予administrators,system完全控制和users读取的权限并替换子目录。

 其余所有的盘都只给于administrators和system用户的完全控制权限,删除其他所有用户并替换子目录。

  D:/test(用户网站目录)继承现有属性并增加app_test_user和iis_test_user完全控制的权限并替换子目录。

  以后每增加一个网站都以此类推。

  但是,至此,system.io还是对c:/windows又读取权限的,(怀疑network servers用户属于users组,但是好多服务都要使用users组来执行的,所以不能把c:/windwos去掉users组的读取权限)但必须知道系统路径,有两种方案解决。

  1、 再安装系统的时候使用无人值守安装,更换c:/windows默认安装路径,如更改为c:/testtest(要符合dos的命名规则,不能超过8个字符)。这个是必需的

  2、 以下位置具有指派给 IIS_WPG 的权限:

  %windir%/help/iishelp/common – 读取

  %windir%/IIS Temporary Compressed Files – 列出、读取、写入

  %windir%/system32/inetsrv/ASP Compiled Template – 读取

  Inetpub/wwwroot(或内容目录)- 读取、执行

  此外,IIS_WPG 还具有以下用户权限:

  忽略遍历检查(SeChangeNotifyPrivilege)

  作为批处理作业登录(SeBatchLogonRight)

  从网络访问此计算机(SeNetworkLogonRight)

  当然两种方法结合起来算是最安全的方案,一般使用第一种方案已经算是很安全的,毕竟是用一个webshell来猜测8位字符的目录还是需要花费时间的。使用防火墙很容易就能察觉出来,并加以控制。

  第二种可能根据所安装软件不同还要相应增加目录的读取权限,详细情况要根据软件来确定。

  如果主机用户比较多,这将是一个相当大的劳动量,推荐使用程序来解决问题,下面给出网上不常见的针对iis应用程序池操作的代码和针对iis虚拟目录的操作代码。

操作iis应用程序池

using System;

using System.DirectoryServices;

using System.Reflection;

namespace ADSI1

{

 ///

 /// Small class containing methods to configure IIS.

 ///

 class ConfigIIS

 {

  ///

  /// The main entry point for the application.

  ///

  [STAThread]

  //主程序入口,可以选择用哪些,我为了方便,全部功能都写上去了。

  static void Main(string[] args)

  {

   string AppPoolName = &#34;MyAppPool&#34;;

   string newvdir1 = &#34;MyVDir&#34;;

   DirectoryEntry newvdir = cr&#101;ateVDir(newvdir1);

   cr&#101;ateAppPool(AppPoolName);

   AssignAppPool(newvdir, AppPoolName);

   ConfigAppPool(&#34;Stop&#34;,AppPoolName);

  }

  //创建虚拟目录

  static DirectoryEntry cr&#101;ateVDir (string vdirname)

  {

   DirectoryEntry newvdir;

   DirectoryEntry root=new DirectoryEntry(&#34;IIS://localhost/W3SVC/1/Root&#34;);

   newvdir=root.Children.Add(vdirname, &#34;IIsWebVirtualDir&#34;);

   newvdir.Properties[&#34;Path&#34;][0]= &#34;c://inetpub//wwwroot&#34;;

   newvdir.Properties[&#34;AccessScript&#34;][0] = true;

   newvdir.CommitChanges();

   return newvdir;

  }

  //创建新的应用程序池。

  static void cr&#101;ateAppPool(string AppPoolName)

  {

   DirectoryEntry newpool;

   DirectoryEntry apppools=new DirectoryEntry(&#34;IIS://localhost/W3SVC/AppPools&#34;);

   newpool=apppools.Children.Add(AppPoolName, &#34;IIsApplicationPool&#34;);

   newpool.CommitChanges();

  }

  static void AssignAppPool(DirectoryEntry newvdir, string AppPoolName)

  {

   object[] param={0, AppPoolName, true};

   newvdir.Invoke(&#34;Appcr&#101;ate3&#34;, param);

  }

  //method是管理应用程序池的方法,有三种Start、Stop、Recycle,而AppPoolName是应用程序池名称

  static void ConfigAppPool(string method,string AppPoolName)

  {

   DirectoryEntry appPool = new DirectoryEntry(&#34;IIS://localhost/W3SVC/AppPools&#34;);

   DirectoryEntry findPool = appPool.Children.Find(AppPoolName,IIsApplicationPool&#34;);

   findPool.Invoke(method,null);

   appPool.CommitChanges();

   appPool.Close();

  }

  //应用程序池的列表

  static void AppPoolList()

  {

   DirectoryEntry appPool = new DirectoryEntry(&#34;IIS://localhost/W3SVC/AppPools&#34;);

   foreach(DirectoryEntry a in appPool.Children)

   {

    Console.WriteLine(a.Name);

   }

  }

  private void VDirToAppPool()

  {

   DirectroryEntry VD = new DirectoryEntry(&#34;IIS://localhost/W3SVC/1/ROOT/ccc&#34;);

   Console.WriteLine(VD.Properties[&#34;AppPoolId&#34;].Value.ToString());

  }

 }

}

iis6操作的例子

using System;

using System.DirectoryServices;

using System.Collections;

using System.Text.RegularExpressions;

using System.Text;

namespace Wuhy.ToolBox

{

 ///

 public class IISAdminLib

 {

  #region UserName,Password,HostName的定义

  public static string HostName

  {

   get

   {

    return hostName;

   }

   set

   {

    hostName = value;

   }

  }

 public static string UserName

 {

  get

  {

   return userName;

  }

  set

  {

   userName = value;

  }

 }

 public static string Password

 {

  get

  {

   return password;

  }

  set

  {

   if(UserName.Length <= 1)

   {

    throw new ArgumentException(&#34;还没有指定好用户名。请先指定用户名&#34;);

   }

  password = value;

 }

}

public static void RemoteConfig(string hostName, string userName, string password)

{

 HostName = hostName;

 UserName = userName;

 Password = password;

}

private static string hostName = &#34;localhost&#34;;

private static string userName;

private static string password;

#endregion

#region 根据路径构造Entry的方法

///

/// 根据是否有用户名来判断是否是远程服务器。

/// 然后再构造出不同的DirectoryEntry出来

///

/// DirectoryEntry的路径

/// 返回的是DirectoryEntry实例

public static DirectoryEntry GetDirectoryEntry(string entPath)

{

 DirectoryEntry ent;

 if(UserName == null)

 {

  ent = new DirectoryEntry(entPath);

 }

 else

 {

  // ent = new DirectoryEntry(entPath, HostName+&#34;//&#34;+UserName, Password, AuthenticationTypes.Secure);

  ent = new DirectoryEntry(entPath, UserName, Password, AuthenticationTypes.Secure);

 }

 return ent;

}

#endregion

#region 添加,删除网站的方法

///

/// 创建一个新的网站。根据传过来的信息进行配置

///

/// 存储的是新网站的信息

public static void cr&#101;ateNewWebSite(NewWebSiteInfo siteInfo)

{

 if(! EnsureNewSiteEnavaible(siteInfo.BindString))

 {

  throw new DuplicatedWebSiteException(&#34;已经有了这样的网站了。&#34; + Environment.NewLine + siteInfo.BindString);

 }

 string entPath = String.Format(&#34;IIS://{0}/w3svc&#34;, HostName);

 DirectoryEntry rootEntry = GetDirectoryEntry(entPath);

 string newSiteNum = GetNewWebSiteID();

 DirectoryEntry newSiteEntry = rootEntry.Children.Add(newSiteNum, &#34;IIsWebServer&#34;);

 newSiteEntry.CommitChanges();

 newSiteEntry.Properties[&#34;ServerBindings&#34;].Value = siteInfo.BindString;

 newSiteEntry.Properties[&#34;ServerComment&#34;].Value = siteInfo.CommentOfWebSite;

 newSiteEntry.CommitChanges();

 DirectoryEntry vdEntry = newSiteEntry.Children.Add(&#34;root&#34;, &#34;IIsWebVirtualDir&#34;);

 vdEntry.CommitChanges();

 vdEntry.Properties[&#34;Path&#34;].Value = siteInfo.WebPath;

 vdEntry.CommitChanges();

}

///

/// 删除一个网站。根据网站名称删除。

///

/// 网站名称

public static void del&#101;teWebSiteByName(string siteName)

{

 string siteNum = GetWebSiteNum(siteName);

 string siteEntPath = String.Format(&#34;IIS://{0}/w3svc/{1}&#34;, HostName, siteNum);

 DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);

 string rootPath = String.Format(&#34;IIS://{0}/w3svc&#34;, HostName);

 DirectoryEntry rootEntry = GetDirectoryEntry(rootPath);

 rootEntry.Children.Remove(siteEntry);

 rootEntry.CommitChanges();

}

#endregion

#region Start和Stop网站的方法

public static void StartWebSite(string siteName)

{

 string siteNum = GetWebSiteNum(siteName);

 string siteEntPath = String.Format(&#34;IIS://{0}/w3svc/{1}&#34;, HostName, siteNum);

 DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);

 siteEntry.Invoke(&#34;Start&#34;, new object[] {});

}

public static void StopWebSite(string siteName)

{

 string siteNum = GetWebSiteNum(siteName);

 string siteEntPath = String.Format(&#34;IIS://{0}/w3svc/{1}&#34;, HostName, siteNum);

 DirectoryEntry siteEntry = GetDirectoryEntry(siteEntPath);

 siteEntry.Invoke(&#34;Stop&#34;, new object[] {});

}

#endregion

#region 确认网站是否相同

///

/// 确定一个新的网站与现有的网站没有相同的。

/// 这样防止将非法的数据存放到IIS里面去

///

/// 网站邦定信息

/// 真为可以创建,假为不可以创建

public static bool EnsureNewSiteEnavaible(string bindStr)

{

 string entPath = String.Format(&#34;IIS://{0}/w3svc&#34;, HostName);

 DirectoryEntry ent = GetDirectoryEntry(entPath);

 foreach(DirectoryEntry child in ent.Children)

 {

  if(child.SchemaClassName == &#34;IIsWebServer&#34;)

  {

   if(child.Properties[&#34;ServerBindings&#34;].Value != null)

   {

    if(child.Properties[&#34;ServerBindings&#34;].Value.ToString() == bindStr)

    {

     return false;

    }

   }

  }

 }

 return true;

}

#endregion

#region 获取一个网站编号的方法

///

/// 获取一个网站的编号。根据网站的ServerBindings或者ServerComment来确定网站编号

///

///

/// 返回网站的编号

/// 表示没有找到网站

public static string GetWebSiteNum(string siteName)

{

 Regex regex = new Regex(siteName);

 string tmpStr;

 string entPath = String.Format(&#34;IIS://{0}/w3svc&#34;, HostName);

 DirectoryEntry ent = GetDirectoryEntry(entPath);

 foreach(DirectoryEntry child in ent.Children)

 {

  if(child.SchemaClassName == &#34;IIsWebServer&#34;)

  {

   if(child.Properties[&#34;ServerBindings&#34;].Value != null)

   {

    tmpStr = child.Properties[&#34;ServerBindings&#34;].Value.ToString();

    if(regex.Match(tmpStr).Success)

    {

     return child.Name;

    }

   }

   if(child.Properties[&#34;ServerComment&#34;].Value != null)

   {

    tmpStr = child.Properties[&#34;ServerComment&#34;].Value.ToString();

    if(regex.Match(tmpStr).Success)

    {

     return child.Name;

    }

   }

  }

 }

 throw new NotFoundWebSiteException(&#34;没有找到我们想要的站点&#34; + siteName);

}

#endregion

#region 获取新网站id的方法

///

/// 获取网站系统里面可以使用的最小的ID。

/// 这是因为每个网站都需要有一个唯一的编号,而且这个编号越小越好。

/// 这里面的算法经过了测试是没有问题的。

///

/// 最小的id

public static string GetNewWebSiteID()

{

 ArrayList list = new ArrayList();

 string tmpStr;

 string entPath = String.Format(&#34;IIS://{0}/w3svc&#34;, HostName);

 DirectoryEntry ent = GetDirectoryEntry(entPath);

 foreach(DirectoryEntry child in ent.Children)

 {

  if(child.SchemaClassName == &#34;IIsWebServer&#34;)

  {

   tmpStr = child.Name.ToString();

   list.Add(Convert.ToInt32(tmpStr));

  }

 }

 list.Sort();

 int i = 1;

 foreach(int j in list)

 {

  if(i == j)

  {

   i++;

  }

 }

 return i.ToString();

}

#endregion

}

#region 新网站信息结构体

public struct NewWebSiteInfo

{

 private string hostIP; // The Hosts IP Address

 private string portNum; // The New Web Sites Port.generally is &#34;80&#34;

 private string descOfWebSite; // 网站表示。一般为网站的网站名。例如&#34;www.dns.com.cn&#34;

 private string commentOfWebSite;// 网站注释。一般也为网站的网站名。

 private string webPath; // 网站的主目录。例如&#34;e:/tmp&#34;

 public NewWebSiteInfo(string hostIP, string portNum, string descOfWebSite, string commentOfWebSite, string webPath)

 {

  this.hostIP = hostIP;

  this.portNum = portNum;

  this.descOfWebSite = descOfWebSite;

  this.commentOfWebSite = commentOfWebSite;

  this.webPath = webPath;

 }

 public string BindString

 {

  get

  {

   return String.Format(&#34;{0}:{1}:{2}&#34;, hostIP, portNum, descOfWebSite);

  }

 }

 public string CommentOfWebSite

 {

  get

  {

   return commentOfWebSite;

  }

 }

 public string WebPath

 {

  get

  {

   return webPath;

  }

 }

}

#endregion

}

  至此,一个相对安全的.net主机就建立起来了,随着.net2.0的发布越来越逼近,希望ms能针对此问题作一个妥善的防范。

  我们已经简单的介绍了一下ASP.NET中关于文件IO系统的漏洞的防治方法,这一方法有些繁琐,但是却可以从根本上杜绝一些漏洞,我们讨论的只是很少的一部分,更多的解决放法需要大家共同来探索、学习.

2006/04/20L i n u x系统

39条评论
55 views

用rsync从Linux到Windows远程备份

rsync是Linux系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync。rsync支持大多数的类Unix系统,无论是Linux、Solaris还是BSD上都经过了良好的测试。rsync的最新版本可以从http://rsync.samba.org/rsync/获得。它的特性如下:

  

  1、可以镜像保存整个目录树和文件系统。

  

  2、可以很容易做到保持原来文件的权限、时间、软硬链接等等。

  

  3、无须特殊权限即可安装。

  

  4、优化的流程,文件传输效率高。

  

  5、可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。

  

  本文介绍了如何使用rsync服务从Linux到Windows进行远程备份。

  

  一、配置服务器端

  

  首先我们需要配置rsync,打开配置文件/etc/xinetd.d/rsyncd.conf(如果没有请创建它),修改相应的配置项,并增加以下内容:

  

  uid = nobody                     # 备份以什么身份进行,用户ID

  gid = nobody                     # 备份以什么身份进行,组ID

  

  #注意这个用户ID和组ID,如果要方便的话,可以设置成root,这样rsync几乎就可#以读取任何文件和目录了,但是也带来安全隐患。建议设置成只能读取你要备

  

  #份的目录和文件即可。

  max connections = 4               # 最大连接数为4

  

  [www]                       # 指定认证的备份模块名

  path = /www                   # 需要备份的目录

  comment = BACKUP WWW      # 注释

  ignore errors                   # 忽略一些无关的IO错误

  read only = yes                 # 设置为只读

  list = no                       # 不允许列文件

  auth users = wwwuser            # 认证的用户名,如果没有这行,则表明是匿名

  hosts allow=220.122.133.31  #允许连接服务器的主机IP地址

  secrets file = /etc/wwwuser.pass     # 认证文件名,用来存放密码

  

  这一段我们修改完成。

  

  注意:如果同时还需要备份其它目录的话,可以直接在配置文件的后面继续增加配置内容,例如:

  

  [database]

  path = /var/lib/mysql

  ……

  

  这样就可以同时备份多个目录了。

  

  然后为备份模块设置密码文件,如上例的密码文件为/etc/wwwuser.pass,使用编辑器创建这个文件,并输入用户名称和密码:

  vi /etc/wwwuser.pass

  

  输入以下内容:

  wwwuser:123456

  

  这样,为备份模块www的用户wwwuser设置了密码123456。注意,出于安全目的,这个文件的属性必需是只有属主可读,否则rsync将拒绝运行。我们可以设置它的属性为600:

  chmod 600 /etc/wwwuser.pass

  

  设置rsync服务在系统启动时自动启动运行,可以通过ntsysv来设置:

attachment/month_0604/p2006420174411.jpg

最后在服务器端我们需要启动rsync服务:

  service xinetd restart

  

  至此,服务器端配置完毕。

  

  二、配置客户端

  

  为了在Windows环境使用rsync工具,我们需要去下载cwRsync工具,这是一个rsync for windows的版本。

  

  下载安装完成之后的目录结构类似下图所示:

attachment/month_0604/h2006420174444.jpg

现在我们可以在Windows环境下运行rsync工具了,举例使用下面的命令连接服务器并开始备份目录和文件:

  rsync -vzrtopg –progress –del&#101;te wwwuser@xx.xx.xx.xx::www .ak

  应该可以看到:

  password:

  

  要求输入密码的提示,正确输入密码后就应该看到开始备份了。当然,也有可能出现类似下面的错误信息:

attachment/month_0604/j2006420174516.jpg

引起这种错误有几种可能性,一是你没有输入正确的用户名或密码,二是你的服务器端存储密码的文件没有正确的权限,也就是你的密码文件不是类似这样子的权限:-rw——-  1 root   root

  

  在备份完成之后,我们可以看到类似下图所示的状态:

attachment/month_0604/02006420174536.jpg

Rsync 同步镜像服务的搭建!!(转)

DNS(Domain Name Servive,域名服务)是Internet/Intranet中最基础也是非常重要的一项服务,提供了网络访问中域名到IP地址的自动转换。我们知道,Inetrnet上的主机成千上万,并且还在随时不断增加,不可能由一个或几个DNS服务器能够实现这样的解析过程,传统主机表(hosts)方式更无法胜任,事实上DNS依靠一个分布式数据库系统对网络中主机域名进行解析,并及时地将新主机的信息传播给网络中的其它相关部分,因而给网络维护及扩充带来了极大的方便。

  对于选择Linux、UNIX 系统作为应用平台的企业或网站来说,往往面临着如何实现将数据远程备份或者如何建立网站镜象的问题,虽然有商业化的备份和镜象产品可供选择,但这些产品的价格往往过于昂贵。因此如何利用自由软件高效实现远程备份和网站镜象就成为一个值得讨论的话题。通过网络进行远程数据备份或者网站镜象的最简单的方法就是使用wget,但是这种方式每次都需要将所有数据都重新在网络上传输一遍,而不考虑哪些文件是经过更新的,因此效率非常低下。尤其在需要备份的数据量很大的时候,往往需要花费数个小时来在网络上进行数据传输。因此这里我们就介绍一种高效的网络远程备份和镜象工具-rsync,它可以满足绝大多数要求不是特别严格的备份需求。

  对系统管理员来说,平时的工作重心应该集中在维护系统正常运转,能够正常提供服务上,这里往往牵涉到一个数据备份的问题,在我们所了解的情况中,有80%的系统管理员不是太关心自己服务器的安全性,但往往对备分镜像的技术相当感兴趣。但由于商业产品软硬件价格都相当高昂,因此往往会选择自由软件,例如刚才我们提到的网络远程备份和镜象工具-rsync,它可以满足绝大多数要求不是特别高的备份需求。

rsync是Linux、UNIX系统下的数据镜像备份工具,从软件的命名上就可以看出来了-remote sync。它的特性如下:

(1)可以镜像保存整个目录树和文件系统。

(2)可以很容易做到保持原来文件的权限、时间、软硬链接等等。

(3)无须特殊权限即可安装。

(4)优化的流程,文件传输效率高。

(5)可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。

(6)支持匿名传输。

安装和配置rsync实例

下面给大家介绍一个rsync 安装和配置的实例:

例如这里有两台服务器,服务器名分别为:WWW和BACKUP。情况如下:

服务器名 域名 IP地址 应用

WWW www.blue.com.cn 12.23.34.56 Web服务器

BACKUP backup.blue.com.cn 12.23.34.57 备份机

硬件环境: 两台HP服务器,1G CPU , 512M Ram , 18G SCSI硬盘

系统环境: Redhat Linux 6.2

服务环境: rsync-2.4.6

  其中服务器名为WWW的Web服务内容存放在以下几个地方:/www/和/mirror/file0/和/mirror/file1/目录中。现在我们需要通过搭建rsync同步服务在备份机BACKUP上建立对这几个目录内容的备份。

软件下载

rysnc的主页地址为:http://rsync.samba.org/,可以从这里下载rysn的安装软件(注意:下载源码编译最好)。

编译安装

rsync的编译安装非常简单,只需要以下简单的几步(在两台服务器中都要安装):

$ tar xvf rsync-2.4.6.tgz$ cd rsync-2.4.6$ ./configure$ make$ make install

但是需要注意的是必须在服务器WWW和BACKUP上都安装rsync,其中WWW服务器上是以服务器模式运行rsync,而BACKUP上则以客户端方式运行rsync。这样在Web服务器WWW上运行rsyn守护进程,在BACKUP上定时运行客户程序来备份Web服务器WWW上需要备份的内容。

配置rsync服务器端

对于rsync服务器来说,最重要和复杂的就是它的配置了。rsync服务器的配置文件为/etc/rsyncd.conf,其控制认证、访问、日志记录等等。该文件是由一个或多个模块结构组成。一个模块定义以方括弧中的模块名开始,直到下一个模块定义开始或者文件结束,模块中包含格式为name = value的参数定义。每个模块其实就对应需要备份的一个目录树,比方说在我们的实例环境中,有三个目录树需要备份:/www/和/mirror/file0/和/mirror/file1/目录,那么就需要在配置文件中定义三个模块,分别对应三个目录树。配置文件是行为单位的,也就是每个新行都表示一个新的注释、模块定义或者参数赋值。(注:本例所指的rsync服务器是名为WWW的服务器)

例如,在www.blue.com.cn上创建rsyncd的配置文件/etc/rsyncd.conf,内容如下:

[root@ www /] cat /etc/rsyncd.confuid = nobody gid = nobody use chroot = nomax connections = 4pid file = /var/run/rsyncd.pidlock file = /var/run/rsync.locklog file = /var/log/rsyncd.log[www]path = /mirror/www/comment = my rsync siteignore errorsread only = truelist = falseauth users = backuphosts allow = 12.23.34.57/32secrets file = /etc/rsyncd.secrets[file0]path = /mirror/file0comment = file0ignore errorsread only = truelist = falseauth users = backuphosts allow = 12.23.34.57/32secrets file = /etc/rsyncd.secrets[file1]path =/mirror/file1comment = file1ignore errorsread only = truelist = falseauth users = backuphosts allow = 12.23.34.57/32secrets file = /etc/rsyncd.secrets

这里分别定义了[www]、[file0]、[file1]三个模块,分别对应于三个需要备份的目树。这里只允许12.23.34.57备份服务器WWW的数据,并且需要认证。三个模块授权的备份用户都为backup,并且用户信息保存在文件/etc/backserver.pas中,其内容如下:

[root@www /etc]# cat /etc/backserver.pasbackup:bk_passwd

并且该文件只能是root用户可读写的,否则rsyncd启动时会出错。这些文件配置完毕以后,就需要在WWW服务器上启动rsyncd服务器:

[root@www /etc]# grep rsync services rsync 873/tcp # rsyncrsync 873/udp # rsync[root@www /etc] grep rsync inetd.confrsync stream tcp nowait root /usr/local/bin/rsync rsyncd -daemon[root@www /etc]# rsync -daemon

执行完毕上面的命令后,rsync即可启动。rsync默认服务端口为873,服务器在该端口接收客户的匿名或者认证方式的备份请求。

执行rsync客户端命令

下一步就要运行rsync客户端的启动命令了(本例所指的rsync客户端是名为BACKUP的服务器):

[backup@backup /] /usr/local/bin/rsync -vzrtopg -del&#101;te -exclude &#34;logs/&#34; –exclude &#34;conf/ssl.*/&#34; –progress backup@12.23.34.56::www /backup/www/–password-file=/etc/rsync.pass

上面这个命令行中-vzrtopg里的v是代表verbose(详细),z是代表zip(压缩),r是代表recursive(递归),topg都是保持文件原有属性如属主、时间的参数。–progress是指显示出详细的进度情况,–del&#101;te是指如果服务器端删除了这一文件,那么客户端也相应把文件删除,保持真正的一致。–exclude &#34;logs/&#34;是表示不对/www/logs目录下的文件进行备份。同样–exclude &#34;conf/ssl.*/&#34;是表示不对/www/conf/ssl.*/目录下的文件进行备份。

backup@12.23.34.56::www 是表示该命令是对服务器12.23.34.56中的www模块进行备份,其中backup表示使用backup用户来对该模块进行备份。–password-file=/etc/rsync.pass来指定密码文件,这样就可以在脚本中使用而无需交互式地输入验证密码了,这里需要注意的是这份密码文件权限属性要设得只有执行这个命令的当前用户可读,本例中是backup用户。

这里将备份的内容存放在备份机的/backup/www/目录下。

[backup@backup /] /usr/local/bin/rsync -vzrtopg -del&#101;te -exclude &#34;logs/&#34; –exclude &#34;conf/ssl.*/&#34; –progress backup@12.23.34.56::www /backup/www/ –password-file=/etc/rsync.passreceiving file list … donea.txtwrote 100 bytes read 990409 bytes 220113.11 bytes/sectotal size is 2779708994 speedup is 2806.34

这样,rsync同步服务就搭建好了,最后我们可以将在客户端执行的命令通过crontab定时执行来实现自动备份,或者写一些脚本,这样rsync同步服务的搭建就更加完美了。

一些示例脚本:

这里这些脚本都是rsync网站上的一些脚本例子,供大家参考:

1、每隔七天将数据往中心服务器做增量备份

#!/bin/sh # This script does personal backups to a rsync backup server. You # with a 7 day rotating backup. The incrementals will go # into subdirectories named after the day of the week, and the c # full backup goes into a directory called &#34;current&#34; # tridge@linuxcare.com # directory to backup BDIR=/home/$USER # excludes file EXCLUDES=$HOME/cron/excludes # the name of the backup machine BSERVER=owl # your password on the backup server export RSYNC_PASSWORD=XXXXXX ###########################################################BACKUPDIR=`date +%A` OPTS=&#34;–force –ignore-errors –del&#101;te-excluded –exclude-from=$EXCLUDES –del&#101;te –backup –backup-dir=/$BACKUPDIR -a&#34; export PATH=$PATH:/bin:/usr/bin:/usr/local/bin # the following line clears the last weeks incremental directory [ -d $HOME/emptydir ]&#39; &#39;mkdir $HOME/emptydir rsync –del&#101;te -a $HOME/emptydir/ $BSERVER::$USER/$BACKUPDIR/ rmdir $HOME/emptydir # now the actual transfer rsync $OPTS $BDIR $BSERVER::$USER/current

2、备份至一个空闲的硬盘

#!/bin/sh export PATH=/usr/local/bin:/usr/bin:/bin LIST=&#34;rootfs usr data data2&#34; for d in $LIST; do mount /backup/$d rsync -ax –exclude fstab –del&#101;te /$d/ /backup/$d/ umount /backup/$d done DAY=`date &#34;+%A&#34;` rsync -a –del&#101;te /usr/local/apache /data2/backups/$DAY rsync -a –del&#101;te /data/solid /data2/backups/$DAY

3、对vger.rutgers.edu的cvs树进行镜像

#!/bin/bash cd /var/www/cvs/vger/ PATH=/usr/local/bin:/usr/freeware/bin:/usr/bin:/bin RUN=`lps x | grep rsync | grep -v grep | wc -l` if [ &#34;$RUN&#34; -gt 0 ]; then echo already running exit 1 fi rsync -az vger.rutgers.edu::cvs/CVSROOT/ChangeLog $HOME/ChangeLog sum1=`sum $HOME/ChangeLog` sum2=`sum /var/www/cvs/vger/CVSROOT/ChangeLog` if [ &#34;$sum1&#34; = &#34;$sum2&#34; ]; then echo nothing to do exit 0 fi rsync -az –del&#101;te –force vger.rutgers.edu::cvs/ /var/www/cvs/vger/ exit 0

2006/04/13Mysql技术

45条评论
43 views

Mysql中两个有用的sql性能分析语句

1> explain SQL,类似于Oracle中explain语句

例如:explain sel&#101;ct * from nad_aditem;

2> sel&#101;ct benchmark(count,sql);计算sql语句执行count次所花费的时间

例如:

mysql> sel&#101;ct benchmark(1000,&#34;Sel&#101;ct * FROM AD&#34;);

+—————————————-+

| benchmark(1000,&#34;Sel&#101;ct * FROM AD&#34;) |

+—————————————-+

| 0 |

+—————————————-+

1 row in set (0.02 sec)

注意观察0.02这个时间,而且不能仅仅关注这个时间,还要观察CPU和系统的负载。

关于防火墙与DDOS的一些常识(全文转载)

看了《问绿盟黑洞》的文章好几天了,有点想法不吐不快。前两天正忙,现在闲下来了,说说我的想法。文章中会提到一些厂商的技术,有正有反,大家不要对号入座,主要是希望对你们的技术提高有帮助。我以原始的ddos的先行者syn flood来举例说明,cc我不打算评价,因为我认为syn flood的效果远远好于cc,而隐蔽性是cc远远达不到的。先点评一下关于DDoS话题方面的一些网友的错误认识和厂商的技术弱点。以下如果没有特殊指明,ddos我指的就是syn flood这种最原始、最有效、最简单、最可爱的东西。

1.只要一谈论ddos想到的就是大流量,就是无边无际、无际无边的带宽消耗战。

错了,syn flood可不是带宽消耗战,drdos才是!那是因为syn flood的使用者使用不当,才会有今天大家的错误认识。

2.天,我CPU都满跑了,为什么目标机一点事都没有?我用的可以Linux下开源的、大家都害怕的、网评第1的攻击软件呀。

检查一下你的网关是不是有NAT,如果有。不是你的包没出去,就是你的网关快阵亡了,您赶快住手吧。

去掉你前面的防火墙,因为防火墙在你发起攻击时,最先受到损害,更重要的是它是你财产的一部分。

你极有可能拿一款ether下的攻击程序在pppoe网络中使用了,为了提高效率攻击数据包都是自己填充的,所以程序本身可能把数据包进行了ether_type的二层封装,如果你在pppoe环境中攻击,请自己修改源代码改为PPPOE封装。否则的话,你攻击的不是目标机,而是在自己的房间里大小便。要学会分析协议,下面才是二层PPPOE封装的正确格式:

88 64 11 00 0B D0 00 56 00 21

3.这个ddos设备没什么了不起,用的就是syn cookie和syn proxy。

我认为这两种方法是当前最有效的解决方法,就像攻击者必须联网才能发起攻击一样,这两种措施是必做的。如果您没用这两种方法就实现了ddos防御,以下的内容您就不用看了。因为您是我见过的第一牛人,我在您面前绝对是个晚辈的。在此就不浪费您的宝贵时间了。如果您感觉我还可救,给我留点面子传张纸条教侮我一番吧。

4.drdos比ddos时髦多了,可以四两拨千斤

真不好意思,syn ack这个数据包应该从内网口收到才对,从外网口收到时直接丢掉就可以了。它浪费的是你的宽带而不是内存或者大量的cpu。

你可能会说我后面的服务器是ftp并工作在主动模式,所以有时syn ack也是不能丢的。嗯…解决方案你自己已经说出来了,自己想个办法吧。

5.DDoS是最没有水准的攻击类型,菜鸟才用。

这只能说明你只是使用ddos工具的人,而不是一个编写ddos攻击类程序的人。大家知道一款好的ddos攻击软件,所发的包在各协议首部字段的合法范围内越随机越好。只要有一个字段该变但你没变的,特证过滤一下子就把你干掉了。如果攻击包是以多播、回环为源ip发送,我只能说攻击者在和你开玩笑,看看日历确认今天不是愚人节。

但满足随机就是好的攻击软件吗?喵~喵~俺家的小花猫都知道,远远不是滴,单纯发syn攻击包就不是好的攻击方式。浪费ddos设备资源的是握手的第三个ack包。但第三个包构造上又很有讲究,举个例子:国内某某ddos厂商的主页,我小流量正常访问时抓包,可以发现他没有做syn proxy,但当我1000pps时,通过抓包就可以看出,他启用syn proxy了,并且syn cookie也随之打开了,你问我怎么知道的?看看它回复的syn ack包的tcp选项部分的变化你就明白了。这时是他启用防护的时机,也是它最脆弱的时候,细心的构造一个syn包,一个ack包,算准了它的cookie,喂给它。喵~小花猫都知道5000pps足够了。我不是有意这么做的,是它在CU里叫大家帮忙做测试,我简单的分析了一下,是这个原理。没叫劲,睡觉了,第二天具说有3000台肉机参与了,不知是真是假,如果没有了解原理,你就算动用8000台也没用啊!

这里真正的技术是推算cookie,但我在市面上找不到一款ddos攻击软件有这个方面的功能,你可能会说这不就是cookie攻击吗,我不这么认为,我不会发大量的ack来消耗它的cpu资源,我只是想钻它算法的空子。因为一种cookie的算法就好比是一类ddos设备的指纹,推出这个cookie的参数与运算法则,以后遇到它的时候,它就死定了。当然厂商也不傻,算cookie的参数是个很大的数并且还是在不断变化,但不会经常变,每次启动的时候变一次就算很智能了。因为每天小花猫吃饭的时候,我都会便顺发送一个相同的syn包给它,它返给我的syn ack中的cookie一直都是一样的。哈哈…如果我有耐心,终有一天我会推出来的,注意:这个syn包源IP是真实的,所以我能观察到它的返回数据包,并且他根本就发现不了偶。一天才一个syn包嘛。

顺便问问版主,绿盟在测试黑洞的时候,肯定有一种攻击软件是他们自己写的,针对自己的产品的弱点、软肋、命门、死穴、扪门发送5000pps应该就可以挂了。喵~喵~喵~小花猫咽到了。

6.这个百兆ddos设备真牛呀,百兆的线路我都D满了,还可以正常访问保护的服务器

你的感叹用错对像了,你应该感叹于这条网线的质量很好,一条质量优秀的网线,百兆千兆的确都可以跑起来呀。另外一个设备适用于百兆还是千兆环境的瓶颈,你没有弄清楚。我用82559网卡,我的算法再好也不可能你把百兆线路D满了,后面的服务器你还可以访问。你的这种情况,我可以很负责任的告诉你,这个外表百兆ddos设备实际采用了千兆平台和千兆网卡,而流量的瓶颈在你测试中的其它结点上。仅此而己。

7.我们的算法不对syn包做回追处理,所以你的下行带宽没有被浪费。

这话也说的出口,真汗!小花猫甩甩尾巴跑去喝水了。你把10kpps的发包器真接插在百兆ddos设备上面试一下,看看是回复syn ack时CPU使用率高,还是只接受syn包不回复时CPU占用率高。告诉你,后者的cpu占用率更高一些。为什么呢?因为我回复syn ack时也是一种另类的保护策略,在局域网中,攻击者发的数据包也必须依照冲突检测载波监听的方式来发送攻击包,如果你回复等量的syn ack也就是在堵攻击者的嘴,他发包的速度会成倍的减下来。这意味这什么?意味着你用你的下行带宽换来了上行带宽,这么好的机会你为什么要放弃?这就好像一群人在用砖头拍你,拍的你上串下蹦,左躲右闪,累的你呼吃带喘,你心里还在想我TM怎么这么聪明呀,没有回拍他们,节约了不少力气,所以现在身行才能如此敏捷。

8.你看我们的设备连IP地址都没有,可以实现网络隐身,所以很安全

幸好小花猫不在身边,否则还不得被呛个半死呀。这个因果关系也说的出来?那我是不是可以说工作在桥模式下的设备都很安全?这是我见过的最大的拿缺点当优点忽忧人的说词。你把IP地址给我设上,我为什么要网络隐身啊,我光明正大!你不是防ddos攻击吗?你自己的ip为什么不敢暴露在公网上提供http管理控制?厂商会找出各种的手段来忽忧你,以下是最常见的托词:设置管理IP地址当然可以了,但要从另外的一个网口专门引出来,并且我们不对管理网口做防护,因为这样会增加我们系统的负载呀。呀~~呀~~呀~~,回想起测试性能的时候他们好像说自己的算法很牛,什么国际领先啦,什么可以抵御所有未知的ddos攻击啦,什么算法CPU零负载啦,什么指纹啦,什么单向数据包一次检测啦,什么身份证啦、什么syn包实名制啦、什么暂住证啦….什么这个,什么那个了,你都这么强了,暴露一下嘛。

不想做过多技术分析,主机型syn proxy syn cookie和网关型syn proxy syn cookie的难度不是一个数量级,原因是厂家为了效率把syn proxy syn cookie都在驱动层实现了,你叫他们把数据包上送到系统的TCP/IP协议栈给系统自身,真的是很难为他们。但你实现不了可以直说,忽忧我家小花猫就不厚道了。

9.我们的设备是透明接入,不会修改你的拓扑

嗯…这要看你对透明接入的了解程度了,我翻了翻所有ddos厂商的手册,吃惊的发现,都是一个模子,不知是谁抄谁的。上画三张用户常用拓扑,一个保护服务器、一个保护防火墙,一个保护网络,就认为自己可以全透明接入了?下面这张图你能透明接入吗?内网为三个VLAN网段,服务器放在VLAN2中,每个网段互相访问都必须通过防火墙内网口的三个对应VLAN网卡(各网段默认网关),防火墙通过DNAT后对外映射VLAN2网段服务器。我的要求是即要求你防外网的ddos还要你防止内网对VLAN2的ddos,敢问您,您打算怎么个透明进入法?

1) 透明接入在防火墙外网口?

2) 透明接入在防火墙内网口?

你八成会修改我的拓扑,把VLAN2转到DMZ,然后透明接入在防火墙DMZ网口上

外网

|

防火墙

|

|交换机trunk口

|

switch

| | |

VLAN 1 VLAN2 VLAN3

10.利用超时重传来判断syn包是否合法

这种方法是相当的有效啊,远处传来小花猫的声音:“给它在三秒钟之内发第二个syn包”

11.可能您感觉本文写的不错,但要转载的时候,请注明原作者是skipjack,仅些而己,谢谢了

很不幸,年初时给国家某某一级刊物投稿,先开始写了8000字,后来叫我一删再删,删了再删,图是左减一个,右减一个,上减一个,下减一个,前减一个,后减一个。本来是一个从浅入深的分析过程,后来成了个半调子,没几个人可以读懂了。稿费汇给我时,我都快哭了,4000多字才给俺103元,从邮局走出来的时候,手里握着这103元钱,心里想:“今儿中午我是请老婆吃饭呢,还是请小花猫吃饭呢?”。

2006-4-6

23:33 skipjack

备注:

2006-4-9 22:02

1)修改原文,去掉笔误(一处)与错别字(两处) xiyang网友说我文章中有&#34;愤青&#34;言语和人身攻击词汇,我把我认为是的去掉了.在此表示谦意.

2)我不是做ddos产品的,所以我写文章这么大胆,否则我不是自己砸自己饭碗嘛?

3)我的身份大家不要猜了,我不是绿盟 天融信 金盾 神州盾 dosnipe的人(排名不分先后)

返回顶部