金色的骷髅 发表于 2015-1-16 20:12:32

发一篇MySQL数据库在收集平安方面的一些进攻措施

有的时候,一些缺失的功能可以通过别的办法来实现,例如,在MySQL4.1以前,你可以通过使用join方法来替代子查询的功能。在MySQL5.0中,大多数关系型数据库所要求的功能已经都具备。跟着收集的提高,基于收集的使用也愈来愈多。收集数据库就是个中之一。经由过程一台或几台服务器能够为良多客户供应服务,这类体例给人们带来了良多便利,但也给犯科份子形成了无隙可乘。因为数据都是经由过程收集传输的,这就能够在传输的过程当中被截获,大概经由过程十分手腕进进数据库。因为以上缘故原由,数据库平安就显得非常主要。因而,本文就以上成绩会商了MySQL数据库在收集平安方面的一些措施。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">帐户平安<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">帐户是MySQL最复杂的平安措施。每帐户都由用户名、暗码和地位(一样平常由服务器名、ip或通配符)构成。如用户john从server1举行登录大概和john从server2登录的权限分歧。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">MySQL的用户布局是用户名/暗码/地位。这个中其实不包含数据库名。上面的两条命令为database1和database2设置了SELECT用户权限。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">GRANTSELECTONdatabase1.*toabc@server1IDENTIFIEDBYpassWord1;<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">GRANTSELECTONdatabase2.*toabc@server1IDENTIFIEDBYpassword2;<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">第一条命令设置了用户abc在毗连数据库database1时利用password1。第二条命令设置了用户abc在毗连数据库database2时利用password2。因而,用户abc在毗连数据库database1和database2的暗码是纷歧样的。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">下面的设置长短常有效的。假如你只想让用户对一个数据库举行无限的会见,而对别的数据库不克不及会见,如许能够对统一个用户设置分歧的暗码。假如不如许做,当用户发明这个用户名能够会见别的数据库时,那将会形成贫苦。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">MySQL利用了良多受权表来跟踪用户和这些用户的分歧权限。这些表就是在mysql数据库中的MyISAM表。将这些平安信息保留在MySQL中长短常成心义的。因而,我们可使用尺度的SQL来设置分歧的权限。<Pstyle="TEXT-INDENT:2em">一样平常在MySQL数据库中可使用3种分歧范例的平安反省:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">・登录考证<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">也就是最经常使用的用户名和暗码考证。一但你输出了准确的用户名和暗码,这个考证便可经由过程。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">・受权<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">在登录乐成后,就请求对这个用户设置它的详细权限。如是不是能够删除数据库中的表等。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">・会见把持<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">这个平安范例更详细。它触及到这个用户能够对数据表举行甚么样的操纵,如是不是能够编纂数据库,是不是能够查询数据等等。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">会见把持由一些特权构成,这些特权触及到所何利用和操纵MySQL中的数据。它们都是布尔型,即要末同意,要末不同意。上面是这些特权的列表:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">・SELECT<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">SELECT是设定用户是不是可使用SELECT来查询数据。假如用户没有这个特权,那末就只能实行一些复杂的SELECT命令,如盘算表达式(SELECT12),或是日期转换(SELECTUnix_TIMESTAMP(NOW()))等。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">・INSERT<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">・UPDATE<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">・INDEX<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">INDEX决意用户是不是能够对表的索引举行设置。假如用户没有这个权限,那末将没法设置表中的索引。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">・ALTER<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">・CREATE<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">・GRANT<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">假如一个用户具有这个GRANT权限,那末他就能够将本人的权限授给其余用户。也就是说,这个用户能够和别的用户共享本人的权限。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">・REFERENCES<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">有了REFERENCES权限,用户就能够将别的表的一个字段作为某一个表的外键束缚。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">除以上的权限外,MySQL另有一些权限能够对全部MySQL举行操纵。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">・Reload<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">这个权限可使用户有权实行各类FLUSH命令,如FLUSHTABLES,FLUSHSTATUS等。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">・Shutdown<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">这个权限同意用户封闭MySQL<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">・PRocess<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">经由过程这个权限,用户能够实行SHOWPROCESSLIST和KILL命令。这些命令能够检察MySQL的处置历程,能够经由过程这类体例检察SQL实行的细节。<Pstyle="TEXT-INDENT:2em">・File<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">这个权限决意用户是不是能够实行LOADDATAINFILE命令。给用户这个权限要稳重,由于有这个权限的用户能够将恣意的文件装载到表中,如许对MySQL是非常伤害的。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">・Super<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">这个权限同意用户停止任何查询(这些查询大概并非这个用户实行的)。<Pstyle="TEXT-INDENT:2em">以上几种权限长短常伤害的,在给用户受权限时要十分审慎。

