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

一、背景

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

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

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

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

接下来给大家介绍两种方案,一种传统方案另一种是通过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进行连接的。

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

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

学长告诉我,大厂MySQL都是通过SSH连接的的更多相关文章

  1. 告诉你一个真实的OpenStack:都谁在用,用来干什么?

    告诉你一个真实的OpenStack:都谁在用,用来干什么? OpenStack基金会近日发布的双年调查报告显示,开源云计算软件OpenStack正在进入主流企业市场,但该项目依然面临较难部署和管理的老 ...

  2. 【转】mysql数据库中实现内连接、左连接、右连接

    [转]mysql数据库中实现内连接.左连接.右连接 内连接:把两个表中数据对应的数据查出来 外连接:以某个表为基础把对应数据查出来 首先创建数据库中的表,数据库代码如下: /* Navicat MyS ...

  3. [修]开启MySQL远程访问权限 允许远程连接

    原文地址:http://www.cnblogs.com/XL-Liang/archive/2012/05/03/2481310.html 这个地址也许更有帮助:http://www.cppblog.c ...

  4. Jmeter配置通过SSH连接的mysql数据库

    jmeter连接配置mysql数据库时,如果数据库服务器没有通过ssh连接,则只需要添加配置相应的jdbc参数就可以了.如果数据库服务器是通过SSH连接的,则需要通过中间远程连接工具来登录,此处使用的 ...

  5. 【small项目】MySQL第二天早上第一次连接超时报错,解决方法com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:

    MySQL第二天早上第一次连接超时报错,解决方法com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link ...

  6. 在docker中创建使用MySQL,并实现远程连接navicat

    在 docker 中使用 mysql 安装完docker之后,在命令行中输入docker images可以查看自己创建的image(安装下载docker的教程很多了,大家需要可以去查一下就可以了)这里 ...

  7. MySQL中concat函数(连接字符串)

    MySQL中concat函数使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串 ...

  8. mysql数据库在Navicat Premium连接的时候出现1862错误

    navicat连接打开时报1862的错误, 很就没有连接mysql看看了,今天连接的时候发现本机的mysql链接不上了,在cmd中执行动作的时候也会叫你去set password,做设置密码的动作时会 ...

  9. 开启MySQL远程访问权限 允许远程连接

    1.登陆mysql数据库 mysql -u root -p 查看user表 mysql> use mysql;Database changedmysql> select host,user ...

随机推荐

  1. CoaXPress 简介

    CoaXPress 背景 CoaXPress (简称CXP)是指一种采用同轴线缆进行互联的相机数据传输标准,主要用于替代之前的cameralink协议,常见于科学相机.工业相机.医学图像.航空防务等场 ...

  2. 学习Linux须知1.2之Linux命令的实战

    (一)学习Linux 的准备工作 1.在线学习linux 学习网站推荐:Linux 基础入门_Linux - 蓝桥云课 (lanqiao.cn) 2.连接远程服务器学习[下文的案例就是使用xshell ...

  3. 没错,就是Access-Control-Allow-Origin,跨域

    服务端添加: <add name="Access-Control-Allow-Origin" value="*" /><add name=&q ...

  4. C++primer第一章

    第一章 : 开始 1.1 编写一个简单的C++程序 要点:每个函数有且只能拥有一个main函数,且main的默认返回是一个int类型. 函数定义:返回类型,函数名,形参列表,函数体 1.1.1编译 运 ...

  5. CSS中html的标签元素分类

    在CSS中,html中的标签元素大体被分为三种不同的类型: 块状元素.内联元素(又叫行内元素)和内联块状元素.    常用的块状元素有:  <div>.<p>.<h1&g ...

  6. bare Git 仓库是什么?

    背景 今天,坐我旁边的同事问我一些关于服务器上命令的问题.其中有一个用了特殊参数的 git init 的命令,我也不认识,遂去 Google... bare Git 仓库 定义 A bare Git ...

  7. 快速 IO

    IO 的进化史 cin和cout 刚开始学的时候,老师叫我们用 cin 和 cout 大概是因为这最简单吧 cin>>x; cout<<x scanf和printf 学到函数了 ...

  8. 如何提高访问 GitHub 的速度

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年5月11日. 因为一些特殊的原因,国内访问Github的速度确实比较慢.国内访问Github经常会出现连接不上.图片加载不出来.文件无 ...

  9. 合宙AIR105(三): 定时器, 定时器中断和PWM输出

    目录 合宙AIR105(一): Keil MDK开发环境, DAP-Link 烧录和调试 合宙AIR105(二): 时钟设置和延迟函数 合宙AIR105(三): 定时器, 定时器中断和PWM输出 Ai ...

  10. 循环码、卷积码及其python实现

    摘要:本文介绍了循环码和卷积码两种编码方式,并且,作者给出了两种编码方式的编码译码的python实现 关键字:循环码,系统编码,卷积码,python,Viterbi算法 循环码的编码译码 设 \(C\ ...