MySQL安全配置详解(4)_MySQL教程
推荐:MySQL中实现高性能高并发计数器方案现在有很多的项目,对计数器的实现甚是随意,比如在实现网站文章点击数的时候,是这么设计数据表的,如:article_id, article_name, article_content, article_author, article_view在article_view中记录该文章的浏览量。诈一看似乎没有问题。对于小站,比如本博客,就
1. 在windows下禁止使用local system(nt authority\system)来运行mysql账户,可以考虑使用network service或者自己新建一个windows账号,但是必须给与mysql程序所在目录的读取权限和data目录的读取和写入权限
2. 在linux下,新建一个mysql账号,并在安装的时候就指定mysql以mysql账户来运行,给与程序所在目录的读取权限,data所在目录的读取和写入权限。
0×2: mysql运行账号的磁盘权限
对mysql运行帐号的磁盘权限的配置,就是在进行ACL的配置(文件夹右键->属性->安全),对于ACL的配置,我们需要牢记的是"默认禁止原则",即操作系统会默认对没有明确指示的权限设定为禁止,即假如你给一个用户授予了某个文件夹的读权限,那么它只有读权限,而不会拥有写权限(权限继承不考虑在内)。
对于mysql运行张厚啊的磁盘ACL配置,我们可以遵循以下原则
1. mysql运行账号需要给予程序所在目录的读取权限,以及data目录的读取和写入权限,保证mysql的正常运行
2. 不容许给予其他目录的写入和执行权限,特别是有网站的,这可以有效防御针对mysql的提权、或者webshell提权
1) udf提权
2) 系统关键目录、注册表写入启动文件
3. 取消mysql运行账户对于cmd,sh等一些程序的执行权限,这可以防御当mysql核心帐号被黑客获取后进一步提权
1) root账户被泄露
由于对cmd、sh等关键程序进行了权限控制,黑客无法继续深入操作系统提权
0×3: Chrooting
Chroot是Unix/类Unix的一种手段,它的建立会将其与主系统几乎完全隔离,也就是说,一旦遭到什么问题,也不会危及到正在运行的主系统。这是一个非常有效的办法,特别是在配置网络服务程序的时候。
0×4: 删除历史命令记录
历史命令记录是一种测信道数据泄漏,从某种程序上来说,"历史命令记录"就像种植在系统上的一个键盘记录rootkit,如果黑客获取到了目标服务器的webshell,就可以通过阅读"历史命令记录"来获取到大量的管理员操作记录,包括帐号和密码。
这些历史文件包括:
1. ~/.bash_history
2. ~/.mysql_history
..
cat /dev/null > ~/.bash_history
cat /dev/null > ~/.mysql_history
0×5: mysql.sock安全配置
默认情况下,PHP支持使用socket方式和msyql数据库进行通信,换句话来说,这也意味着,在服务器本机可以允许无密码直接登录mysql,请看下面的一段实例
< ?php
ini_set("mysql.default_socket = /var/lib/mysql/mysql.sock");
$sql = "select user();";
$res = mysql_query($sql);
$final = mysql_fetch_array($res);
die(var_dump($final));
?>
执行成功,result:
array(2) { [0]=> string(16) "apache@localhost" ["user()"]=> string(16) "apache@localhost" }
这意味着黑客在获取了目标服务器的webshell之后,可以在不知道mysql帐号密码的情况下直接从数据库中获取隐私数据。
防御的方法还是一样,针对mysql程序帐号进行磁盘ACL控制,防止mysql越权读/写/执行非mysql目录下的文件。
7. 部署SQL注入检测、防御模块
根据OWASP2013的报告显示,针对数据库的攻击方式,SQL注入依然是主要的因素,因此针对SQL Injection的攻击,除了针对应用层的代码安全审计、SDLC之外,在数据库层部署数据库防火墙也应该作为纵深防御的一个手段。
目前基于SQL注入检测、防御的的数据库防火墙大概有以下几个:
1. 安华金和数据库防火墙系统(Xsecure-DBFirewall)
2. Snort入侵检测系统
能针对指定端口进行正则特征匹配方式的SQL注入检测
3. Java/J2EE 过滤器
对于J2ee的WEB应用来说,可以在HTTP请求上部署过滤器,并将SQL注入检测规律写在过滤器中
4. druid-sql-wall开源SQL检测、阻断系统
8. mysqld安全相关启动选项
1. --local-infile[={0|1}]
如果用–local-infile=0启动服务器,则客户端不能使用LOCAL in LOAD DATA语句,防止基于注入的直接文件读取数据泄漏
2. --old-passwords
强制服务器为新密码生成短(pre-4.1)密码哈希。当服务器必须支持旧版本客户端程序时,为了保证兼容性这很有用。
3. (OBSOLETE) –safe-show-database
1) 在MySQL 5.1以前版本的MySQL中,该选项使SHOW DATABASES语句只显示用户具有部分权限的数据库名
2) 在MySQL 5.1中,该选项不再作为现在的 默认行为使用,有一个SHOW DATABASES权限可以用来控制每个账户对数据库名的访问。
4. --safe-user-create
如果启用,用户不能用GRANT语句创建新用户,除非用户有mysql.user表的INSERT权限。如果你想让用户具有授权权限来创建新用户,你应给用户授予下面的权限:
mysql> GRANT INSERT(user) ON mysql.user TO 'user_name'@'host_name’;这样确保用户不能直接更改权限列,必须使用GRANT语句给其它用户授予该权限。
5. --secure-auth
不允许鉴定有旧(pre-4.1)密码的账户。
6. --skip-grant-tables
这个选项导致服务器根本不使用权限系统。这给每个人以完全访问所有的数据库的权力,这个选项常常在发生了忘记了msyql密码的情况使用这个方式在本机"无密码登录mysql"通过执行mysqladmin flush-privileges或mysqladmin eload命令,或执行FLUSH PRIVILEGES语句,你能告诉一个正在运行的服务器再次开始使用授权表。
7. --skip-name-resolve
主机名不被解析。所有在授权表的Host的列值必须是IP号或localhost
8. --skip-networking
在网络上不允许TCP/IP连接。所有到mysqld的连接必须经由Unix套接字进行
9. --skip-show-database
使用该选项,只允许有SHOW DATABASES权限的用户执行SHOW DATABASES语句,该语句显示所有数据库名。不使用该选项,允许所有用户执行SHOW DATABASES,但只显示用户有SHOW DATABASES权限或部分数据库权限的数据库名。请注意全局权限指数据库的权限。
9. mysql备份策略
像mysql、sqlserver、access这种数据库都是将数据以单独文件的形式保存在磁盘上的,所以,对于数据库的备份也可以采用传统的文件备份策略。总的来说,有以下方式:
分享:创建MySQL从库我们知道Oracle有DataGuard实时备份数据,可以做主备切换,而MySQL也有自己的一套备库方案,称之为主从复制。 搭建MySQL从库是为了实时同步主库数据,同时也可以分担主库的读压力,对数据库端做成读写分离结构。 搭建MySQL主从库注意点: 1.主库和从库的 server-id 一
- MySQL中实现高性能高并发计数器方案
- 创建MySQL从库
- mysql语句中使用like后面的%(百分号)的问题
- sqlserver数据实时同步到mysql
- EXP-00091: Exporting questionable statistics
- 由于文件组 ‘DEFAULT’ 中的磁盘空间不足,无法为数据库 ‘TEMPDB’ 分配新页
- sqlserver多版本查看版本号
- 如何正确查看 SQL Server 2005 版本号?
- SQL查询语句中的bool类型字段值的写法
- SQL Server 2005建立与服务器的连接时出错的解决方案
- MySQL中GROUP BY的基本实现原理
- PHP实现将EXCEL文件导入到MYSQL
- 相关链接:
- 教程说明:
MySQL教程-MySQL安全配置详解(4)。