写点什么

MySQL 传统方案和通过 SSH 连接哪个好?

  • 2022 年 8 月 09 日
    湖南
  • 本文字数:2134 字

    阅读完需:约 7 分钟

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 端口 kaka1MySQL 主机 47.93.12.2043306kaka2 远程服务器 8.142.40.20233888

修改 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 进行连接的。

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

用户头像

不定期更新Java开发工具及Java面试干货技巧 2021.12.12 加入

Java后端工程师,十年大厂经验。具有扎实的Java、JEE基础知识。熟悉Spring、SpringMVC、Struts MyBatisHibernate等JEE常用框架。

评论

发布
暂无评论
MySQL传统方案和通过SSH连接哪个好?_MySQL_了不起的程序猿_InfoQ写作社区