0

0

保障MySQL数据安全的14个最佳方法

php中文网

php中文网

发布时间:2016-06-07 14:55:33

|

1370人浏览过

|

来源于php中文网

原创

有的企业在安装MySQL时用的是默认选项,由此造成其数据不安全,且服务器也面临被入侵的风险,并有可能在短时间内就出现性能问题。本文将提供保障MySQL安全的最佳方法。 MySQL数据库一贯以高性能、高可性和易用性著称,它已经成为世界上最流行的开源数据库。

  有的企业在安装mysql时用的是默认选项,由此造成其数据不安全,且服务器也面临被入侵的风险,并有可能在短时间内就出现性能问题。本文将提供保障mysql安全的最佳方法。


  MySQL数据库一贯以高性能、高可性和易用性著称,它已经成为世界上最流行的开源数据库。大量的个人、WEB开发者、大型公司等都在其网站、关键系统、软件包中广泛使用MySQL数据库。


  通常,许多企业在部署一种产品时,安全性常常得不到应有的重视。企业最关心的是使其可以尽快地运行,企业由此也可以尽快赢利。


  但有的企业在安装MySQL时用的是默认选项,由此造成其数据不安全,且服务器也面临被入侵的风险,并有可能在短时间内就出现性能问题。


  下面将提供保障MySQL安全的最佳方法:


  1、避免从互联网访问MySQL数据库,确保特定主机才拥有访问特权


  直接通过本地网络之外的计算机改变生产环境中的数据库是异常危险的。有时,管理员会打开主机对数据库的访问:


  > GRANT ALL ON *.* TO 'root'@'%';


  这其实是完全放开了对root的访问。所以,把重要的操作限制给特定主机非常重要:


  > GRANT ALL ON *.* TO 'root'@'localhost';


  > GRANT ALL ON *.* TO 'root'@'myip.athome'


  > FLUSH PRIVILEGES


  此时,你仍有完全的访问,但只有指定的IP(不管其是否静态)可以访问。


  2、定期备份数据库


  任何系统都有可能发生灾难。服务器、MySQL也会崩溃,也有可能遭受入侵,数据有可能被删除。只有为最糟糕的情况做好了充分的准备,才能够在事后快速地从灾难中恢复。企业最好把备份过程作为服务器的一项日常工作。目前国内软件多备份在这方面做得很好,基于Cloud 5技术实现多个云平台的数据互通,自动备份,帮助企业或个人进行数据保护和管理。当出现任何问题时,立刻一键恢复,即可把原来的数据都恢复,做到‘原地满血复活’


  3、禁用或限制远程访问


  前面说过,如果使用了远程访问,要确保只有定义的主机才可以访问服务器。这一般是通过TCP wrappers、iptables或任何其它的防火墙软件或硬件实现的。


  为限制打开网络socket,管理员应当在my.cnf或my.ini的[mysqld]部分增加下面的参数:


  skip-networking


  这些文件位于windows的C:\Program Files\MySQL\MySQL Server 5.1文件夹中,或在Linux中,my.cnf位于/etc/,或位于/etc/mysql/。这行命令在MySQL启动期间,禁用了网络连接的初始化。请注意,在这里仍可以建立与MySQL服务器的本地连接。


  另一个可行的方案是,强迫MySQL仅监听本机,方法是在my.cnf的[mysqld]部分增加下面一行:


  bind-address=127.0.0.1


  如果企业的用户从自己的机器连接到服务器或安装到另一台机器上的web服务器,你可能不太愿意禁用网络访问。此时,不妨考虑下面的有限许可访问:


  mysql> GRANT SELECT, INSERT ON mydb.* TO 'someuser'@'somehost';


  这里,你要把someuser换成用户名,把somehost换成相应的主机。


  4、设置root用户的口令并改变其登录名


  在linux中,root用户拥有对所有数据库的完全访问权。因而,在Linux的安装过程中,一定要设置root口令。当然,要改变默认的空口令,其方法如下:


  Access MySQL控制台:$ mysql -u root -p


  在MySQL控制台中执行:


  > SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_password');


  在实际操作中,只需将上面一行的new_password换成实际的口令即可。


  在Linux控制台中更改root口令的另一种方法是使用mysqladmin工具:


  $ mysqladmin -u root password new_password


  此时,也是将上面一行的new_password换成实际的口令即可。


  当然,这是需要使用强口令来避免强力攻击。


  为了更有效地改进root用户的安全性,另一种好方法是为其改名。为此,你必须更新表用户中的mySQL数据库。在MySQL控制台中进行操作:


  > USE mysql;


  > UPDATE user SET user="another_username" WHERE user="root";


  > FLUSH PRIVILEGES;


  然后,通过Linux访问MySQL控制台就要使用新用户名了:


  $ mysql -u another_username -p


  5、移除测试(test)数据库


  在默认安装的MySQL中,匿名用户可以访问test数据库。我们可以移除任何无用的数据库,以避免在不可预料的情况下访问了数据库。因而,在MySQL控制台中,执行:


  > DROP DATABASE test;


  6、禁用LOCAL INFILE


  另一项改变是禁用”LOAD DATA LOCAL INFILE”命令,这有助于防止非授权用户访问本地文件。在PHP应用程序中发现有新的SQL注入漏洞时,这样做尤其重要。


  此外,在某些情况下,LOCAL INFILE命令可被用于访问操作系统上的其它文件(如/etc/passwd),应使用下现的命令:


  mysql> LOAD DATA LOCAL INFILE '/etc/passwd' INTO TABLE table1


  更简单的方法是:


  mysql> SELECT load_file("/etc/passwd")


  为禁用LOCAL INFILE命令,应当在MySQL配置文件的[mysqld]部分增加下面的参数:


  set-variable=local-infile=0


  7、移除匿名账户和废弃的账户


  有些MySQL数据库的匿名用户的口令为空。因而,任何人都可以连接到这些数据库。可以用下面的命令进行检查:


  mysql> select * from mysql.user where user="";


  在安全的系统中,不会返回什么信息。另一种方法是:


  mysql> SHOW GRANTS FOR ''@'localhost';


  mysql> SHOW GRANTS FOR ''@'myhost';


  如果grants存在,那么任何人都可以访问数据库,至少可以使用默认的数据库“test”。其检查方法如下:


  shell> mysql -u blablabla


  如果要移除账户,则执行命令:


  mysql> DROP USER "";


  从MySQL的5.0版开始支持DROP USER命令。如果你使用的老版本的MySQL,你可以像下面这样移除账户:


  mysql> use mysql;


  mysql> DELETE FROM user WHERE user="";


  mysql> flush privileges;


  8、降低系统特权


  常见的数据库安全建议都有“降低给各方的特权”这一说法。对于MySQL也是如此。一般情况下,开发人员会使用最大的许可,不像安全管理一样考虑许可原则,而这样做会将数据库暴露在巨大的风险中。


  为保护数据库,务必保证真正存储MySQL数据库的文件目录是由”mysql” 用户和” mysql”组所拥有的。


  shell>ls -l /var/lib/mysql


  此外,还要确保仅有用户”mysql”和root用户可以访问/var/lib/mysql目录。


  Mysql的二进制文件存在于/usr/bin/目录中,它应当由root用户或特定的”mysql”用户所拥有。对这些文件,其它用户不应当拥有“写”的访问权:


  shell>ls -l /usr/bin/my*


  9、降低用户的数据库特权


  有些应用程序是通过一个特定数据库表的用户名和口令连接到MySQL的,安全人员不应当给予这个用户完全的访问权。


  如果攻击者获得了这个拥有完全访问权的用户,他也就拥有了所有的数据库。查看一个用户许可的方法是在MySQL控制台中使用命令SHOW GRANT


  >SHOW GRANTS FOR 'user'@'localhost';


  为定义用户的访问权,使用GRANT命令。在下面的例子中,user1仅能从dianshang数据库的billing表中选择:


  > GRANT SELECT ON billing.dianshang TO 'user1'@'localhost';


  > FLUSH PRIVILEGES;


  如此一来,user1用户就无法改变数据库中这个表和其它表的任何数据。


  另一方面,如果你要从一个用户移除访问权,就应使用一个与GRANT命令类似的REVOKE命令:


  > REVOKE SELECT ON billing.ecommerce FROM 'user1'@'localhost';


  > FLUSH PRIVILEGES;


  10、移除和禁用.mysql_history文件


  在用户访问MySQL控制台时,所有的命令历史都被记录在~/.mysql_history中。如果攻击者访问这个文件,他就可以知道数据库的结构。


  $ cat ~/.mysql_history


  为了移除和禁用这个文件,应将日志发送到/dev/null。


  $export MYSQL_HISTFILE=/dev/null


  上述命令使所有的日志文件都定向到/dev/null,你应当从home文件夹移除.mysql_history:$ rm ~/.mysql_history,并创建一个到/dev/null的符号链接。


  11、安全补丁


  务必保持数据库为最新版本。因为攻击者可以利用上一个版本的已知漏洞来访问企业的数据库。


  12、启用日志


  如果你的数据库服务器并不执行任何查询,建议你启用跟踪记录,你可以通过在/etc/my.cnf文件的[Mysql]部分添加:log =/var/log/mylogfile。


  对于生产环境中任务繁重的MySQL数据库,因为这会引起服务器的高昂成本。


  此外,还要保证只有root和mysql可以访问这些日志文件。


  错误日志


  务必确保只有root和mysql可以访问hostname.err日志文件。该文件存放在mysql数据历史中。该文件包含着非常敏感的信息,如口令、地址、表名、存储过程名、代码等,它可被用于信息收集,并且在某些情况下,还可以向攻击者提供利用数据库漏洞的信息。攻击者还可以知道安装数据库的机器或内部的数据。


  MySQL日志


  确保只有root和mysql可以访问logfileXY日志文件,此文件存放在mysql的历史目录中。


  13、改变root目录


  Unix操作系统中的chroot可以改变当前正在运行的进程及其子进程的root目录。重新获得另一个目录root权限的程序无法访问或命名此目录之外的文件,此目录被称为“chroot监狱”。


  通过利用chroot环境,你可以限制MySQL进程及其子进程的写操作,增加服务器的安全性。


  你要保证chroot环境的一个专用目录,如/chroot/mysql。此外,为了方便利用数据库的管理工具,你可以在MySQL配置文件的[client]部分改变下面的参数:


  [client]


  socket = /chroot/mysql/tmp/mysql.sock


  14、禁用LOCAL INFILE命令


  LOAD DATA LOCAL INFILE可以从文件系统中读取文件,并显示在屏幕中或保存在数据库中。如果攻击者能够从应用程序找到SQL注入漏洞,这个命令就相当危险了。下面的命令可以从MySQL控制台进行操作:


  > SELECT LOAD_FILE("/etc/passwd");


  该命令列示了所有的用户。解决此问题的最佳方法是在MySQL配置中禁用它,在CentOS中找到/etc/my.cnf或在Ubuntu中找到/etc/mysql/my.cnf,在[mysqld]部分增加下面一行:set-variable=local-infile=0。搞定。


  当然,唇亡齿寒,保护服务器的安全对于保障MySQL数据库的安全也是至关重要的。服务器的安全对于数据库来说可谓生死攸关。交给多备份,还你安全可靠的数据安全保障!


  分享自www.dbfen.com 转载请注明


热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

89

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

276

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

59

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

99

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

105

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

230

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

619

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

173

2026.03.04

热门下载

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

精品课程

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

共48课时 | 2.6万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 850人学习

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

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