• 学长告诉我,大厂MySQL都是通过SSH连接的


    大家好,我是咔咔 不期速成,日拱一卒

    一、背景

    之前待的几个公司,数据库、服务器权限都是给所有后端直接拉满的,但也会出现员工离职的情况,每次有人离职时都需要改数据库密码、服务器密码。

    每次密码修改后得告知所有开发修改本地密码,但这样的事情也不是经常发生,公司虽小但很稳定。

    假设你所待的公司是一个开发非常多的公司,有可能你待了一年还没认识全,人员流动的速度也非常快,这时上面那种方案的执行成本就非常高了。

    若此时把这个问题抛给你,让你解决你会有什么方案?

    接下来给大家介绍两种方案,一种传统方案另一种是通过SSH来实现的。

    二、传统方案

    MySQL版本:8.0.26

    其中最简单的方案就是给每个人在数据库添加一个账号,具体步骤如下:

    创建新用户

    create user "kaka"@"%" identified by 'qwerty123456';
    

    其中kaka为自定义的用户名;%为登录域名,host为'%'时表示为 任意IP,为localhost时表示本机,或者填写指定的IP地址;qwerty123456为密码

    为用户授权

    grant all privileges on kaka.* to "kaka"@"%" with grant option;
    
    或
    
    grant all on *.* to "kaka"@"%";
    

    其中kaka.*,kaka为数据名,*为所有表,如果想授权全部表就把kaka.*写成*.*,当然这里是以开发库为基础的,所有的权限都得给。当前也可以给予部分权限。

    刷新权限

    flush privileges;
    

    使用用户名:kaka进行登录

    发现kaka用户只有两个库,kaka库就是授权的库,当切换系统库时发现是没有权限的。

    在切到kaka库,是可以做正常的curd操作的

    给予部分权限

    grant update on kaka.* to "kaka"@"%";
    
    flush privileges;
    

    若想给多个权限,则逗号隔开即可,update,select,insert ....,执行完切记需要刷新权限,否则不会生效

    撤销全部权限

    这块有点小插曲,当执行撤销命令后报了这样一个错

    Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation
    

    查阅了一下官方文档,原因是由于root用户没有SYSTEM_USER权限,把权限加入后即可解决

    grant system_user on *.* to 'root';
    
    revoke all privileges ,grant option from kaka;
    
    或
    
    revoke all privileges on kaka.* from kaka;
    
    flush privileges;
    

    插销部分权限

    revoke select on kaka.* from kaka;
    

    kaka.*为表名,kaka为用户名

    员工离职删除用户即可

    drop from kaka;
    

    kaka 为用户名

    嗯,成功的把MySQL权限给复习了一遍.....

    三、通过SSH隧道连接MySQL数据库

    准备工作

    主机名 角色 IP 端口
    kaka1 MySQL主机 47.93.12.204 3306
    kaka2 远程服务器 8.142.40.202 33888

    修改MySQL主机仅允许远程服务器连接

    use mysql;
    
    update user set host='8.142.40.202' where user = "root";
    

    此时在MySQL主机服务器是直接登录不了的

    配置SSH连接MySQL主机

    在远程主机执行

    ssh -fN -L33888:47.93.12.204:3306 root@8.142.40.202
    

    在使用SSH连接使用时发现部分人员说是连接一直在断,影响了正常开发,只需要加上下面这个参数重新执行即可,这个参数是每60秒发送一个KeepAlive请求,保证终端不会因为超时空闲而断开连接

    ssh -o ServerAliveInterval=60 -fN -L33888:47.93.12.204:3306 root@8.142.40.202
    

    注意前边是远程服务器 后边是远程主机的服务器账号、服务器地址

    命令执行完成后,可以通过命令

    mysql -h 127.0.0.1 -P 33888 -uroot -p
    

    密码是MySQL服务器的 MySQL密码

    四、本地开发连接

    上述通过两台服务器给大家做了演示,接下来看看开发人员如何连接开发数据库

    同样在本地也执行命令

    ssh -fN -L3306:47.93.12.204:3306 root@8.142.40.202
    

    在host配置文件中进行域名映射

    // 127.0.0.1 MySQL服务器地址
    127.0.0.1 8.142.40.202
    

    使用Navicat进行连接

    可以看到已经连接上了

    这样就强制让所有开发人员通过SSH来连接MySQL,当有一个开发离职后,只需要删除对应的服务器账号即可

    五、限制Linux用户登录

    你肯定也想到了,通过SSH连接使用的服务器账号密码,那么就意味着所有开发者都可以用过自己的账号密码进行登录服务器。

    上有政策,下有对策,接下来看看如何限制用户登录服务器。

    例如现在添加了用户niuniu,此时该用户是肯定可以连接到服务器的

    可以看到当前用户通过Xsheel连接上了服务器,服务器权限还是给部分人开通比较好,接下来就来限制该用户登录服务器

    执行命令

    usermod -s /sbin/nologin niuniu 
    

    用户niuniu通过Xsheel登录服务器,可以看到返回当前账号不可用,说明我们想要的结果已经有了

    在这里插入图片描述 再看看本地Navicat连接是否正常

    截止到这里就已经完成了所有的安全措施。

    六、扩展一:WITH GRANT OPTION

    这个参数是可选的,如果不加,那这句话到这就结束了,这个用户就是一级,他不能再去建子用户了,如果给了,就代表可以建子账号,当然子用户能分出去的权限仅限他自己有的权限

    注意一点,这里的操作只能分配给已有的账户,创建新账户需要另外的权限 并且,还得有GRANT权限,不然的话就算有这个权限但是没有执行这个权限的权限

    七、扩展二:Linux用户操作

    添加用户

    useradd {username}
    

    删除用户

    vipw
    
    进去之后删除对应的用户名即可
    
    groupdel {username}
    
    rm -rf /home/{username}
    

    设置密码

    passwd {username}
    

    需要输入两遍,注意

    八、总结

    本文给大家介绍两种应对开发者离职后,数据库权限收回的方案。一种是通过MySQL本身字段的权限、另一种是通过SSH来连接,目前咔咔所在的公司是通过SSH进行连接的。

    在介绍这两种方案时发现了很多可以扩展的知识点,也一并写了出来,当你看这篇文章时就不用再一次进行查资料了。

    坚持学习、坚持写作、坚持分享是咔咔从业以来所秉持的信念。愿文章在偌大的互联网上能给你带来一点帮助,我是咔咔,下期见。

  • 相关阅读:
    conda环境下version libcublasLt.so.11 not defined问题解决
    【数据仓库设计基础1】关系数据模型理论与数据仓库Inmon方法论
    Spring Boot Endpoints:端点
    02 【setup reactive ref】
    tomcat
    算法通关村第十七关:白银挑战-贪心高频问题
    Golang新版本 Go1.19新的fmt方法
    JVM哪些区域可能出现内存溢出,哪些地方需要GC?
    【注解和反射】获取类运行时结构
    Go 调度器——schedule
  • 原文地址:https://www.cnblogs.com/fkaka/p/16564275.html