Mysql数据库安全配置手册_第1页
Mysql数据库安全配置手册_第2页
Mysql数据库安全配置手册_第3页
Mysql数据库安全配置手册_第4页
Mysql数据库安全配置手册_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、誉天 cisco / linux认证社区 数据库安全配置手册1、前言mysql 是完全网络化的跨平台关系型数据库系统,同时是具有客户机/服务器体系结构的分布式数据库管理系统。它具有功能强、使用简便、管理方便、运行速度快、安全可靠性强等优点,用户可利用许多语言编写访问mysql 数据库的程序,特别是与php更是黄金组合,运用十分广泛。由于 mysql 是多平台的数据库,它的默认配置要考虑各种情况下都能适用,所以在我们自己的使用环境下应该进行进一步的安全加固。作为一个mysql 的系统管理员,我们有责任维护mysql 数据库系统的数据安全性和完整性。mysql 数据库的安全配置必须从两个方面入手,

2、系统内部安全和外部网络安全,另外我们还将简单介绍编程时要注意的一些问题以及一些小窍门。2、系统内部安全首先简单介绍一下mysql 数据库目录结构。mysql 安装好,运行了mysql_db_install 脚本以后就会建立数据目录和初始化数据库。如果我们用mysql 源码包安装,而且安装目录是/usr/local/mysql ,那么数据目录一般会是/usr/local/mysql/var 。数据库系统由一系列数据库组成,每个数据库包含一系列数据库表。 mysql 是用数据库名在数据目录建立建立一个数据库目录,各数据库表分别以数据库表名作为文件名,扩展名分别为myd 、myi 、 frm的三个文

3、件放到数据库目录中。mysql 的授权表给数据库的访问提供了灵活的权限控制,但是如果本地用户拥有对库文件的读权限的话,攻击者只需把数据库目录打包拷走,然后拷到自己本机的数据目录下就能访问窃取的数据库。所以 mysql 所在的主机的安全性是最首要的问题,如果主机不安全,被攻击者控制,那么mysql的安全性也无从谈起。其次就是数据目录和数据文件的安全性,也就是权限设置问题。从mysql 主站一些老的 binary 发行版来看, 3.21.xx版本中数据目录的属性是775,这样非常危险,任何本地用户都可以读数据目录,所以数据库文件很不安全。3.22.xx版本中数据目录的属性是770,这种属性也有些危

4、险,本地的同组用户既能读也能写,所以数据文件也不安全。3.23.xx版本数据目录的属性是700,这样就比较好,只有启动数据库的用户可以读写数据库文件,保证了本地数据文件的安全。如果启动 mysql 数据库的用户是mysql,那么象如下的目录和文件的是安全的,请注意数据目录及下面的属性:shellls -l /usr/local/mysql total 40 drwxrwxr-x 2 root root 4096 feb 27 20:07 bin drwxrwxr-x 3 root root 4096 feb 27 20:07 include drwxrwxr-x 2 root root 409

5、6 feb 27 20:07 info drwxrwxr-x 3 root root 4096 feb 27 20:07 lib drwxrwxr-x 2 root root 4096 feb 27 20:07 libexec 武汉誉天. 独家授权cisco / rhce 培训 誉天 cisco / linux认证社区 3 root root 4096 feb 27 20:07 man drwxrwxr-x 6 root root 4096 feb 27 20:07 mysql-test drwxrwxr-x 3 root root 4096 feb 27 20:07 share drwxrw

6、xr-x 7 root root 4096 feb 27 20:07 sql-bench drwx- 4 mysql mysql 4096 feb 27 20:07 var shellls -l /usr/local/mysql/var total 8 drwx- 2 mysql mysql 4096 feb 27 20:08 mysql drwx- 2 mysql mysql 4096 feb 27 20:08 test shellls -l /usr/local/mysql/var/mysql total 104 -rw- 1 mysql mysql 0 feb 27 20:08 colu

7、mns_priv.myd -rw- 1 mysql mysql 1024 feb 27 20:08 columns_priv.myi -rw- 1 mysql mysql 8778 feb 27 20:08 columns_priv.frm -rw- 1 mysql mysql 302 feb 27 20:08 db.myd -rw- 1 mysql mysql 3072 feb 27 20:08 db.myi -rw- 1 mysql mysql 8982 feb 27 20:08 db.frm -rw- 1 mysql mysql 0 feb 27 20:08 func.myd -rw-

