MySQL权限开通的设计方案

MySQL中的权限管理和其他数据库还是有很大的不同,它能够实现几种很特别的权限场景:

  1. 几个人公用一个账号,看起来用户名相同,密码相同,但是权限缺可以不同
  2. 几个人用同一个账号,用户名相同,但是密码可以不同,权限可以相同
  3. 几个人用同一个账号,用户名相同,但是密码可以不同,权限可以不同。

主要的原因就在于MySQL的权限认证中是按照用户和主机名两个维度结合来考量的。

所以我们的工作中,如果权限指定的太细,到了IP级别,其实需要创建的用户太多,所以我们很多时候是基于一个网段来创建,比如用户IP是192.168.3.100,那么我们可能会创建192.168.3.%的用户,这样后续要开通权限就能方便很多,从权限的管理来说,可能需要补充的就是系统级别的防火墙权限了。

这个看起来蛮简单的工作,一旦陷入琐碎的设置和流程之中,就会给我们带来很多的困扰和手工操作的复杂度,大体有几类体验比较深的痛点:

  1. 开通权限需要手工构造很多基本的SQL语句,看起来没有技术含量
  2. 如果指定一些表名,比如指定10个表,开通权限的时候可能权限语句就需要10条。
  3. 如果有多个IP要开通权限,那么我们需要手工构造很多重复繁琐的权限语句
  4. 每次开通权限的时候,对于密码都是一个头疼的格式,密码太简单不好,输入的多一些,手工输入的时候其实会发现密码好像不够随机。
  5. 测试环境和生产环境的用户应该按照规范,现在可能就压根没有遵守规范。

所以实际接触一些场景,自己手工做了一些业务之后,我发现这个地方确实得改进一下了。

整体的思路就是根据输入的信息自动生成匹配的SQL语句,人工初步审核和过滤,确认后执行。如果梳理需求,大体就会有一些功能点需要完善,这些通过手工眼里去鉴别还是有些费神的。整体来说是有两个大的功能需要做,一个是开通权限,一个是查询权限。

开通权限的部分需要的改进如下:

1. 根据客户端IP信息,取IP的前三段动态生成用户

2. 根据输入对象动态生成SQL

3. 根据输入权限动态生成SQL

4. 根据环境类型,检查用户名是否符合规范,根据业务匹配用户名

5. 根据权限类型,检查用户名是否符合规范

6. 帮助生成随机密码,转储密码信息到数据库中

7. 输入参数保证健壮性,自动过滤空格

查询权限的部分需要的改进如下:

1. 根据客户端IP和端口在服务器中得到权限信息列表

2. 根据用户来查找相应的权限

进一步发掘需求,其实我们需要的基本信息是下面的几个参数:

环境类型: 测试开发环境,线上环境

用户名:

密码:

权限类型:

数据库:

对象:

客户端列表:

def handle_grant():

# client IP list

ipaddr_list = '192.168.10.202,192.168.10.203, 192.168.3.20'

# username

username ='dev_user'

password = ''.join(random.sample(string.ascii_letters + string.digits, 15))

privilege_list = 'select,insert,delete'

database_list = 'test1,test2'

object_list = 'tab1,tab2,tab3'

env_type = 'test'

error_info = []

if env_type == 'test':

if username.startswith("dev_") == 0 :

error_info.append("username is not following standard...")

print(error_info)

return;

elif env_type == 'prod':

if username.startswith("prod") == 0:

error_info.append("username is not following standard...")

print(error_info)

return;

print("aaa")

ipaddr_list = ipaddr_list.replace(' ', '')

print(ipaddr_list)

username_list = []

for ipaddr in ipaddr_list.split(','):

tmp_ipaddr = '.'.join(ipaddr.split('.')[0:3])

if tmp_ipaddr not in username_list:

username_list.append(tmp_ipaddr)

print(username_list)

create_user_SQLs = []

for host_prefix in username_list:

create_user_SQLs.append( 'create user ' +username+ '@'+"'"+host_prefix+".%' identified by '"+password+"';")

for sql in create_user_SQLs:

print(sql)

grant_SQLs = []

for owner_db in database_list.split(','):

for obj in object_list.split(','):

for user_host in username_list:

grant_SQLs.append("grant "+privilege_list+" on "+owner_db+"."+obj+" to "+username+"@'"+user_host+".%';")

print(grant_SQLs)

for sql in grant_SQLs:

print(sql)

handle_grant()

输出如下:

192.168.10.202,192.168.10.203,192.168.3.20

['192.168.10', '192.168.3']

create user dev_user@'192.168.10.%' identified by 'sRBgTNIei0XdUYZ';

create user dev_user@'192.168.3.%' identified by 'sRBgTNIei0XdUYZ';

。。。。。

grant select,insert,delete on test2.tab3 to dev_user@'192.168.10.%';

grant select,insert,delete on test2.tab3 to dev_user@'192.168.3.%';

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2018-05-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏青玉伏案

Git版本控制Windows版快速上手

  说到版本控制,之前用过VSS,SVN,Git接触不久,感觉用着还行。写篇博文给大家分享一下使用Git的小经验,让大家对Git快速上手。   说白了Git就是...

21580
来自专栏小狼的世界

由于版本依赖造成的YUM段错误

最近在服务器(Centos 5.3,64位)上使用YUM,总是提示 Segmentation Fault,无论执行什么命令都是如此,一时不得其解。

13520
来自专栏友弟技术工作室

云原生概念

1.9K50
来自专栏Golang语言社区

关于缓存你需要知道的

About Cache 作后端开发的同学,缓存是必备技能。这是你不需要花费太多的精力就能显著提升服务性能的灵丹妙药。前提是你得知道如何使用它,这样才能够最大限度...

368130
来自专栏IT技术精选文摘

redis架构演变与redis-cluster群集读写方案

redis-cluster是近年来redis架构不断改进中的相对较好的redis高可用方案。本文涉及到近年来redis多实例架构的演变过程,包括普通主从架构(M...

63830
来自专栏散尽浮华

由索引节点(inode)爆满引发的问题

关于磁盘空间中索引节点爆满的问题还是挺多的,借此跟大家分享一下: 一、发现问题 在公司一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建...

34280
来自专栏进击的程序猿

ZooKeeper: Wait-free coordination for Internet-scale systems(笔记)

本文是读ZooKeeper: Wait-free coordination for Internet-scale systems的笔记,从第一手资料了解zook...

12030
来自专栏个人分享

数据集成中间件知识点总结

  数据集成是把不同来源、格式、特点性质的数据在逻辑上或物理上有机地集中,从而为企业提供全面的数据共享。

48410
来自专栏企鹅号快讯

做网站-推荐3种CSS,JS合并的方式

在Web项目的开发中,js,css文件会随着项目的开发变得越来越多,越来越大,这就给给性能方面带来一些问题,如,页面引入的的js,css越多的话,那么对就增加了...

754110
来自专栏逢魔安全实验室

某移动应用安全加固与脱壳技术研究与实例分析

62280

扫码关注云+社区

领取腾讯云代金券