返回列表 发新帖

MYSQL数据库安全解决方案

54.6k 10
开着越野放牛 发表于 2013-6-14 21:06:29|湖北 | 查看全部 阅读模式
随着网络的普及,基于网络的应用也越来越多。网络数据库就是其中之一。通过一台或几台服务器可以为很多客户提供服务,这种方式给人们带来了很多方便,但也给不法分子造成了可乘之机。由于数据都是通过网络传输的,这就可以在传输的过程中被截获,或者通过非常手段进入数据库。由于以上原因,数据库安全就显得十分重要。因此,本文就以上问题讨论了MySQL数据库在网络安全方面的一些功能。
: n! w% }. y) d1 H* j/ s( ?! K' z: p帐户安全
3 o1 Q: y" Z# V* @, ~! L( z2 {" A: c帐户是MySQL最简单的安全措施。每一帐户都由用户名、密码以及位置(一般由服务器名、IP或通配符)组成。如用户john从server1进行登录可能和john从server2登录的权限不同。( f( C. v; [3 ]& k% a9 f7 q6 y
MySQL的用户结构是用户名/密码/位置。这其中并不包括数据库名。下面的两条命令为database1和database2设置了SELECT用户权限。
* j' r0 U5 s) y- i+ hGRANT SELECT ON database1.* to ‘abc’@‘server1’ IDENTIFIED BY ‘password1’;  j* ~9 Y# }. }" ^* Y+ \4 N
GRANT SELECT ON database2.* to ‘abc’@‘server1’ IDENTIFIED BY ‘password2’;
4 V" Y$ d  E6 Y) ]0 T第一条命令设置了用户abc在连接数据库database1时使用password1。第二条命令设置了用户abc在连接数据库database2时使用password2。因此,用户abc在连接数据库database1和database2的密码是不一样的。
/ M" Z/ d, P' r0 _1 F& S上面的设置是非常有用的。如果你只想让用户对一个数据库进行有限的访问,而对其它数据库不能访问,这样可以对同一个用户设置不同的密码。如果不这样做,当用户发现这个用户名可以访问其它数据库时,那将会造成麻烦。
+ w, G% h0 V5 r6 {( M' iMySQL使用了很多授权表来跟踪用户和这些用户的不同权限。这些表就是在mysql数据库中的MyISAM表。将这些安全信息保存在MySQL中是非常有意义的。因此,我们可以使用标准的SQL来设置不同的权限。
0 f+ ~3 I3 G3 B6 p. w! V- U+ u1 N一般在MySQL数据库中可以使用3种不同类型的安全检查:
# G5 E; b2 \, i: {4 j4 e/ Q·登录验证+ g% `/ K  W: I3 J
也就是最常用的用户名和密码验证。一但你输入了正确的用户名和密码,这个验证就可通过。4 J7 n1 Z: P+ ]1 {
·授权: j' o5 a' E- ]# o! V6 }5 f
在登录成功后,就要求对这个用户设置它的具体权限。如是否可以删除数据库中的表等。
* T% ?0 _& @/ ^% i# b" v" p: A* B* @·访问控制% O& G7 ?* D" f; f: w. V
这个安全类型更具体。它涉及到这个用户可以对数据表进行什么样的操作,如是否可以编辑数据库,是否可以查询数据等等。) V3 s3 u6 F" P. `
访问控制由一些特权组成,这些特权涉及到所何使用和操作MySQL中的数据。它们都是布尔型,即要么允许,要么不允许。下面是这些特权的列表:
+ I( t) T/ J, d/ P# B·SELECT
: g/ `3 S% b9 OSELECT是设定用户是否可以使用SELECT来查询数据。如果用户没有这个特权,那么就只能执行一些简单的SELECT命令,如计算表达式(SELECT 1+2),或是日期转换(SELECT Unix_TIMESTAMP(NOW( )))等。. C6 d: n. p& ~
·INSERT$ C) j' d9 W. ~0 ^
·UPDATE& \: `0 M( j! t' M( B5 O5 j2 A
·INDEX
: h( H7 Q' Z! S: C. GINDEX决定用户是否可以对表的索引进行设置。如果用户没有这个权限,那么将无法设置表中的索引。6 X# Z' C$ Z7 z; [
·ALTER1 u$ L+ q/ U& G
·CREATE2 R* {/ x3 J! B0 {2 a
·GRANT
2 O2 r& v/ a% A如果一个用户拥有这个GRANT权限,那么他就可以将自己的权限授给别的用户。也就是说,这个用户可以和其它用户共享自己的权限。4 G7 r& R) a1 S5 x: F: n
·REFERENCES
, c- ?1 X1 J" F2 R  Z& o有了REFERENCES权限,用户就可以将其它表的一个字段作为某一个表的外键约束。; C5 _% n; X7 P/ y3 O/ ^9 z3 O% Z- P
除了以上的权限外,MySQL还有一些权限可以对整个MySQL进行操作。+ m  l  v4 t: o5 \8 u1 k. z
·Reload
" h, R5 n$ _0 K5 T这个权限可以使用户有权执行各种FLUSH命令,如FLUSH TABLES, FLUSH STATUS等。  ~1 s9 A6 m, `& L0 D
·Shutdown8 [7 P; a" S4 f1 U# l+ ]
这个权限允许用户关闭MySQL
# S1 r# n# {2 @( m) v3 e8 K( K  t·Process2 N1 a$ ?5 p6 n! _
通过这个权限,用户可以执行SHOW PROCESSLIST和KILL命令。这些命令可以查看MySQL的处理进程,可以通过这种方式查看SQL执行的细节。4 H7 a! Q: }: G
·File- k& e# d5 }1 w/ Z4 ~4 L& r1 k
这个权限决定用户是否可以执行LOAD DATA INFILE命令。给用户这个权限要慎重,因为有这个权限的用户可以将任意的文件装载到表中,这样对MySQL是十分危险的。8 Z" v- L0 K3 A# r0 z0 R
·Super
' v; R2 g& S$ ]4 o这个权限允许用户终止任何查询(这些查询可能并不是这个用户执行的)。- T/ g, l. I! S7 A; N$ N, H
以上几种权限是非常危险的,在给用户授权限时要非常谨慎。0 o" j' A7 c. p3 ^9 }
[NextPage]1 @7 E+ D5 M2 r5 v4 u, q4 t$ _& ?
MySQL中的SSL
6 _- p; v% ~# B/ Y- W6 g0 l以上的帐户安全只是以普通的Socket进行数据传输的,这样非常不安全。因此,MySQL在4.1版以后提供了对SSL(Secure Scokets Layer)的支持。MySQL使用的是免费的OpenSSL库。
% B! y/ e8 s0 m+ ]由于MySQL的Linux版本一般都是随Linux本身一起发布,因此,它们默认时都不使用SSL进行传输数据。如果要打开SSL功能,需要对hava_openssl变量进行设置:
% p( z2 q) O* ^1 KMySQL的Windows版本已经将OpenSSL加入了。也面的命令是查看你的MySQL是否打开了SSL功能。
/ t- q- [' k; e- e& J* G- [SHOW VARIABLES LIKE ‘have_openssl’;
. P* e. f* |6 u) W7 E+---------------+-------+
& `6 @% ]7 a- L" P# P& f| Variable_name | Value |4 U5 S4 Z! O' E) R- M
+---------------+-------+
+ |5 @, _8 U# _0 {7 g& g1 m| have_openssl | NO |# E3 ]7 Z- L8 \" h
+---------------+-------+3 h/ X7 J* W4 S4 I8 A* d: n
1 row in set (0.00 sec)/ ~$ C! Z0 g0 Y, |- j  z4 }1 C% {
如果返回的是NO,那么说明你需要将OpenSSL编译进自己的MySQL
. J9 y1 |# L5 X! Z4 d& e2 [在有时你可能需要将用户名和密码进行加密传输。在这时可以使用下面GRANT命令:; x+ e! M/ g# V# D
GRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!” REQUIRE SSL;5 L5 r# |8 ?: A* b9 }# q
还可以通过 REQUIRE x509 选项进行SSL传输:
' J0 A/ ?$ T9 g. m/ m0 {GRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!” REQUIRE x509;) F1 k" ]+ |5 F% U. `, {8 o* [
你还可以使用REQUIRE SUBJECT来指定一个特定的客户端证书来访问数据库。
' ]; G6 S* x, n/ Y- k: n' p; KGRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’* Z' @4 W% x- n
IDENTIFIED BY “password!”
* M* l7 [4 Y; J( y' `( t) _REQUIRE SUBJECT “/C=US/ST=New York/L=Albany/O=Widgets Inc./CN=client-ray., Q" x1 {; J  P, \# h. `
example.com/emailAddress=raymond@example.com”;
0 F& Y3 v0 I& D也许你并不关心使用的是什么客户许可,而仅仅关心的是你的证书。那么你可以使用REQUIRE ISSUER来实现:
9 ]# X1 i5 L3 t5 h% g* RGRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!”5 p5 d) H6 Z( G4 Q5 B
REQUIRE ISSUER “/C=US/ST=New+20York/L=Albany/O=Widgets Inc./CN=cacert.example.
# d1 |" [; W, N- [" `$ B4 X6 Fcom/emailAddress=admin@example.com”;
' p+ H5 M* G+ F; _SSL还可以直接通过密码进行加密。可以使用REQUIRE CIPHER设置密码。4 }; x# j% }% X" Y
GRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!”
1 c& y& v4 h  ^2 vREQUIRE CIPHER “EDH-RSA-DES-CBC3-SHA”;' h- a" F8 x. R: O& |6 e( H' t$ g
上面使用了GRANT命令对用户权限进行设置。而这些信息都是保存在授权表中,这些表是安全系统的心脏。在这些表中保存了每一个用户和客户机所具有的权限。如果正确地操作这些表,将会对数据库的安全起到积极的作用,而如果使用不慎,将是非常危险的。  a& ~9 b6 `/ {, K! T3 D/ M6 W. ]
下面让我们来看看MySQL中的最要的5个授权表。
/ ^+ ]8 b1 f0 x# r0 suser: }% t# p7 h0 ]* |* A1 x
用户表保存了用户的权限和被加密的密码。这个表负责确定哪些用户和客户机可以连接到服务器上。
; |# q' c% v; M2 \. X9 W' Uhost
, n3 }5 ^! C) f+ y1 I! \& j这个表为每一个客户机分配权限,它并不考虑用户的权限。MySQL在确定是否接收还是拒绝一个连接时,首先考虑的是user表。而使用GRANT或REVOKE命令并不影响host表,我们可以通过手工方式修改这个表中的内容。
. L8 s+ [9 H7 ^9 x6 P2 ^db6 v# F- D) k- [' m" S. @2 P
db表保存了数据库层的权限信息。
% G# B( M9 j* y' etables_priv3 O9 m* r3 x; j1 O- L; R6 G% h
这个表存储了表的权限信息。
) \1 B% D* e2 y9 E* D) i1 ]columns_priv% @# W1 ?$ [4 Y" Y! z
这个表保存了单独列的权限信息。通过这个表,可以将操作某一列的权限授予一个用户。
. x( Q, O! Z; }0 g% E& i1 S[NextPage]7 J+ P5 U5 [- M6 j8 a
哈希加密+ d! ]* p  z7 ^. p7 Q. A  E% V& z
如果数据库保存了敏感的数据,如银行卡密码,客户信息等,你可能想将这些数据以加密的形式保存在数据库中。这样即使有人进入了你的数据库,并看到了这些数据,也很难获得其中的真实信息。
0 R# s6 `6 M) G- |. S7 c+ a) C在应用程序的大量信息中,也许你只想交很小的一部分进行加密,如用户的密码等。这些密码不应该以明文的形式保存,它们应该以加密的形式保存在数据库中。一般情况下,大多数系统,这其中包括MySQL本身都是使用哈希算法对敏感数据进行加密的。
8 Z) q/ r8 G1 ]3 B哈希加密是单向加密,也就是说,被加密的字符串是无法得到原字符串的。这种方法使用很有限,一般只使用在密码验证或其它需要验证的地方。在比较时并不是将加密字符串进行解密,而是将输入的字符串也使用同样的方法进行加密,再和数据库中的加密字符串进行比较。这样即使知道了算法并得到了加密字符串,也无法还原最初的字符串。银行卡密码就是采用的这种方式进行加密。
3 V; X, C& G; wMySQL提供了4个函数用于哈希加密:PASSWORD, ENCRYPT, SHA1和MD5。下面让我们试一试这4个函数,看看会得到什么结果。我们以加密字符串“pa55word”为例进行说明:
$ F: Z& U6 l/ @# c. x让我们先来看看MD5函数
- `; u: k5 q; \- Q- F6 O. ySELECT MD5(‘pa55word’);$ `* M7 `, m9 R4 n1 i
+----------------------------------+
* E, i7 F3 N, e! B9 S9 m2 S: {& P| MD5(‘pa55word’) |$ z0 T& w6 E7 P* D* q
+----------------------------------+
3 U+ d" i0 r/ U! r8 p' l| a17a41337551d6542fd005e18b43afd4 |
5 \5 m# j) N" h) \' a2 j* N2 D4 \& e1 t. I. P& ^8 z
+----------------------------------+, ~1 _  e' a" s0 {$ q
1 row in set (0.13 sec)! _( K; y# v- |7 o+ E8 x3 A& v
下面是PASSWORD函数
; w' |4 W3 A  N& ?, f; L3 M- vSELECT PASSWORD(‘pa55word’);
8 k8 {' u4 L* r2 E9 \  N) {1 D1 b+----------------------+
& o/ m$ b+ v! |7 U5 O5 N| PASSWORD(‘pa55word’) |
" t) A+ b- z8 v+----------------------+
  n4 D: k7 T6 G+ @| 1d35c6556b8cab45 |0 u3 D, K7 `: w! ]
+----------------------+
$ y0 v! D' b2 d1 row in set (0.00 sec)9 X8 K8 h' z/ L5 [4 y
下面是ENCRYPT函数
8 c$ y7 f. H2 f# T* ~; QSELECT ENCRYPT(‘pa55word’);
* e/ m0 M$ x% u+ M9 @+---------------------+- p7 I$ j( n- V+ m8 f
| ENCRYPT(‘pa55word’) |- a% w7 k8 N8 ^. E. t4 j
+---------------------++ |8 R( @: I8 j$ O2 o  X! J# q
| up2Ecb0Hdj25A |
" ~; K3 z- R7 F4 w+---------------------+
" q8 }, f# N$ A/ x1 row in set (0.17 sec)
$ A/ }8 Q! h& I. z9 D$ t& s上面的每个函数都返回了一个加密后的字符串。为了区分加密字符串的大小写,最好在使用ENCRYPT生成加密字符串时,将这个字段定义成CHAR BINARY类型。6 I& R/ G, b2 {# U1 |- x3 J$ @
上面列举了3种加密的方法,但我认为使用MD5加密是最好的。这是因为这样做可以将明文密码显示在处理列表中或是查询日志中,这样便于跟踪。如下面的INSERT语句使用插入了一条记录,其中的密码使用了MD5进行加密:, l, w/ a. D  W0 j
INSERT INTO table1 (user, pw) VALUE (‘user1’, MD5(‘password1’))
$ o5 t/ [, E1 u9 N: E; R4 ~8 C) h) X可以通过如下的语句进行密码验证:% H7 A1 O+ q7 ?7 [
SELECT * FROM table1 WHERE user = ‘user1’ AND pw = MD5(‘password1’)6 l5 ^5 f! V" [$ d: R" B
哈希加密方法可以很好地对密码进行加密,使用了这种方法加密,密码将无法 恢复成明文。
& z3 K. ~, @0 W7 |! r# |
# v: Z% Y4 Y& x- {  V. e* Q

回复|共 10 个

xiaoye Lv.9 发表于 2014-10-9 14:01:41|INNA | 查看全部
出来混 迟早都是要灌的——不灌水怎么混啊
inhidgehila Lv.8 发表于 2014-10-9 14:09:14|美国 | 查看全部
宁死不屈.....
inhidgehila Lv.8 发表于 2014-10-9 14:25:17|英国 | 查看全部
哈哈 小心被她看见哦~~~~
pangio Lv.8 发表于 2014-10-9 14:28:20|美国 | 查看全部
哦...这个...偶昨天就看了....
pangio Lv.8 发表于 2014-10-31 16:10:42|美国 | 查看全部
怎么这么跟别人不一样类~
efiew Lv.15 发表于 2014-10-31 16:14:28|美国 | 查看全部
哈 你逗逗他啊
efiew Lv.15 发表于 2014-10-31 16:20:59|INNA | 查看全部
k了我一个月的站,刚才site的时候
xiaoye Lv.9 发表于 2014-10-31 16:27:07|香港 | 查看全部
哈哈~` 你好有意思哦~
jckie Lv.8 发表于 2014-10-31 16:48:52|美国 | 查看全部
呵呵 都没人想我~~

回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

得知互动是一个融创意、设计、开发、营销、生活、互联网于一体的专业交流分享平台。
Copyright © 2026 得知互动-专注Ai与站长技术交流社区-Ai交流平台 版权所有 All Rights Reserved. Powered by Discuz! X5.0 鄂ICP备15006301号-5|鄂公网安备 42018502006730号
关灯 在本版发帖 扫一扫添加QQ客服 返回顶部
快速回复 返回顶部 返回列表