8、1 mysql mysql 1024 feb 27 20:08 func.myi -rw- 1 mysql mysql 8641 feb 27 20:08 func.frm -rw- 1 mysql mysql 0 feb 27 20:08 host.myd -rw- 1 mysql mysql 1024 feb 27 20:08 host.myi -rw- 1 mysql mysql 8958 feb 27 20:08 host.frm -rw- 1 mysql mysql 0 feb 27 20:08 tables_priv.myd -rw- 1 mysql mysql 1024 feb

9、27 20:08 tables_priv.myi -rw- 1 mysql mysql 8877 feb 27 20:08 tables_priv.frm -rw- 1 mysql mysql 428 feb 27 20:08 user.myd -rw- 1 mysql mysql 2048 feb 27 20:08 user.myi -rw- 1 mysql mysql 9148 feb 27 20:08 user.frm 如果这些文件的属主及属性不是这样,请用以下两个命令修正之:shellchown -r mysql.mysql /usr/local/mysql/var shellchmo

10、d -r go-rwx /usr/local/mysql/var 用root用户启动远程服务一直是安全大忌,因为如果服务程序出现问题,远程攻击者极有可能获得主机的完全控制权。mysql 从 3.23.15 版本开始时作了小小的改动,默认安装后服务要用mysql用户来启动, 不允许 root用户启动。 如果非要用 root用户来启动, 必须加上 -user=root的参数 (./safe_mysqld -user=root &) 。因为 mysql 中有 load data infile和select . into outfile的sql语句,如果是 root用户启动了 mysql 服务

11、器,那么,数据库用户就拥有了root用户的写权限。不过mysql 还是做了一些限制的,比如load data infile只能读全局可读的文件,select . into outfile不能覆盖已经存在的文件。本地的日志文件也不能忽视,包括 shell的日志和 mysql 自己的日志。 有些用户在本地登陆或备份数武汉誉天. 独家授权cisco / rhce 培训 誉天 cisco / linux认证社区 -uroot -ptest testtest.sql shell/usr/local/mysql/bin/mysql -uroot -ptest 这些命令会被 shell记录在历史文件里,比如

12、bash会写入用户目录的.bash_history文件,如果这些文件不慎被读, 那么数据库的密码就会泄漏。用户登陆数据库后执行的sql命令也会被 mysql 记录在用户目录的 .mysql_history 文件里。如果数据库用户用sql语句修改了数据库密码,也会因 .mysql_history文件而泄漏。所以我们在shell登陆及备份的时候不要在-p后直接加密码,而是在提示后再输入数据库密码。另外这两个文件我们也应该不让它记录我们的操作,以防万一。shellrm .bash_history .mysql_history shellln -s /dev/null .bash_history sh

13、ellln -s /dev/null .mysql_history 上门这两条命令把这两个文件链接到/dev/null ,那么我们的操作就不会被记录到这两个文件里了。外部网络安全mysql 数据库安装好以后,unix 平台的 user表是这样的:mysql use mysql; database changed mysql select host,user,password,select_priv,grant_priv from user; +-+-+-+-+-+ | host | user | password | select_priv | grant_priv | +-+-+-+-+-+

14、 | localhost | root | | y | y | | redhat | root | | y | y | | localhost | | | n | n | | redhat | | | n | n | +-+-+-+-+-+ 4 rows in set (0.00 sec) windows 平台的 user表是这样的:mysql use mysql; database changed mysql select host,user,password,select_priv,grant_priv from user; +-+-+-+-+-+ | host | user | pass

15、word | select_priv | grant_priv | +-+-+-+-+-+ | localhost | root | | y | y | | % | root | | y | y | | localhost | | | y | y | 武汉誉天. 独家授权cisco / rhce 培训 誉天 cisco / linux认证社区 % | | | n | n | +-+-+-+-+-+ 4 rows in set (0.00 sec) 我们先来看 unix 平台的 user表。其中 redhat只是我试验机的机器名,所以实际上unix 平台的 mysql默认只允许本机才能连接数据库

16、。但是缺省 root用户口令是空, 所以当务之急是给root用户加上口令。给数据库用户加口令有三种方法:1)在shell提示符下用 mysqladmin 命令来改 root用户口令shellmysqladmin -uroot password test 这样, mysql 数据库 root用户的口令就被改成test了。 (test只是举例,我们实际使用的口令一定不能使用这种易猜的弱口令)2)用set password修改口令:mysql set password for rootlocalhost=password(test); 这时 root用户的口令就被改成test了。3)直接修改 use

