注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

A small step

Judgement Must

 
 
 

日志

 
 
关于我

不要因为急着赶路,让自己的步伐杂乱。远方是既定的目标,但路上才是最重要的经历!

网易考拉推荐

mysql 安全  

2015-07-24 10:55:11|  分类: Database |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 MySQL 是完全网络化的跨平台关系型数据库系统,同时是具有客户机/服务器体系结构的分布式数据库管理系统。它具有功能强、使用简便、管理方便、运行速度快、安全可靠性强等优点,用户可利用许多语言编写访问MySQL 数据库的程序。由于MySQL是多平台的数据库,它的默认配置要考虑各种情况下都能适用,所以在我们自己的使用环境下应该进行进一步的安全加固。作为一个MySQL的系统管理员,是需要保证MySQL数据库系统的数据安全性和完整性。以下主要从系统内部安全、外部网络安全以及账户安全来简单描述下数据库的安全性。
    系统内部安全 
首先简单介绍一下MySQL数据库目录结构。MySQL安装好,运行了mysql_db_install 脚本以后就会建立数据目录和初始化数据库。我们一般采用MySQL源码包安装,而且安装目录是/opt/modules/mysql,那么数据目录一般会是/opt/modules/mysql/var。数据库系统由一系列数据库组成,每个数据库包含一系列数据库表。MySQL是用数据库名在数据目录建立建立一个数据库目录,各数据库表分别以数据库表名作为文件名,扩展名分别为MYD、MYI、frm的三个文件放到数据库目录中。如何保证数据目录和数据文件的安全性,也就是权限设置问题,在数据库初始化时指定用mysql用户(mysql_db_install –user=mysql)。从3.23.xx版本开始数据目录的属性是700,这样就比较好,只有启动数据库的用户可以读写数据库文件,保证了本地数据文件的安全。如下所示: Mysql dir.jpg
    外部网络安全 
MySQL的授权表给数据库的访问提供了灵活的权限控制,但是如果本地用户拥有对库文件的读权限的话,攻击者只需把数据库目录打包拷走,然后拷到自己本机的数据目录下就能访问窃取的数据库。所以MySQL所在的主机的安全性是最首要的问题,如果主机不安全,被攻击者控制,那么MySQL的安全性也无从谈起。主机安全主要是从接入层防火墙及主机两块做起,接入层针对数据库服务器设置严格的策略,只充许某些IP段来管理服务器及数据库端口,网络条件充许情况下可以把数据库设置为内网,数据交互都通过内网实现,服务器端也可以加上iptables限制。例如:

        iptables -A INPUT -s 202.205.109.0/255.255.255.0 -p tcp -m tcp --dport 22 -j ACCEPT
        iptables -A INPUT -p tcp -m tcp --dport 22 -j REJECT --reject-with icmp-port-unreachable
        iptables -A INPUT -s 202.205.109.0/255.255.255.0 -p tcp -m tcp --dport 3306 -j ACCEPT
        iptables -A INPUT -p tcp -m tcp --dport 3306 -j REJECT --reject-with icmp-port-unreachable 
    账户安全 
