返回列表 发新帖

MYSQL数据库安全解决方案

54.4k 10
开着越野放牛 发表于 2013-6-14 21:06:29|湖北 | 查看全部 阅读模式
随着网络的普及,基于网络的应用也越来越多。网络数据库就是其中之一。通过一台或几台服务器可以为很多客户提供服务,这种方式给人们带来了很多方便,但也给不法分子造成了可乘之机。由于数据都是通过网络传输的,这就可以在传输的过程中被截获,或者通过非常手段进入数据库。由于以上原因,数据库安全就显得十分重要。因此,本文就以上问题讨论了MySQL数据库在网络安全方面的一些功能。7 l/ G* B* A% C: g) d7 L* |
帐户安全
! Q; ]( P( r7 A( L9 p3 x帐户是MySQL最简单的安全措施。每一帐户都由用户名、密码以及位置(一般由服务器名、IP或通配符)组成。如用户john从server1进行登录可能和john从server2登录的权限不同。
2 A: e; g6 w1 r+ e  S! S4 S2 vMySQL的用户结构是用户名/密码/位置。这其中并不包括数据库名。下面的两条命令为database1和database2设置了SELECT用户权限。5 O' `' N' J8 C0 P" |: Q
GRANT SELECT ON database1.* to ‘abc’@‘server1’ IDENTIFIED BY ‘password1’;0 ^5 N8 d4 ~. u; e& \
GRANT SELECT ON database2.* to ‘abc’@‘server1’ IDENTIFIED BY ‘password2’;7 \7 I- i% ?5 G% G+ v0 ~
第一条命令设置了用户abc在连接数据库database1时使用password1。第二条命令设置了用户abc在连接数据库database2时使用password2。因此,用户abc在连接数据库database1和database2的密码是不一样的。
: V' w  x" z* O2 F$ n5 p上面的设置是非常有用的。如果你只想让用户对一个数据库进行有限的访问,而对其它数据库不能访问,这样可以对同一个用户设置不同的密码。如果不这样做,当用户发现这个用户名可以访问其它数据库时,那将会造成麻烦。$ s8 G0 A0 Y" x! U/ |/ ]% p  V" a
MySQL使用了很多授权表来跟踪用户和这些用户的不同权限。这些表就是在mysql数据库中的MyISAM表。将这些安全信息保存在MySQL中是非常有意义的。因此,我们可以使用标准的SQL来设置不同的权限。
7 Y9 a1 n+ [( H7 f# l! N5 ?一般在MySQL数据库中可以使用3种不同类型的安全检查:8 O6 [* {7 {1 {+ D8 h- N
·登录验证
3 P% i  P% |+ \! u也就是最常用的用户名和密码验证。一但你输入了正确的用户名和密码,这个验证就可通过。) d$ g+ z, m* h$ n8 v% Q( u
·授权$ f) i& b5 ~4 K' V
在登录成功后,就要求对这个用户设置它的具体权限。如是否可以删除数据库中的表等。! y- g) h6 W  Q8 `  b
·访问控制. p3 X  x6 t" d
这个安全类型更具体。它涉及到这个用户可以对数据表进行什么样的操作,如是否可以编辑数据库,是否可以查询数据等等。
% q0 N* y1 v! Y1 n访问控制由一些特权组成,这些特权涉及到所何使用和操作MySQL中的数据。它们都是布尔型,即要么允许,要么不允许。下面是这些特权的列表:
/ K4 Z* a' `! Y' }5 h2 b- {·SELECT
" b+ j7 f( p& KSELECT是设定用户是否可以使用SELECT来查询数据。如果用户没有这个特权,那么就只能执行一些简单的SELECT命令,如计算表达式(SELECT 1+2),或是日期转换(SELECT Unix_TIMESTAMP(NOW( )))等。: p$ w* c8 n1 y% X0 u0 ]7 e
·INSERT
# H8 p2 j3 l# R# H3 G, i·UPDATE
; C9 v$ D" _% G4 J, T, s·INDEX
, M% Y" A/ Y$ sINDEX决定用户是否可以对表的索引进行设置。如果用户没有这个权限,那么将无法设置表中的索引。$ v* g- y* \& v
·ALTER
( i6 R# C3 X* ]7 i7 G4 q·CREATE
/ H2 U* Q" X9 C2 }·GRANT
1 N) v6 D/ P; X. }. {如果一个用户拥有这个GRANT权限,那么他就可以将自己的权限授给别的用户。也就是说,这个用户可以和其它用户共享自己的权限。$ W3 [- [* ?* E5 L* b8 |+ e& s
·REFERENCES
4 B; i& B$ a) j5 M有了REFERENCES权限,用户就可以将其它表的一个字段作为某一个表的外键约束。
3 k% y: q! m( g除了以上的权限外,MySQL还有一些权限可以对整个MySQL进行操作。. \. V( T4 i: a7 A& q; a5 ^
·Reload4 F0 E; }0 |8 U8 F( k& X, J
这个权限可以使用户有权执行各种FLUSH命令,如FLUSH TABLES, FLUSH STATUS等。
: O" s2 A2 a6 ^3 P( y6 |·Shutdown
+ @. H4 M: {8 J+ v这个权限允许用户关闭MySQL
; W0 G* ?4 q0 q' k# E. y' `·Process( }) ^$ A" Q; j: V5 y8 j0 @( b
通过这个权限,用户可以执行SHOW PROCESSLIST和KILL命令。这些命令可以查看MySQL的处理进程,可以通过这种方式查看SQL执行的细节。0 w- j- g6 C5 i
·File% p' L3 D' E& x: L9 \
这个权限决定用户是否可以执行LOAD DATA INFILE命令。给用户这个权限要慎重,因为有这个权限的用户可以将任意的文件装载到表中,这样对MySQL是十分危险的。
6 Z# b" I  Z8 i! W0 J3 L·Super
" b4 \' w2 f' d7 l这个权限允许用户终止任何查询(这些查询可能并不是这个用户执行的)。) U- x6 n# g' A3 q7 H$ H# z
以上几种权限是非常危险的,在给用户授权限时要非常谨慎。
$ ^2 j5 ~- A$ Y9 t9 o# X! A+ Y[NextPage]
5 Q% X6 U% P8 t% ?  V' J, H: vMySQL中的SSL
$ Q; g+ n# t% Y( U以上的帐户安全只是以普通的Socket进行数据传输的,这样非常不安全。因此,MySQL在4.1版以后提供了对SSL(Secure Scokets Layer)的支持。MySQL使用的是免费的OpenSSL库。  I. I* g7 X( @9 u) D
由于MySQL的Linux版本一般都是随Linux本身一起发布,因此,它们默认时都不使用SSL进行传输数据。如果要打开SSL功能,需要对hava_openssl变量进行设置:$ l/ y, l/ a& n* y8 S, Y; I
MySQL的Windows版本已经将OpenSSL加入了。也面的命令是查看你的MySQL是否打开了SSL功能。6 {" G' o3 f. ~, y
SHOW VARIABLES LIKE ‘have_openssl’;0 r' a; |$ x4 F, l/ ~
+---------------+-------+
: P- J. A. j% l" d| Variable_name | Value |& o  d% N" ^1 F5 p4 J
+---------------+-------++ h& ~+ S  |$ z! M4 s" V
| have_openssl | NO |
* v6 U% O" x5 J# M3 i+---------------+-------+. j2 A0 v1 q, [
1 row in set (0.00 sec)# N8 M$ F: ]& D2 p) T3 v) O
如果返回的是NO,那么说明你需要将OpenSSL编译进自己的MySQL/ s' A9 s2 K: B* X( c
在有时你可能需要将用户名和密码进行加密传输。在这时可以使用下面GRANT命令:
0 E* H" I, f5 N0 e5 G+ c) PGRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!” REQUIRE SSL;
" `* `9 D: B0 v9 Q6 P还可以通过 REQUIRE x509 选项进行SSL传输:: D! j: v, c" ]2 ^) s
GRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!” REQUIRE x509;
4 L+ d- u" k: C  j! R  _- L8 u你还可以使用REQUIRE SUBJECT来指定一个特定的客户端证书来访问数据库。  {5 J2 T% Y" |, }
GRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’  e4 U. n; E+ }  i4 v0 I& n( i1 L
IDENTIFIED BY “password!”
* S  D. j" v/ _+ {; R0 b) oREQUIRE SUBJECT “/C=US/ST=New York/L=Albany/O=Widgets Inc./CN=client-ray.
! O* ^$ r- @4 f. |2 }/ n' Oexample.com/emailAddress=raymond@example.com”;3 K8 d+ ~0 P6 Z, d7 V" @6 }
也许你并不关心使用的是什么客户许可,而仅仅关心的是你的证书。那么你可以使用REQUIRE ISSUER来实现:; ~) B+ M- W, Q+ U8 p# Q3 c
GRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!”$ Q* S, A: t% U0 J, k/ n% }3 a
REQUIRE ISSUER “/C=US/ST=New+20York/L=Albany/O=Widgets Inc./CN=cacert.example.7 d4 x8 d- F# g5 s: V  P
com/emailAddress=admin@example.com”;4 Y0 X% J! s4 Y
SSL还可以直接通过密码进行加密。可以使用REQUIRE CIPHER设置密码。/ w3 X' N4 t# W0 @0 V2 L- ]3 c
GRANT ALL PRIVILEGES ON ssl_only_db.* to ‘abc’@‘%’ IDENTIFIED BY “password!”9 J" k2 J+ |7 O1 B1 J
REQUIRE CIPHER “EDH-RSA-DES-CBC3-SHA”;
' x' p/ }( C. R& p& g6 @4 V3 u上面使用了GRANT命令对用户权限进行设置。而这些信息都是保存在授权表中,这些表是安全系统的心脏。在这些表中保存了每一个用户和客户机所具有的权限。如果正确地操作这些表,将会对数据库的安全起到积极的作用,而如果使用不慎,将是非常危险的。
) U7 L$ B" F+ J下面让我们来看看MySQL中的最要的5个授权表。& V- w6 V3 Y$ n! x. F5 H
user
  O% f0 n4 O: P7 Y# G$ G+ b用户表保存了用户的权限和被加密的密码。这个表负责确定哪些用户和客户机可以连接到服务器上。
. w9 o9 R4 z. ^) T, x  }host
$ g0 N* P3 @# U2 n0 H这个表为每一个客户机分配权限,它并不考虑用户的权限。MySQL在确定是否接收还是拒绝一个连接时,首先考虑的是user表。而使用GRANT或REVOKE命令并不影响host表,我们可以通过手工方式修改这个表中的内容。/ Z7 ?" O1 n, n
db
! B0 e9 k* E3 Ydb表保存了数据库层的权限信息。
) k4 e' X0 D, I6 z* Y* H: k. R+ rtables_priv+ o& q" Z! _1 U" S4 T: ?3 J$ [
这个表存储了表的权限信息。
8 [+ a# [* W7 Y6 w; x+ |' Jcolumns_priv
+ V" M6 I* A& D8 A这个表保存了单独列的权限信息。通过这个表,可以将操作某一列的权限授予一个用户。; V" ~$ L4 J* [5 Y; M  \5 y4 T
[NextPage]
- S& T+ m( U4 w' {+ H1 \8 A哈希加密* `& Y* M/ D/ X, {+ T+ E/ R- A
如果数据库保存了敏感的数据,如银行卡密码,客户信息等,你可能想将这些数据以加密的形式保存在数据库中。这样即使有人进入了你的数据库,并看到了这些数据,也很难获得其中的真实信息。) \/ E9 C% z5 Z; e0 Z" t9 n$ S
在应用程序的大量信息中,也许你只想交很小的一部分进行加密,如用户的密码等。这些密码不应该以明文的形式保存,它们应该以加密的形式保存在数据库中。一般情况下,大多数系统,这其中包括MySQL本身都是使用哈希算法对敏感数据进行加密的。
: f! \( v9 b0 g1 K哈希加密是单向加密,也就是说,被加密的字符串是无法得到原字符串的。这种方法使用很有限,一般只使用在密码验证或其它需要验证的地方。在比较时并不是将加密字符串进行解密,而是将输入的字符串也使用同样的方法进行加密,再和数据库中的加密字符串进行比较。这样即使知道了算法并得到了加密字符串,也无法还原最初的字符串。银行卡密码就是采用的这种方式进行加密。
/ w* Y- N, {  N" ~1 \5 g" x  dMySQL提供了4个函数用于哈希加密:PASSWORD, ENCRYPT, SHA1和MD5。下面让我们试一试这4个函数,看看会得到什么结果。我们以加密字符串“pa55word”为例进行说明:
( S2 D! G2 `* b) ?+ I. \让我们先来看看MD5函数3 M% n: W9 ], B9 p- G' R
SELECT MD5(‘pa55word’);" h$ O0 q! f* N, _7 l. Y
+----------------------------------+5 y# o# `) i; l& y' M: w% c5 k8 W
| MD5(‘pa55word’) |& K8 Y* O& [; d+ ]9 B7 a: U# f
+----------------------------------+
  ~# \" m. {, _- ]| a17a41337551d6542fd005e18b43afd4 |' v, F) V- @3 R7 Z9 Z; t( h8 {

+ a$ d7 Y$ C/ f+----------------------------------+3 [5 ~# C6 E- u2 Z, d) h. R4 w
1 row in set (0.13 sec)9 i! P+ K5 G- m" o5 s
下面是PASSWORD函数+ Q: n; @0 e: C* C) C
SELECT PASSWORD(‘pa55word’);
4 `# u( e. x9 R+ l$ U8 e/ O+ |" k+ P+----------------------+
0 }/ f7 x1 W& a3 _! C| PASSWORD(‘pa55word’) |+ {" E# G% n3 H! ~
+----------------------+& Q7 C& F. b2 S# L" x# O
| 1d35c6556b8cab45 |1 G7 ~" Z/ g+ ]: U$ p
+----------------------+* s3 H' w% v. {8 r8 j9 B1 S
1 row in set (0.00 sec)
0 q9 t, m- R  g6 s下面是ENCRYPT函数
$ V# O$ _  Q* L6 }7 gSELECT ENCRYPT(‘pa55word’);
) _; X6 Q0 `  E: j* `0 {+---------------------+
, L" F# W9 u+ v' @% E) n' g| ENCRYPT(‘pa55word’) |. c& }, f, a  l5 [% |3 W3 I
+---------------------+
: k* a* t+ {0 ?( h| up2Ecb0Hdj25A |
4 C2 x3 A% Y- m, ?' k# u6 Q: `+---------------------+% \) o! ^8 ~* ?3 a; o
1 row in set (0.17 sec): z" l- |4 D5 |0 V
上面的每个函数都返回了一个加密后的字符串。为了区分加密字符串的大小写,最好在使用ENCRYPT生成加密字符串时,将这个字段定义成CHAR BINARY类型。' M6 h2 F- A  ?0 M5 X
上面列举了3种加密的方法,但我认为使用MD5加密是最好的。这是因为这样做可以将明文密码显示在处理列表中或是查询日志中,这样便于跟踪。如下面的INSERT语句使用插入了一条记录,其中的密码使用了MD5进行加密:
5 O1 B6 v+ z  b( E- _- c( q& r. oINSERT INTO table1 (user, pw) VALUE (‘user1’, MD5(‘password1’))
+ F, b! U) d7 Y2 o. }9 d- {可以通过如下的语句进行密码验证:* o' E: e3 G  P  R8 m7 e" }* o
SELECT * FROM table1 WHERE user = ‘user1’ AND pw = MD5(‘password1’)$ V0 r0 \( p5 d5 [" e7 `; ^
哈希加密方法可以很好地对密码进行加密,使用了这种方法加密,密码将无法 恢复成明文。
7 I+ o7 W0 B' v+ e( R' v) A' n/ A3 N1 }0 a. j: b4 ^% R5 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客服 返回顶部
快速回复 返回顶部 返回列表