• 专注于网站建设,网络推广,关键词优化,SEO优化,专业的网站建设开发团队!
首页 > IT技术 > MySQL > 内容

MySQL安全配置详解

2015-06-11 21:53:44   来源:叶景网络
    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/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安全配置
    数据库作为数据管理的平台,它的安全性首先由系统的内部安全和网络安全两部分来决定。对于系统管理员来说,首先要保证系统本身的安全,在安装MySQL数据库时,需要对基础环境进行较好的配置。
    1、修改root用户口令,删除空口令
    缺省安装的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; //强制刷新内存授权表,否则用的还是在内存缓冲的口令
    2、删除默认数据库和数据库用户
    一般情况下,MySQL数据库安装在本地,并且也只需要本地的php脚本对mysql进行读取,所以很多用户不需要,尤其是默认安装的用户。MySQL初始化后会自动生成空用户和test库,进行安装的测试,这会对数据库的安全构成威胁,有必要全部删除,最后的状态只保留单个root即可,当然以后根据需要增加用户和数据库。
    #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; //强制刷新内存授权表。
    3、改变默认mysql管理员帐号
    系统mysql的管理员名称是root,而一般情况下,数据库管理员都没进行修改,这一定程度上对系统用户穷举的恶意行为提供了便利,此时修改为复杂的用户名,请不要在设定为admin或者administraror的形式,因为它们也在易猜的用户字典中。
    mysql> update user set user="newroot" where user="root"; //改成不易被猜测的用户名
    mysql> flush privileges;
    4、关于密码的管理
    密码是数据库安全管理的一个很重要因素,不要将纯文本密码保存到数据库中。如果你的计算机有安全危险,入侵者可以获得所有的密码并使用它们。相反,应使用MD5()、SHA1()或单向哈希函数。也不要从词典中选择密码,有专门的程序可以破解它们,请选用至少八位,由字母、数字和符号组成的强密码。在存取密码时,使用mysql的内置函数password()的sql语句,对密码进行加密后存储。例如以下方式在users表中加入新用户。
    #mysql> insert into users values (1,password(1234),'test');
    5、使用独立用户运行msyql
    绝对不要作为使用root用户运行MySQL服务器。这样做非常危险,因为任何具有FILE权限的用户能够用root创建文件(例如,~root/.bashrc)。mysqld拒绝使用root运行,除非使用–user=root选项明显指定。应该用普通非特权用户运行mysqld。正如前面的安装过程一样,为数据库建立独立的linux中的mysql账户,该账户用来只用于管理和运行MySQL。
    要想用其它Unix用户启动mysqld,,增加user选项指定/etc/my.cnf选项文件或服务器数据目录的my.cnf选项文件中的[mysqld]组的用户名。
    #vim /etc/my.cnf
    [mysqld]
    user=mysql
    该命令使服务器用指定的用户来启动,无论你手动启动或通过mysqld_safe或mysql.server启动,都能确保使用mysql的身份。也可以在启动数据库是,加上user参数。
    # /usr/local/mysql/bin/mysqld_safe --user=mysql &
    作为其它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 --user=mysql & //后台用mysql用户启动mysql
    7、限制连接用户的数量
    数据库的某用户多次远程连接,会导致性能的下降和影响其他用户的操作,有必要对其进行限制。可以通过限制单个账户允许的连接数量来实现,设置my.cnf文件的mysqld中的max_user_connections变量来完成。GRANT语句也可以支持资源控制选项来限制服务器对一个账户允许的使用范围。
    #vim /etc/my.cnf
    [mysqld]
    max_user_connections 2
    8、用户目录权限限制
    默认的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.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
    --local-infile=0选项启动mysqld从服务器端禁用所有LOAD DATA LOCAL命令,假如需要获取本地文件,需要打开,但是建议关闭。
叶景网络,网络推广,网站建设
特别推荐RECOMMEND
搜索引擎网站关键词seo优化的意义
视频推广怎么做
网站seo优化怎么做关键词排上首页?
SEO介绍什么叫搜索引擎网站关键词优化
seo优化怎样做提升关键词排名
热点图文Hot
MYSQL中导入大小超过2M的数据库文件解决办法 MYSQL中导入大小超
从MySQL中获得数据表auto_increment值的方法 从MySQL中获得数据
MySQL 错误1418 的原因分析及解决方法 MySQL 错误1418
MySQL group by 排序问题 MySQL group by 排序问题
关注排行RANKING
1

MYSQL中导入大小超过2M的数据库文件...

MYSQL中导入大小超过2M的数据库文件解决办法 叶景网络(www cngxit com),致力于互联网品牌建设与网络营销,专业领域包括网...

2

从MySQL中获得数据表auto_increment值的方法

从MySQL中获得数据表auto_increment值的方法 在插入一行数据前就想要知道将要产生的id。比如说想用来命名上传的文件。如果不事先...

3

MySQL 错误1418 的原因分析及解决方法

MySQL 错误1418 的原因分析及解决方法 叶景网络(www cngxit com),致力于互联网品牌建设与网络营销,专业领域包括网...

4

MySQL group by 排序问题

MySQL group by 排序问题 id 为 自动增长字段, tid为该回复的主题帖子的id(外键关联), subject 为回复...

5

MySQL-bin导致阿里云LNMP20G系统盘...

MySQL-bin导致阿里云LNMP20G系统盘不够用处理方法 在MySQL数据库中,mysql-bin 000001、mysql- bin 000002等文件是数据库的操作日志,...

6

LNMP更改网站文件和MySQL数据库的存放目录

LNMP更改网站文件和MySQL数据库的存放目录 购买阿里云服务器,一般建议买一个数据盘,也就是系统盘和数据盘分开,将网站文...

7

MySQL无法启动ERROR! MySQL is r...

MySQL无法启动ERROR! MySQL is running but PID file could not be found ? 叶景网络(www cngxit com),致力于互联网品牌建设与网络营销,专业领...

8

LNMP关闭MySQL日志保护硬盘空间

LNMP关闭MySQL日志保护硬盘空间 今天发现VPS硬盘居然快满了。第一反应是:肯定是某个东西的日志文件造成的,因为以前在W...

9

MySQL数据库批量修改表前缀的方法

MySQL数据库批量修改表前缀的方法 叶景网络(www cngxit com),致力于互联网品牌建设与网络营销,专业领域包括网...