mysql 配置网络_MySQL数据库安全配置

1、前言

MySQL 是完全网络化的跨平台关系型数据库系统,同时是具有客户机/服务器体系结构的分布式数据库管理系统。它具有功能强、使用简便、管理方便、运行速度快、安全可靠性强等优点,用户可利用许多语言编写访问MySQL 数据库的程序,特别是与PHP更是黄金组合,运用十分广泛。

由于MySQL是多平台的数据库,它的默认配置要考虑各种情况下都能适用,所以在我们自己的使用环境下应该进行进一步的安全加固。作为一个MySQL的系统管理员,我们有责任维护MySQL数据库系统的数据安全性和完整性。

MySQL数据库的安全配置必须从两个方面入手,系统内部安全和外部网络安全,另外我们还将简单介绍编程时要注意的一些问题以及一些小窍门。

2、系统内部安全

首先简单介绍一下MySQL数据库目录结构。MySQL安装好,运行了mysql_db_install脚本以后就会建立数据目录和初始化数据库。如果我们用MySQL源码包安装,而且安装目录是/usr/local/mysql,那么数据目录一般会是/usr/local/mysql/var。数据库系统由一系列数据库组成,每个数据库包含一系列数据库表。MySQL是用数据库名在数据目录建立建立一个数据库目录,各数据库表分别以数据库表名作为文件名,扩展名分别为MYD、MYI、frm的三个文件放到数据库目录中。

MySQL的授权表给数据库的访问提供了灵活的权限控制,但是如果本地用户拥有对库文件的读权限的话,攻击者只需把数据库目录打包拷走,然后拷到自己本机的数据目录下就能访问窃取的数据库。所以MySQL所在的主机的安全性是最首要的问题,如果主机不安全,被攻击者控制,那么MySQL的安全性也无从谈起。其次就是数据目录和数据文件的安全性,也就是权限设置问题。

从MySQL主站一些老的binary发行版来看,3.21.xx版本中数据目录的属性是775,这样非常危险,任何本地用户都可以读数据目录,所以数据库文件很不安全。3.22.xx版本中数据目录的属性是770,这种属性也有些危险,本地的同组用户既能读也能写,所以数据文件也不安全。3.23.xx版本数据目录的属性是700,这样就比较好,只有启动数据库的用户可以读写数据库文件,保证了本地数据文件的安全。

如果启动MySQL数据库的用户是mysql,那么象如下的目录和文件的是安全的,请注意数据目录及下面的属性:

shell>ls -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         4096 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

drwxrwxr-x    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

drwxrwxr-x    7 root     root         4096 Feb 27 20:07 sql-bench

drwx------    4 mysql    mysql        4096 Feb 27 20:07 var

shell>ls -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

shell>ls -l /usr/local/mysql/var/mysql

total 104

-rw-------    1 mysql    mysql           0 Feb 27 20:08 columns_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-------    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 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

如果这些文件的属主及属性不是这样,请用以下两个命令修正之:

shell>chown -R mysql.mysql /usr/local/mysql/var

shell>chmod -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服务器,那么,数据库用户就拥有了root用户的写权限。不过MySQL还是做了一些限制的,比如LOAD DATA INFILE只能读全局可读的文件,SELECT ... INTO OUTFILE不能覆盖已经存在的文件。

本地的日志文件也不能忽视,包括shell的日志和MySQL自己的日志。有些用户在本地登陆或备份数据库的时候为了图方便,有时会在命令行参数里直接带了数据库的密码,如:

shell>/usr/local/mysql/bin/mysqldump -uroot -ptest test>test.sql

shell>/usr/local/mysql/bin/mysql -uroot -ptest

这些命令会被shell记录在历史文件里,比如bash会写入用户目录的.bash_history文件,如果这些文件不慎被读,那么数据库的密码就会泄漏。用户登陆数据库后执行的SQL命令也会被MySQL记录在用户目录的.mysql_history文件里。如果数据库用户用SQL语句修改了数据库密码,也会因.mysql_history文件而泄漏。所以我们在shell登陆及备份的时候不要在-p后直接加密码,而是在提示后再输入数据库密码。