17、r表的 root用户口令mysql use mysql; mysql update user set password=password(test) where user=root; mysql flush privileges; 这样, mysql 数据库 root用户的口令也被改成test了。其中最后一句命令flush privileges 的意思是强制刷新内存授权表,否则用的还是缓冲中的口令,这时非法用户还可以用root用户及空口令登陆,直到重启 mysql 服务器。我们还看到 user为空的匿名用户,虽然它在unix 平台下没什么权限,但为了安全起见我们应该删除它:mysql dele

18、te from user where user=; windows 版本 mysql 的user表有很大不同,我们看到host字段除了 localhost还有是 %。这里 %的意思是允许任意的主机连接mysql 服务器, 这是非常不安全的,给攻击者造成可乘之机,我们必须删除host字段为 %的记录:mysqldelete from user where host=%; 默认 root用户的空密码也是必须修改,三种修改方法和unix 平台一样。我们注意到 host字段为 localhost的匿名用户拥有所有的权限!就是说本地用户用空的用户名和空的武汉誉天. 独家授权cisco / rhce 培训

19、 誉天 cisco / linux认证社区 mysql 数据库服务器可以得到最高的权限!所以匿名用户必须删除!mysql delete from user where user=; 对user表操作以后不要忘了用flush privileges 来强制刷新内存授权表,这样才能生效。默认安装的 windows 版 mysql 存在的不安全因素太多,我们在安装后一定要进一步配置!mysql 的 5 个授权表: user, db, host, tables_priv和columns_priv 提供非常灵活的安全机制,从mysql 3.22.11 开始引入了两条语句grant 和 revoke 来创建

20、和删除用户权限,可以方便的限制哪个用户可以连接服务器,从哪里连接以及连接后可以做什么操作。作为 mysql 管理员, 我们必须了解授权表的意义以及如何用grant 和revoke 来创建用户、授权和撤权、删除用户。在 3.22.11 版本以前的 mysql 授权机制不完善,和新版本也有较大的不同,建议升级到最新版本的mysql 。 (本书的操作例子是以mysql 3.23.49 为样本)我们先来了解授权表的结构。1)mysql 授权表的结构与内容:mysql desc user; +-+-+-+-+-+-+ | field | type | null | key | default | ext

21、ra | +-+-+-+-+-+-+ | host | char(60) binary | | pri | | | | user | char(16) binary | | pri | | | | password | char(16) binary | | | | | | select_priv | enum(n,y) | | | n | | | insert_priv| enum(n,y)| n| update_priv | enum(n,y) | | | n | | | delete_priv | enum(n,y) | | | n | | | create_priv | enum(n,

22、y) | | | n | | | drop_priv| enum(n,y)| n| reload_priv | enum(n,y) | | | n | | | shutdown_priv | enum(n,y) | | | n | | | process_priv| enum(n,y)| n| file_priv | enum(n,y) | | | n | | | grant_priv | enum(n,y) | | | n | | | references_priv | enum(n,y) | | | n | | | index_priv | enum(n,y) | | | n | | |

23、alter_priv | enum(n,y) | | | n | | +-+-+-+-+-+-+ 17 rows in set (0.01 sec) user表是 5 个授权表中最重要的一个,列出可以连接服务器的用户及其加密口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。所武汉誉天. 独家授权cisco / rhce 培训 誉天 cisco / linux认证社区 | 权限指定符 | 列名 |权限操作 | +-+-+-+ | select | select_priv | 允许对表的访问,不对数据表进行访问的select语句不受影响,比

24、如select 1+1| +-+-+-+ | insert | insert_priv | 允许对表用 insert语句进行写入操作。 | +-+-+-+ | update | update_priv | 允许用 update语句修改表中现有记录。 | +-+-+-+ | delete | delete_priv | 允许用 delete语句删除表中现有记录。 | +-+-+-+ | create | create_priv | 允许建立新的数据库和表。| +-+-+-+ | drop | drop_priv | 允许删除现有的数据库和表。 | +-+-+-+ | index | index_

25、priv | 允许创建、修改或删除索引。 | +-+-+-+ | alter | alter_priv | 允许用 alter语句修改表结构。| +-+-+-+ | grant | grant_priv | 允许将自己拥有的权限授予其它用户,包括grant。| +-+-+-+ | reload | reload | 允许重载授权表,刷新服务器等命令。 | +-+-+-+ | shutdown | shudown_priv| 允许用 mysqladmin shutdown 命令关闭 mysql 服务器。该权限比较危险, | | | | 不应该随便授予。 | +-+-+-+ | process |

