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


    数据库权限管理(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 })
  • 相关阅读:
    asp.net textbox控件readonly为true时,后台取值的问题
    未能加载文件或程序集“ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf1164f73”或它的某一个依赖项
    DataSet与DataReader的比较
    EntityFramwork所有 SSDL 项目都必须以同一提供程序为目标。ProviderManifestToken“2008”不同于以前遇到的“2005”
    路由器wan口连接不上的问题
    Git学习(四)----版本号跳转
    jquery记分牌的插件
    ORACLE 第4节 多表查询
    基于消息机制的异步架构之回调函数注冊
    干货!手把手教你怎样高速了解一个行业--游戏产业概况
  • 原文地址:https://www.cnblogs.com/windysai/p/14397033.html
Copyright © 2020-2023  润新知