文章背景
ubuntu 20.04 默认支持 mysql8 ,不支持 mysql5 。Ubuntu 20 apt源的 mysql server 的最新版本已更新到 mysql8.0.27
,我们可以直接通过 apt
命令来安装!
顺带一提,某些 过时
的 mysql 5 安装教程
中,也是通过 apt
命令来安装最新的 mysql 5.7.35
,但在 Ubuntu
仓库更新到 mysql 8
之后,该类教程已经 失效
了。
mysql 5.7.35
默认只支持到 Ubuntu 18.04
, 还请读者注意,除非不得已,不要使用过时的版本。
基于安全考虑,本文还介绍了一些笔者用到的安全措施。
文章目标
- 换国内源+更新软件源;
- 使用 apt 命令安装 mysql-server ;
- auth_socket 身份验证机制;
- mysql 安全加固检查;
- 创建独立用户,允许远程访问,分配合理的权限;
- 开放远程访问之 bind-address 设置;
- 开放远程访问之防火墙放行 3306 端口。
详细步骤
1. 换国内源+更新软件源
2. 使用 apt 命令安装 mysql-server
使用下面的命令直接安装 mysql-server
。
sudo apt update
sudo apt install mysql-server
安装完成后,mysql 服务会自动启动。使用 systemctl status
命令来查看 mysql 服务的状态。
好耶!安装成功~
3. auth_socket 身份验证机制
如同 Ubuntu 系统一般, mysql 的默认超级用户也是 root 。
在 mysql8 中,root 默认使用 auth_socket plugin
进行身份验证。
这种验证方式不要求输入密码,即使输入了密码也不验证,如下图。
这个特点让很多人觉得很不安全,实际仔细研究一下这种方式,还是安全的,因为它有另外两个限制:只能用 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
创建 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
只能看到 QingYan
和 information_schema
两个数据库,这说明我们的设置生效了。
show databases;
6. 开放远程访问之 bind-address 设置
事实上,以上的步骤都是在 localhost 访问。
如果这时在远程访问,会发现,访问被拒绝。
这是因为 mysql的配置文件中 /etc/mysql/mysql.conf.d/mysqld.cnf
的 bind-address
为 127.0.0.1
换回地址,只会监听来自本地的请求,我们将其改为 0.0.0.0
,监听所有来源的请求。
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
重启使配置生效。
service mysql restart
7. 开放远程访问之防火墙放行 3306 端口
笔者的服务器开启了 ufw
防火墙,需要放行 mysql 端口 3306
才能够在远程访问,如果不做这一步,会遇到 access deny
错误。
sudo ufw allow 3306
运行下面的命令,可以查看 ufw
的端口配置。
sudo ufw status
好耶!!!现在我们可以远程访问了!!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。