首页 > 技术文章 > 数据库权限管理(mysql+mongo)

windysai 2021-02-10 23:40 原文

数据库权限管理(mysql+mongo)

一、需求引入

  之前领导给的一个需求,叫严格控制好线上生产数据库的权限控制,因为平时后端开发是有权限登录线上mysql,mongo正式库的,怕误操作。叫我平时就开一个仅有查询权限的账号给他们用,其他权限收回去。这么搞老实说增加我工作量不说,开发也是各种怨言,每次都得请示我 = =

  然后我就搞了个脚本,他们运行就可以自己开给自己,当然也方便我,不然每次都登数据库,运行命令。而且堡垒机也会记录他们对服务器的操作,也有数据库审计,人品也信得过,所以我还是比较放心的

 

二、脚本实现

【i】mysql

  首先把线上mysql生产库信息都统计分类起来,包括数据库ip,监听端口,超管用户,超管密码。然后为了方便,每个mysql数据库都统一建了一个 ywindysai 的用户(作为平时开给开发用的账号,只有查权限)

  grant select on 某库名.* to 'ywindsyai'@'数据库登录地址' identified by 'ywindsyai登录数据库的密码';

  1、脚本首先会有个选库的提示(read -p xxx),表示要操作哪里的数据库:阿里?天翼?华为?给到变量  ${choice_mysql}

  2、选完之后有个case in 的选择操作。因为每个库的超管用户和密码不一定相同,当然大部分是root啦。这里主要实现超管账号密码的变量赋值

  3、用ywindysai去登录这个 ${choice_mysql} 的数据库,查看能授权的数据库有哪些;还有进行具体是哪种操作:授权还是回收权限

  4、最后利用超管给ywindysai进行授权或回收权限即可。

 1 #!/bin/bash
 2 
 3 ## 1、选择操作哪个mysql
 4 cat << EOF
 5 1.天翼云A数据库
 6 2.天翼云B数据库
 7 3.某A数据库
 8 4.某B数据库
 9 EOF
10 
11 port=3306   #默认3306,端口不同会在case下面覆盖值的
12 read -p "please choose where to authorize: " choice_mysql
13 
14 superuser=root
15 dev_name='ywindysai'
16 dev_pwd='ywindysai登录数据库的密码'
17 
18 case ${choice_mysql} in
19   1)
20     remote_ip=天翼云A数据库的地址
21     port=123     #数据库端口不是3306选择覆盖
22     rootpwd='超管密码'
23     ;;
24   
25   2)
26     remote_ip=天翼云B数据库的地址
27     port=8888      #数据库端口不是3306选择覆盖
28     superuser=ljy123   #超管不是root时要覆盖值
29     rootpwd='超管密码'
30     ;;
31   3)
32     。。。
33     ;;
34   4)
35    。。。
36     ;;
37 esac
38 
39 
40 ## 2、选择操作mysql上哪个库
41 mysql -u$dev_name -p$dev_pwd -h$remote_ip -P$port -e "show databases;"
42 read -p "please choose which db to operate: " choice_db
43 echo "你选择操作的数据库是: " $choice_db
44 
45 echo "#############"
46 echo ""
47 
48 ## 3、选择授权还是收回权限
49 read -p "please choose to authorize(1) or revoke(2): " choice_operate
50 case ${choice_operate} in
51  ## 授权
52   1)
53     run_sql="grant select, insert, delete, update, alter, create  on $choice_db.* to ywindysai; flush privileges;"
54     ;;
55   
56  ## 收回权限
57   2)
58     run_sql="revoke insert, delete, update, alter, create, drop on $choice_db.* from ywindysai; flush privileges;"
59     ;;
60 esac
61 
62 echo $run_sql
63 mysql -u$superuser -p$rootpwd -h$remote_ip -P$port -e "$run_sql"
64 mysql -u$superuser -p$rootpwd -h$remote_ip -P$port -e "flush privileges;"

 

【i】mongo 

mongo跟mysql的处理思路大致是一样的,不过授权那里需要用一个js去搞,否则跑不了命令,我试过直接复制js的命令到脚本上,是运行不了的!!!

 1 #!/bin/bash
 2 
 3 js_dir=/home/ljy/app/mongodb-install
 4 
 5 ## 1、选择操作哪个mongo
 6 cat << EOF
 7 1.天翼云mongo-A
 8 2.天翼云mongo-B
 9 3.阿里云mongo-A
10 EOF
11 
12 mongo_dir=/home/ljy/app/mongodb-install/bin
13 port=mongo监听端口
14 read -p "please choose where to authorize: " choice_mongo
15 
16 dev_name='ywindysai'
17 dev_pwd='ywindysai登录mongo的密码'
18 
19 mongo_db=登录mongo要操作的具体数据库  #因为大部分mongo操作的库名是一样的,所以我拎出来外面定义了,不同才需要在case里面改
20 
21 case ${choice_mongo} in
22   1)
23      remote_ip=xx
24      ;;
25   2)
26      remote_ip=xx
27      ;;     
28   3)
29      remote_ip=xx
30      mongo_db='report_ljy'  #假设mongo_db不是默认值,要覆盖
31      ;;   
32 esac
33 
34 #一般mongo超管用户是admin
35 superuser=admin
36 rootpwd='超管密码'
37 
38 ## 2、选择授权还是回收权限
39 read -p "please choose to authorize(1) or revoke(2): " choice_operate
40 
41 case ${choice_operate} in
42   1)
43   ##授权:grant.js
44   oper_js=${js_dir}/grant.js
45 >${oper_js}
46 cat << EOF >${oper_js}
47 use $mongo_db;
48 db.updateUser("ywindysai",
49 {
50     roles:[
51         { role:"dbOwner", db:"$mongo_db" }
52     ]
53 })
54 EOF
55   ;;
56 
57   2)
58   ##回收权限:revoke.js
59   oper_js=${js_dir}/revoke.js
60 >${oper_js}
61 cat << EOF >${oper_js}
62 use $mongo_db;
63 db.updateUser("ywindysai",
64 {
65     roles:[
66         { role:"read", db:"$mongo_db" }
67     ]
68 })
69 EOF
70   ;;
71 esac
72 
73 echo ${oper_js} 
74 echo "#################################"
75 sleep 1
76 
77 ${mongo_dir}/mongo admin -u "admin" -p 'admin密码' --host $remote_ip --port $port < ${oper_js}

 

回收权限js:只给读权限

[ljy@test scripts]$ cat /home/ljy/app/mongodb-install/revoke.js 

use 操作的库名;
db.updateUser("ywindysai",
{
    roles:[
        { role:"read", db:"操作的库名" }
    ]
})

 

授权js:注意要给dbOwner角色

1 [ljy@test scripts]$ cat /home/ljy/app/mongodb-install/grant.js 
2 
3 use 操作的库名;
4 db.updateUser("ywindysai",
5 {
6     roles:[
7         { role:"dbOwner", db:"操作的库名" }
8     ]
9 })

 

推荐阅读