涂抹MySQL--第5章 MySQL数据库中的权限体系 - 5.4帐户安全管理

5.4 帐户安全管理

提到帐户安全,我想即使是从没有接触过MySQL库软件的朋友,只要使用过计算机,畅游过互联网就都会有自己的理解,甚至对于那些从没接触过计算机的人也有自己的心得,毕竟当下就是信息时代,不管是做为普通人到银行办理业务,或者极客在网上购物消费,都少不得要管理一系列的帐户和口令,因此可以说人人都对此早有接触,并且积累下深厚的帐户管理经验。

因为关于帐户安全的一般性原则是通用的,因此这里三思并不想再去强调什么密码设置原则、口令保护指南等等陈词滥调,本章着重谈到的几方面内容更多可以视为一些小技巧,希望能够真正帮助大家在运维MySQL数据库的过程中,提供一些参考,减少一些隐患。

5.4.1 用户与权限设定原则

看完前面的内容,我想大家已经对如何创建用户,如何管理用户的权限有了认识。不过,要知道想炒出一盘可口的佳肴,只有原料可还不行,厨艺的高低更加重要。

创建出一个数据库帐户,权限是给大还是给小;前端的应用服务很多,是共用同一个帐户,还是分开独立操作;每一种选择都有它的优点,相应也会有它的弊端,究竟怎么设定才对,有时候我觉着这就像问大厨师炒菜时放多少盐合适,它的回答可能是:适量就好。这个答案听起来很虚,但实际上有时候就是这么微妙,它确实不是一个定量,需要大家根据实际情况调整。

本节的内容并不一定都对,更多是三思个人的理解,不过,我可以负责任的告诉大家,我所管理的数据库的帐户,也正是按照这些原则在维护。

总体规划目标:

l 考虑实际情况及使用习惯,权限的设定应该是尽可能不增加应用端开发工作量的前提下,尽可能缩小权限分配的粒度;

l 做到业务级的帐户分享,不同应用(项目)分别使用不同的帐户执行操作;

l 使操作者执行SQL时所使用的帐户,与其能够执行的操作相对应;

l 降低误操作的几率,保障数据库系统安全。

权限按照可控程度分级设定。如何定义级别就请根据实际业务规模,我们目前的环境综合考虑了团队规模和业务数据规模,最终确定以库为单位创建帐户,在达到安全设定目标的前提下,尽可能简化流程,将权限级别设为三级:

l {user}_oper:定义为操作用户,拥有指定库下所有对象的操作权限,授予增加(insert)、删除(delete)、修改(update)、查询(select)记录的权限,主要用于前端应用程序,连接数据库读写数据;

l {user}_read:定义为只读用户,拥有指定库下对象的读取权限,授予查询(SELECT)记录的权限,可用于数据查询、SQL调试,数据验证,数据导出等操作,对于做了读写分离的应用,只读访问也使用本帐户;

l {user}_mgr:定义为管理帐户,拥有多个库下对象操作权限,用于各项目负责人实时操作对象数据;

上述的三类用户主要用于应用端的业务,对于DB层维护的帐户,首先按功能区分,其次在授予权限时也是按照最小粒度权限的原则授予,除此之外,所有系统维护的帐户还会遵循下列两个原则:

l MySQL数据库的管理员帐户改名,不允许出现"root"名称的用户;

l 用户访问域设定为服务器所在IP段;

5.4.2 小心历史文件泄密

对特性掌握的越全面,对系统了解的越深入,在执行具体的运维工作就越能够得心应手,做到有备无患。但是要达到这项要求难度极高极大,因为向上提升永无极限,我们总能够做的更好。这就要求我们态度上谦虚审慎,同时还要时刻抓紧学习,不忘补充新的知识点。

就以MySQL数据库来说,即使当前的密码设置的极为规范,口令保护措施也很到位,但是,如果对mysql的某些特性不了解,就还是有可能存在巨大的系统漏洞。

你们信不信,我反正是信了,执行下列命令看一看吧:

$ tail -20 ~/.mysql_history 

...............

...............

grant select (phoneno) on jssdb.users to jss_col;

select * from mysql.columns_priv;

select * from mysql.tables_priv where user='jss_cols';

...............

惊讶了吧,前面所做的操作居然都保存在这里,如果一页页去翻开这个文件的内容,你会发现我们执行过的所有操作,包括最初重命名root用户和修改system系统帐户的口令均在其中,黑黑,小伙伴儿们当场就震惊了吧。

在Linux/Unix系统下,使用mysql命令行工具执行的所有操作,都会被记录到一个名为".mysql_history"的文件中,该文件默认保存在当前用户的根目录下(也可以通过MYSQL_HISTFILE环境变量修改保存路径)。

这个设定本意是为了提升mysql命令行工具操作体验的,有了它,我们在mysql命令行界面,就能够方便的使用方向键,上下翻看执行过的命令,但是,又因为它记录了所有所执行过的操作,某些情况下又会成为巨大的安全隐患。