另外这两个文件我们也应该不让它记录我们的操作,以防万一。

shell>rm .bash_history .mysql_history

shell>ln -s /dev/null .bash_history

shell>ln -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 |

+-----------+------+----------+-------------+------------+

| 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 | Password | Select_priv | Grant_priv |

+-----------+------+----------+-------------+------------+

| localhost | root |          | Y           | Y          |

| %         | root |          | Y           | Y          |

| localhost |      |          | Y           | Y          |

| %         |      |          | N           | N          |

+-----------+------+----------+-------------+------------+

4 rows in set (0.00 sec)

我们先来看Unix平台的user表。其中redhat只是我试验机的机器名,所以实际上Unix平台的MySQL默认只允许本机才能连接数据库。但是缺省root用户口令是空,所以当务之急是给root用户加上口令。给数据库用户加口令有三种方法:

1)在shell提示符下用mysqladmin命令来改root用户口令

shell>mysqladmin -uroot password test

这样,MySQL数据库root用户的口令就被改成test了。(test只是举例,我们实际使用的口令一定不能使用这种易猜的弱口令)

2)用set password修改口令:

mysql> set password for root@localhost=password(''test'');

这时root用户的口令就被改成test了。

3)直接修改user表的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> delete from user where user='''';

Windows版本MySQL的user表有很大不同,我们看到Host字段除了localhost还有是%。这里%的意思是允许任意的主机连接MySQL服务器,这是非常不安全的,给攻击者造成可乘之机,我们必须删除Host字段为%的记录:

mysql>delete from user where host=''%'';

默认root用户的空密码也是必须修改,三种修改方法和Unix平台一样。

MySQL 是完全网络化的跨平台关系型数据库系统,同时是具有客户机/服务器体系结构的分布式数据库管理系统。它具有功能强、使用简便、管理方便、运行速度快、安全可靠性强等优点,用户可利用许多语言编写访问MySQL 数据库的程序,另外,MySQL在UNIX等操作系统上是免费的,在Windows操作系统上,可免费使用其客户机程序和客户机程序库。 本书通过两个实例,详细介绍了MySQL的基本概念、基本技巧、编程方法、管理特点,以及第三方工具(如PHP和Perl)的使用方法。本书还提供了大量与MySQL有关的因特网站点,以及获得MySQL的技术支持方法。 本书适合数据库网络开发与管理等人员参考。 目 录 译者序 序 前言 第一部分 MySQL的使用 第1章 MySQL 与 SQL 介绍 1 1.1 MySQL 的用途 1 1.2 一个样例数据库 4 1.2.1 美国历史同盟 4 1.2.2 学分保存方案 6 1.2.3 样例数据库怎样才能满足需求 6 1.3 基本数据库术语 7 1.3.1 基本术语 7 1.3.2 查询语言术语 9 1.3.3 MySQL的体系结构术语 9 1.4 MySQL教程 10 1.4.1 基本要求 10 1.4.2 取得样例数据库的分发包 11 1.4.3 建立和中止服务器的连接 11 1.4.4 发布查询 13 1.4.5 创建数据库 14 1.4.6 创建表 15 1.4.7 增加新记录 26 1.4.8 检索信息 28 1.4.9 删除或更新现有记录 49 1.4.10 改变表的结构 50 1.5 与 mysql 交互的技巧 51 1.5.1 简化连接过程 51 1.5.2 以较少的键入发布查询 53 1.6 向何处去 56 第2章 用 MySQL 处理数据 57 2.1 MySQL 数据类型 58 2.2 MySQL 的列类型 59 2.2.1 列类型概述 59 2.2.2 数值列类型 61 2.2.3 串列类型 69 2.2.4 日期和时间列类型 76 2.3 选择列的类型 81 2.3.1 列中存储何种类型的值 82 2.3.2 列值有特定的取值范围吗 84 2.3.3 性能与效率问题 85 2.3.4 希望对值进行什么样的比较 87 2.3.5 计划对列进行索引吗 87 2.3.6 列类型选择问题的相互关联程度 88 2.4 表达式求值和类型转换 88 2.4.1 撰写表达式 89 2.4.2 类型转换 94 第3章 MySQL SQL 语法及其用法 99 3.1 MySQL 中的SQL特征 99 3.2 MySQL 的命名规则 100 3.2.1 引用数据库的成分 100 3.2.2 SQL语句中的大小写规则 101 3.3 创建、删除和选择数据库 101 3.4 创建、删除、索引和更改表 102 3.4.1 CREATE TABLE语句 102 3.4.2 DROP TABLE 语句 106 3.4.3 创建和删除索引 106 3.4.4 ALTER TABLE语句 109 3.5 获取数据库和表的有关信息 111 3.6 检索记录 112 3.6.1 平凡连接 113 3.6.2 全连接 113 3.6.3 左连接 114 3.7 加注释 115 3.8 解决方案随笔 116 3.8.1 将子选择编写为连接 116 3.8.2 检查表中未给出的值 117 3.8.3 执行UNION操作 118 3.8.4 增加序列号列 119 3.8.5 对某个已有的列进行排序 120 3.8.6 非正常次序的串 120 3.8.7 建立计数表 120 3.8.8 检查表是否存在 121 3.9 MySQL 不支持的功能 121 第4章 查询优化 125 4.1 使用索引 125 4.1.1 索引的益处 125 4.1.2 索引的弊端 127 4.1.3 选择索引 127 4.2 MySQL 查询优化程序 129 4.2.1 优化程序怎样工作 129 4.2.2 忽略优化 131 4.3 列类型选择与查询效率 132 4.4 有效地装载数据 134 4.5 调度与锁定问题 136 4.6 管理员的优化 137 4.6.1 服务器参数 138 4.6.2 硬件问题 138 第二部分 MySQL 编程接口 第5章 MySQL 程序设计介绍 139 5.1 MySQL 可用的 API 142 5.1.1 C API 143 5.1.2 Perl DBI API 143 5.1.3 PHP API 145 5.2 选择API 146 5.2.1 执行环境 146 5.2.2 性能 147 5.2.3 开发时间 149 5.2.4 可移植性 151 第6章 MySQL C API 152 6.1 建立客户机程序的一般过程 153 6.1.1 基本的系统需求 153 6.1.2 编译和连接客户机程序 153 6.2 客户机程序1—连接到服务器 154 6.3 客户机程序2—增加错误检查 156 6.4 客户机程序3—产生连接代码模块 158 6.5 客户机程序4—在运行时获取连接参 数 163 6.5.1 访问选项文件内容 164 6.5.2 分析命令行参数 166 6.6 处理查询 172 6.6.1 处理不返回结果集的查询 173 6.6.2 处理返回结果集的查询 174 6.6.3 通用目标查询处理程序 176 6.6.4 可选择的查询处理方法 178 6.6.5 mysql_store_result()与 mysql_ use _result()的比较 179 6.6.6 使用结果集元数据 181 6.7 客户机程序5—交互式查询程序 184 6.8 其他主题 185 6.8.1 在结果集上执行计算 185 6.8.2 对查询中有疑问的数据进行编码 187 6.8.3 图像数据的处理 188 6.8.4 获取表信息 189 6.8.5 需要避免的客户机程序设计错误 189 第7章 Perl DBI API 192 7.1 Perl 脚本的特点 192 7.2 Perl DBI 基础 193 7.2.1 DBI数据类型 193 7.2.2 一个简单的DBI脚本 193 7.2.3 处理错误 196 7.2.4 处理不返回结果集的查询 199 7.2.5 处理返回结果集的查询 200 7.2.6 引用问题 206 7.2.7 占位符和参数约束 209 7.2.8 指定连接参数 210 7.2.9 调试 213 7.2.10 使用结果集元数据 215 7.3 运行 DBI 218 7.3.1 生成历史同盟目录 218 7.3.2 发送成员资格更新通知 223 7.3.3 历史同盟成员项目编辑 227 7.3.4 寻找共同兴趣的历史同盟成员 231 7.3.5 联机历史同盟目录 232 7.4 在 Web 应用程序中使用 DBI 234 7.4.1 设置CGI脚本的Apache 235 7.4.2 CGI.pm的简要介绍 236 7.4.3 从Web脚本连接到MySQL服 务器 239 7.4.4 samp_db数据库浏览器 240 7.4.5 学分保存方案分数浏览器 243 7.4.6 历史同盟共同兴趣的搜索 246 第8章 PHP API 248 8.1 PHP 脚本的特点 248 8.2 PHP基础 248 8.2.1 使用函数和include 文件 253 8.2.2 一个简单的查询页面 257 8.2.3 处理查询结果 258 8.2.4 处理错误 261 8.2.5 引用问题 262 8.3 运行 PHP 263 8.3.1 输入学生分数 263 8.3.2 美国???统测验 269 8.3.3 历史同盟联机成员项的编辑 271 第三部分 MySQL 管理 第9章 MySQL 管理介绍 277 9.1 管理职责概述 277 9.2 常规管理 278 9.3 安全性 279 9.4 数据库修复和维护 279 第10章 MySQL 数据目录 280 10.1 数据目录的位置 280 10.2 数据目录的结构 281 10.2.1 MySQL服务器怎样提供对数据 的访问 282 10.2.2 数据库的表示法 283 10.2.3 数据库表的表示法 283 10.2.4 数据库和表命名中的操作系统 约束 284 10.2.5 系统性能的数据目录结构的 含义 285 10.2.6 MySQL的状态文件 286 10.3 重定位数据目录的内容 288 10.3.1 重定位方法 288 10.3.2 估计重定位的效果 289 10.3.3 重定位数据目录 289 10.3.4 重定位数据库 290 10.3.5 重定位数据库表 290 10.3.6 重定位状态文件 290 第11章 常规的MySQL 管理 292 11.1 新的 MySQL 安装的安全性 292 11.2 MySQL 服务器的启动和关闭 293 11.2.1 用无特权的用户账号运行MySQL 服务器 293 11.2.2 启动服务器的方法 295 11.2.3 关闭服务器 296 11.2.4 在不连接时收回服务器的控制 297 11.3 用户账号管理 298 11.3.1 创建新用户和授权 298 11.3.2 取消权限和删除用户 302 11.4 日志文件维护 303 11.5 备份和拷贝数据库 305 11.5.1 用mysqldump备份和拷贝数 据库 307 11.5.2 使用直接拷贝数据库备份和 拷贝方法 308 11.5.3 复制数据库 309 11.6 为数据恢复使用备份 309 11.6.1 恢复整个数据库 310 11.6.2 恢复单个的表 310 11.7 优化服务器 311 11.8 运行多个服务器 312 11.8.1 配置和安装多个服务器 313 11.8.2 多个服务器的启动过程 313 11.9 更新 MySQL 313 第12章 安全性 315 12.1 内部安全性:安全数据目录访问 315 12.2 外部安全性:安全网络访问 317 12.2.1 MySQL授权表的结构和内容 317 12.2.2 服务器如何控制客户机的访问 320 12.2.3 授权表应避免的风险 323 12.2.4 不用GRANT建立用户 324 第13章 数据库维护和修复 328 13.1 检查和维护数据库表 328 13.1.1 myisamchk和 isamchk的调用 语法 328 13.1.2 检查表 329 13.1.3 修复表 329 13.1.4 避免与 MySQL 服务器交互 作用 331 13.1.5 快速运行myisamchk和 isamchk 332 13.2 安排预防性的维护 333 13.2.1 用cron定期检查表 334 13.2.2 在系统启动期间检查表 335 第四部分 附 录 附录A 获得和安装软件 337 附录B 列类型参考 349 附录C 运算符和函数参考 356 附录D SQL 语法参考 384 附录E MySQL 程序参考 408 附录F C API 参考 431 附录G Perl DBI API 参考 453 附录H PHP API 参考 465 附录 I 有用的第三方工具 482 附录 J 因特网服务商 484
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值