0

0

MySQL数据库安全配置_MySQL

php中文网

php中文网

发布时间:2016-06-01 14:12:27

|

1217人浏览过

|

来源于php中文网

原创


  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,那么我们的操作就不会被记录到这两个文件里了。
  
  3、外部网络安全
  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='';

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

145

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

100

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

34

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

13

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

19

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

27

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

11

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

371

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

28

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS教程
CSS教程

共754课时 | 32.4万人学习

【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2.1万人学习

微信小程序开发之API篇
微信小程序开发之API篇

共15课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号