26、 process_priv| 允许查看和终止mysql 服务器正在运行的线程(进程)以及正在执行的查询语句 | | | | ,包括执行修改密码的查询语句。该权限比较危险,不应该随便授予。 | +-+-+-+ | file | file_priv | 允许从服务器上读全局可读文件和写文件。该权限比较危险,不应该随便授予。 | +-+-+-+ mysql desc db; +-+-+-+-+-+-+ | field | type | null | key | default | extra | +-+-+-+-+-+-+ | host | char(60) binary | | pri | | |

27、 | db | char(64) binary | | pri | | | 武汉誉天. 独家授权cisco / rhce 培训 誉天 cisco / linux认证社区 user | char(16) binary | | pri | | | | select_priv | enum(n,y) | | | n | | | insert_priv| enum(n,y)| n| update_priv | enum(n,y) | | | n | | | delete_priv | enum(n,y) | | | n | | | create_priv | enum(n,y) | | | n | |

28、 | drop_priv| enum(n,y)| n| grant_priv | enum(n,y) | | | n | | | references_priv | enum(n,y) | | | n | | | index_priv | enum(n,y) | | | n | | | alter_priv | enum(n,y) | | | n | | +-+-+-+-+-+-+ 13 rows in set (0.01 sec) db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。mysql desc host; +-+-+-+-+-+-+ | field

29、| type | null | key | default | extra | +-+-+-+-+-+-+ | host | char(60) binary | | pri | | | | db | char(64) binary | | pri | | | | select_priv | enum(n,y) | | | n | | | insert_priv| enum(n,y)| n| update_priv | enum(n,y) | | | n | | | delete_priv | enum(n,y) | | | n | | | create_priv | enum(n,y) | |

30、 | n | | | drop_priv| enum(n,y)| n| grant_priv | enum(n,y) | | | n | | | references_priv | enum(n,y) | | | n | | | index_priv | enum(n,y) | | | n | | | alter_priv | enum(n,y) | | | n | | +-+-+-+-+-+-+ 12 rows in set (0.01 sec) host表与 db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。这个表不受grant 和 revoke 语句

31、的影响,所以,你可能发觉你根本不是用它。mysql desc tables_priv; +-+-+-+-+-+-+ | field | type | null | key | default | extra | +-+-+-+-+-+-+ | host | char(60) binary | | pri | | | | db | char(64) binary | | pri | | | 武汉誉天. 独家授权cisco / rhce 培训 誉天 cisco / linux认证社区 user | char(16) binary | | pri | | | | table_name | char(

32、60) binary | | pri | | | | grantor | char(77) | | mul | | | | timestamp | timestamp(14) | yes | | null | | | table_priv | set(select,insert, | | | | | | | update,delete,create, | | | | | | | drop,grant,references,| | | | | | | index,alter) | | | | | | column_priv | set(select,insert, | | | | | | | u

33、pdate,references) | | | | | +-+-+-+-+-+-+ 8 rows in set (0.01 sec) tables_priv表指定表级权限。在这里指定的一个权限适用于一个表的所有列。mysql desc columns_priv; +-+-+-+-+-+-+ | field | type | null | key | default | extra | +-+-+-+-+-+-+ | host | char(60) binary | | pri | | | | db | char(64) binary | | pri | | | | user | char(16

34、) binary | | pri | | | | table_name | char(64) binary | | pri | | | | column_name | char(64) binary | | pri | | | | timestamp | timestamp(14) | yes | | null | | | column_priv | set(select,insert, | | | | | | update,references) |+-+-+-+-+-+-+ 7 rows in set (0.00 sec) columns_priv 表指定列级权限。在这里指定的权限适用于一

35、个表的特定列。2)mysql 授权表运行机制mysql 的访问控制分两个步骤:a)服务器检查是否允许该用户连接。b)如果该用户有权连接,那么服务器还会检查它的每一个请求是否有足够的权限。比如:用户检索数据库中的一个表需要有这个数据库的select权限,用户删除数据库中的一个表需要有这个数据库的drop权限。授权表的 user, db, host表使用这两个步骤,tables_priv 和columns_priv 表只使用第二步(检查请求)。每个授权表包含决定一个权限何时运用的范围列和决定授予哪种权限的权限列。范围列指定表中的权限何时运用。每个授权表条目包含user和host列来指定权限何时运用