基于安全性方面的考虑,服务端的.mysql_history文件有必要进行保护,以避免操作被外泄,特别是对于像创建用户/修改密码[这类管理操作,如果没有防护,那数据库对某些有心人士来说就是不设防的状态。

如何消除这种隐患呢(也相当于禁用),两种方案:

l 一种方式是彻底清除,修改操作系统层的MYSQL_HISTFILE环境变量,将其值改为/dev/null,这样所有操作都会被输出到空,操作的历史自然不会被保留;

l 另一个是仍然保留.mysql_history文件,但是该文件实际上为/dev/null的软链接,这样所有操作也是会被输出到空,操作的历史不会被保留;

两种方式功能基本相同,原理也一样,只不过一种是在MySQL的DB层操作,另外一种则是在OS层实施,究竟选择哪种方式,完全可以由DBA自行决定。

这里以第二种方式为例,操作最为简单,在操作系统的命令行界面执行下列命令:

$ ln -f -s /dev/null ~/.mysql_history

之后再通过mysql命令行登录到数据库时,方向键上下翻则仅针对当前会话有效,不过退出会话后再次登录,就看不到上次执行过的操作了。

 

5.4.3 管理员口令丢失怎么办

用户的口令很重要,大家对其重视程度都不低,读过前面小节中的内容后,想必在设置密码时也会花些心思,设定一个不那么有规律的口令。这种设定有时候真是挺矛盾,设置的太简单吧不安全,设置的太复杂又真不容易记,更何况忘记口令这种事儿并不稀奇,看看各大网站的用户登录页面吧,显著位置都留有"找回密码"的链接,就知道这类需求实在太过稀松平常了,这位仁兄,今天,你密码忘了没?

对于数据库软件来说,要是普通用户的口令忘记了倒还好处理,拿系统帐户登录进去后简单的一条命令就改了,但是如果系统管理员帐户的口令也忘了(这事儿也不稀奇),别担心,照样有方法处理,尽管方法用的非常规,但是:正能量,无所畏。

在操作前必须要首先强调,非常规方式重置系统管理员帐户的密码,对MySQL服务的正常运行是有影响的,因为操作过程中必须多次重启MySQL服务。

MySQL官方给出的非常规方式重置系统管理员帐户有两种方法:

l 启动MySQL服务时附加参数(--init-file),使其执行含有密码重置的脚本,达到修改帐户密码的目地;

l 启动MySQL服务时通过附加特殊的参数,使其跳过权限验证,而后登录数据库中重置密码后,再按照正常的方式重启MySQL服务;

前一种方式安全性更强,操作的步骤稍多一些,而且不同平台执行的命令也稍有差异,后一种方法通用性强,适用范围广(Windows/Linux/Unix平台均适用),因此这里我们重点介绍第二种方式,具体步骤如下。

首先,停止当前的MySQL服务,因为没有管理帐户密码,常规关停方法无法使用,只好直接杀进程了,对于Windows平台可以在"服务"中停止MySQL服务,Linux/Unix平台则查找到mysqld主进程后杀掉该进程:

[mysql@mysqldb01 ~]$ kill `cat /data/mysqldata/3306/mysql.pid` 

接下来又重新启动mysqld服务,启动时在启动命令后附加--skip-grant-tables选项。该选项的功能,正是当有用户连接时,跳过检查授权表,直接授予所有登录用户最大权限(相当于所有登录的用户都是系统管理员),执行mysqld_safe命令启动数据库,操作如下(Windows平台没有mysqld_safe脚本,直接执行mysqld命令即可):

$ mysqld_safe --defaults-file=/data/mysqldata/3306/my.cnf --skip-grant-tables --skip-networking&

大家注意到三思这里还另外指定了--skip-networking选项,这主要是考虑到附加--skip-grant-tables选项启动后,连接数据库时不再有权限验证,在此期间如果有其它用户创建连接的话可能存在安全隐患,那么我们可以在启动服务器同时附加--skip-networking选项,这样该MySQL服务不会监听来自TCP/IP的连接,相当于禁用了网络上其它主机发出的登录请求,只允许MySQL服务本地创建连接,安全性方面更加可靠。

而后就可以无须用户验证,即可直接登录到MySQL数据库服务里:

[mysql@mysqldb01 ~]$ mysql

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 1

........

........

(root@localhost) [(none)]>  

所有连接进来的用户现在都是系统用户,默认就是root,想做啥都可以,对于我们来说,接下来就执行update语句,修改系统管理员帐户的密码:

(root@localhost) [(none)]> update mysql.user set password=password('5ienet.com') where user='system';

Query OK, 0 rows affected (0.00 sec)

Rows matched: 1  Changed: 0  Warnings: 0

关闭MySQL服务,这次不用杀进程了,就用常规的mysqladmin命令关闭吧:

[mysql@mysqldb01 ~]$ mysqladmin shutdown

然后按照正常的方式重新启动MySQL服务:

$ mysqld_safe --defaults-file=/data/mysqldata/3306/my.cnf &

系统管理员帐户的密码重置完毕,接下来就可以用刚刚设定的新密码来管理你的MySQL数据库了。

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7607759/viewspace-1212616/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/7607759/viewspace-1212616/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值