返回列表 发新帖

MYSQL数据库安全解决方案

54.4k 10
开着越野放牛 发表于 2013-6-14 21:06:29|湖北 | 查看全部 阅读模式
随着网络的普及,基于网络的应用也越来越多。网络数据库就是其中之一。通过一台或几台服务器可以为很多客户提供服务,这种方式给人们带来了很多方便,但也给不法分子造成了可乘之机。由于数据都是通过网络传输的,这就可以在传输的过程中被截获,或者通过非常手段进入数据库。由于以上原因,数据库安全就显得十分重要。因此,本文就以上问题讨论了MySQL数据库在网络安全方面的一些功能。, O& R) m; g7 W: x5 @) X+ J" d
帐户安全* h: c8 M( q. v4 N
帐户是MySQL最简单的安全措施。每一帐户都由用户名、密码以及位置(一般由服务器名、IP或通配符)组成。如用户john从server1进行登录可能和john从server2登录的权限不同。  j1 x2 d, G6 `6 C
MySQL的用户结构是用户名/密码/位置。这其中并不包括数据库名。下面的两条命令为database1和database2设置了SELECT用户权限。
1 ~5 Y) M1 ~- C6 d8 T; G# q5 b6 LGRANT SELECT ON database1.* to ‘abc’@‘server1’ IDENTIFIED BY ‘password1’;6 V* _4 Z4 C* k( ~9 n+ o* ]
GRANT SELECT ON database2.* to ‘abc’@‘server1’ IDENTIFIED BY ‘password2’;! j3 i! a$ ^5 y( m& U* J
第一条命令设置了用户abc在连接数据库database1时使用password1。第二条命令设置了用户abc在连接数据库database2时使用password2。因此,用户abc在连接数据库database1和database2的密码是不一样的。0 ~0 `& ]# p0 }) [5 \6 ]/ W2 N
上面的设置是非常有用的。如果你只想让用户对一个数据库进行有限的访问,而对其它数据库不能访问,这样可以对同一个用户设置不同的密码。如果不这样做,当用户发现这个用户名可以访问其它数据库时,那将会造成麻烦。6 J4 N% @: A6 ~  Y5 A) \7 i; d
MySQL使用了很多授权表来跟踪用户和这些用户的不同权限。这些表就是在mysql数据库中的MyISAM表。将这些安全信息保存在MySQL中是非常有意义的。因此,我们可以使用标准的SQL来设置不同的权限。
% J. ?6 p7 i3 V/ J- x# p' r/ U" O一般在MySQL数据库中可以使用3种不同类型的安全检查:. T) {6 h) v$ b5 n' {; h) M
·登录验证% A) L" s" R2 b
也就是最常用的用户名和密码验证。一但你输入了正确的用户名和密码,这个验证就可通过。
* u, D/ u& @; Y4 f·授权, q$ s( h- P/ o7 W5 o# b0 F  C7 \5 s
在登录成功后,就要求对这个用户设置它的具体权限。如是否可以删除数据库中的表等。
5 ~" H( `( K( G0 |. J- V·访问控制" F! p3 r, ~  s* _% s; n
这个安全类型更具体。它涉及到这个用户可以对数据表进行什么样的操作,如是否可以编辑数据库,是否可以查询数据等等。+ K2 f% C5 C' e+ d4 E4 X* N4 n
访问控制由一些特权组成,这些特权涉及到所何使用和操作MySQL中的数据。它们都是布尔型,即要么允许,要么不允许。下面是这些特权的列表:
* d5 N% C+ [1 O( |·SELECT; M* {4 Q- b2 L' |9 S9 H) ]3 d' V  ~
SELECT是设定用户是否可以使用SELECT来查询数据。如果用户没有这个特权,那么就只能执行一些简单的SELECT命令,如计算表达式(SELECT 1+2),或是日期转换(SELECT Unix_TIMESTAMP(NOW( )))等。
+ }* o" ?7 }0 N·INSERT
/ |, v1 \. D) j# P$ x8 A·UPDATE, u7 {! T2 X$ ?9 K* K
·INDEX
6 F; r& `; h; N0 h2 xINDEX决定用户是否可以对表的索引进行设置。如果用户没有这个权限,那么将无法设置表中的索引。# y8 [8 s# _1 Y
·ALTER
3 P. j" _3 w+ n# P% L) H·CREATE! m" y% e# x/ H
·GRANT: U( }- _2 I- ?& @
如果一个用户拥有这个GRANT权限,那么他就可以将自己的权限授给别的用户。也就是说,这个用户可以和其它用户共享自己的权限。4 l9 H6 W8 C* J: i
·REFERENCES& J4 x) `9 T) _+ P, I
有了REFERENCES权限,用户就可以将其它表的一个字段作为某一个表的外键约束。# k; x" ?. A2 {1 L
除了以上的权限外,MySQL还有一些权限可以对整个MySQL进行操作。
0 w, J4 @/ f2 m1 T9 K$ l4 m- u9 s·Reload; q2 Z4 \! Y4 r
这个权限可以使用户有权执行各种FLUSH命令,如FLUSH TABLES, FLUSH STATUS等。) D0 U: `- z6 f! L0 N( U
·Shutdown
$ ^: }0 W+ m3 r' V/ {0 u这个权限允许用户关闭MySQL
5 B, t5 ^; i3 Q* g3 C+ S# z; H·Process, ^  g. p. S, n" l; ^
通过这个权限,用户可以执行SHOW PROCESSLIST和KILL命令。这些命令可以查看MySQL的处理进程,可以通过这种方式查看SQL执行的细节。
3 ?6 u( t* h5 [·File
5 J! p% n" K  `1 m+ X这个权限决定用户是否可以执行LOAD DATA INFILE命令。给用户这个权限要慎重,因为有这个权限的用户可以将任意的文件装载到表中,这样对MySQL是十分危险的。
- N, M- A5 z, p·Super; m2 n5 r! \7 s! N
这个权限允许用户终止任何查询(这些查询可能并不是这个用户执行的)。& G2 Z/ ~$ F0 e# |
以上几种权限是非常危险的,在给用户授权限时要非常谨慎。$ _6 U1 L- Y; H6 X' V4 v3 s
[NextPage]: m* i+ ]: @/ Q& A/ k0 s
MySQL中的SSL
# d0 u& p0 h; [# ^. \以上的帐户安全只是以普通的Socket进行数据传输的,这样非常不安全。因此,MySQL在4.1版以后提供了对SSL(Secure Scokets Layer)的支持。MySQL使用的是免费的OpenSSL库。1 a. Z. i) z% i1 N4 n
由于MySQL的Linux版本一般都是随Linux本身一起发布,因此,它们默认时都不使用SSL进行传输数据。如果要打开SSL功能,需要对hava_openssl变量进行设置:" @* o" a/ B4 ?
MySQL的Windows版本已经将OpenSSL加入了。也面的命令是查看你的MySQL是否打开了SSL功能。
0 q- m9 x3 H# j5 }SHOW VARIABLES LIKE ‘have_openssl’;& b1 O- H  Y3 v" g8 @7 A  I
+---------------+-------+3 i( V5 ~& x; X
| Variable_name | Value |1 K# @/ c; K- [5 m
+---------------+-------+
! k! r' X* ~* A/ |/ p8 J| have_openssl | NO |- Q: r" h/ a* R( T% W
+---------------+-------+: ?2 d4 ?* M5 \% j
1 row in set (0.00 sec)7 M2 `! h0 R$ U
如果返回的是NO,那么说明你需要将OpenSSL编译进自己的MySQL7 V6 L$ V* T. |5 [7 U) |. L9 c9 Q
在有时你可能需要将用户名和密码进行加密传输。在这时可以使用下面GRANT命令:9 M# u- h, b( D
GRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!” REQUIRE SSL;; @' h. c( R4 @( K  _
还可以通过 REQUIRE x509 选项进行SSL传输:
  P* P2 t) ?- b& H# R" JGRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!” REQUIRE x509;
+ _! N0 v$ ~" v% `" H你还可以使用REQUIRE SUBJECT来指定一个特定的客户端证书来访问数据库。
2 I4 ?: b0 g' ~7 K4 m8 D! zGRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’3 e  {9 Q( ~1 s& I
IDENTIFIED BY “password!”
6 K9 D! }+ s8 A( t9 U# |; F& sREQUIRE SUBJECT “/C=US/ST=New York/L=Albany/O=Widgets Inc./CN=client-ray.
/ [% X3 B9 e' v, j6 |6 Qexample.com/emailAddress=raymond@example.com”;
6 ?" n/ c7 K1 d; h3 N也许你并不关心使用的是什么客户许可,而仅仅关心的是你的证书。那么你可以使用REQUIRE ISSUER来实现:' z: f9 L5 S, ^) T- k7 R
GRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!”
; G' h# `" o+ q# j* h/ ?* cREQUIRE ISSUER “/C=US/ST=New+20York/L=Albany/O=Widgets Inc./CN=cacert.example.
4 X6 g" M2 i  P( K" Hcom/emailAddress=admin@example.com”;
# f. x& P. q  Q* c& S7 J& G  _0 DSSL还可以直接通过密码进行加密。可以使用REQUIRE CIPHER设置密码。& Q. E9 p1 G5 g! B, m! ]7 t
GRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!”  P6 C* y. X  ~
REQUIRE CIPHER “EDH-RSA-DES-CBC3-SHA”;( X) Q4 @) b( ~- S1 F
上面使用了GRANT命令对用户权限进行设置。而这些信息都是保存在授权表中,这些表是安全系统的心脏。在这些表中保存了每一个用户和客户机所具有的权限。如果正确地操作这些表,将会对数据库的安全起到积极的作用,而如果使用不慎,将是非常危险的。, y+ p/ W" k  s
下面让我们来看看MySQL中的最要的5个授权表。
3 ^4 \/ y/ i7 H0 _) }user& b1 t- i; O( C7 P% B
用户表保存了用户的权限和被加密的密码。这个表负责确定哪些用户和客户机可以连接到服务器上。
1 o" Y- u1 {! c% W/ ?host
; S7 R8 H- y; A, |, D% ?. v这个表为每一个客户机分配权限,它并不考虑用户的权限。MySQL在确定是否接收还是拒绝一个连接时,首先考虑的是user表。而使用GRANT或REVOKE命令并不影响host表,我们可以通过手工方式修改这个表中的内容。
" V  _8 K5 _* e  {8 R( edb2 W' C- t! E* F  y4 }( I4 y% R
db表保存了数据库层的权限信息。8 C0 O9 ?$ u5 @3 T6 i
tables_priv: O; c! G1 i9 _5 \4 s" Q5 d+ _
这个表存储了表的权限信息。1 d' i1 i* x0 v# [  A- H$ u. v
columns_priv0 H* I7 w% r* O1 V0 D9 F
这个表保存了单独列的权限信息。通过这个表,可以将操作某一列的权限授予一个用户。
( o' D8 Y5 k$ k& i[NextPage]- b- v  |- u  z# v  @6 n
哈希加密9 o& V3 C% g+ N
如果数据库保存了敏感的数据,如银行卡密码,客户信息等,你可能想将这些数据以加密的形式保存在数据库中。这样即使有人进入了你的数据库,并看到了这些数据,也很难获得其中的真实信息。
7 z. T1 U0 Q/ f! Y在应用程序的大量信息中,也许你只想交很小的一部分进行加密,如用户的密码等。这些密码不应该以明文的形式保存,它们应该以加密的形式保存在数据库中。一般情况下,大多数系统,这其中包括MySQL本身都是使用哈希算法对敏感数据进行加密的。0 V. @. \( h: S6 l% m3 _
哈希加密是单向加密,也就是说,被加密的字符串是无法得到原字符串的。这种方法使用很有限,一般只使用在密码验证或其它需要验证的地方。在比较时并不是将加密字符串进行解密,而是将输入的字符串也使用同样的方法进行加密,再和数据库中的加密字符串进行比较。这样即使知道了算法并得到了加密字符串,也无法还原最初的字符串。银行卡密码就是采用的这种方式进行加密。3 E! k' B5 t" o; ]/ e
MySQL提供了4个函数用于哈希加密:PASSWORD, ENCRYPT, SHA1和MD5。下面让我们试一试这4个函数,看看会得到什么结果。我们以加密字符串“pa55word”为例进行说明:8 X# `4 }/ N4 p
让我们先来看看MD5函数0 d3 E" I7 M; h* W2 q6 u, g
SELECT MD5(‘pa55word’);2 ^# r- C+ `- S7 M( y$ o% i: s. E
+----------------------------------+- n( d: _* G* m& K
| MD5(‘pa55word’) |
- L3 W, N0 a) a! c+----------------------------------+- h9 w, y: }* ~) `2 G7 p% x- q
| a17a41337551d6542fd005e18b43afd4 |% i1 ?. \# l2 K# Q8 \, n' L/ T

, n) ~) c) d1 s4 p) Y! G" ?+----------------------------------+
1 r) G9 e/ |5 S$ f1 row in set (0.13 sec)
! |6 I& s/ g; r5 U  c( W) v下面是PASSWORD函数
0 ?+ Y5 s8 d- K) s; ]SELECT PASSWORD(‘pa55word’);1 _6 V! u$ d# k7 t$ [4 {
+----------------------+! l0 G. X' l# B8 n# V
| PASSWORD(‘pa55word’) |4 @( r; F3 V+ G& ]& x) B7 I
+----------------------+
: ]* B' ]$ O9 i" t# W| 1d35c6556b8cab45 |
7 r/ s4 |( i. t( M  p8 [+----------------------+
7 ?3 W2 J4 u8 O1 row in set (0.00 sec)% Z" D* h& @* q/ R" K* g3 m+ |/ F
下面是ENCRYPT函数" \" d. S! Z/ b0 f& p
SELECT ENCRYPT(‘pa55word’);/ }& _5 y4 R+ _+ R7 \; y. O/ ?% ^5 X7 Z
+---------------------+( T# X/ p7 a) n/ m4 ]5 U1 Y# L! j* p3 i
| ENCRYPT(‘pa55word’) |4 i( G& L6 X  @: {  ^' Q
+---------------------+
) X  X/ o  X) v$ K4 _| up2Ecb0Hdj25A |
- l4 n+ g, a, N+ F8 w+---------------------+/ U: Y$ _4 _5 _2 ]2 d
1 row in set (0.17 sec)# Z9 b( g" Q6 p; q9 `- Z0 j
上面的每个函数都返回了一个加密后的字符串。为了区分加密字符串的大小写,最好在使用ENCRYPT生成加密字符串时,将这个字段定义成CHAR BINARY类型。0 U# l' n) e; L9 V' s
上面列举了3种加密的方法,但我认为使用MD5加密是最好的。这是因为这样做可以将明文密码显示在处理列表中或是查询日志中,这样便于跟踪。如下面的INSERT语句使用插入了一条记录,其中的密码使用了MD5进行加密:$ |) L- v6 a: @! C+ y
INSERT INTO table1 (user, pw) VALUE (‘user1’, MD5(‘password1’))9 q. u2 }* O; a  u" w8 |
可以通过如下的语句进行密码验证:
1 v5 A$ @7 X. U8 H/ FSELECT * FROM table1 WHERE user = ‘user1’ AND pw = MD5(‘password1’)8 @+ h, s% h! a6 B/ q5 G* ?# ?
哈希加密方法可以很好地对密码进行加密,使用了这种方法加密,密码将无法 恢复成明文。$ j/ W' V* j& m; \3 {. n% J
' y+ ?- O3 @7 o1 p8 w% I

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