36、于一个给定用户从给定主机的连接。其他表包含附加的范围列,如db表包含一个 db列指出权限运用于哪个数据库。类似地,tables_priv和 columns_priv 表包含范围字段,缩小范围到一个数据库中的特定表或一武汉誉天. 独家授权cisco / rhce 培训 誉天 cisco / linux认证社区 user表的 host字段和 user字段组合的一些例子:+-+-+-+ | host值| user值 | 匹配的连接 | +-+-+-+ | x.y.z | test | test用户只能从 x.y.z连接数据库 | +-+-+-+ | x.y.z | | 任何用户可以从x.y.z连接数

37、据库 | +-+-+-+ | %| test | test用户可以从任意主机连接数据库 | +-+-+-+ | | | 任何用户可以从任意主机连接数据库 | +-+-+-+ | %.y.z | test | test用户可以从 y.z域的任意主机连接数据库| +-+-+-+ | x.y.% | test | test用户可以从 , , 等主机连接数据库| +-+-+-+ | | test | test用户可以从 ip地址为 的主机连接数据库 | +-+-+-+ | 192.168.1.% | test | test用户可以从 c类子

38、网 192.168.1 中的任意主机连接数据库 | +-+-+-+ | / | test | 同上 | +-+-+-+ sql的字符串通配符%表示匹配任意字符,可以是0 个字符,通配符_表示匹配一个字符。权限列指出在范围列中指定的用户拥有何种权限。该表使用grant 语句的权限名称。对于绝大多数在 user、 db和 host表中的权限列的名称与grant 语句中有明显的联系。如select_priv 对应于select权限。3)授权表使用举例grant用于给增加用户和创建权限,revoke用于删除用户权限。下面是一些用 grant增加用户和创建

39、权限的例子:mysql grant all privileges on *.* to testlocalhost identified by test with grant option; 这句增加一个本地具有所有权限的test用户(超级用户) ,密码是 test。on子句中的 *.* 意味着 所有数据库、所有表。with grant option 表示它具有 grant权限。mysql grant select,insert,update,delete,create,drop privileges on test.* to test1/ ide

40、ntified by test; 这句是增加了一个test1 用户,口令是test,但是它只能从c类子网192.168.1 连接,对 test库有select,insert,update,delete,create,drop操作权限。用grant语句创建权限是不需要再手工刷新授权表的,因为它已经自动刷新了。武汉誉天. 独家授权cisco / rhce 培训 誉天 cisco / linux认证社区 insert into user values(localhost,test,password(test),y,y,y,y,y,y,y,y,y,y,y,y,y,y); mysql flush pri

41、vileges; 这两句和上面第一句grant的效果是一样的,也是增加了一个本地的test超级用户。我们看到用grant方便多了,而且还不需flush privileges 。mysql insert into user (host,user,password) values(/,test1,password(test); mysql insert into db values(/,test,test1,y,y,y,y,y,y,n,n,n,n) mysql flush privileges; 这三句

42、和上面第二句grant的效果也是一样的, 也是增加了一个只能从c类子网 192.168.1 连接,对test库有 select,insert,update,delete,create,drop操作权限的 test1 用户,口令是 test。要取消一个用户的权限,使用revoke语句。 revoke的语法非常类似于grant语句, 除了 to用from取代并且没有 identified by 和with grant option 子句,下面是用revoke删除用户权限的例子:mysql revoke all on test.* from test1/255.255.255.

43、0; 这句 revoke就撤消了上面第二句grant创建的权限,但是test1 用户并没有被删除,必须手工从user表删除:mysql delete from user where user=test1; mysql flush privileges; 这样, test1用户就彻底删除了。这些只是 mysql 授权表的简单使用,更多详细的资料请见mysql 提供的手册。3、编程需要注意的一些问题不管是用哪种程序语言写连接mysql 数据库的程序,有一条准则是永远不要相信用户提交的数据!对于数字字段, 我们要使用查询语句:select * from table where id=234,不要使用

44、 select * from table where id=234这样的查询语句。mysql 会自动把字串转换为数字字符并且去除非数字字符。如果用户提交的数据经过了mysql_escape_string处理,这样我们就可以完全杜绝了sql inject攻击,关于 sql inject 攻击请参考下面链接的文章:http:/ 独家授权cisco / rhce 培训 誉天 cisco / linux认证社区 web程序:a)尝试在 web表单输入单引号和双引号来测试可能出现的错误,并找出原因所在。b)修改 url 参数带的 %22 (), %23 (#), 和 %27 ()。c)对于数字字段的变量,我们的应用程序必须进行严格的检查,否则是非常危险的。d)检查用户提交的数据是否超过字段的长度。e)不要给自己程序连接数据库的用户过多的访问权限。2)php:a)检查用户提交的数据在查询之前是否经过addslas

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论