文章背景

ubuntu 20.04 默认支持 mysql8 ,不支持 mysql5 。Ubuntu 20 apt源的 mysql server 的最新版本已更新到 mysql8.0.27 ,我们可以直接通过 apt 命令来安装!

image.png

顺带一提,某些 过时mysql 5 安装教程 中,也是通过 apt 命令来安装最新的 mysql 5.7.35 ,但在 Ubuntu 仓库更新到 mysql 8 之后,该类教程已经 失效 了。

mysql 5.7.35 默认只支持到 Ubuntu 18.04 , 还请读者注意,除非不得已,不要使用过时的版本。

基于安全考虑,本文还介绍了一些笔者用到的安全措施。

文章目标

  1. 换国内源+更新软件源;
  2. 使用 apt 命令安装 mysql-server ;
  3. auth_socket 身份验证机制;
  4. mysql 安全加固检查;
  5. 创建独立用户,允许远程访问,分配合理的权限;
  6. 开放远程访问之 bind-address 设置;
  7. 开放远程访问之防火墙放行 3306 端口。

详细步骤

1. 换国内源+更新软件源

Ubuntu 20.04.3 桌面版换源的两种方法

2. 使用 apt 命令安装 mysql-server

使用下面的命令直接安装 mysql-server

sudo apt update
sudo apt install mysql-server

安装完成后,mysql 服务会自动启动。使用 systemctl status 命令来查看 mysql 服务的状态。

image.png

好耶!安装成功~

3. auth_socket 身份验证机制

如同 Ubuntu 系统一般, mysql 的默认超级用户也是 root 。
在 mysql8 中,root 默认使用 auth_socket plugin 进行身份验证。

image.png

这种验证方式不要求输入密码,即使输入了密码也不验证,如下图。

image.png

这个特点让很多人觉得很不安全,实际仔细研究一下这种方式,还是安全的,因为它有另外两个限制:只能用 UNIX 的 socket 方式登陆,这就保证了只能本地登陆,用户在使用这种登陆方式时已经通过了操作系统的安全验证;操作系统的用户和 MySQL 数据库的用户名必须一致,例如你要登陆 MySQL 的 root 用户,必须用操作系统的 root 用户登陆。
(第二个限制存疑,笔者的超级用户不是 root ,但已然可以使用 auth_socket 插件登陆 root )

作为 mysql 官方推荐的身份验证插件,auth_socket 是足够安全的,为了安全考虑,我们不要修改其配置。

4. mysql 安全加固检查

运行 mysql_secure_installation 进行安全检查。

  • VALIDATE PASSWORD COMPONENT 密码检查组件(可选),测试用户密码强度,要求用户设置足够强的密码
  • Create Root Password 创建root密码
  • Remove Anonymous Users 移除匿名用户,在生产环境中应禁止匿名用户登陆
  • Disable Remote Root Login 禁止远程 Root 登陆
  • Remove Test Database 移除测试数据库,在生产环境中应移除
  • Reload Privilege Tables 重新加载权限表,让上面的修改立即生效

5. 创建独立用户,允许远程访问,分配一定的权限

虽然是在测试环境,但必要的安全措施还是要遵守的。
笔者创建一个独立用户用于 远程访问 ,理论上我们应设置远程访问的 ip白名单 ,mysql也提供了这个功能,但在本教程中不设置,读者如果有较高的安全需求,可以在防火墙和应用进行相应的设置。

首先,使用3中提到的 root + auth_socket 登陆 mysql 。

sudo mysql

image.png

创建 QingYan 数据库测试用。

CREATE DATABASE IF NOT EXISTS qingyan;

创建新用户 ninesun ,设置密码。

CREATE USER 'ninesun'@'%' IDENTIFIED BY '123456';

赋予它在任意主机上对 qingyan 数据库的所有权限。

GRANT ALL PRIVILEGES ON qingyan.* TO 'ninesun'@'%';

有的教程中,使用 grant 命令,一行命令可以创建用户并赋予权限,在 mysql 8 会报错,请按照先创建用户再分配权限,两步完成。

刷新权限表,我们的权限设置生效了!

FLUSH PRIVILEGES;

验证一下,使用组合键 ctrl + C 或输入 exit 退出当前用户,使用 ninesun 账户输入密码登陆。

mysql -u ninesun -p

使用下面的命令列出数据库,会发现 ninesun 只能看到 QingYaninformation_schema 两个数据库,这说明我们的设置生效了。

show databases;

image.png

6. 开放远程访问之 bind-address 设置

事实上,以上的步骤都是在 localhost 访问。
如果这时在远程访问,会发现,访问被拒绝。
这是因为 mysql的配置文件中 /etc/mysql/mysql.conf.d/mysqld.cnf bind-address127.0.0.1 换回地址,只会监听来自本地的请求,我们将其改为 0.0.0.0 ,监听所有来源的请求。

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

image.png

重启使配置生效。

service mysql restart

7. 开放远程访问之防火墙放行 3306 端口

笔者的服务器开启了 ufw 防火墙,需要放行 mysql 端口 3306 才能够在远程访问,如果不做这一步,会遇到 access deny 错误。

sudo ufw allow 3306

运行下面的命令,可以查看 ufw 的端口配置。

sudo ufw status

好耶!!!现在我们可以远程访问了!!

致谢

  1. How To Install & Secure MySQL Server on Ubuntu 20.04
  2. 故障分析 | 正确使用 auth_socket 验证插件
  3. MySQL auth_socket 验证插件的工作原理
  4. MySQL教程:MySQL数据库学习宝典(从入门到精通)
  5. MySQL 8.0.15版本,给用户分配访问权限提示 your MySQL server version for the right syntax to use near 'IDENTIFIED
  6. MySQL8 创建用户与授权

ninesun
16 声望2 粉丝