<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">MySQL中的SSL<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">以上的帐户平安只是以一般的Socket举行数据传输的,如许十分不平安。因而,MySQL在4.1版今后供应了对SSL(SecureScoketsLayer)的撑持。MySQL利用的是收费的OpenSSL库。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">  因为MySQL的linux版本一样平常都是随Linux自己一同公布,因而,它们默许时都不利用SSL举行传输数据。假如要翻开SSL功效,必要对hava_openssl变量举行设置:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">MySQL的Windows版本已将OpenSSL到场了。也面的命令是检察你的MySQL是不是翻开了SSL功效。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">SHOWVARIABLESLIKEhave_openssl;<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">----------------------<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">|Variable_name|Value|<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">----------------------<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">|have_openssl|NO|<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">----------------------<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">1rowinset(0.00sec)<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">假如前往的是NO,那末申明你必要将OpenSSL编译进本人的MySQL在偶然你大概必要将用户名和暗码举行加密传输。在这时候可使用上面GRANT命令:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">GRANTALLPRIVILEGESONssl_only_db.<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">*toabc@%IDENTIFIEDBY"password!"REQUIRESSL;<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">还能够经由过程REQUIREx509选项举行SSL传输:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">GRANTALLPRIVILEGESONssl_only_db.<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">*toabc@%IDENTIFIEDBY"password!"REQUIREx509;<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">你还可使用REQUIRESUBJECT来指定一个特定的客户端证书来会见数据库。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">GRANTALLPRIVILEGESONssl_only_db.*toabc@%<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">IDENTIFIEDBY"password!"<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">REQUIRESUBJECT"/C=US/ST=NewYork/L=Albany/O=WidgetsInc./CN=client-ray.<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">example.com/emailAddress=raymond@example.com";<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">大概你其实不体贴利用的是甚么客户允许,而仅仅体贴的是你的证书。那末你可使用REQUIREISSUER来完成:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">GRANTALLPRIVILEGESONssl_only_db.<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">*toabc@%IDENTIFIEDBY"password!"<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">REQUIREISSUER<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">"/C=US/ST=New20York/L=Albany/O=WidgetsInc./CN=cacert.example.<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">com/emailAddress=admin@example.com";<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">SSL还能够间接经由过程暗码举行加密。可使用REQUIRECIPHER设置暗码。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">GRANTALLPRIVILEGESONssl_only_db.<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">*toabc@%IDENTIFIEDBY"password!"<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">REQUIRECIPHER"EDH-RSA-DES-CBC3-SHA";<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">下面利用了GRANT命令对用户权限举行设置。而这些信息都是保留在受权表中,这些表是平安体系的心脏。在这些表中保留了每个用户和客户机所具有的权限。假如准确地操纵这些表,将会对数据库的平安起到主动的感化,而假如利用失慎,将长短常伤害的。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">上面让我们来看看MySQL中的最要的5个受权表。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">user<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">用户表保留了用户的权限和被加密的暗码。这个表卖力断定哪些用户和客户机能够毗连到服务器上。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">host<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">这个表为每个客户机分派权限,它其实不思索用户的权限。MySQL在断定是不是吸收仍是回绝一个毗连时,起首思索的是user表。而利用GRANT或REVOKE命令其实不影响host表,我们能够经由过程手工体例修正这个表中的内容。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">db<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">db表保留了数据库层的权限信息。<Pstyle="TEXT-INDENT:2em">tables_priv<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">这个表存储了表的权限信息。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">columns_priv<Pstyle="TEXT-INDENT:2em">这个表保留了独自列的权限信息。经由过程这个表,能够将操纵某一列的权限授与一个用户。

