【php精品源码栏目提醒】:网学会员为广大网友收集整理了,MySQL安全配置详解 - 其它资料,希望对大家有所帮助!
MySQL 安全配置详解MySQL 是一个真正的多用户、多线程 SQL 数据库服务器,它是一个客户机/服务器结构的实现。
MySQL 是现在流行的关系数据库中其中的一种,相比其它的数据库管理系统(DBMS)来说,MySQL 具有小巧、功能齐全、查询迅捷等优点。
MySQL 主要目标是快速、健壮和易用。
目前,在大中型企业中已经得到了较好的运用,但是由于它是多平台的数据库,不可避免的默认配置也是适合多种情况的需求,因此需要用户需要在自定义的环境下对 MySQL 的使用进行加固。
假如软件本身有严重安全问题, 即使安全配置做的更好,也没有用。
因此,要首先了解 MySQL的版本。
关于 MySQL 的版本,在 MySQL 官方文档中是这么描述的: MySQL 5.5 是最新开发的发布系列,是将执行新功能的系列。
不久的将来可以使用 Alpha发行,以便感兴趣的用户进行广泛的测试。
MySQL 5.1 是当前稳定产品质量发布系列。
只针对漏洞修复重新发布;没有增加会影响稳定性的新功能。
MySQL 5.0 是前一稳定产品质量发布系列。
只针对严重漏洞修复和安全修复重新发布;没有增加会影响该系列的重要功能。
MySQL 4.0 和 3.23 是旧的稳定产品质量发布系列。
该版本不再使用,新的发布只用来修复特别严重的漏洞(以前的安全问题) 。
Mysql 开发组织不认为有完全的冻结版,因为任何版本均需要对漏洞进行修复和其它修复。
对于“某种程度的冻结”,他们是指他们可以在产品发布中增加一些不会影响当前工作的小东西。
当然,前一系列的相关漏洞修复会移植到后面的系列。
根据官方的建议,至目前为止,推荐使用目前的稳定版本 MySQL 5.1。
如果你正在运行一个老的系统并且想要升级, 但是又不想冒险进行非无缝升级, 应该升级到最新版本中你正使用的相同的发布系列(只有版本号的最后部分比你使用的新,例如 5.0 和 5.1 为同一系列) 。
一、MySQL 安装MySQL 可以在 redhat 环境下进行 RPM 安装和 debian 下 apt 安装,但是最新的包一般都是
源码的形式,因此这里选择
源码编译安装的方式。
首先登陆官方网站 http://www.mysql.com,下载最新的 released 版本。
tar zxf mysql-5.1.22-rc-linux-i686-glibc23.tar.gz为 mysql 的运行建立 mysql 用户和 mysql 用户组groupadd mysql useradd -g mysql mysql ./configure --prefix/usr/local/mysqlmakemake install cp support-files/my-medium.cnf /etc/my.cf bin/mysql_install_db --usermysql //用 mysql 生成初始数据库,出现类似 thank for usingmysql 证明初始化数据库成功。
chown -R root . //当前目录给 root chown -R mysql var //var 给 mysql,这个很重要,也是安全起见 chgrp -R mysql . bin/mysqld_safe --usermysql bin/mysql –u root此时安全完毕,但是最重要是对 MySQL 进行安全配置,检查你的系统,最基本要做到以下配置。
二、MySQL 安全配置数据库作为数据管理的平台,它的安全性首先由系统的内部安全和网络安全两部分来决定。
对于系统管理员来说,首先要保证系统本身的安全,在安装 MySQL 数据库时,需要对基础环境进行较好的配置。
1、修改 root 用户口令,删除空口令缺省安装的 MySQL 的 root 用户是空密码的,为了安全起见,必须修改为强密码,所谓的强密码,至少 8 位, 数字和符号组成的不规律密码。
由字母、 使用 MySQL 自带的命令 mysaladmin修改 root 密码,同时也可以登陆数据库,修改数据库 mysql 下的 user 表的字段内容,修改方法如下所示: /usr/local/mysql/bin/mysqladmin -u root password “upassword” //使用 mysqladminmysql use mysqlmysql update user set passwordpasswordupassword where userrootmysql flush privileges //强制刷新内存授权表,否则用的还是在内存缓冲的口令2、删除默认数据库和数据库用户一般情况下, MySQL 数据库安装在本地,并且也只需要本地的
php 脚本对 mysql 进行读取,所以很多用户不需要,尤其是默认安装的用户。
MySQL 初始化后会自动生成空用户和 test库,进行安装的测试,这会对数据库的安全构成威胁,有必要全部删除,最后的状态只保留单个 root 即可,当然以后根据需要增加用户和数据库。
mysql show databasesmysql drop database test //删除数据库 testuse mysqldelete from db //删除存放数据库的表信息,因为还没有数据库信息。
mysql delete from user where not userroot // 删除初始非 root 的用户mysql delete from user where userroot and password //删除空密码的 root,尽量重复操作Query OK 2 rows affected 0.00 secmysql flush privileges //强制刷新内存授权表。
3、改变默认 mysql 管理员帐号系统 mysql 的管理员名称是 root,而一般情况下,数据库管理员都没进行修改,这一定程度上对系统用户穷举的恶意行为提供了便利,此时修改为复杂的用户名,请不要在设定为admin 或者 administraror 的形式,因为它们也在易猜的用户字典中。
mysql update user set usernewroot where userroot //改成不易被猜测的用户名mysql flush privileges4、关于密码的管理密码是数据库安全管理的一个很重要因素,不要将纯文本密码保存到数据库中。
如果你的计算机有安全危险,入侵者可以获得所有的密码并使用它们。
相反,应使用 MD5、SHA1或单向哈希函数。
也不要从词典中选择密码,有专门的程序可以破解它们, 请选用至少八位,由字母、数字和符号组成的强密码。
在存取密码时,使用 mysql 的内置函数 password()的sql 语句,对密码进行加密后存储。
例如以下方式在 users 表中加入新用户。
mysql insert into users values 1password1234test5、使用独立用户运行 msyql绝对不要作为使用 root 用户运行 MySQL 服务器。
这样做非常危险,因为任何具有 FILE 权限的用户能够用 root 创建文件例如,root/.bashrc。
mysqld 拒绝使用 root 运行,除非使用–userroot 选项明显指定。
应该用普通非特权用户运行 mysqld。
正如前面的安装过程一样,为数据库建立独立的 linux 中的 mysql 账户,该账户用来只用于管理和运行 MySQL。
要想用其它 Unix 用户启动 mysqld, ,增加 user 选项指定/etc/my.cnf 选项文件或服务器数据目录的 my.cnf 选项文件中的mysqld组的用户名。
vim /etc/my.cnfmysqldusermysql该命令使服务器用指定的用户来启动,无论你手动启动或通过 mysqld_safe 或 mysql.server启动,都能确保使用 mysql 的身份。
也可以在启动数据库是,加上 user 参数。
/usr/local/mysql/bin/mysqld_safe --usermysql 作为其它 linux 用户而不用 root 运行 mysqld,你不需要更改 user 表中的 root 用户名,因为MySQL 账户的用户名与 linux 账户的用户名无关。
确保 mysqld 运行时,只使用对数据库目录具有读或写权限的 linux 用户来运行。
6、禁止远程连接数据库在命令行 netstat -ant 下看到,默认的 3306 端口是打开的,此时打开了 mysqld 的网络监听,允许用户远程通过帐号密码连接数本地据库, 默认情况是允许远程连接数据的。
为了禁止该功能,启动 skip-networking,不监听 sql 的任何 TCP/IP 的连接,切断远程访问的权利,保证安全性。
假如需要远程管理数据库,可通过安装 PhpMyadmin 来实现。
假如确实需要远程连接数据库,至少修改默认的监听端口,同时添加防火墙规则,只允许可信任的网络的mysql 监听端口的数据通过。
vim /etc/my.cf将skip-networking 注释去掉。
/usr/local/mysql/bin/mysqladmin -u root -p shutdown //停止数据库/usr/local/mysql/bin/mysqld_safe --usermysql //后台用 mysql 用户启动 mysql7、限制连接用户的数量数据库的某用户多次远程连接, 会导致性能的下降和影响其他用户的操作,有必要对其进行限制。
可以通过限制单个账户允许的连接数量来实现,设置 my.cnf 文件的 mysqld 中的max_user_connections 变量来完成。
GRANT 语句也可以支持 资源控制选项来限制服务器对一个账户允许的使用范围。
vim /etc/my.cnfmysqldmax_user_connections 28、用户目录权限限制默认的 mysql 是安装在/usr/local/mysql,而对应的数据库文件在/usr/local/mysql/var 目录下,因此,必须保证该目录不能让未经授权的用户访问后把数据库打包拷贝走了, 所以要限制对该目录的访问。
确保 mysqld 运行时, 只使用对数据库目录具有读或写权限的 linux 用户来运行。
chown -R root /usr/local/mysql/ //mysql 主目录给 root chown -R mysql.mysql /usr/local/mysql/var //确保数据库目录权限所属 mysql 用户9、命令历史记录保护数据库相关的 shell 操作命令都会分别记录在.bash_history,如果这些文件不慎被读取,会导致数据库密码和数据库结构等信息泄露,而登陆数据库后的操作将记录在.mysql_history文件中,如果使用 update 表信息来修改数据库用户密码的话,也会被读取密码,因此需要删除这两个文件,同时在进行登陆或备份数据库等与密码相关操作时,应该使用-p 参数加入提示输入密码后,隐式输入密码,建议将以上文件置空。
rm .bash_history .mysql_history //删除历史记录 ln -s /dev/null .bash_history //将 shell 记录文件置空 ln -s /dev/null .mysql_history //将 mysql 记录文件置空10、禁止 MySQL 对本地文件存取在 mysql 中,提供对本地文件的读取,使用的是 load data local infile 命令,默认在 5.0 版本中,该选项是默认打开的,该操作令会利用 MySQL 把本地文件读到数据库中,然后用户就可以非法获取敏感信息了,假如你不需要读取本地文件,请务必关闭。
测试:首先在测试数据库下建立 sqlfile.txt 文件,用逗号隔开各个字段 vi sqlfile.txt1sszng1112sman222mysql load data local infile sqlfile.txt into table users fields terminatedby //读入数据mysql select from users------------------------------ userid username password ------------------------------ 1 sszng 111 2 sman 222 ------------------------------成功的将本地数据插入数据中,此时应该禁止 MySQL 中用“LOAD DATA LOCAL INFILE”命令。
网络上流传的一些攻击方法中就有用它 LOAD DATA LOCAL INFILE 的, 同时它也是很多新发现的 SQL Injection 攻击利用的手段!黑客还能通过使用 LOAD DATALOCALINFILE 装载“/etc/passwd”进一个数据库表,然后能用 SELECT 显示它,这个操作对服务器的安全来说,是致命的。
可以在 my.cnf 中添加 local-infile0,或者加参数 local-infile0 启动mysql。
/usr/local/mysql/bin/mysqld_safe --usermysql --local-infile0 mysql load data local infile sqlfile.txt into table users fields terminatedby ERROR 1148 42000: The used command is not allowed with this MySQL version--local-infile0 选项启动 mysqld 从服务器端禁用所有 LOAD DATA LOCAL 命令,假如需要获取本地文件,需要打开,但是建议关闭。
11、MySQL 服务器权限控制MySQL 权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的 SELECT、INSERT、UPDATE 和 DELETE 等权限(详见 user 超级用户表) 。
它的附加的功能包括有匿名的用户并对于 MySQL 特定的功能例如 LOAD DATA INFILE 进行授权及管理操作的能力。
管理员可以对 user,db,host 等表进行配置,来控制用户的访问权限,而 user 表权限是超级用户权限。
只把 user 表的权限授予超级用户如服务器或数据库主管是明智的。
对其他用户,你应该把在 user 表中的权限设成’N并且仅在特定数据库的基础上授权。
你可以为特定的数据库、 表或列授权,FILE 权限给予你用 LOAD DATA INFILE 和 SELECT … INTO OUTFILE语句读和写服务器上的文件,任何被授予 FILE 权限的用户都能读或写 MySQL 服务器能读或写的任何文件。
说明用户可以读任何数据库目录下的文件,因为服务器可以访问这些文 。
件) FILE 权限允许用户在 MySQL 服务器具有写权限的目录下创建新文件,但不能覆盖 ,已有文件在 user 表的 File_priv 设置 Y 或 N。
所以当你不需要对服务器文件读取时,请关闭该权限。
mysql load data infile sqlfile.txt into table loadfile.users fields terminatedby Query OK 4 rows affected 0.00 sec //读取本地信息 sqlfile.txtRecords: 4 Deleted: 0 Skipped: 0 Warnings: 0mysql update user set File_privN where userroot //禁止读取权限Query OK 1 row affected 0.00 secRows matched: 1 Changed: 1 Warnings: 0mysql flush privileges //刷新授权表Query OK 0 rows affected 0.00 secmysql load data infile sqlfile.txt into table users fields terminated by //重登陆读取文件ERROR 1045 28000: Access denied for user rootlocalhost using password:YES //失败 mysql select from loadfile.users into outfile test.txt fields terminatedby ERROR 1045 28000: Access denied for user rootlocalhost using password:YES为了安全起见,随时使用 SHOW GRANTS 语句检查查看谁已经访问了什么。
然后使用 REVOKE 语句删除不再需要的权限。
12、使用 chroot 方式来控制 MySQL 的运行目录Chroot 是 linux 中的一种系统高级保护手段,它的建立会将其与主系统几乎完全隔离,也就是说,一旦遭到什么问题,也不会危及到正在运行的主系统。
这是一个非常有效的办法,特别是在配置网络服务程序的时候。
13、关闭对 Web 访问的支持如果不打算让 Web 访问使用 MySQL 数据库,没有提供诸如
PHP 这样的 Web 语言的时候,重新设置或编译你的
PHP,取消它们对 MySQL 的默认支持。
假如服务器中使用
php 等 web程序,试试用 Web 形式非法的请求,如果得到任何形式的 MySQL 错误,立即分析原因,及时修改 Web 程序,堵住漏洞,防止 MySQL 暴露在 web 面前。
对于 Web 的安全检查,在 MySQL 官方文档中这么建议,对于 web 应用,至少检查以下清单: 试试用 Web 形式输入单引号和双引号‘’’和‘”’。
如果得到任何形式的 MySQL 错误,立即分析原因。
试试修改动态 URL,可以在其中添加22‘”’、23‘’和27‘’’。
试试在动态 URL 中修改数据类型,使用前面示例中的字符,包括数字和字符类型。
你的应用程序应足够安全,可以防范此类修改和类似攻击。
试试输入字符、空格和特殊符号,不要输入数值字段的数字。
你的应用程序应在将它们传递到 MySQL 之前将它们删除或生成错误。
将未经过检查的值传递给 MySQL 是很危险的! 将数据传给 MySQL 之前先检查其大小。
用管理账户之外的用户名将应用程序连接到数据库。
不要给应用程序任何不需要的访问权限。
14、数据库备份策略一般可采用本地备份和网络备份的形式,可采用 MySQL 本身自带的 mysqldump 的方式和直接复制备份形式,直接拷贝数据文件最为直接、快速、方便,但缺点是基本上不能实现增量备份。
为了保证数据的一致性,需要在备份文件前,执行以下 SQL 语句:FLUSH TABLES WITH READLOCK;也就是把内存中的数据都刷新到磁盘中,同时锁定数据表,以保证拷贝过程中不会有新的数据写入。
这种方法备份出来的数据恢复也很简单, 直接拷贝回原来的数据库目录下即可。
使用 mysqldump 可以把整个数据库装载到一个单独的文本文件中。
这个文件包含有所有重建您的数据库所需要的 SQL 命令。
这个命令取得所有的模式(Schema,后面有解释)并且将其转换成 DDL 语法(CREATE 语句,即数据库定义语句) ,取得所有的数据,并且从这些数据中创建 INSERT 语句。
这个工具将您的数据库中所有的设计倒转。
因为所有的东西都被包含到了一个文本文件中。
这个文本文件可以用一个简单的批处理和一个合适 SQL 语句导回到 MySQL 中。
使用 mysqldump 进行备份非常简单,如果要备份数据库” nagios_db_backup ”,使用命令,同时使用管道 gzip 命令对备份文件进行压缩,建议使用异地备份的形式,可以采用 Rsync等方式,将备份服务器的目录挂载到数据库服务器,将数据库文件备份打包在, 通过 crontab定时备份数据:/bin/shtimedate FR/usr/local/mysql/bin/mysqldump -u nagios -pnagios nagios gzip/home/sszheng/nfs58/nagiosbackup/nagios_backup.time.gz crontab -l m h dom mon dow command00 00 /home/sszheng/shnagios/backup.sh恢复数据使用命令:gzip -d nagios_backup.2008-01-2400:00.gznagios_backup.2008-01-2400:00mysql –u root -pnagios /home/sszheng/nfs58/nagiosbackup/nagios_backup.2008-01-2412:00三、Mysqld 安全相关启动选项下列 mysqld 选项影响安全: --allow-suspicious-udfs该选项控制是否可以载入主函数只有 xxx 符的用户定义函数。
默认情况下,该选项被关闭,并且只能载入至少有辅助符的 UDF。
这样可以防止从未包含合法 UDF 的共享对象文件载入函数。
--local-infile01如果用–local-infile0 启动服务器,则客户端不能使用 LOCAL in LOAD DATA 语句。
--old-passwords强制服务器为新密码生成短pre-4.1密码哈希。
当服务器必须支持旧版本客户端程序时,为了保证兼容性这很有用。
OBSOLETE --safe-show-database在以前版本的 MySQL 中,该选项使 SHOW DATABASES 语句只显示用户具有部分权限的数据库名。
在 MySQL 5.1 中,该选项不再作为现在的 默认行为使用,有一个 SHOWDATABASES 权限可以用来控制每个账户对数据库名的访问。
--safe-user-create如果启用,用户不能用 GRANT 语句创建新用户, 除非用户有 mysql.user 表的 INSERT 权限。
如果你想让用户具有授权权限来创建新用户,你应给用户授予下面的权限:mysql GRANT INSERTuser ON mysql.user TO ‘user_name’host_name’这样确保用户不能直接更改权限列,必须使用 GRANT 语句给其它用户授予该权限。
--secure-auth不允许鉴定有旧pre-4.1密码的账户。
--skip-grant-tables这个选项导致服务器根本不使用权限系统。
( 这给每个人以完全访问所有的数据库的权力!通过执行 mysqladmin flush-privileges 或 mysqladmin eload 命令,或执行 FLUSH PRIVILEGES语句,你能告诉一个正在运行的服务器再次开始使用授权表。
) --skip-name-resolve主机名不被解析。
所有在授权表的 Host 的列值必须是 IP 号或 localhost。
--skip-networking在网络上不允许 TCP/IP 连接。
所有到 mysqld 的连接必须经由 Unix 套接字进行。
--skip-show-database使用该选项,只允许有 SHOW DATABASES 权限的用户执行 SHOW DATABASES 语句,该语句显示所有数据库名。
不使用该选项,允许所有用户执行 SHOW DATABASES,但只显示用户有 SHOW DATABASES 权限或部分数据库权限的数据库名。
请注意全局权限指数据库的权限。
上一篇:
DES算法和RC4算法实验任务
下一篇:
电咖汽车入选2018独角兽企业榜百强 发布“天际”品牌将推高估值