返回列表 发新帖

MYSQL数据库安全解决方案

54.2k 10
开着越野放牛 发表于 2013-6-14 21:06:29|湖北 | 查看全部 阅读模式
随着网络的普及,基于网络的应用也越来越多。网络数据库就是其中之一。通过一台或几台服务器可以为很多客户提供服务,这种方式给人们带来了很多方便,但也给不法分子造成了可乘之机。由于数据都是通过网络传输的,这就可以在传输的过程中被截获,或者通过非常手段进入数据库。由于以上原因,数据库安全就显得十分重要。因此,本文就以上问题讨论了MySQL数据库在网络安全方面的一些功能。: z6 J7 \: w5 x" V$ V1 n' r6 w1 q1 C
帐户安全
9 S% l7 \4 S! l0 {' f5 Y; s帐户是MySQL最简单的安全措施。每一帐户都由用户名、密码以及位置(一般由服务器名、IP或通配符)组成。如用户john从server1进行登录可能和john从server2登录的权限不同。& W' w: S8 U  A/ y
MySQL的用户结构是用户名/密码/位置。这其中并不包括数据库名。下面的两条命令为database1和database2设置了SELECT用户权限。& C  ]) \8 {7 G+ q7 k/ |
GRANT SELECT ON database1.* to ‘abc’@‘server1’ IDENTIFIED BY ‘password1’;
5 s7 p  c' p4 M. z) p  i/ cGRANT SELECT ON database2.* to ‘abc’@‘server1’ IDENTIFIED BY ‘password2’;' [2 N3 b- l( }7 r9 a
第一条命令设置了用户abc在连接数据库database1时使用password1。第二条命令设置了用户abc在连接数据库database2时使用password2。因此,用户abc在连接数据库database1和database2的密码是不一样的。
0 \' Q: z8 l) [  b上面的设置是非常有用的。如果你只想让用户对一个数据库进行有限的访问,而对其它数据库不能访问,这样可以对同一个用户设置不同的密码。如果不这样做,当用户发现这个用户名可以访问其它数据库时,那将会造成麻烦。6 D, ?5 I$ Y0 _% q
MySQL使用了很多授权表来跟踪用户和这些用户的不同权限。这些表就是在mysql数据库中的MyISAM表。将这些安全信息保存在MySQL中是非常有意义的。因此,我们可以使用标准的SQL来设置不同的权限。3 {! B1 Y- L1 Z1 c
一般在MySQL数据库中可以使用3种不同类型的安全检查:
: ^" e2 w, I% H! ~+ l: Q·登录验证
" C9 b$ U! `/ P) R也就是最常用的用户名和密码验证。一但你输入了正确的用户名和密码,这个验证就可通过。$ T; u/ }( m, `& }  _
·授权! N' w; T/ F* u1 C
在登录成功后,就要求对这个用户设置它的具体权限。如是否可以删除数据库中的表等。
! L* ?4 X$ H% u7 @·访问控制
, o# b" U( ]6 ~) ^: z这个安全类型更具体。它涉及到这个用户可以对数据表进行什么样的操作,如是否可以编辑数据库,是否可以查询数据等等。% t/ l* F5 B- ^7 Q1 r. o
访问控制由一些特权组成,这些特权涉及到所何使用和操作MySQL中的数据。它们都是布尔型,即要么允许,要么不允许。下面是这些特权的列表:6 Y) B# U! r$ K, Q9 k2 A, B  ]
·SELECT4 B" O: @; T+ [3 Z7 n
SELECT是设定用户是否可以使用SELECT来查询数据。如果用户没有这个特权,那么就只能执行一些简单的SELECT命令,如计算表达式(SELECT 1+2),或是日期转换(SELECT Unix_TIMESTAMP(NOW( )))等。
/ M# V& ^* X. o& M) d% G, k3 m6 H·INSERT$ X9 `: _9 R+ K( z
·UPDATE8 k" N' x7 ^+ s$ [! g
·INDEX
: e" x; G* Q: VINDEX决定用户是否可以对表的索引进行设置。如果用户没有这个权限,那么将无法设置表中的索引。* r) X% L4 p) t7 Z
·ALTER
$ p4 T, f$ Q! K·CREATE6 z, M0 y! s# y, g! _/ t
·GRANT# T% R1 R4 @7 ~' W. Y  B
如果一个用户拥有这个GRANT权限,那么他就可以将自己的权限授给别的用户。也就是说,这个用户可以和其它用户共享自己的权限。. S, U; J9 l; L: h% \/ p
·REFERENCES+ b0 \# p1 l. S# p; H8 z' \4 Z
有了REFERENCES权限,用户就可以将其它表的一个字段作为某一个表的外键约束。8 m% L& Y: O: }: G# N; U
除了以上的权限外,MySQL还有一些权限可以对整个MySQL进行操作。* ~. e3 @: B/ l* O
·Reload
1 Q. J3 ^+ ^' [6 F% [  o这个权限可以使用户有权执行各种FLUSH命令,如FLUSH TABLES, FLUSH STATUS等。
! K" L: R. m8 d5 O·Shutdown: {2 S, A# F% A/ d' R# Z5 H
这个权限允许用户关闭MySQL
6 D5 P  W5 Q5 H! H  _·Process9 P$ y. o7 q# S2 k# L
通过这个权限,用户可以执行SHOW PROCESSLIST和KILL命令。这些命令可以查看MySQL的处理进程,可以通过这种方式查看SQL执行的细节。1 A9 X0 j4 {( y8 M  i- S6 Z
·File3 {: @/ x+ W- M! W4 ?
这个权限决定用户是否可以执行LOAD DATA INFILE命令。给用户这个权限要慎重,因为有这个权限的用户可以将任意的文件装载到表中,这样对MySQL是十分危险的。
/ Z1 F" M7 E8 A+ g$ q7 |4 w·Super6 @3 t1 g' I3 Y" t& w4 h4 f8 t
这个权限允许用户终止任何查询(这些查询可能并不是这个用户执行的)。1 I& o  Z2 \  Q% A" w
以上几种权限是非常危险的,在给用户授权限时要非常谨慎。  G  H" L$ Y+ Q0 Q$ H
[NextPage]) v3 _6 c8 f2 t
MySQL中的SSL
+ U3 F0 Y7 G2 R) \, |% r  l以上的帐户安全只是以普通的Socket进行数据传输的,这样非常不安全。因此,MySQL在4.1版以后提供了对SSL(Secure Scokets Layer)的支持。MySQL使用的是免费的OpenSSL库。
  I7 u) Q5 f4 P- P由于MySQL的Linux版本一般都是随Linux本身一起发布,因此,它们默认时都不使用SSL进行传输数据。如果要打开SSL功能,需要对hava_openssl变量进行设置:
9 A& W* A, _" B7 o0 h2 NMySQL的Windows版本已经将OpenSSL加入了。也面的命令是查看你的MySQL是否打开了SSL功能。8 C) U4 L8 P& `' o) J
SHOW VARIABLES LIKE ‘have_openssl’;( \% T$ B8 s  @
+---------------+-------+4 c4 x% Z2 Q9 `5 _
| Variable_name | Value |/ A0 j! a) y) c9 p
+---------------+-------+* a$ T/ j2 E/ u2 ?
| have_openssl | NO |
7 O8 G7 N: e$ r* h+ l2 i+---------------+-------+9 T: L8 M$ J3 f3 ?; r$ U9 e% r8 [' D: X
1 row in set (0.00 sec)& z0 m9 o4 {6 H/ N1 K, B
如果返回的是NO,那么说明你需要将OpenSSL编译进自己的MySQL# ?  Y/ S0 S' L5 K6 O! N+ d  {) o
在有时你可能需要将用户名和密码进行加密传输。在这时可以使用下面GRANT命令:# n$ M  n5 q# k' V! o4 X& v4 z
GRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!” REQUIRE SSL;
5 f* r% ?: g! L0 A2 h' G; O8 W还可以通过 REQUIRE x509 选项进行SSL传输:# A, B6 g! g6 w* U
GRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!” REQUIRE x509;
7 x( D6 \2 X- O) `你还可以使用REQUIRE SUBJECT来指定一个特定的客户端证书来访问数据库。& b7 E+ Q, n( {: X6 F' O* L9 Y
GRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’+ d, Y4 B9 R: a$ Z: j1 p8 f5 y( o) |% A" c
IDENTIFIED BY “password!”5 m- }! i" \# L+ z2 ?  Z
REQUIRE SUBJECT “/C=US/ST=New York/L=Albany/O=Widgets Inc./CN=client-ray.# K/ S2 ?* u! x% [- V* T
example.com/emailAddress=raymond@example.com”;4 _1 [# s2 [2 a$ G
也许你并不关心使用的是什么客户许可,而仅仅关心的是你的证书。那么你可以使用REQUIRE ISSUER来实现:, C3 v0 M4 O+ q0 h0 i+ y/ f
GRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!”
5 |& I4 U9 I. f1 C7 _! FREQUIRE ISSUER “/C=US/ST=New+20York/L=Albany/O=Widgets Inc./CN=cacert.example.* x2 v# R" e5 w( A* S6 U
com/emailAddress=admin@example.com”;
0 }9 h% h2 D. C- x1 ZSSL还可以直接通过密码进行加密。可以使用REQUIRE CIPHER设置密码。
0 {4 ^2 `2 C) ^6 a& NGRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!”
1 C6 \8 @. c! z8 u# a; w9 WREQUIRE CIPHER “EDH-RSA-DES-CBC3-SHA”;5 @) i- |; a1 n5 o6 A4 ^
上面使用了GRANT命令对用户权限进行设置。而这些信息都是保存在授权表中,这些表是安全系统的心脏。在这些表中保存了每一个用户和客户机所具有的权限。如果正确地操作这些表,将会对数据库的安全起到积极的作用,而如果使用不慎,将是非常危险的。; i5 C# _' \8 R% R2 y/ x, T
下面让我们来看看MySQL中的最要的5个授权表。
. b! F  O1 V( H! b$ ~& _0 Luser; T" _6 r; |4 W
用户表保存了用户的权限和被加密的密码。这个表负责确定哪些用户和客户机可以连接到服务器上。# |* Z5 T$ b+ ~6 A! G) R, p3 g8 e
host
, s" k+ L$ s3 M这个表为每一个客户机分配权限,它并不考虑用户的权限。MySQL在确定是否接收还是拒绝一个连接时,首先考虑的是user表。而使用GRANT或REVOKE命令并不影响host表,我们可以通过手工方式修改这个表中的内容。
, m4 c# m7 j. ^db+ _/ l1 t, a# U# B
db表保存了数据库层的权限信息。- O0 T/ x7 D; @; Y( C+ f1 A: V' D
tables_priv
4 n+ Q" c% ~" @7 P+ F; B: c$ ?3 T; P+ d这个表存储了表的权限信息。
8 c$ V: K* P2 T% D1 b( e- \columns_priv1 X7 q7 k1 M4 l% |7 q# g
这个表保存了单独列的权限信息。通过这个表,可以将操作某一列的权限授予一个用户。
! H  e0 ^- \8 H- |* E! l[NextPage]
, n% M( |. r+ j哈希加密
0 c9 Y$ {# l# {& w9 {7 |& l如果数据库保存了敏感的数据,如银行卡密码,客户信息等,你可能想将这些数据以加密的形式保存在数据库中。这样即使有人进入了你的数据库,并看到了这些数据,也很难获得其中的真实信息。. z: f3 I' L: u% _3 a
在应用程序的大量信息中,也许你只想交很小的一部分进行加密,如用户的密码等。这些密码不应该以明文的形式保存,它们应该以加密的形式保存在数据库中。一般情况下,大多数系统,这其中包括MySQL本身都是使用哈希算法对敏感数据进行加密的。
9 j3 t: O+ ^8 f. F: N0 H8 Z1 x9 O. F哈希加密是单向加密,也就是说,被加密的字符串是无法得到原字符串的。这种方法使用很有限,一般只使用在密码验证或其它需要验证的地方。在比较时并不是将加密字符串进行解密,而是将输入的字符串也使用同样的方法进行加密,再和数据库中的加密字符串进行比较。这样即使知道了算法并得到了加密字符串,也无法还原最初的字符串。银行卡密码就是采用的这种方式进行加密。/ p: Y* y; ~8 s! ^0 Q
MySQL提供了4个函数用于哈希加密:PASSWORD, ENCRYPT, SHA1和MD5。下面让我们试一试这4个函数,看看会得到什么结果。我们以加密字符串“pa55word”为例进行说明:- n* h) o& Z; Y
让我们先来看看MD5函数1 N$ I0 _2 f0 B& o6 A
SELECT MD5(‘pa55word’);
! O2 M6 T7 Z9 \  R( w8 z; N3 Z4 U; r+----------------------------------+
* w  }8 D6 E/ Q| MD5(‘pa55word’) |
7 w6 E( u5 B$ V+ O1 ]+----------------------------------+
, f6 s8 _5 B' g; F0 T. R9 n4 `| a17a41337551d6542fd005e18b43afd4 |6 y; Z7 p2 V! w8 P: e7 v
8 b1 i) X* o! J; X% w0 j: _
+----------------------------------+
- E* V7 z6 \2 Q) _! ?& G1 row in set (0.13 sec)
8 f( w* @' o) t# k3 p下面是PASSWORD函数
8 ~* ]2 F9 |. ]8 W5 G, E' n- K3 cSELECT PASSWORD(‘pa55word’);
5 l- V! }/ f' b* L) d9 ~3 G+----------------------+; m# ~0 l! z. B  v7 @% R2 d
| PASSWORD(‘pa55word’) |3 C0 \# c$ l% c( O- |9 x1 d
+----------------------+
# S0 R( C3 c4 B5 Z7 n. u. d| 1d35c6556b8cab45 |
2 ?. D8 t% \% S. m+----------------------+
& j0 ~. i# T" ]5 R/ _# @6 p3 W( h8 ?' Q! C1 row in set (0.00 sec)
1 K9 k8 N8 M# }5 y下面是ENCRYPT函数2 W) g, J9 c; F& W7 R" H: q
SELECT ENCRYPT(‘pa55word’);
& {6 K5 s, q% `* U0 {5 `+---------------------+
/ W# z2 F2 {0 e6 }( ^| ENCRYPT(‘pa55word’) |
. N2 ~6 }' p, s* ^0 d0 ]+---------------------+* p# W2 Y& `. l
| up2Ecb0Hdj25A |" s0 c4 Y/ ~/ r  d/ l1 T- S6 n( g+ v; {
+---------------------+
8 Y0 E( G, P/ L0 }  `) b1 row in set (0.17 sec)
( _4 C7 ?' k6 R/ N上面的每个函数都返回了一个加密后的字符串。为了区分加密字符串的大小写,最好在使用ENCRYPT生成加密字符串时,将这个字段定义成CHAR BINARY类型。4 O1 f$ [  a( H9 c, }! H. r7 ]
上面列举了3种加密的方法,但我认为使用MD5加密是最好的。这是因为这样做可以将明文密码显示在处理列表中或是查询日志中,这样便于跟踪。如下面的INSERT语句使用插入了一条记录,其中的密码使用了MD5进行加密:
" D) z/ B4 z* n5 p& n) CINSERT INTO table1 (user, pw) VALUE (‘user1’, MD5(‘password1’))( \0 V' |  ~1 w  D: T3 a4 k
可以通过如下的语句进行密码验证:9 i( Z% M3 S, H" F
SELECT * FROM table1 WHERE user = ‘user1’ AND pw = MD5(‘password1’)
; ?0 E# W3 x) H" S哈希加密方法可以很好地对密码进行加密,使用了这种方法加密,密码将无法 恢复成明文。
: s& @3 p3 j  f' q# h# H2 o. m- L% o! q$ N: `0 H

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