mysql数据库的安全配置Word文件下载.docx
- 文档编号:21922859
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:15
- 大小:315.81KB
mysql数据库的安全配置Word文件下载.docx
《mysql数据库的安全配置Word文件下载.docx》由会员分享,可在线阅读,更多相关《mysql数据库的安全配置Word文件下载.docx(15页珍藏版)》请在冰豆网上搜索。
drwxrwxr-x
2
root
4096
Feb
27
20:
07
bin
3
include
info
lib
libexec
man
6
mysql-test
share
7
sql-bench
drwx------
4
mysql
var
/usr/local/mysql/var
8
08
test
/usr/local/mysql/var/mysql
104
-rw-------
1
0
columns_priv.MYD
1024
columns_priv.MYI
8778
columns_priv.frm
302
db.MYD
3072
db.MYI
8982
db.frm
func.MYD
func.MYI
8641
func.frm
host.MYD
host.MYI
8958
host.frm
tables_priv.MYD
tables_priv.MYI
8877
tables_priv.frm
428
user.MYD
2048
user.MYI
9148
user.frm
如果这些文件的属主及属性不是这样,请用以下两个命令修正之:
chown
-R
mysql.mysql
chmod
go-rwx
/usr/local/mysql/var
用root用户启动远程服务一直是安全大忌,因为如果服务程序出现问题,远程攻击者极有可能获得主机的完全控制权。
MySQL从3.23.15版本开始时作了小小的改动,默认安装后服务要用mysql用户来启动,不允许root用户启动。
如果非要用root用户来启动,必须加上--user=root的参数(./safe_mysqld--user=root&
)。
因为MySQL中有LOADDATAINFILE和SELECT...INTOOUTFILE的SQL语句,如果是root用户启动了MySQL服务器,那么,数据库用户就拥有了root用户的写权限。
不过MySQL还是做了一些限制的,比如LOADDATAINFILE只能读全局可读的文件,SELECT...INTOOUTFILE不能覆盖已经存在的文件。
本地的日志文件也不能忽视,包括shell的日志和MySQL自己的日志。
有些用户在本地登陆或备份数据库的时候为了图方便,有时会在命令行参数里直接带了数据库的密码,如:
/usr/local/mysql/bin/mysqldump
-uroot
-ptest
test>
test.sql
/usr/local/mysql/bin/mysql
-ptest
这些命令会被shell记录在历史文件里,比如bash会写入用户目录的.bash_history文件,如果这些文件不慎被读,那么数据库的密码就会泄漏。
用户登陆数据库后执行的SQL命令也会被MySQL记录在用户目录的.mysql_history文件里。
如果数据库用户用SQL语句修改了数据库密码,也会因.mysql_history文件而泄漏。
所以我们在shell登陆及备份的时候不要在-p后直接加密码,而是在提示后再输入数据库密码。
另外这两个文件我们也应该不让它记录我们的操作,以防万一。
rm
.bash_history
.mysql_history
ln
-s
/dev/null
.mysql_history
上门这两条命令把这两个文件链接到/dev/null,那么我们的操作就不会被记录到这两个文件里了。
外部网络安全
MySQL数据库安装好以后,Unix平台的user表是这样的:
mysql>
use
mysql;
Database
changed
select
Host,User,Password,Select_priv,Grant_priv
from
user;
图1
4rowsinset(0.00sec)
Windows平台的user表是这样的:
图2
我们先来看Unix平台的user表。
其中redhat只是我试验机的机器名,所以实际上Unix平台的MySQL默认只允许本机才能连接数据库。
但是缺省root用户口令是空,所以当务之急是给root用户加上口令。
给数据库用户加口令有三种方法:
1)在shell提示符下用mysqladmin命令来改root用户口令:
mysqladmin
password
test
这样,MySQL数据库root用户的口令就被改成test了。
(test只是举例,我们实际使用的口令一定不能使用这种易猜的弱口令)
2)用setpassword修改口令:
set
for
root@localhost=password('
test'
);
这时root用户的口令就被改成test了。
3)直接修改user表的root用户口令:
update
user
password=password('
)
where
user='
root'
;
flush
privileges;
这样,MySQL数据库root用户的口令也被改成test了。
其中最后一句命令flushprivileges的意思是强制刷新内存授权表,否则用的还是缓冲中的口令,这时非法用户还可以用root用户及空口令登陆,直到重启MySQL服务器。
我们还看到user为空的匿名用户,虽然它在Unix平台下没什么权限,但为了安全起见我们应该删除它:
delete
'
Windows版本MySQL的user表有很大不同,我们看到Host字段除了localhost还有是%。
这里%的意思是允许任意的主机连接MySQL服务器,这是非常不安全的,给攻击者造成可乘之机,我们必须删除Host字段为%的记录:
host='
%'
默认root用户的空密码也是必须修改,三种修改方法和Unix平台一样。
我们注意到Host字段为localhost的匿名用户拥有所有的权限!
就是说本地用户用空的用户名和空的口令登陆MySQL数据库服务器可以得到最高的权限!
所以匿名用户必须删除!
对user表操作以后不要忘了用flushprivileges来强制刷新内存授权表,这样才能生效。
默认安装的Windows版MySQL存在的不安全因素太多,我们在安装后一定要进一步配置!
MySQL的5个授权表:
user,db,host,tables_priv和columns_priv提供非常灵活的安全机制,从MySQL3.22.11开始引入了两条语句GRANT和REVOKE来创建和删除用户权限,可以方便的限制哪个用户可以连接服务器,从哪里连接以及连接后可以做什么操作。
作为MySQL管理员,我们必须了解授权表的意义以及如何用GRANT和REVOKE来创建用户、授权和撤权、删除用户。
在3.22.11版本以前的MySQL授权机制不完善,和新版本也有较大的不同,建议升级到最新版本的MySQL。
(本书的操作例子是以MySQL3.23.49为样本)我们先来了解授权表的结构。
1)MySQL授权表的结构与内容:
mysql>
descuser;
图3
17rowsinset(0.01sec)
user表是5个授权表中最重要的一个,列出可以连接服务器的用户及其加密口令,并且它指定他们有哪种全局(超级用户)权限。
在user表启用的任何权限均是全局权限,并适用于所有数据库。
所以我们不能给任何用户访问mysql.user表的权限!
权限说明:
图4
descdb;
图5
13rowsinset(0.01sec)
db表列出数据库,而用户有权限访问它们。
在这里指定的权限适用于一个数据库中的所有表。
deschost;
图6
12rowsinset(0.01sec)
host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。
这个表不受GRANT和REVOKE语句的影响,所以,你可能发觉你根本不是用它。
desctables_priv;
图7
8rowsinset(0.01sec)
tables_priv表指定表级权限。
在这里指定的一个权限适用于一个表的所有列。
desccolumns_priv;
图8
7rowsinset(0.00sec)
columns_priv表指定列级权限。
在这里指定的权限适用于一个表的特定列。
2)MySQL授权表运行机制
MySQL的访问控制分两个步骤:
a)服务器检查是否允许该用户连接。
b)如果该用户有权连接,那么服务器还会检查它的每一个请求是否有足够的权限。
比如:
用户检索数据库中的一个表需要有这个数据库的select权限,用户删除数据库中的一个表需要有这个数据库的drop权限。
授权表的user,db,host表使用这两个步骤,tables_priv和columns_priv表只使用第二步(检查请求)。
每个授权表包含决定一个权限何时运用的范围列和决定授予哪种权限的权限列。
范围列指定表中的权限何时运用。
每个授权表条目包含User和Host列来指定权限何时运用于一个给定用户从给定主机的连接。
其他表包含附加的范围列,如db表包含一个Db列指出权限运用于哪个数据库。
类似地,tables_priv和columns_priv表包含范围字段,缩小范围到一个数据库中的特定表或一个表的特定列。
下面是user表的Host字段和User字段组合的一些例子:
图9
SQL的字符串通配符%表示匹配任意字符,可以是0个字符,通配符_表示匹配一个字符。
权限列指出在范围列中指定的用户拥有何种权限。
该表使用GRANT语句的权限名称。
对于绝大多数在user、db和host表中的权限列的名称与GRANT语句中有明显的联系。
如Select_priv对应于SELECT权限。
3)授权表使用举例
grant用于给增加用户和创建权限,revoke用于删除用户权限。
下面是一些用grant增加用户和创建权限的例子:
grant
all
privileges
on
*.*
to
test@localhost
identified
by
with
option;
这句增加一个本地具有所有权限的test用户(超级用户),密码是test。
ON子句中的*.*意味着"
所有数据库、所有表"
。
withgrantoption表示它具有grant权限。
select,insert,update,delete,create,drop
test.*
test1@'
192.168.1.0/255.255.255.0'
这句是增加了一个test1用户,口令是test,但是它只能从C类子网192.168.1连接,对test库有select,insert,update,delete,create,drop操作权限。
用grant语句创建权限是不需要再手工刷新授权表的,因为它已经自动刷新了。
给用户创建权限还可以通过直接修改授权表:
insert
into
values("
localhost"
"
test"
password("
),"
Y"
这两句和上面第一句grant的效果是一样的,也是增加了一个本地的test超级用户。
我们看到用grant方便多了,而且还不需flushprivileges。
(host,user,password)
192.168.1.0/255.255.255.0"
test1"
PASSWORD("
));
db
N"
这三句和上面第二句grant的效果也是一样的,也是增加了一个只能从C类子网192.168.1连接,对test库有select,insert,update,delete,create,drop操作权限的test1用户,口令是test。
要取消一个用户的权限,使用revoke语句。
revoke的语法非常类似于grant语句,除了to用from取代并且没有identifiedby和withgrantoption子句,下面是用revoke删除用户权限的例子:
revoke
这句revoke就撤消了上面第二句grant创建的权限,但是test1用户并没有被删除,必须手工从user表删除:
test1'
这样,test1用户就彻底删除了。
这些只是MySQL授权表的简单使用,更多详细的资料请见MySQL提供的手册。
编程需要注意的一些问题
不管是用哪种程序语言写连接MySQL数据库的程序,有一条准则是永远不要相信用户提交的数据!
对于数字字段,我们要使用查询语句:
SELECT*FROMtableWHEREID='
234'
,不要使用SELECT*FROMtableWHEREID=234这样的查询语句。
MySQL会自动把字串转换为数字字符并且去除非数字字符。
如果用户提交的数据经过了mysql_escape_string处理,这样我们就可以完全杜绝了sqlinject攻击。
各种编程语言该注意的问题:
1)所有Web程序:
a)尝试在Web表单输入单引号和双引号来测试可能出现的错误,并找出原因所在。
b)修改URL参数带的%22('
"
),%23('
#'
),和%27('
c)对于数字字段的变量,我们的应用程序必须进行严格的检查,否则是非常危险的。
d)检查用户提交的数据是否超过字段的长度。
e)不要给自己程序连接数据库的用户过多的访问权限。
2)PHP:
a)检查用户提交的数据在查询之前是否经过addslashes处理,在PHP4.0.3以后提供了基于MySQLC
API的函数mysql_escape_string()。
3)MySQLCAPI:
a)检查查询字串是否用了mysql_escape_string()API调用。
4)MySQL++:
a)检查查询字串是否用了escape和quote处理。
5)PerlDBI:
a)检查查询字串是否用了quote()方法。
6)JavaJDBC:
a)检查查询字串是否用了PreparedStatement对象。
5、
一些小窍门
1)如果不慎忘记了MySQL的root密码,我们可以在启动MySQL服务器时加上参数--skip-grant-tables来跳过授权表的验证(./safe_mysqld--skip-grant-tables&
),这样我们就可以直接登陆MySQL服务器,然后再修改root用户的口令,重启MySQL就可以用新口令登陆了。
2)启动MySQL服务器时加上--skip-show-database使一般数据库用户不能浏览其它数据库。
3)启动MySQL服务器时加上--chroot=path参数,让mysqld守护进程运行在chroot环境中。
这样SQL语句LOADDATAINFILE和SELECT...INTOOUTFILE就限定在chroot_path下读写文件了。
这里有一点要注意,MySQL启动后会建立一个mysql.sock文件,默认是在/tmp目录下。
使用了chroot后,MySQL会在chroot_path/tmp去建立mysql.sock文件,如果没有chroot_path/tmp目录或启动MySQL的用户没有这个目录写权限就不能建立mysql.sock文件,MySQL会启动失败。
比如我们加了--chroot=/usr/local/mysql/启动参数,那么最好建立一个启动MySQL的用户能写的/usr/lo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- mysql 数据库 安全 配置