在网络蓬勃发展的几天,网络安全问题日益突出。网络上的黑、白两道在网络安全的各个领域都展开了激烈的竞争。黑帽社团不断推出躲避或者越过网络入侵检测系统(Network Intrusion Detection System,NIDS)的新技术,而NIDS的开发者不断地在自己的产品中加入对这些技术的检测。但是,由于NIDS本身的局限性,胜利的天平正在向黑帽子倾斜。本文将讨论一些基本的IDS躲避技术,以及如何识破这些技术。
1.字符串匹配的弱点
针对基本字符串匹配弱点的IDS躲避技术是最早被提出和实现的。一些基于特征码的入侵检测设备几乎完全依赖于字符串匹配算法,而对于一个编写很差的特征码,攻击者可以轻松地破坏对其的字符串匹配。虽然不是所有的入侵检测系统都是纯粹基于特征码检测的,但是绝大多数对字符串匹配算法有很大的依赖。这里,我们将使用开放源码工具snort的特征码来进行讨论。
在UNIX系统中,/etc/passwd是一个重要的文件,它包含用户名、组成员关系和为用户分配的shell等信息。我们就从监视对/etc/passwd文件的访问开始,下面是用于检测的snort检测规则:
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS 80 (msg:"WEB-MISC /etc/passwd";
flags: A ; content:"/etc/passwd"; nocase; classtype:attempted-recon; sid:1122;rev:1)
snort使用字符串匹配算法对包含特征码(/etc/passwd)的HTTP请求进行检测。但是,这个规则的特征码过于简单了,攻击者修改攻击字 符串可以很轻松地逃过检测(我们暂时不考虑攻击请求是通过HTTP发出的)。例如,把攻击请求由GET/etc/passwd改为GET /etc//\// passwd,或者GET /etc/rc.d/.././\passwd,修改方式简直不计其数。这是最基本的娶亲检测逃避技术,对这种技术的检测也相对容易一些,只要在编写特征码时能够仔细考虑一下攻击可能出现的变体。目前大多数流行入侵检测系统都有非常强大的字符串匹配能力,足以检测此类攻击的大多数变体。不过,仍然有些编写不太好的特征码可以给攻击者以可乘之机。
攻击者还可以在此基础上再加以变化,几乎不费吹灰之力就可以加大入侵检测系统的防御难度。例如在telnet之类的交互会话中,攻击者企图读取/etc/passwd文件。通常,入侵检测系统中存在很多特征码一些误用操作和后门等,但是这些特征码一般只包含黑客工具名、文件名和程序名。在获得/etc/passwd文件的内容时,我们不直接输入cat/etc/passwd等命令行,而是通过一个命令解释器(例如:perl)来实现我们的目的:
badguy@host$Content$nbsp;perl -e
‘$foo=pack(“C11”,47,101,116,99,47,112,97,115,115,119,100);
@bam=`/bin/cat/ $foo`; print”@bam\n”;’
从这个命令中,入侵检测系统根本就不会重组出/etc/passwd这些字符。显然,防御这种攻击就很困难了,因为这要求入侵检测系统必须能够理解这种解释器如何收到的命令,这恐怕不太现实。当然,入侵检测系统也可以对使用解释器的可疑行为进行报警,但是它很难对攻击行为进行精确的监视。
通过把字符串处理技术和字符替换技术结合到一起,我们可疑实现更复杂的字符串伪装。对于WEB请求,我们不必使用命令解释器,在我们的请求中使用16进制的URL即可,以下的请求可以被目标WEB服务器解释为/etc/passwd:
GET etc/passwd或者
GET etc/passwd
为了捕获这一个字符串的所有变体,你可能需要1000个以上的特征码进行字符串匹配,这还没有考虑UNICODE。UNICODE提供了另一 种字符表达方式。有关UNICODE的IDS欺骗技术细节,本文将不多做讨论。如果想了解更多细节请参考SecurityFocus的IDS Evasion with Unicode。除此之外,RainForestPuppy在他的HTTP扫描工具Whisker中采用了另外一些IDS欺骗技术:
-I 1 IDS-evasive mode 1 (URL编码)
-I 2 IDS-evasive mode 2 (/./目录插入)
-I 3 IDS-evasive mode 3 (过早结束URL)
-I 4 IDS-evasive mode 4 (长URL)
-I 5 IDS-evasive mode 5 (伪造参数)
-I 6 IDS-evasive mode 6 (TAB分割) (not NT/IIS)
-I 7 IDS-evasive mode 7 (大小写敏感)
-I 8 IDS-evasive mode 8 (Windows分割符)
-I 9 IDS-evasive mode 9 (会话拼接) (slow)
-I 0 IDS-evasive mode 0 (NULL方法)
如果想了解上面这些方法的技术细节,可以参考A Look At Whisker’s Anti-IDS Tactics。需要特别说明的是,rfp把whisker采用的anti-ids技术 单独放到了libwhisker(使用perl编写的)库中,为其它的程序采用这些技术提供了很大的便利。另外,nessus和babelweb等扫描工具都有自己的应用层入侵检测躲避技术。
现在,IDS开发人员对各种网络协议有了更深入的理解,并且入侵检测设备在对数据包的负载进行字符串匹配之前会进行必要的协议分析,因此现在的IDS已经能够很好地处理上述的欺骗技术了。但是多余的字符转换又提高了入侵检测系统的负载,有时是得不偿失。为了减小这个跗面影响,开发人员可以使入侵检测系统只在特定的端口进行字符转换。
2.多变shell代码(polymorphic shell code)
多变shell代码(polymorphic shell code)技术由K2开发的,设计思想来源于病毒逃避(virus evasion)技术。使用这种技术重新构造的shell代码更为危险,入侵检测设备非常难以检测到。这种技术只用于缓冲区溢出攻击,对付基于特征码的检测系统非常有效,而对于智能化的或者基于协议分析的检测系统的效果要差很多。为了便于讨论,我们以SSH CRC32缓冲区为例。我们先看以下snort检测规则:
alert tcp $EXTERNAL_NET any -> $HOME_NET 22 (msg:"EXPLOIT ssh CRC32
overflow /bin/sh"; flags:A ; content:"/bin/sh"; reference:bugtraq,2347;
reference:cve,CVE-2001-0144; classtype:shellcode-detect; sid:1324; rev:1;)
alert tcp $EXTERNAL_NET any -> $HOME_NET 22 (msg:"EXPLOIT ssh CRC32
overflow NOOP"; flags:A ; content:" 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90)
上面的第一条规则简单地检查从外部到$HOME_NET,目标端口是22的数据包,搜索里面是否包含字符串/bin/sh。第二条规则是检查是否 包含x86空操作字符(0x90)。多变shell代码(polymorphic shell code)使用很多方法逃避字符串匹配系统的检测。首先(以x86架构为例), 使用其它的字符代替0x90执行无操作(no-op)指令。对于X86架构,有55种替代方式,其它的要少一些。这些替代方式以一种伪随机的 方式结合到一块,建立缓冲区溢出shell代码包含无操作(no-op)指令的部分。想了解无操作(no-op)指令的所有替代字符可以参考http:// cansecwest.com/noplist-v1-1.txt。除此之外,shell代码本身也采用XOR机制编码。通过这种方式建立的缓冲区溢出shell代码被重组后不会包含以上的特征码,从而能够逃过字符串匹配检测。
多变shell代码检测对基于特征码检测的IDS是一个很大的挑战。Next Generation Security Technologie公司的技术白皮书Polymorphic Shellcodes vs. Application IDSs中提出了一些检测多变shell代码的设想。通过搜索无操作(no-op)字符的一个特定长度的正则表达式,可以实现对多变 shell代码的精确检测。最近,Dragos Ruiu发布了一个用于检测多变shell代码的snort预处理插件spp_fnord,这个插件采用了和上面相似的 检测技术。这个预处理插件有端口和长度两个配置选项。例如,如果某个人在配置时设置了80、21、23和53等端口,它就只对这几个 端口的数据流量进行多变shell代码的检测,而不会对其它端口(例如:22)进行检测。
3.会话拼接(session splicing,叫会话分割更合适一些)
上面讨论的这些方法都是属于攻击数据在一个数据包中的情况,没有涉及攻击数据和会话通过多个数据包投递的情况。RFP在Whisker 中实现了一种IDS逃避技术叫作会话拼接(session splicing),就是把会话数据放到多个数据包中发出,例如:
-------------------------
packet number content
--------------- ---------
1 G
--------------- ---------
2 E
--------------- ---------
3 T
--------------- ---------
4 20
--------------- ---------
5 /
--------------- ---------
6 H
--------------- ---------
通过这种方式,每次只投递几个字节的数据,就可能避开字符串匹配入侵检测系统的监视。要监视这种攻击,需要入侵检测系统或者 能够理解、监视网络会话(即使IDS有这种能力,攻击者也可以通过其它的凡是避开监视),或者采用其它的技术监视这种攻击。snort使 用以下规则来监视会话拼接:
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS 80 (msg:"WEB-MISC whisker
space splice attack"; content:" 20 "; flags:A ; dsize:1;
reference:arachnids,296; classtype:attempted-recon; reference)
这条规则使snort检测目标为$HTTP_SERVERS 80端口的ACK报文的负载长度是否等于1以及是否包含空格(16进制的20)。使用这条规则可以精确地检测出whisker,但是攻击者只要稍加修改就可以避开这个检测。为了能够检测可能出现的会话拼接攻击,可以对上面这条 snort规则进行扩展,使其检查负载很短的HTTP请求。但是,这样做的副作用是提高了误报警数量,而且在某些情况下攻击者还是能 够避开监视。为了真正有效地检测这种攻击,需要入侵检测系统能够完整地理解网络会话,不过这是非常困难的。应该注意的是目前 大多数系统能够重组会话,在所有的会话数据到达之前,它们会等待一些时间。而等待时间的长短与程序有关。例如,Apache/RedHat 的会话超时时间是6分钟,IIS/Win2K等待的时间非常长。因此,攻击者完全可以每15分钟发送一个字节的会话数据,而IIS还会认为是有效的会话。最新版本的snort能够监视长期的会话和网络层欺骗,例如:小TTL值。
4.碎片攻击
碎片攻击和会话拼接(session splicing)有点类似。直到最近,很多入侵检测系统在进行字符串匹配之前不能准确地重组碎片。现在这种 情况有了改观,所有的入侵检测系统都能够进行某些重组。不过,还是有很多方法可以避开入侵检测系统的监视。碎片重组的问题是 在进行字符串匹配以前,入侵检测系统必须在内存中缓存所有的碎片,然后进行重组。而且,他还需要直到、碎片在目的主机会如何 重组。Thomas Ptacek and Timoth Newsham于1998年写的Insertion,Evasion and Denial of Service: Eluding Network Intrusion Detection描述了许多基于网络的碎片躲避和其它类型的躲避技术。碎片攻击包括:碎片覆盖、碎片重写、碎片超时和针对网络拓扑的碎片技术(例如使用小的 TTL)等。下面,我们将详细讨论。
4.1.碎片覆盖
所谓碎片覆盖就是发送碎片覆盖先前碎片中的数据。例如:
碎片1 GET x.idd
碎片2 a.?(缓冲区溢出数据)
第二个碎片的第一个字符覆盖第一个碎片最后一个字符,这两个碎片被重组之后就变成了GET x.ida?(缓冲区溢出数据)。实际情况远非这么简单。
4.2.碎片数据覆盖
10月3日外电消息,一家安全厂商警告说,在软件厂商正式修复其软件安全漏洞之前使用第三方的补丁修复漏洞可能会引起更多的问题。也就是说,第三方补丁引起的问题会比它解决的问题还要多。
安全公司Sophos的高级技术顾问Graham Cluley对英国IT新闻网站vnunet.com说,如果人们使用第三方补丁自己修复安全漏洞,由于这种补丁的不可预见性,这个补丁在使用过程中可能会引起更多的冲突。
这位安全专家解释说,有些企业谨慎地使用非盈利组织Zert发布的补丁修复IE浏览器中的安全漏洞是可以理解的,因为他们不知道微软是否能够应付这个事情。他说,当微软发布安全补丁的时候,微软不必处理许多安全补丁,不必迎合这些计算机中的第三方补丁。
Cluley坚持认为,IT管理员在使用第三方补丁的时候应该权衡利弊。他说,这不是我们安全厂商能够为你做出的决策。我们不能说你们应该使用Zert的补丁,应为各个地方和每一个的情况都不同。
Sophos知道微软正在设法尽快发布自己的安全补丁,用户不必等到10月10日的下一个补丁周期。Cluley说,我认为微软可能会提前发布一个安全补丁,因为我们看到利用这个安全漏洞的企图正在增长。因此,这个安全漏洞肯定还没有修复,黑客对于利用这个漏洞非常感兴趣。
Cluley建议说,如果一家公司的风险很大,这家公司宁愿依靠第三方补丁也不愿意冒不理会安全漏洞的风险,使用第三方补丁是一种“可以理解的担心”。
Cluley说,我认识Zert组织的一些人。他们都是杰出的安全专家。Zert的补丁与某些人随意发布的补丁还是有些区别的。
木马与杀毒软件之间的战斗从来就没有停止过,通过对已知的木马进行加壳可以再次躲避杀毒软件的查杀。加了壳的木马可以防止被杀毒软件跟踪查杀和被跟踪调试,同时也可以防止木马本身的算法程序被别人静态分析。加壳软件通常可以分为压缩保护和加密保护两种。
压缩保护
压缩保护就是利用特定的压缩算法把程序压缩打包,运行的时候在内存中执行解压过程并运行主程序。常见的压缩类加壳软件有:UPX、ASpack、Petite、PE-PACK、WWPack32、Shrinker等。以UPX为例,它的主要功能就是压缩,由于木马要在内存中释放后才能运行,所以对付这类加壳木马,凡是有内存杀毒功能的杀毒软件都能获得很好的查杀效果。
加密保护
这类软件侧重的是加密和保护软件,在反编译和反调试功能方面比较完善,某些加密软件甚至可以做到锁定自身在内存中的进程而不让别的进程插进来。此类加壳软件由于具备反编译和反调试功能,杀毒软件很难查杀到壳里的木马。常见的加密类加壳软件有ASProtect、tElock、Armadillo、SVK Protector、Xtreme-Protector、Obsidium、PElock等。
给木马脱壳
要给木马脱壳,需要先知道加了什么壳。PEid一款专用的查壳工具,可以方便的检测出软件到底是使用什么东西加的壳,给脱壳带来了极大的便利!木马Cmdshell.exe是个只有7KB的小木马,通过开放本机的54088端口,实现远程命令行控制。下面就详细介绍一下给木马Cmdshell.exe脱壳的过程。运行软件后,点击“File(文件)”右边的浏览按钮,打开Cmdshell.exe文件,这时在主界面中就可以看到该文件的加壳情况:Cmdshell.exe使用的是UPX加壳。
通常UPX加壳和脱壳工具是通用的,所以笔者选用了使用起来比较容易的UPX Shell对加壳文件进行脱壳。运行UPX Shell程序,点击“OPen(打开)”按钮,选定被加壳的程序。切换到“Compress(压缩)”标签,选择“Decompress(解压缩)”,再点击“GO(运行)”按钮,即可完成脱壳。脱壳后程序由原来的7K变成了20K,文件脱壳成功。
PE-Scan也是一款专用的查壳脱壳工具,能识别出当今流行的绝大多数壳的类型,而且功能更强。PE-Scan可以检测出一些壳的入口点(OEP),方便手动脱壳。运行Pe-scan,打开加了壳的木马,即可看到木马加壳的类型(如图3)。这里笔者使用了一个用Asprotect加壳的木马来做测试,由于目前的PE-Scan并不支持脱Asprotect壳,所以“脱壳”按钮无法使用。
为了脱去Asprotect壳,还需要使用另外一款脱壳软件stripperX来帮忙,它可以方便快捷地脱掉ASpack和ASProtect加的壳。运行stripperX,点击“open(打开)”按钮,选择要脱壳的文件,再点击“unpack(脱壳)”按钮即可生成目标文件,完成脱壳任务。需要注意的是由于ASProtect在不断升级,低版本的stripperX往往不能脱最新版本的ASProtect壳,目前stripperX 2.07版本支持脱ASpack 2.xx 和 ASProtect 1.2x版本的壳,stripperX 2.11版本支持脱ASProtect 1.3~2.0版本的壳。
总的来说,脱壳要对症下药,先用PEid或PE-Scan查清楚壳的类型,然后找脱这种壳的工具,才能达到脱壳的目的。脱了壳的木马,就失去了保护,几乎所有的杀毒软件或木马查杀工具都能查杀它。当从网络上下载了某些怀疑有木马的程序,可以先用本文介绍的方法来检查一下,看看它是否被加了壳,如果是就要提高警惕了,建议不要使用。
Mysql有一个高级的但不标准的存取权限系统.此部分即描述其如何工作.权限系统做什么
Mysql的权限系统的主要功能是验证从假定主机来的用户连接.以及检查用户对数据库的select,insert,update和delete操作权限.其附加功能还包括匿名用户验证及赋予权限以使用Mysql特殊的功能,如从文件中装入数据和管理操作.
Mysql的用户名和口令
Mysql的用户名和口令在Unix和Windows之间有一些差别:·用户名,Mysql用于达到其验证目的.与Unix和Windows的用户名毫无干系(login names).大多数的Mysql客户端缺省的使用Uinx当前用户名作为 Mysql用户名去登录,但那只是为了方便而已.客户端程序允许使用-u或--user参数指定一个不同的名字.这意味着你不可能使Mysql数据库得到安全保护除非每一个Mysql用户名都具有口令.任何人都可以用任何名字来企图连接数据库,如果他们指定的某一个名字恰好没有口令,他们就会取得成功.
·Mysql用户名可以提高到十六位字符长,而典型的Unix用户名都限制在八位.
·Mysql的口令跟Unix口令毫无干系.不必把你登录进Unix机器的口令和你用来在该机器上存取数据库的口令联系起来.
·Mysql使用了与Unix登录进程不同的加密算法.请参见7.3.11节各种函数中对PASSWORD()和ENCRYPT()函数的描述.
连接上Mysql服务器
Mysql客户端程序通常会让你指定一些连接参数,但你想存取Mysql数据库的时候:你想连接的主机,你的用户名和口令.例如,Mysql客户端可以象这样开始(可选参数被加上了"["和"]"):
shell> mysql [-h 主机名] [-u 用户名] [-p口令]
也可以用--host=主机名,--user=用户名和--password=口令来代替-h,-u和-p选项.注意,在-p或--password和口令之间没有空格.
如果在命令行没有指定连接参数,Mysql将使用缺省值:
·缺省的主机名是localhost. ·缺省的用户名是你在Unix中的登录名. ·如果没有-p参数则将不提供口令.
因而,对于Unix用户Joe如下的命令是等价的
shell> mysql -h localhost -u joe shell> mysql -h localhost shell> mysql -u joe shell> mysql
其它的客户端的动作与此类似.
在Unix系统中,你不必在每一次调用客户机程序进行连接的时候都在命令行敲入所有选项,可以为它们指定不同的缺省值.这可以用两种方法来办到:
·你可以在你的home目录中的".my.cnf"配置文件中的[client]一节指定连接参数.该文件的相关节看起来可能象这样:
[client]host=host_name user=user_name password=your_pass
·你也可以使用环境变量来指定连接参数.主机可以被指定使用MYSQL_HOST,Mysql用户名可以被指定使用USER,LOGNAME或是LOGIN(尽管这些变量可能已经被设置成你的Unix登录名,但它们可能被任意改变).口令可以被指定为使用MYSQL_PWD(但这是不安全的;参见下节)
如果通过多种不同的方法指定连接参数,那么在命令行中指定的值比在配置文件中和环境变量中指定的值具有更高的优先权.而在配置文件中指定的值又比在环境变量中指定的值具有更高的优先权.
使你的口令安全
在其它用户可以发现的情况下将你的口令用一种方法暴露的指定出来是相当失策的.下面列出了当你使用客户端程序时可以用来指定密码的方法,比比较了每一种方法的优劣:
·在命令行使用一个 -p密码 或 --password=密码 参数.这确很方便,但极不安全,你密码能被系统状态检测程序看见(如ps),所以可以被其他用户调用出来显示在命令行上.(MySQL客户端特别在命令行参数初始化时用0覆盖它们,但在该值显得可见时仍有短暂的间隔). ·用一个-p或--password参数(不指定你的密码).这样,客户端程序会要求密码从终端输入:
shell> mysql -u 用户名 -p] Enter password: ********
客户端把你输入的密码以*"字符显示在终端上,以使旁观者无法看见.如此输入密码比你在命令行上指定密码更安全,因为它对其他用户并不可见.但是,此输入密码的方法只在你使用交互式程序时才有效.如果你想非交互的从一个脚本中调用客户端,则没有机会从终端输入密码了. ·把你的密码保存在一个配置文件中.举例来说,你可以把你的密码列在你home目录下的.my.cnf文件的[client]节:
[client] password=your_pass
如果你把密码存放在.my.cnf中,那么同组用户和其他用户对该文件必须不能具有读取和写入的权限.确定文件的存取模式必须为400或600.参见4.15.4节选项文件. ·你也可以把你的密码存放在MYSQL_PWD环境变量中,但该方法被认为极不安全而通常不被使用.某些版本的PS包括一个选项可以列出正在运行的进程的环境;你的密码将被清楚的显示出来,如果你设置了MYSQL_PWD环境变量的话.
总而言之,最安全的方法是在客户端提示输入密码或将密码保存在受到正确保护的.my.cnf文件中.
MySQL提供的权限
权限信息存放在mysql数据库(即数据库的名字叫mysql)的user, db, host, tables_priv and columns_priv表中.当MySQL服务器在启动时或在6.9节"改变的权限何时生效"指出的情况下读取这些表中的项目.
此手册所提及的MySQL提供的权限的名字列在其下,各列列出了权限的名字,对应的操作和适用的范围.
权限 列名 范围 select select_priv 表 insert Insert_priv 表 update Update_priv 表 delete Delete_priv 表 index Index_priv 表 alter Alter_priv 表 create Create_priv 数据库,表或索引 drop Drop_priv 数据库或表 grant Grant_priv 数据库或表 reload Reload_priv 服务器管理 shutdown Shutdown_priv 服务器管理 process Process_priv 服务器管理 file File_priv 服务器上文件存取
select, insert, update 和 delete 权限允许你在一个数据库中存在的表的行上执行操作.
仅当你真要从表中返回行时SELECT表达式才需要select权限.你可以执行一个SELECT表达式,甚至当你在服务器上没有存取任何数据库的权限时也行.比如,你可以用mysql客户端作一个简单的计数:
mysql> SELECT 1 1; mysql> SELECT PI()*2;
index权限允许你create或drop(删除)索引.
alter权限允许你使用ALTER TABLE.
create和drop权限允许你create新数据库和表,或drop(删除)存在的数据库和表.
注意,如果你允许一个用户拥有对mysql数据库的drop权限,那么该用户可以drop掉MySQL用来存放存取权限的地方.
grant权限允许你授予其他用户你所拥有的那些权限.
file权限允许你用LOAD DATA INFILE 和 SELECT ... INTO OUTFILE语句存取服务器上的文件.任何用户如果具有了这个权限他就可以存取任何MySQL服务器可以存取的文件.剩下的权限用于管理操作,在执行mysqladmin程序时会用到.下表列出了mysqladmin命令允许你执行的每一个管理权限:
权限 权限拥有者可以执行的操作 reload reload, refresh, flush-privileges, flush-hosts, flush-logs, flush-tables shutdown shutdown process processlist, kill
reload命令告诉服务器重新读取认证表.refresh命令刷新所有的数据库,打开和关闭日志文件.flush-privileges是reload的一个同义词.其它flush-*执行和refresh大致相同的功能,但是在更有限的范围内,也许在某些场合效果更好.例如,如果你仅想刷新日志文件,flush-logs就是比refresh更好的选择.
shutdown命令关闭服务器.
processlist命令列出有关服务器中所执行的线程的信息.kill命令杀掉服务器的线程.你通常只能列出和杀掉你自己的线程,但如果你有process权限就可以列出或杀掉由其他用户启动的线程.
通常只授予相关用户一些必须权限是一个好办法,当你得学会小心谨慎的授出下列权限:
·grant权限允许用户把他们自己的权限授予另外一些用户.如果两个用户有不同的权限,而又同时具有grant权限的话,那他们就共同具有了这所有的这些权限. ·alter权限拥有者可以用给表重命名的方式破坏权限系统. ·file权限些许会被滥用,以在数据库表中读取任何的全程文件,该项目可以使用SELECT进行存取. ·shudown权限也可能被滥用.关闭服务器,对其他所有用户拒绝服务. ·process权限可以以纯文本的方式显示出当前正执行的查询,包含设置和修改密码的查询. ·mysql数据库上的权限可以用来改变密码和其它存取权限信息.(密码是加密存储的,所以一个有恶意的用户不能简单的读取它们.但是,如果有足够的权限,他可以把它改成另一个不同的密码.)
通过MySQL权限系统无法实现下面一些事情:
·你不能明确的指定一个用户将被拒绝存取.也就是说,你不能明确指定匹配一个用户,拒绝它的连接. ·你不能指定一个用户能在一个数据库中创建和删除表,而不能创建和删除该数据库自身.
数据库命名规范
1、数据库表
根据表所属的子系统/模块,命名方式为:
数据库表名 = 子系统/模块 缩写 表含义
其中子系统/模块的缩写首字母大写,表含义中每个单词的首字母为大写。
子系统/模块及其缩写应在《数据库设计说明书》的约定部分加以描述。
例如:代码表可统一采用”code”为表的前缀,则:code_area表示地区代码表
2、表字段:
概念模型中,每个数据库中为每个表定义唯一的缩写,长度为4~8个字符,
字段名 = 表缩写 “_” 字段含义。
如地区代码表字段前缀为area,其相关字段名:
area_id :地区代码ID主键
area_name :地区代码名称
数据库表名及表缩写应在《数据库设计说明书》中加以描述。
3、索引
索引名 = idx “_” 表缩写 相关字段/索引含义
4、关联
关联指数据库表之间的外键关系
关联名 = rl “_” 主表缩写 从表缩写
5、存储过程:
存储过程名 = proc “_” 存储过程含义
在数据库表丢失或损坏的情况下,备份你的数据库是很重要的。如果发生系统崩溃,你肯定想能够将你的表尽可能丢失最少的数据恢复到崩溃发生时的状态。有时,正是MySQL管理员造成破坏。管理员已经知道表以破坏,用诸如vi或Emacs等编辑器试图直接编辑它们,这对表绝对不是件好事!
备份数据库两个主要方法是用mysqldump程序或直接拷贝数据库文件(如用cp、cpio或tar等)。每种方法都有其优缺点:
mysqldump与MySQL服务器协同操作。直接拷贝方法在服务器外部进行,并且你必须采取措施保证没有客户正在修改你将拷贝的表。如果你想用文件系统备份来备份数据库,也会发生同样的问题:如果数据库表在文件系统备份过程中被修改,进入备份的表文件主语不一致的状态,而对以后的恢复表将失去意义。文件系统备份与直接拷贝文件的区别是对后者你完全控制了备份过程,这样你能采取措施确保服务器让表不受干扰。 mysqldump比直接拷贝要慢些。 mysqldump生成能够移植到其它机器的文本文件,甚至那些有不同硬件结构的机器上。直接拷贝文件不能移植到其它机器上,除非你正在拷贝的表使用MyISAM存储格式。ISAM表只能在相似的硬件结构的机器上拷贝。在MySQL 3.23中引入的MyISAM表存储格式解决了该问题,因为该格式是机器无关的,所以直接拷贝文件可以移植到具有不同硬件结构的机器上。只要满足两个条件:另一台机器必须也运行MySQL 3.23或以后版本,而且文件必须以MyISAM格式表示,而不是ISAM格式。 不管你使用哪种备份方法,如果你需要恢复数据库,有几个原则应该遵守,以确保最好的结果:
定期实施备份。建立一个计划并严格遵守。 让服务器执行更新日志。当你在崩溃后需要恢复数据时,更新日志将帮助你。在你用备份文件恢复数据到备份时的状态后,你可以通过运行更新日志中的查询再次运用备份后面的修改,这将数据库中的表恢复到崩溃发生时的状态。 以文件系统备份的术语讲,数据库备份文件代表完全倾倒(full dump),而更新日志代表渐进倾倒(incremental dump)。
使用一种统一的和易理解的备份文件命名机制。象backup1、buckup2等不是特别有意义。当实施你的恢复时,你将浪费时间找出文件里是什么东西。你可能发觉用数据库名和日期构成备份文件名会很有用。例如: %mysqldump samp_db >/usr/archives/mysql/samp_db.1999-10-02
%mysqldump menagerie >/usr/archives/mysql/menagerie.1999-10-02
你可能想在生成备份后压缩它们。备份一般都很大!你也需要让你的备份文件有过期期限以避免它们填满你的磁盘,就象你让你的日志文件过期那样。
用文件系统备份备份你的备份文件。如果遇上了一个彻底崩溃,不仅清除了你的数据目录,也清除了包含你的数据库备份的磁盘驱动器,你将真正遇上了麻烦。也要备份你的更新日志。 将你的备份文件放在不同于用于你的数据库的文件系统上。这将降低由于生成备份而填满包含数据目录的文件系统的可能性。 用于创建备份的技术同样对拷贝数据库到另一台机器有用。最常见地,一个数据库被转移到了运行在另一台主机上的服务器,但是你也可以将数据转移到同一台主机上的另一个服务器。
1 使用mysqldump备份和拷贝数据库 当你使用mysqldumo程序产生数据库备份文件时,缺省地,文件内容包含创建正在倾倒的表的CREATE语句和包含表中行数据的INSERT语句。换句话说,mysqldump产生的输出可在以后用作mysql的输入来重建数据库。
你可以将整个数据库倾倒进一个单独的文本文件中,如下:
%mysqldump samp_db >/usr/archives/mysql/samp_db.1999-10-02
输出文件的开头看起来象这样:
# MySQL Dump 6.0 # # Host: localhost Database: samp_db #--------------------------------------- # Server version 3.23.2-alpha-log # # Table structure for table absence # CREATE TABLE absence( student_id int(10) unsigned DEFAULT NOT NULL, date date DEFAULT 000-00-00 NOT NULL, PRIMARY KEY (student_id,date) ); # # Dumping data for table absence # INSERT INTO absence VALUES (3,1999-09-03); INSERT INTO absence VALUES (5,1999-09-03); INSERT INTO absence VALUES (10,1999-09-08); ...... 文件剩下的部分有更多的INSERT和CREATE TABLE语句组成。
如果你想压缩备份,使用类似如下的命令:
%mysqldump samp_db | gzip >/usr/archives/mysql/samp_db.1999-10-02.gz
如果你要一个庞大的数据库,输出文件也将很庞大,可能难于管理。如果你愿意,你可以在mysqldump命令行的数据库名后列出单独的表名来倾到它们的内容,这将倾倒文件分成较小、更易于管理的文件。下例显示如何将samp_db数据库的一些表倾到进分开的文件中:
%mysqldump samp_db student score event absence >grapbook.sql %mysqldump samp_db member president >hist-league.sql
如果你生成准备用于定期刷新另一个数据库内容的备份文件,你可能想用--add-drop-table选项。这告诉服务器将DROP TABLE IF EXISTS语句写入备份文件,然后,当你取出备份文件并把它装载进第二个数据库时,如果表已经存在,你不会得到一个错误。
如果你倒出一个数据库以便能把数据库转移到另一个服务器,你甚至不必创建备份文件。要保证数据库存在于另一台主机,然后用管道倾倒数据库,这样mysql能直接读取mysqldump的输出。例如:你想从主机pit-viper.snake.net拷贝数据库samp_db到boa.snake.net,可以这样很容易做到:
%mysqladmin -h boa.snake.net create samp_db %mysqldump samp_db | mysql -h boa.snake.net samp_db
以后,如果你想再次刷新boa.snake.net上的数据库,跳过mysqladmin命令,但要对mysqldump加上--add-drop-table以避免的得到表已存在的错误:
%mysqldump --add-drop-table samp_db | mysql -h boa.snake.net samp_db
mysqldump其它有用的选项包括:
--flush-logs和--lock-tables组合将对你的数据库检查点有帮助。--lock-tables锁定你正在倾倒的所有表,而--flush-logs关闭并重新打开更新日志文件,新的更新日志将只包括从备份点起的修改数据库的查询。这将设置你的更新日志检查点位备份时间。(然而如果你有需要执行个更新的客户,锁定所有表对备份期间的客户访问不是件好事。) 如果你使用--flush-logs设置检查点到备份时,有可能最好是倾倒整个数据库。如果你倾倒单独的文件,较难将更新日志检查点与备份文件同步。在恢复期间,你通常按数据库为基础提取更新日志内容,对单个表没有提取更新的选择,所以你必须自己提取它们。
缺省地,mysqldump在写入前将一个表的整个内容读进内存。这通常确实不必要,并且实际上如果你有一个大表,几乎是失败的。你可用--quick选项告诉mysqldump只要它检索出一行就写出每一行。为了进一步优化倾倒过程,使用--opt而不是--quick。--opt选项打开其它选项,加速数据的倾倒和把它们读回。 用--opt实施备份可能是最常用的方法,因为备份速度上的优势。然而,要警告你,--opt选项确实有代价,--opt优化的是你的备份过程,不是其他客户对数据库的访问。--opt选项通过一次锁定所有表阻止任何人更新你正在倾倒的任何表。你可在一般数据库访问上很容易看到其效果。当你的数据库一般非常频繁地使用,只是一天一次地调节备份。
一个具有--opt的相反效果的选项是--dedayed。该选项使得mysqldump写出INSERT DELAYED语句而不是INSERT语句。如果你将数据文件装入另一个数据库并且你想是这个操作对可能出现在该数据库中的查询的影响最小,--delayed对此很有帮助。 --compress选项在你拷贝数据库到另一台机器上时很有帮助,因为它减少网络传输字节的数量。下面有一个例子,注意到--compress对与远端主机上的服务器通信的程序才给出,而不是对与本地主机连接的程序: %mysqldump --opt samp_db | mysql --compress -h boa.snake.net samp_db mysqldump有很多选项,详见《MySQL参考手册》。
2 使用直接拷贝数据库的备份和拷贝方法 另一种不涉及mysqldump备份数据库和表的方式是直接拷贝数据库表文件。典型地,这用诸如cp、tar或cpio实用程序。本文的例子使用cp。
当你使用一种直接备份方法时,你必须保证表不在被使用。如果服务器在你则正在拷贝一个表时改变它,拷贝就失去意义。
保证你的拷贝完整性的最好方法是关闭服务器,拷贝文件,然后重启服务器。如果你不想关闭服务器,要在执行表检查的同时锁定服务器。如果服务器在运行,相同的制约也适用于拷贝文件,而且你应该使用相同的锁定协议让服务器“安静下来”。
假设服务器关闭或你已经锁定了你想拷贝的表,下列显示如何将整个samp_db数据库备份到一个备份目录(DATADIR表示服务器的数据目录):
很多网络初级用户认为,只要装了杀毒软件,系统就绝对安全了,这种想法是万万要不得的!在现今的网络安全环境下,木马、病毒肆虐,黑客攻击频繁,而各种流氓软软件、间谍软件也行风作浪。怎样才能让我们的系统立于如此险恶的网络环境呢?光靠杀毒软件足以保证我们的系统安全吗?下面我就从影响系统安全的几个方面来剖析防火墙的重要性。
现在的网络安全威胁主要来自病毒攻击、木马攻击、黑客攻击以及间谍软件攻击。杀毒软件发展了十几年,依然是停留在被动杀毒的层面(别看那些自我标榜主动防御,无非是一些骗人的幌子,看看这个文章就知道了http://column.chinabyte.com/388/2014388.shtml),而国外的调查表明,当今全球杀毒软件对80%的病毒无法起到识别作用,也就是说,杀毒软件之所以能杀毒,纯粹是根据病毒样本的代码特征来识别他是否是病毒,就如警察抓住一个小偷,这个小偷留着大胡子,于是警察就天天在街上盯着大胡子的人。这样的杀毒效果可想而知。同样的道理,杀毒软件对于木马、间谍软件的防范也是基于这种方式。
现在病毒、木马的更新很快,从全球范围内来看,能造成较大损失的病毒木马,大部分都是新出现的,或者是各类变种,由于这些病毒木马的特征并没有被杀毒软件掌握,因此杀毒软件对它们是既不能报警,也无法剿杀。难道我们就任病毒木马宰割了吗?当然不!高手岂能向几个病毒木马低头!虽然杀毒软件只能干瞪眼,可是我们还有严守大门的防火墙呢!
防火墙为什么就能挡住病毒木马甚至是最新的病毒木马变种呢?这就要从防火墙的防御机制说起了。防火墙是根据连接网络的数据包来进行监控的,也就是说,防火墙就相当于一个严格的门卫,掌管系统的各扇门(端口),它负责对进出的人进行身份核实,每个人都需要得到最高长官的许可才可以出入,而这个最高长官,就是你自己了。每当有不明的程序想要进入系统,或者连出网络,防火墙都会在第一时间拦截,并检查身份,如果是经过你许可放行的(比如在应用规则设置中你允许了某一个程序连接网络),则防火墙会放行该程序所发出的所有数据包,如果检测到这个程序并没有被许可放行,则自动报警,并发出提示是否允许这个程序放行,这时候就需要你这个“最高统帅”做出判断了。一般来说,自己没有运行或者不太了解的程序,我们一律阻拦,并通过搜索引擎或者防火墙的提示确认该软件的性质。
写到这里,大家估计对杀毒软件和防火墙的区别有一定了解了,举个直观的例子:你的系统就好比一座城堡,你是这个城堡的最高统帅,杀毒软件和防火墙是负责安全的警卫,各有分工。杀毒软件负责对进入城堡的人进行鉴别,如果发现可疑的人物就抓起来(当然,抓错的几率很大,不然就没有这么多误杀误报事件了);而防火墙则是门卫,对每一个进出城堡的人都进行检查,一旦发现没有出入证的人就向最高统帅确认。因此,任何木马或者间谍软件,或许可能在杀毒软件的眼皮底下偷偷记录你的帐号密码,可是由于防火墙把城门看得死死的,再多的信息也传不出去,从而保护了你的系统安全。
另外,对于黑客攻击,杀毒软件是没有任何办法的,因为黑客的操作不具有任何特征码,杀毒软件自然无法识别,而防火墙则可以把你系统的每个端口都隐藏起来,让黑客找不到入口,自然也就保证了系统的安全。
目前全球范围内防火墙种类繁多,不过从个人经验来说,推荐天网防火墙给大家。天网防火墙可以有效的防止黑客、木马或者其他恶意程序盗取您的隐私包括:网上银行、网络游戏、QQ等的帐号和密码。