MySQL 5.5是最新开发的发布系列,是将执行新功能的系列。不久的将来可以使用Alpha发行,以便感兴趣的用户进行广泛的测试。
MySQL 5.1是当前稳定(产品质量)发布系列。只针对漏洞修复重新发布;没有增加会影响稳定性的新功能。
MySQL 5.0是前一稳定(产品质量)发布系列。只针对严重漏洞修复和安全修复重新发布;没有增加会影响该系列的重要功能。
MySQL 4.0和3.23是旧的稳定(产品质量)发布系列。该版本不再使用,新的发布只用来修复特别严重的漏洞(以前的安全问题)。
首先登陆官方网站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/mysql
#make
#
make install# cp support-files/my-medium.cnf /etc/my.cf
# bin/mysql_install_db --user=mysql //
用生成初始数据库,出现类似
mysql
thank for using mysql
证明初始化数据库成功。
# chown -R root . //
当前目录给
root
# chown -R mysql var //var
给,这个很重要,也是安全起见
mysql
# chgrp -R mysql .
# bin/mysqld_safe --user=mysql &
#bin/mysql –u root
此时安全完毕,但是最重要是对MySQL进行安全配置,检查你的系统,最基本要做到以下配置。
缺省安装的MySQL的root用户是空密码的,为了安全起见,必须修改为强密码,所谓的强密码,至少8位,由字母、数字和符号组成的不规律密码。使用MySQL自带的命令mysaladmin修改root密码,同时也可以登陆数据库,修改数据库mysql下的user表的字段内容,修改方法如下所示:
# /usr/local/mysql/bin/mysqladmin -u root password “upassword” //
使用
mysqladmin
#mysql> use mysql;
#mysql> update user set password=password('upassword') where user='root';
#mysql> flush privileges; //
强制刷新内存授权表,否则用的还是在内存缓冲的口令
#mysql> show databases;
#mysql> drop
database test; //test
删除数据库
#use mysql;
#delete from db; //
删除存放数据库的表信息,因为还没有数据库信息。
#mysql> delete from user where not (user='root') ; //
删除初始非的用户
root
#mysql> delete from user where user='root' and password=''; //
删除空密码的,尽量重复操作
root
Query OK, 2 rows affected (0.00 sec)
#mysql> flush privileges; //
强制刷新内存授权表。
mysql> update user set user="newroot" where user="root"; //
改成不易被猜测的用户名
mysql> flush privileges;
#mysql> insert into users values (1,password(1234),'test');
# vim /etc/my.cf
将注释去掉。
#skip-networking
# /usr/local/mysql/bin/mysqladmin -u root -p shutdown //
停止数据库
#/usr/local/mysql/bin/mysqld_safe --user=mysql & //
后台用用户启动
mysql
mysql
#vim /etc/my.cnf
[mysqld]
max_user_connections 2
# chown -R root /usr/local/mysql/ //mysql
主目录给
root
# chown -R mysql.mysql /usr/local/mysql/var //
确保数据库目录权限所属用户
mysql
# vi sqlfile.txt
1,sszng,111
2,sman,222
#mysql> load data local infile 'sqlfile.txt' into table users fields terminated by ','; //
读入数据
#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 DATALOCAL INFILE装载“/etc/passwd”进一个数据库表,然后能用SELECT显示它,这个操作对服务器的安全来说,是致命的。可以在my.cnf中添加local-infile=0,或者加参数local-infile=0启动mysql。
#/usr/local/mysql/bin/mysqld_safe --user=mysql --local-infile=0 &
#mysql> load data local infile 'sqlfile.txt' into table users fields terminated by ',';
#ERROR 1148 (42000): The used command is not allowed with this MySQL version
#mysql> load data infile 'sqlfile.txt' into table loadfile.users fields terminated by ',';
Query OK, 4 rows affected (0.00 sec) //
读取本地信息
sqlfile.txt'
Records: 4 Deleted: 0 Skipped: 0 Warnings: 0
#mysql> update user set File_priv='N' where user='root'; //
禁止读取权限
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges; //
刷新授权表
Query OK, 0 rows affected (0.00 sec)
#mysql> load data infile 'sqlfile.txt' into table users fields terminated by ','; //
重登陆读取文件
#ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) //
失败
# mysql> select * from loadfile.users into outfile 'test.txt' fields terminated by ',';
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
为了安全起见,随时使用语句检查查看谁已经访问了什么。然后使用
SHOW GRANTS
REVOKE
语句删除不再需要的权限。
对于Web的安全检查,在MySQL官方文档中这么建议,对于web应用,至少检查以下清单:
试试用Web形式输入单引号和双引号(‘’’和‘”’)。如果得到任何形式的MySQL错误,立即分析原因。
试试修改动态URL,可以在其中添加%22(‘”’)、%23(‘#’)和%27(‘’’)。
试试在动态URL中修改数据类型,使用前面示例中的字符,包括数字和字符类型。你的应用程序应足够安全,可以防范此类修改和类似攻击。
试试输入字符、空格和特殊符号,不要输入数值字段的数字。你的应用程序应在将它们传递到MySQL之前将它们删除或生成错误。将未经过检查的值传递给MySQL是很危险的!
将数据传给MySQL之前先检查其大小。
用管理账户之外的用户名将应用程序连接到数据库。不要给应用程序任何不需要的访问权限。
#!/bin/sh
time=`date +"("%F")"%R`
$/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 command
00 00 * * * /home/sszheng/shnagios/backup.sh
恢复数据使用命令:
gzip -d nagios_backup.(2008-01-24)00:00.gz
nagios_backup.(2008-01-24)00:00
#mysql –u root -p nagios < /home/sszheng/nfs58/nagiosbackup/nagios_backup.(2008-01-24)12:00
--allow-suspicious-udfs
该选项控制是否可以载入主函数只有xxx符的用户定义函数。默认情况下,该选项被关闭,并且只能载入至少有辅助符的UDF。这样可以防止从未包含合法UDF的共享对象文件载入函数。
--local-infile[={0|1}]
如果用–local-infile=0启动服务器,则客户端不能使用LOCAL in LOAD DATA语句。
--old-passwords
强制服务器为新密码生成短(pre-4.1)密码哈希。当服务器必须支持旧版本客户端程序时,为了保证兼容性这很有用。
(OBSOLETE) --safe-show-database
在以前版本的MySQL中,该选项使SHOW DATABASES语句只显示用户具有部分权限的数据库名。在MySQL 5.1中,该选项不再作为现在的 默认行为使用,有一个SHOW DATABASES权限可以用来控制每个账户对数据库名的访问。
--safe-user-create
如果启用,用户不能用GRANT语句创建新用户,除非用户有mysql.user表的INSERT权限。如果你想让用户具有授权权限来创建新用户,你应给用户授予下面的权限:
mysql> GRANT INSERT(user) 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权限或部分数据库权限的数据库名。请注意全局权限指数据库的权限。