<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">哈希加密<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">假如数据库保留了敏感的数据,如银行卡暗码,客户信息等,你大概想将这些数据以加密的情势保留在数据库中。如许即便有人进进了你的数据库,并看到了这些数据,也很难取得个中的实在信息。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">在使用程序的大批信息中,大概你只想交很小的一部分举行加密,如用户的暗码等。这些暗码不该该以明文的情势保留,它们应当以加密的情势保留在数据库中。一样平常情形下,年夜多半体系,这个中包含MySQL自己都是利用哈希算法对敏感数据举行加密的。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">哈希加密是单向加密,也就是说,被加密的字符串是没法失掉原字符串的。这类办法利用很无限,一样平常只利用在暗码考证或别的必要考证的中央。在对照时并非将加密字符串举行解密,而是将输出的字符串也利用一样的办法举行加密,再和数据库中的加密字符串举行对照。如许即便晓得了算法并失掉了加密字符串,也没法复原最后的字符串。银行卡暗码就是接纳的这类体例举行加密。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">MySQL供应了4个函数用于哈希加密:PASSWORD,ENCRYPT,SHA1和md5。上面让我们试一试这4个函数,看看会失掉甚么了局。我们以加密字符串"pa55word"为例举行申明:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">让我们先来看看MD5函数:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">SELECTMD5(pa55word);<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">----------------------------------<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">|MD5(pa55word)|<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">----------------------------------<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">|a17a41337551d6542fd005e18b43afd4|<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">----------------------------------<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">1rowinset(0.13sec)<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">上面是PASSWORD函数:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">SELECTPASSWORD(pa55word);<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">----------------------<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">|PASSWORD(pa55word)|<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">----------------------<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">|1d35c6556b8cab45|<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">----------------------<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">1rowinset(0.00sec)<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">上面是ENCRYPT函数:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">SELECTENCRYPT(pa55word);<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">---------------------<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">|ENCRYPT(pa55word)|<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">---------------------<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">|up2Ecb0Hdj25A|<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">---------------------<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">1rowinset(0.17sec)<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">下面的每一个函数都前往了一个加密后的字符串。为了辨别加密字符串的巨细写,最幸亏利用ENCRYPT天生加密字符串时,将这个字段界说成CHARBINARY范例。<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">下面枚举了3种加密的办法,但我以为利用MD5加密是最好的。这是由于如许做能够将明文暗码显现在处置列表中或是查询日记中,如许便于跟踪。以下面的INSERT语句利用拔出了一笔记录,个中的暗码利用了MD5举行加密:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">INSERTINTOtable1(user,pw)VALUE(user1,MD5(password1))<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">能够经由过程以下的语句举行暗码考证:<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">SELECT*FROMtable1WHEREuser=user1ANDpw=MD5(password1)<Pstyle="TEXT-INDENT:2em">哈希加密办法能够很好地对暗码举行加密,利用了这类办法加密,暗码将没法恢复成明文。
怀疑这些功能在MySQL5.0中的成熟性。充其量它们在MySQL中被支持的时间也就一年左右,而在MySQL学习教程其他关系型数据库中则已经存在了近10年的时间。

若相依 发表于 2015-1-18 18:43:56

每天坚持做不一样的是,认真做笔录,定时复习。一个月你就可以有一定的收获。当然如果你想在sql方面有一定的造诣,你少不了需要看很多很多的书籍了。

活着的死人 发表于 2015-1-26 05:28:32

从项目平台的选择上讲,我们关心的,应该是一款产品能不能满足任务需求,而不是网上怎么说。

再现理想 发表于 2015-2-4 13:51:14

你可以简单地认为适合的就是好,不适合就是不好。

若天明 发表于 2015-2-10 01:23:04

光写几个SQL实在叫无知。

飘飘悠悠 发表于 2015-2-28 14:36:13

多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。

不帅 发表于 2015-3-10 00:25:58

SQLServer的异构移植功能个人感觉最好了。(如果对比过SQLServer的链接服务器和Oracle的透明网关的朋友会发现SQLServer的sp_addlinkedserver(openquery)异构数据库系列比Oracle真是强太多了。)

柔情似水 发表于 2015-3-17 04:05:14

可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。

小魔女 发表于 2015-3-23 18:22:04

XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应该是相当的熟了!)
页: [1]
查看完整版本: 发一篇MySQL数据库在收集平安方面的一些进攻措施