在保证了系统及网络方面的安全,接下来主要描述下Mysql在账户方面的安全机制。
        1、Mysql受权机制。
            MySQL授权表访问控制分两个步骤:
                服务器检查是否允许该用户连接。
                如果该用户有权连接,那么服务器还会检查它的每一个请求是否有足够的权限。比如:
                    用户检索数据库中的一个表需要有这个数据库的select权限,用户删除数据库中的一个表需要有这个数据库的drop权限。
                    授权表的user, db, host表使用这两个步骤,tables_priv和columns_priv表只使用第二步(检查请求)。每个授权表包含决定一个权限何时运用的范围列和决定授予哪种权限的权限列。范围列指定表中的权限何时运用。每个授权表条目包含User和Host列来指定权限何时运用于一个给定用户从给定主机的连接。其他表包含附加的范围列,如db表包含一个Db列指出权限运用于哪个数据库。类似地,tables_priv和columns_priv表包含范围字段,缩小范围到一个数据库中的特定表或一个表的特定列。
                    下面是user表的Host字段和User字段组合的一些例子:
                    +-----------------------------+--------+--------------------------------------------------------+
                    | Host值 | User值 | 匹配的连接 |
                    +-----------------------------+--------+--------------------------------------------------------+
                    | 'x.y.z' | 'test' | test用户只能从x.y.z连接数据库 |
                    +-----------------------------+--------+--------------------------------------------------------+
                    | 'x.y.z' | | 任何用户可以从x.y.z连接数据库 |
                    +-----------------------------+--------+--------------------------------------------------------+
                    | '%' | 'test' | test用户可以从任意主机连接数据库 |
                    +-----------------------------+--------+--------------------------------------------------------+
                    | | | 任何用户可以从任意主机连接数据库 |
                    +-----------------------------+--------+--------------------------------------------------------+
                    | '%.y.z' | 'test' | test用户可以从y.z域的任意主机连接数据库 |
                    +-----------------------------+--------+--------------------------------------------------------+
                    | 'x.y.% ' | 'test' | test用户可以从x.y.net, x.y.com, x.y.edu等主机连接数据库|
                    +-----------------------------+--------+--------------------------------------------------------+
                    | '192.168.1.1' | 'test' | test用户可以从IP地址为192.168.1.1的主机连接数据库 |
                    +-----------------------------+--------+--------------------------------------------------------+
                    | '192.168.1.% ' | 'test' | test用户可以从C类子网192.168.1中的任意主机连接数据库 |
                    +-----------------------------+--------+--------------------------------------------------------+
                    | '192.168.1.0/255.255.255.0' | 'test' | 同上 |
                    +-----------------------------+--------+--------------------------------------------------------+
                        SQL的字符串通配符%表示匹配任意字符,可以是0个字符,通配符_表示匹配一个字符。 
        2、ROOT账户安全设置
            Mysql初化完成,默认root是没有密码,需要设置
            shell> mysql -u root
            mysql> use mysql;
            update user set password=password("************") where user="root";
            flush privileges;
            删除匿名用户
            shell> mysql -u root –p************
            mysql> use mysql;
            mysql> DELETE FROM mysql.user WHERE User = ;
            mysql> FLUSH PRIVILEGES; 
        3、数据库及授权
            Create主要是创建新的数据库,drop为删除数据库;grant用于给增加用户和创建权限,
            revoke用于删除用户权限。
                创建数据库及授权;命令:GRANT <privileges> ON <what> TO <user> [IDENTIFIED BY "<password>"] [WITH GRANT OPTION]; 

<privileges>是一个用逗号分隔的你想要赋予的权限的列表。你可以指定的权限可以分为三种类型,如下:

            数据库/数据表/数据列权限:
                Alter: 修改已存在的数据表(例如增加/删除列)和索引;
                Create: 建立新的数据库或数据表;
                Delete: 删除表的记录;
                Drop: 删除数据表或数据库;
                INDEX: 建立或删除索引;
                Insert: 增加表的记录;
                Select: 显示/搜索表的记录;
                Update: 修改表中已存在的记录。 
            全局管理权限:
                file: 在MySQL服务器上读写文件;
                PROCESS: 显示或杀死属于其它用户的服务线程;
                RELOAD: 重载访问控制表,刷新日志等;
                SHUTDOWN: 关闭MySQL服务。 
            特别的权限:
                ALL: 允许做任何事(和root一样);
                USAGE: 只允许登录--其它什么也不允许做。 
        实例如下(直接在服务器上操作):
            mysql> create database eol_test; //创建eol_test这个数据库
            mysql> grant all on eol_test.* to eol_test@'202.205.109.0/24' IDENTIFIED BY '************' WITH GRANT OPTION; //授于eol_test这个用户可以通过202.205.109.0这个网段来访问eol_test这个数据库,可以对这个数据库进行所有操作;
            mysql> revoke all on eol_test.* from eol_test@'202.205.109.0/24'; //取消授权
            mysql> flush privileges; //重载授权表 
        还有一些数据库在建库的时候需要指定字符集的如下操作
            mysql>create database eol_test DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci; 
        指定用户只有读权限:
            mysql> GRANT Select ON eol_test.* to eol_test@'202.205.109.0/24' INDETIFIED BY "******" WITH GRANT OPTION; 
        撤销用户权限 命令:revoke <privileges> (columns) on <what> from <user>; 

revoke语句只删权限不删用户,用户仍然可以连接服务器。 要完全删除一个用户必须用一条delete语句明确从user表中删除用户记录,如下:

            mysql> delete from user where user='eol_test';
            mysql> flush privileges; 重载授权表 
    总结 

在当今互联网高速发展前景下,在互联网上的应用越来越多;而用户数据都是保存在数据库里,因此数据库的安全性越来越重要,需要我们数据库管理员严格设置好数据库服务器及数据库本身的安全,做好数据备份;并定期检查,定期更换root密码,审查系统及数据库日志;以防患于未然。 
  评论这张
 
阅读(37)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018