数据库权限管理(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 })