返回列表 发新帖

MYSQL数据库安全解决方案

54.2k 10
开着越野放牛 发表于 2013-6-14 21:06:29|湖北 | 查看全部 阅读模式
随着网络的普及,基于网络的应用也越来越多。网络数据库就是其中之一。通过一台或几台服务器可以为很多客户提供服务,这种方式给人们带来了很多方便,但也给不法分子造成了可乘之机。由于数据都是通过网络传输的,这就可以在传输的过程中被截获,或者通过非常手段进入数据库。由于以上原因,数据库安全就显得十分重要。因此,本文就以上问题讨论了MySQL数据库在网络安全方面的一些功能。
7 V% F; D7 r3 }; j帐户安全  o' E6 Q# \9 w% u
帐户是MySQL最简单的安全措施。每一帐户都由用户名、密码以及位置(一般由服务器名、IP或通配符)组成。如用户john从server1进行登录可能和john从server2登录的权限不同。. ]/ B( W1 O9 a9 @. k
MySQL的用户结构是用户名/密码/位置。这其中并不包括数据库名。下面的两条命令为database1和database2设置了SELECT用户权限。
8 e* _4 @& O/ m5 pGRANT SELECT ON database1.* to ‘abc’@‘server1’ IDENTIFIED BY ‘password1’;* f3 x/ S) F% q
GRANT SELECT ON database2.* to ‘abc’@‘server1’ IDENTIFIED BY ‘password2’;* b9 u$ e5 K: r
第一条命令设置了用户abc在连接数据库database1时使用password1。第二条命令设置了用户abc在连接数据库database2时使用password2。因此,用户abc在连接数据库database1和database2的密码是不一样的。( i! W. _' T( ^- V
上面的设置是非常有用的。如果你只想让用户对一个数据库进行有限的访问,而对其它数据库不能访问,这样可以对同一个用户设置不同的密码。如果不这样做,当用户发现这个用户名可以访问其它数据库时,那将会造成麻烦。
+ Y) Z! w2 I3 E! z. V$ m4 [MySQL使用了很多授权表来跟踪用户和这些用户的不同权限。这些表就是在mysql数据库中的MyISAM表。将这些安全信息保存在MySQL中是非常有意义的。因此,我们可以使用标准的SQL来设置不同的权限。# @! n4 E1 w+ H7 C) d5 P
一般在MySQL数据库中可以使用3种不同类型的安全检查:: {( g& e. Q  J$ Q
·登录验证
, q* F+ K" h: V- Y* n! q也就是最常用的用户名和密码验证。一但你输入了正确的用户名和密码,这个验证就可通过。
- M3 x' [( D( P5 X4 F+ |8 L·授权
8 o% N# L* k4 F$ Z' q3 O在登录成功后,就要求对这个用户设置它的具体权限。如是否可以删除数据库中的表等。
1 y" r7 t: O. A7 X- I+ W3 q·访问控制
* K: ]1 O; ^5 x这个安全类型更具体。它涉及到这个用户可以对数据表进行什么样的操作,如是否可以编辑数据库,是否可以查询数据等等。8 V% @0 Y5 q, d# z# n' B
访问控制由一些特权组成,这些特权涉及到所何使用和操作MySQL中的数据。它们都是布尔型,即要么允许,要么不允许。下面是这些特权的列表:: c' ?4 z2 y) B: r# E& a: i
·SELECT8 C1 {) q2 p5 b: y* q; I% S
SELECT是设定用户是否可以使用SELECT来查询数据。如果用户没有这个特权,那么就只能执行一些简单的SELECT命令,如计算表达式(SELECT 1+2),或是日期转换(SELECT Unix_TIMESTAMP(NOW( )))等。
; S! \9 s. b1 B- h6 n3 P* `·INSERT
& H. W$ Q; m( T4 j6 L0 e·UPDATE3 x' ?: x, i! q7 ?, C7 s& _
·INDEX# S# |+ e  b2 t8 |& f4 ^- ~
INDEX决定用户是否可以对表的索引进行设置。如果用户没有这个权限,那么将无法设置表中的索引。
& P0 C/ R$ a' P' [·ALTER- `' ?2 J" ~, u% T, J
·CREATE
! Y8 E( r$ a: L( o9 H. `·GRANT+ C1 ]1 p& K6 F" T7 a& e8 G
如果一个用户拥有这个GRANT权限,那么他就可以将自己的权限授给别的用户。也就是说,这个用户可以和其它用户共享自己的权限。/ W( I$ i: ?, T/ c
·REFERENCES% n- }0 O$ T7 M) F7 n
有了REFERENCES权限,用户就可以将其它表的一个字段作为某一个表的外键约束。. O7 j' ?' |& ~- j' f3 t
除了以上的权限外,MySQL还有一些权限可以对整个MySQL进行操作。' u/ ~  {4 g5 N% \0 V' K4 Q) ~
·Reload( g7 G9 p. n; w5 |% m4 I+ k. Z
这个权限可以使用户有权执行各种FLUSH命令,如FLUSH TABLES, FLUSH STATUS等。3 t1 K5 Z$ V2 v& g5 x* ^# q2 ^
·Shutdown
* i2 g  F) j+ ]+ N这个权限允许用户关闭MySQL
$ Y* u: W- c% E9 p+ b* y5 V·Process- r) q" |0 p9 ~" f6 E2 B
通过这个权限,用户可以执行SHOW PROCESSLIST和KILL命令。这些命令可以查看MySQL的处理进程,可以通过这种方式查看SQL执行的细节。
8 }$ T2 D1 |/ ^1 M8 L7 B·File
5 K7 l  ~1 Y# e% l" s2 g这个权限决定用户是否可以执行LOAD DATA INFILE命令。给用户这个权限要慎重,因为有这个权限的用户可以将任意的文件装载到表中,这样对MySQL是十分危险的。
2 [- D+ ^3 c# d·Super
& a- |) t3 O$ g, `; W" v这个权限允许用户终止任何查询(这些查询可能并不是这个用户执行的)。
) P  r- A. v7 Q* c以上几种权限是非常危险的,在给用户授权限时要非常谨慎。
( F  R, k7 W6 ]- @3 W[NextPage]1 G/ z4 x- v. z/ ^& X  Q8 r$ s" W4 _
MySQL中的SSL
( p% y% F7 q; G& H8 v- b以上的帐户安全只是以普通的Socket进行数据传输的,这样非常不安全。因此,MySQL在4.1版以后提供了对SSL(Secure Scokets Layer)的支持。MySQL使用的是免费的OpenSSL库。
- N+ U' W) h  H' g由于MySQL的Linux版本一般都是随Linux本身一起发布,因此,它们默认时都不使用SSL进行传输数据。如果要打开SSL功能,需要对hava_openssl变量进行设置:
& K- Z+ g) _: _$ Q/ qMySQL的Windows版本已经将OpenSSL加入了。也面的命令是查看你的MySQL是否打开了SSL功能。( |7 h) ~' r* r' P" a% j
SHOW VARIABLES LIKE ‘have_openssl’;
! `. c! B' h! h, ?+---------------+-------+! q6 A0 Y  y- x. l
| Variable_name | Value |8 v, a" f5 Y; B5 t
+---------------+-------+$ n  E% x0 `( J& Y9 S% @7 u' i- t" F
| have_openssl | NO |
( S! U. t4 Y( x, _: \) Z  C0 I, i, l* f+---------------+-------+
8 K4 Z) E6 n& w- j1 row in set (0.00 sec)
4 a5 K! i' L* Y' l5 \7 C/ D. K如果返回的是NO,那么说明你需要将OpenSSL编译进自己的MySQL
5 I% v% I) m- Y* z# h3 r' F  j8 j在有时你可能需要将用户名和密码进行加密传输。在这时可以使用下面GRANT命令:, Z* T  v  R* X# M' x& L
GRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!” REQUIRE SSL;
  _) x+ g6 N9 v3 o, {还可以通过 REQUIRE x509 选项进行SSL传输:! _- I1 f1 C7 M2 H; m
GRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!” REQUIRE x509;
3 Z/ B( ?/ g/ R  L你还可以使用REQUIRE SUBJECT来指定一个特定的客户端证书来访问数据库。* C3 y' n3 d4 |4 X
GRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’
1 m$ u. ?% f4 k, K. F/ L6 U9 J; IIDENTIFIED BY “password!”% w' h7 \5 ?+ j5 R- \
REQUIRE SUBJECT “/C=US/ST=New York/L=Albany/O=Widgets Inc./CN=client-ray.5 o* V: o! C! O7 T  n
example.com/emailAddress=raymond@example.com”;! w. W/ W% b$ p8 |' A. \
也许你并不关心使用的是什么客户许可,而仅仅关心的是你的证书。那么你可以使用REQUIRE ISSUER来实现:' {& R" I  E4 o( B: k  {2 Y. b
GRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!”
- k2 p$ O! |! g( n' jREQUIRE ISSUER “/C=US/ST=New+20York/L=Albany/O=Widgets Inc./CN=cacert.example.9 P4 \9 |) W" K1 ^+ r
com/emailAddress=admin@example.com”;
9 p  ^2 m* Y! `( {7 u( L6 \SSL还可以直接通过密码进行加密。可以使用REQUIRE CIPHER设置密码。
8 H. C  U6 a% m( O4 b% r3 hGRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!”; T! X  `6 N( C* q3 h% S5 a- x
REQUIRE CIPHER “EDH-RSA-DES-CBC3-SHA”;. A/ R4 U% O+ {% K' j3 K
上面使用了GRANT命令对用户权限进行设置。而这些信息都是保存在授权表中,这些表是安全系统的心脏。在这些表中保存了每一个用户和客户机所具有的权限。如果正确地操作这些表,将会对数据库的安全起到积极的作用,而如果使用不慎,将是非常危险的。' _" }% I& X4 j
下面让我们来看看MySQL中的最要的5个授权表。
  b; n4 h% s/ i# i9 F/ I0 guser
6 q) r0 k; G0 H1 j& w用户表保存了用户的权限和被加密的密码。这个表负责确定哪些用户和客户机可以连接到服务器上。
% [* n) m3 P* \3 u7 }( J7 z2 lhost& H$ ]1 B  u+ m
这个表为每一个客户机分配权限,它并不考虑用户的权限。MySQL在确定是否接收还是拒绝一个连接时,首先考虑的是user表。而使用GRANT或REVOKE命令并不影响host表,我们可以通过手工方式修改这个表中的内容。' E5 \9 Y2 {8 D9 c3 c: |. x0 H0 t
db
* n# ?* _! p- z6 ]2 ], W+ r6 Ldb表保存了数据库层的权限信息。( _, V3 o! }$ w( V/ W) m! I8 @
tables_priv
( i- T. |+ ?8 e: q6 s, y+ I$ O这个表存储了表的权限信息。
0 q  c/ E: T) N( {; E; ^3 B5 z  xcolumns_priv4 i0 }% b+ a; l& B
这个表保存了单独列的权限信息。通过这个表,可以将操作某一列的权限授予一个用户。4 |/ u4 e" e  T* C2 p  @. u* ~8 M& V
[NextPage]8 S1 D  X+ x+ {; Z1 ^* s  Z
哈希加密
1 V3 s9 ]0 K& Z7 O0 o如果数据库保存了敏感的数据,如银行卡密码,客户信息等,你可能想将这些数据以加密的形式保存在数据库中。这样即使有人进入了你的数据库,并看到了这些数据,也很难获得其中的真实信息。
" x" m% {& U2 K' {在应用程序的大量信息中,也许你只想交很小的一部分进行加密,如用户的密码等。这些密码不应该以明文的形式保存,它们应该以加密的形式保存在数据库中。一般情况下,大多数系统,这其中包括MySQL本身都是使用哈希算法对敏感数据进行加密的。
* x6 M3 [7 f7 \7 X6 [! I. M* G哈希加密是单向加密,也就是说,被加密的字符串是无法得到原字符串的。这种方法使用很有限,一般只使用在密码验证或其它需要验证的地方。在比较时并不是将加密字符串进行解密,而是将输入的字符串也使用同样的方法进行加密,再和数据库中的加密字符串进行比较。这样即使知道了算法并得到了加密字符串,也无法还原最初的字符串。银行卡密码就是采用的这种方式进行加密。9 ~8 w7 z9 v$ g2 y# G
MySQL提供了4个函数用于哈希加密:PASSWORD, ENCRYPT, SHA1和MD5。下面让我们试一试这4个函数,看看会得到什么结果。我们以加密字符串“pa55word”为例进行说明:( ^& O. @: a, p6 E9 n3 j
让我们先来看看MD5函数  u" P. e! ?, f* [
SELECT MD5(‘pa55word’);" B2 _' @7 U# j, I- q" w* i5 u
+----------------------------------+
3 _8 u! ~/ f. a# T, H; |! x# D| MD5(‘pa55word’) |
+ t5 V( B! r/ Q7 J+----------------------------------+* C0 K, w7 T$ i# d2 F% g
| a17a41337551d6542fd005e18b43afd4 |
/ z1 ]5 l, D% t/ V% \; Y: V! ~3 M  d' ]) ~* H% I( F/ f$ j% l
+----------------------------------+* s5 p; q7 a# Q1 D
1 row in set (0.13 sec)
6 a  _$ x* c; l! S下面是PASSWORD函数+ P" Z; u; {1 \7 a5 y/ R; Q; Z  D
SELECT PASSWORD(‘pa55word’);$ i( u0 l- a, F* W6 e+ O2 d
+----------------------+
: e5 {+ z& @: C. U, @. C% A| PASSWORD(‘pa55word’) |' t9 a1 |& O) Q3 k. I7 S% o
+----------------------+
4 v3 \* Z: ?1 L1 U| 1d35c6556b8cab45 |
& @  m% G  v: |& N+ r1 _; m+----------------------+4 S- u- u' L/ [
1 row in set (0.00 sec). I& I$ b; z. [, v# @, H
下面是ENCRYPT函数7 {! ]0 e$ P- g7 k) J+ U4 D
SELECT ENCRYPT(‘pa55word’);" @" x, G6 J: e( A( n# |+ S
+---------------------+9 T: E0 @6 ], u$ r
| ENCRYPT(‘pa55word’) |0 P" C+ ?8 f; @( j% l0 E) X
+---------------------+. i4 g9 _  h( _
| up2Ecb0Hdj25A |
$ Q6 o" r+ e' l4 M* V+---------------------+
* p4 o0 J. V6 B1 row in set (0.17 sec)
: n/ U& T$ T; r上面的每个函数都返回了一个加密后的字符串。为了区分加密字符串的大小写,最好在使用ENCRYPT生成加密字符串时,将这个字段定义成CHAR BINARY类型。3 e; |7 }( I* e
上面列举了3种加密的方法,但我认为使用MD5加密是最好的。这是因为这样做可以将明文密码显示在处理列表中或是查询日志中,这样便于跟踪。如下面的INSERT语句使用插入了一条记录,其中的密码使用了MD5进行加密:
, b) W) |* I0 n# Q# P8 t! S1 qINSERT INTO table1 (user, pw) VALUE (‘user1’, MD5(‘password1’))# M6 c/ ^: Y) p+ ]
可以通过如下的语句进行密码验证:
) l, _& {9 a( C' U& hSELECT * FROM table1 WHERE user = ‘user1’ AND pw = MD5(‘password1’)% l) }3 U6 G1 `, l. Y/ l( i5 m
哈希加密方法可以很好地对密码进行加密,使用了这种方法加密,密码将无法 恢复成明文。8 I: E" y/ d+ Q/ ^
7 g- F- P& O. n7 }$ S

回复|共 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客服 返回顶部
快速回复 返回顶部 返回列表