[SQL] MariaDB & MySQL 用户和权限的管理 (转载)

MySQL用户管理和权限管理

在项目中,一个数据库有很多人需要使用,不能所有的人都使用相同的权限,如果人比较多,一人一个用户也很难管理。一般来说,会分超级管理员权限,管理员权限,读写权限,只读权限等,这样方便管理。当然,具体怎么管理权限根据实际情况来确定。

无论如何,都需要创建多个用户来管理权限。

root 是数据库的超级管理员用户,对于普通开发人员来说,权限太大了,如果不小心做了一些不可逆的操作,后果是非常严重的,并且还不容易查出责任人。

所以 root 用户不会让开发人员使用,一般会由 DBA 或运维人员统一管理,如果没有 DBA,统一由超级管理员 root 来分配。

1. 查看所有用户

MySQL 中所有的用户及权限信息都存储在默认数据库 mysql 的 user 表中。

进入 mysql 数据库,通过 desc user; 可以查看 user 表的结构。

    use mysql;
    desc user;

可以看到 user 中有40多个字段,字段非常多,只要关注主要字段就行了。

其中的主要字段有:

host: 允许访问的主机地址,localhost 为本机,% 为任何主机。
user: 用户名。
authentication_string: 加密后的密码值。

使用 select * from user; 查看 user 表中当前有哪些用户。

select host,user,authentication_string from user;

在安装 MySQL 后,有三个默认的用户。

2. 创建用户

使用 create user '用户名'@'访问主机' identified by '密码'; 创建用户。

create user 'admin'@'localhost' identified by 'Mysql!123';

创建用户后,查看用户,多了刚才创建的 admin,创建成功。

3. 查看用户权限

使用 show grants for '用户名'@'访问主机'; 查看用户的权限。

show grants for 'admin'@'localhost';

在创建用户的时候,如果没有指定权限,默认会赋予 USAGE 权限,这个权限很小,几乎为0,只有连接数据库和查询information_schema 数据库的权限。虽然 *.* 表示所有数据库的所有表,但因为 USAGE 的限制,不能操作所有数据库。

退出 root 用户,登录到 admin 用户,只能看到 information_schema 数据库。

4. 给用户授权

创建 admin 用户,目的是创建一个管理员,所以要给 admin 授权。退出 admin ,重新登录 root 。

在授权时,常用的权限有 CREATE、ALTER、DROP、INSERT、UPDATE、DELETE、SELECT,ALL PRIVILEGES 表示所有权限。

通过 数据库.数据表 指定对哪个数据库的哪个表授权,*.* 表示所有数据库中的所有表。

通过 '用户名'@'访问主机' 来表示用户可以从哪些主机登录, ‘%’ 表示可以从任何主机登录。

使用 grant 权限 on 数据库.数据表 to '用户名'@'访问主机' identified by '密码'; 来给数据库用户授权。

grant all privileges on *.* to 'admin'@'localhost' identified by 'Mysql!123';

给 admin 用户授权后,权限从 USAGE 变成了 ALL PRIVILEGES ,表示 admin 拥有了所有权限。

如果授权没有生效,记得刷新一下权限,使权限生效。

flush privileges;

再重新登陆到 admin 用户上,可以操作所有数据库了。

给用户授权的时候,必须要指定 '用户名'@'访问主机' 来指定用户。如果 '访问主机' 不相同,不是给用户授权,而是创建一个同名同密码的用户,这个用户与原用户可以登陆的主机不相同,权限不同。

grant all privileges on *.* to 'admin'@'%' identified by 'Mysql!123';

执行上面的语句后,user 表中有两个 admin 用户,用户名和密码都一样,但可以登陆的主机不一样。第一次创建的 admin 访问主机是 localhost,执行上面的语句时指定的访问主机是 % ,访问主机不一样,MySQL 会创建两个用户。虽然用户名密码相同,但这是两个不同的用户,两个用户的权限不一样。给两个用户指定不同的权限,在两个用户都有权限的主机登录时,局部用户的权限会覆盖全局用户的权限,当在 localhost 登录时,'admin'@'localhost' 的权限会覆盖 'admin'@'%' 的权限。

对于可以从任何主机登录的用户,在查看用户权限时,可以使用 show grants for 用户名; 来查看权限,指定主机的用户在查看权限时,要跟上访问主机才能查看权限。

5. 创建用户并授权

使用 grant 权限 on 数据库.数据表 to '用户名'@'访问主机' identified by '密码'; 来创建一个用户并指定权限,与上面授权使用的语句相同。

grant create,select on *.* to 'creater'@'%' identified by 'Mysql!123';

创建了一个有读写权限的用户 creater,这个用户拥有所有数据库的 SELECT 和 CREATE 权限,可以从任何主机登录数据库。

6. 修改用户的权限

使用 grant 权限 on 数据库.数据表 to '用户名'@'访问主机' identified by '密码'; 修改用户的权限,其实前面的授权就是修改权限。

grant all privileges on *.* to 'creater'@'%' identified by 'Mysql!123';

修改用户的权限后,creater 的权限从 SELECT 和 CREATE 权限变成了 ALL PRIVILEGES。

7. 删除用户

使用 drop user '用户名'@'访问主机'; 来删除用户。

drop user 'admin'@'localhost';

执行删除操作后,user 表中不再有该用户。

8. 修改用户名和访问主机

使用 rename user '用户名'@'访问主机' to '新用户名'@'新访问主机'; 来修改用户名和用户的访问主机。

rename user 'creater'@'%' to 'create'@'localhost';

修改之后,creater 用户改名 create ,访问主机从 % 变成了 localhost 。

9. 修改用户密码  

使用 set password for '用户名'@'访问主机' = password('新密码'); 修改用户的密码。

set password for 'create'@'localhost'=password('Mysql@123');

上面创建的 admin 用户和 create 用户密码相同,现在给 create 修改密码,使密码不一样。

以上就是对数据库用户和权限管理的基本操作。这些操作都是对 mysql 数据库中的 user 表进行操作,所以上面的大部分操作都还有另外一种方法,就是通过对 mysql.user 表的增删改查语句来实现。
————————————————
版权声明:本文为CSDN博主「Python碎片」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43790276/article/details/102674936

注明:所有转载内容皆直接从被转载文章网页的标题和内容的文本中复制而来

CC 4.0 BY-SA 版权协议网址:https://creativecommons.org/licenses/by-sa/4.0/deed.z

[SQL] MariaDB & MySQL 数据的查询 (转载)

MySQL基本查询语句

MySQL基本查询语句是掌握MySQL数据查询的基本操作,处理数据所必要掌握的,提高处理数据的能力,速度要熟练掌握基本的查询语句。

1.limit字句

select * from limit 3;查询前三条数据

select * from limit 5,3;查询从第5+1条开始的后三条数据

2.函数:平均数,总和,最大值,最小值和总信息数

平均数:select AVG(age) as 平均 from info;查询info表的平均年龄

总和:select SUM(age) as 年龄总和 from lx;查询lx表格的年龄的总和

最大值:select MAX(age) as 最大年龄 from lx; 查询lx表格里年龄的最大值

最小值:select MIN(age) as 最小年龄 from lx; 查询lx表格中的年龄的最小值

总信息数:select COUNT(*) as 总人数 from lx; 查询lx中的信息条数

3.where子句中的经常使用的运算符:比较运算符和逻辑运算符

比较运算符:
大于> 小于< 小于等于<= 大于等于>= 等于 = 不等于<> !=

区间 :between…and…
1.select age from student where age>=18 and age<=22;等价于
2.select age from student where age between 18 and 22;

查想查的信息:in
select age from student where age in(19,20,50);
查年龄是19.20.50的人

模糊查询:like
select age from student where name like ‘王%’; 查询姓王的人 %表示任意长度任意字符

不为空:is null

逻辑运算符:
同时成立:and。任一成立:or。不成立:not

4.笛卡尔积:
select 表1.name,表2.score from 表1 s(表1缩写),表2 g(表2缩写) where s.id = g.gradeId;

5.表连接
内连接:select s.name,g.score from student s inner join grade g on s.id=g.gradeId;

左外连接:select s.name,g.score from student s Left join grade g on s.id=g.gradeId

左外连接:select s.name,g.score from student s right join grade g on s.id=g.gradeId
————————————————
版权声明:本文为CSDN博主「我是超级小白」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lady88888888/article/details/103018101

注明:所有转载内容皆直接从被转载文章网页的标题和内容的文本中复制而来

CC 4.0 BY-SA 版权协议网址:https://creativecommons.org/licenses/by-sa/4.0/deed.z

[SQL] MariaDB & MySQL 表结构的修改 (转载)

MYSQL的修改表结构SQL语句:

-- 查看创表语句
SHOW CREATE TABLE t_login;

-- 查看表结构
desc t_login1;

-- 增加列
ALTER TABLE t_login1 ADD COLUMN COL_1 VARCHAR(10);

-- 修改列
ALTER TABLE t_login1 MODIFY COLUMN COL_1 INT(10);

-- 修改列名称
ALTER TABLE t_login1 CHANGE COL_1 COL_2 VARCHAR(50);

-- 删除列
ALTER TABLE t_login1 DROP COLUMN COL_2;

-- 修改整个表的字符集
ALTER TABLE t_login1 DEFAULT CHARACTER SET UTF8;

-- 修改某个字段的字符集
ALTER TABLE t_login1  CHANGE stu_num stu_num varchar(20) CHARACTER SET utf8;
————————————————
版权声明:本文为CSDN博主「h_j_c_123」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/h_j_c_123/article/details/95035434

注明:所有转载内容皆直接从被转载文章网页的标题和内容的文本中复制而来

CC 4.0 BY-SA 版权协议网址:https://creativecommons.org/licenses/by-sa/4.0/deed.z

[内容] MariaDB & MySQL 安全调优思路

内容目录:

内容一:数据库运行环境安全
1.1 保证运行数据库的系统是安全的
1.2 以最小权限用户运行数据库
1.2.1 停止数据库
1.2.2 修改数据库目录的
1.2.3 修改配置文件
1.2.4 启动数据库
1.3 将数据库版本升级到更新的版本

内容二:数据库库安全
2.1 删除所有不用的库
2.1.1 查看所有库的列表
2.1.2 删除测试库
2.2 删除所有测试库
2.2.1 方法一:手动删除所有测试库
2.2.1.1 查看所有库的列表
2.2.1.2 删除测试库
2.2.2 方法二:使用工具删除所有测试库
2.3 禁用客户端本地数据被读取
2.3.1 修改配置文件
2.3.2 重启数据库
2.4 保护数据的本地存储

内容三:数据库登陆安全
3.1 限制数据的导入导出
3.1.1 案例一:禁止数据的导入导出
3.1.1.1 修改配置文件
3.1.1.2 重启数据库
3.1.2 案例二:只允许将数据从 /root 目录导入或导出到 /root 目录
3.1.2.1 修改配置文件
3.1.2.2 重启数据库
3.1.3 案例三:不对数据作出导入和导出的限制
3.1.3.1 修改配置文件
3.1.3.2 重启数据库
3.2 删除无用和不需要的用户
3.2.1 查看所有用户
3.2.2 删除不需要的用户
3.2.2.1 删除用户的第一种方法:使用 drop 命令删除用户
3.2.2.2 删除用户的第二中方法:使用 delete 命令删除用户
3.3 强制用户使用强密码
3.3.1 修改配置文件
3.3.2 重启数据库
3.3.3 确保 validate_password_policy 被设置的参数是 MEDIUM
3.3.3.1 进入数据库
3.3.3.2 查看 validate_password_policy 参数
3.4 设置用户密码有效期
3.4.1 对于 MariaDB 和 MySQL5.7 及以下的版本无法设置有效期,只能定期修改密码
3.4.2 设置用户默认有效期的方法
3.4.2.1 修改用户密码默认的自动过期时间
3.4.2.2 让用户密码立刻过期
3.4.2.3 让用户密码永不过期
3.5 删除无密码用户
3.5.1 方法一:手动删除无密码用户
3.5.1.1 查看无密码用户
3.5.1.1.1 MariaDB 和 MySQL 5.7 及以下版本查看无密码用户的方法
3.5.1.1.2 MySQL 8.0 及以上版本查看无密码用户的方法
3.5.1.2 手动删除不需要的用户的方法
3.5.1.2.1 手动删除用户的第一种方法:使用 drop 命令删除用户
3.5.1.2.2 手动删除用户的第二种方法:使用 delete 命令删除用户
3.5.2 方法二:使用工具删除无密码用户
3.6 禁止非 root 用户 拥有 mysql.user 表访问权限
3.7 让用户只拥有最小但够用的权限
3.7.1 查看所有用户
3.7.2 数据库权限层级
3.7.3 查看每一个用户的权限
3.7.4 删除用户多余的权限

内容四:数据库网络安全
4.1 禁止或者限制远程登陆
4.1.1 禁止远程登陆
4.1.1.1 通过 MariaDB & MySQL 的配置文件禁止远程登录
4.1.1.1.1 修改配置文件
4.1.1.1.2 重启数据库
4.1.1.2 通过防火墙禁止远程登录
4.1.2 如果非要进行远程登录则要限制远程登录
4.1.2.1 限制访问数据库 TCP 端口的具体 IP 地址
4.1.2.2 禁止有较大权限的用户被远程登陆
4.2 对网络数据进行加密传输
4.2.1 生成 SSL
4.2.1.1 创建 CA 证书
4.2.1.2 创建服务端证书,并去除加密,并使用刚刚的 CA 证书进行签名
4.2.1.3 创建客户端证书,并去除加密,并使用刚刚的 CA 证书进行签名
4.2.1.4 对生成的证书进行验证
4.2.2 将 SSL 添加到 MariaDB & MySQL
4.2.2.1 将 SSL 放在指定的位置
4.2.2.2 修改配置文件
4.2.3 重启数据库
4.2.4 验证 SSL
4.2.4.1 查看 have_ssl 和 ssl 变量
4.2.4.2 查看 SSL 的状态
4.2.5 确保所有数据库用户使用 SSL
4.2.6 用户通过 SSL 连接数据库的方法

内容五:开启审计
5.1 开启审计
5.1.1 MariaDB 和 MySQL 5.7 开启审计的方法
5.1.2 MySQL 8.0 开启审计的方法
5.2 查看 MariaDB & MySQL 日志

具体的内容:

内容一:数据库运行环境安全
1.1 保证运行数据库的系统是安全的

(步骤略)

1.2 以最小权限用户运行数据库
1.2.1 停止数据库

# systemctl stop mariadb

(补充:这里以停止 MariaDB 数据库为例)

1.2.2 修改数据库目录的

# chown -R mysql /var/lib/mysql

(补充:MariaDB&MySQL 数据库数据默认存放位置是 /var/lib/mysql)

1.2.3 修改配置文件

# vim /etc/my.cnf

在:

......
[mysqld]

下面添加:

user=mysql
......

(补充:这里以 MariaDB 数据库的配置文件是 /etc/my.cnf 为例)

1.2.4 启动数据库

# systemctl start mariadb

(补充:这里以启动 MariaDB 数据库为例)

1.3 将数据库版本升级到更新的版本

(步骤略)

内容二:数据库库安全
2.1 删除所有不用的库
2.1.1 查看所有库的列表

> show databases;

2.1.2 删除测试库

> drop database <database>

2.2 删除所有测试库
2.2.1 方法一:手动删除所有测试库
2.2.1.1 查看所有库的列表

> show databases;

2.2.1.2 删除测试库

> drop database <database>

2.2.2 方法二:使用工具删除所有测试库

# sudo mysql_secure_installation

2.3 禁用客户端本地数据被读取
2.3.1 修改配置文件

# vim /etc/my.cnf

在:

......
[mysqld]

下面添加:

local-infile=0
......

(补充:这里以 MariaDB 数据库的配置文件是 /etc/my.cnf 为例)

(注意:此参数对 MariaDB 数据库无效)

2.3.2 重启数据库

# systemctl restart mariadb

(补充:这里以重启 MariaDB 数据库为例)

2.4 保护数据的本地存储

思路如下:
1) 使用加密的文件系统存储存放数据库的数据文件
2) 使用数据库之外的存储加密产品
3) 使用其他加密产品实现适当的数据保护

内容三:数据库登陆安全
3.1 限制数据的导入导出
3.1.1 案例一:禁止数据的导入导出
3.1.1.1 修改配置文件

# vim /etc/my.cnf

在:

......
[mysqld]

下面添加:

secure_file_priv=null
...... 

(补充:这里以 MariaDB 数据库的配置文件是 /etc/my.cnf 为例)

(注意:此参数对 MariaDB 数据库无效)

3.1.1.2 重启数据库

# systemctl restart mariadb

(补充:这里以重启 MariaDB 数据库为例)

3.1.2 案例二:只允许将数据从 /root 目录导入或导出到 /root 目录
3.1.2.1 修改配置文件

# vim /etc/my.cnf

在:

......
[mysqld]

下面添加:

secure_file_priv=/root/
...... 

(补充:这里以 MariaDB 数据库的配置文件是 /etc/my.cnf 为例)

(注意:此参数对 MariaDB 数据库无效)

3.1.2.2 重启数据库

# systemctl restart mariadb

(补充:这里以重启 MariaDB 数据库为例)

3.1.3 案例三:不对数据作出导入和导出的限制
3.1.3.1 修改配置文件

# vim /etc/my.cnf

删除以下内容:

......
secure_file_priv=*
...... 

(补充:这里以 MariaDB 数据库的配置文件是 /etc/my.cnf 为例)

(注意:此参数对 MariaDB 数据库无效)

3.1.3.2 重启数据库

# systemctl restart mariadb

(补充:这里以重启 MariaDB 数据库为例)

3.2 删除无用和不需要的用户
3.2.1 查看所有用户

> select user,host from mysql.user;

3.2.2 删除不需要的用户
3.2.2.1 删除用户的第一种方法:使用 drop 命令删除用户

> drop <user>;

3.2.2.2 删除用户的第二中方法:使用 delete 命令删除用户

> delete from mysql.user where user='<user>' and host='<host>';

3.3 强制用户使用强密码
3.3.1 修改配置文件

# vim /etc/my.cnf

在:

......
[mysqld]

下面添加:

plugin-load=validate_password.so
......

(补充:这里以 MariaDB 数据库的配置文件是 /etc/my.cnf 为例)

3.3.2 重启数据库

# systemctl restart mariadb

(补充:这里以重启 MariaDB 数据库为例)

3.3.3 确保 validate_password_policy 被设置的参数是 MEDIUM
3.3.3.1 进入数据库

# mysql -p

3.3.3.2 查看 validate_password_policy 参数

> show variables like 'validate_password_policy';
+--------------------------+--------+
| Variable_name            | Value  |
+--------------------------+--------+
| validate_password.policy | MEDIUM |
| validate_password_policy | MEDIUM |
+--------------------------+--------+
2 rows in set (0.01 sec)

(补充:MEDIUM 的含义是密码最小的长度是 8 ,并且必须要有一个特殊字符和一个数字)

3.4 设置用户密码有效期
3.4.1 对于 MariaDB 和 MySQL 5.7 及以下的版本无法设置有效期,只能定期修改密码

> alter user 'root'@'localhost' identified by '<password>';

3.4.2 设置用户默认有效期的方法
3.4.2.1 修改用户密码默认的自动过期时间

> set global default_password_lifetime=<number>;

(补充:这里的数字代表天数)

3.4.2.2 让用户密码立刻过期

> aleter user '<user>'@'<host>' password expire;

3.4.2.3 让用户密码永不过期

> aleter user '<user>'@'<host>' password expire never;

(补充:建议普通用户每 90 天修改一次密码,敏感用户每 30 天修改一次密码,服务用户每 365 天修改一次密码)

3.5 删除无密码用户
3.5.1 方法一:手动删除无密码用户
3.5.1.1 查看无密码用户
3.5.1.1.1 MariaDB 和 MySQL 5.7 及以下版本查看无密码用户的方法

> select user, host, password from mysql.user;

3.5.1.1.2 MySQL 8.0 及以上版本查看无密码用户的方法

> select user, host, authentication_string from mysql.user;

3.5.1.2 手动删除不需要的用户的方法
3.5.1.2.1 手动删除用户的第一种方法:使用 drop 命令删除用户

> drop user <user>;

3.5.1.2.2 手动删除用户的第二种方法:使用 delete 命令删除用户

> delete from mysql.user where user='<user>' and host='<host>';

3.5.2 方法二:使用工具删除无密码用户

# sudo mysql_secure_installation

3.6 禁止非 root 用户 拥有 mysql.user 表访问权限

> show grants for root@localhost \G;
> select * from mysql.user where user='test' \G;

3.7 让用户只拥有最小但够用的权限
3.7.1 查看所有用户

> select user,host from mysql.user;

3.7.2 数据库权限层级

1) 全局层级权限:是指整个数据库级别的权限,存储在 mysql.user 表中
格式:

> grant all on *.* ......
> show grants for <user>;
> select * from mysql.user where user='<user>'\G;

2) 库级层级权限:是指数据库中某个库的权限,存储在 mysql.db 和 mysql.host 表中
格式:

> grant all on <database>.* ......
> show grants for <user>;
> select * from mysql.db where user='<user>'\G;

3) 表级层级权限:是指数据库中某个库的某个表的权限,存储在 mysql.tables_priv 表中
格式:

> grant all on <database>.<table> ......
> show grants for <user>;
> select * from mysql.tables_priv where user='<user>'\G;

4) 列级层级权限:是指数据库中某个库的某个表的某一单列的权限,存储在 mysql.columns_priv 表中
格式:

> grant select(<field>,<field>) on <database>.<table> ......
> show grants for <user>;
> select * from mysql.columns_priv where user='<user>'\G;

5) 子程序层级权限:适用于已存储的子程序
create routing, alter routing, execute 和 grant 权限适用于已存储的子程序
create routing, alter routing, execute 和 grant 权限可以被授予为全局层级和数据库层级
alter routing, execute 和 grant 权限可以被授予为子程序层级,并存储在 mysql.procs_priv 表中
格式:

> grant execute on <subroutine> <database>.<table> ......
> show grants for <user>;
> select * from mysql.procs_priv where user='<user>'\G;

3.7.3 查看每一个用户的权限

> show grants for '<user>'@'<host>';

3.7.4 删除用户多余的权限

如果有全局权限(如: FILE,PROCESS,SUPER, or SHUTDOWN 等权限),就删除这些权限
格式:

> revoke <privilege> on *.* from <user>@<host>;
> flush privileages;

内容四:数据库网络安全
4.1 禁止或者限制远程登陆

(步骤略)

(
补充:
查看可以远程登录的用户的案例

> select user, host from mysql.user where host not in ('::1','127.0.0.1','localhost');

4.1.1 禁止远程登陆
4.1.1.1 通过 MariaDB & MySQL 的配置文件禁止远程登录
4.1.1.1.1 修改配置文件

# vim /etc/my.cnf

在:

......
[mysqld]

下面添加:

skip-networking
bind-address=127.0.0.1
......

(补充:这里以 MariaDB 数据库的配置文件是 /etc/my.cnf 为例)

(注意:加入 skip-networking 这一行会让 MariaDB&MySQL 不再使用和监听任何端口)

4.1.1.1.2 重启数据库

# systemctl restart mariadb

(补充:这里以重启 MariaDB 数据库为例)

4.1.1.2 通过防火墙禁止远程登录
4.1.2 如果非要进行远程登录则要限制远程登录
4.1.2.1 限制访问数据库 TCP 端口的具体 IP 地址

(步骤略)

(补充:MariaDB&MySQL 数据库的默认端口号是 3306)

4.1.2.2 禁止有较大权限的用户被远程登陆

1) 有 grant option 权限的用户
2) 被给予了全局权限像是 grant all on . 权限的用户
3) 一个可以访问 mysql.user 表的用户

4.2 对网络数据进行加密传输
4.2.1 生成 SSL
4.2.1.1 创建 CA 证书

# openssl genrsa 2048 > ca-key.pem
Generating RSA private key, 2048 bit long modulus
..+++
...................................+++
e is 65537 (0x10001)

# openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:ca
Email Address []:

(注意:创建 CA 证书、服务端证书、客户端证书时 Common Name 必须要有值,且必须相互不一样)

4.2.1.2 创建服务端证书,并去除加密,并使用刚刚的 CA 证书进行签名

# openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
Generating a 2048 bit RSA private key
.............+++
...+++
writing new private key to 'server-key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

# openssl rsa -in server-key.pem -out server-key.pem
writing RSA key

# openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
Signature ok
subject=/C=XX/L=Default City/O=Default Company Ltd
Getting CA Private Key

(注意:创建 CA 证书、服务端证书、客户端证书时 Common Name 必须要有值,且必须相互不一样)

4.2.1.3 创建客户端证书,并去除加密,并使用刚刚的 CA 证书进行签名

# openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
Generating a 2048 bit RSA private key
..................+++
..............................................+++
writing new private key to 'client-key.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

# openssl rsa -in client-key.pem -out client-key.pem
writing RSA key

# openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
Signature ok
subject=/C=XX/L=Default City/O=Default Company Ltd
Getting CA Private Key

4.2.1.4 对生成的证书进行验证

# openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
server-cert.pem: OK
client-cert.pem: OK

4.2.2 将 SSL 添加到 MariaDB & MySQL
4.2.2.1 将 SSL 放在指定的位置

# mv ca.pem /home/mysql/sslconfig/ca.pem
# mv server-cert.pem /home/mysql/sslconfig/server-cert.pem
# mv server-key.pem /home/mysql/sslconfig/server-key.pem

4.2.2.2 修改配置文件

# vim /etc/my.cnf

在:

......
[mysqld]

下面添加:

ssl-ca=/home/mysql/sslconfig/ca.pem
ssl-cert=/home/mysql/sslconfig/server-cert.pem
ssl-key=/home/mysql/sslconfig/server-key.pem
......

(补充:这里以 MariaDB 数据库的配置文件是 /etc/my.cnf 为例)

4.2.3 重启数据库

# systemctl restart mariadb

(补充:这里以重启 MariaDB 数据库为例)

4.2.4 验证 SSL
4.2.4.1 查看 have_ssl 和 ssl 变量

> show variables like 'have_%ssl';
> show variables like '%ssl%';

(补充:如果它们的参数为 yes ,表示服务端已经开启 SSL)

4.2.4.2 查看 SSL 的状态

> show status like 'ssl_cipher'

(补充:如果出现 “SSL:Cipher in use is DHE-RSA-AES256-SHA“ 则表示客户端已经使用 SSL 连接了)

4.2.5 确保所有数据库用户使用 SSL

> grant usage on <database>.<table> to '<user>'@'<host>' reouter ssl;

4.2.6 用户通过 SSL 连接数据库的方法

> mysql -u <user> -p -h <host> --ssl-ca=/home/mysql/sslconfig/ca.pem

内容五:开启审计
5.1 开启审计
5.1.1 MariaDB 和 MySQL 5.7 及以下版本开启审计的方法

> set global log_warning=2;

5.1.2 MySQL 8.0 及以上版本开启审计的方法

> set global general_log = on;
> set global log_timestamps = SYSTEM;

5.2 查看 MariaDB & MySQL 日志

# find /I "Access denied for user" <logfile_name>.log
# grep -i 'Access denied for user' <logfile_name>.log

(补充:中止连接、失败连接、尝试连接都将被写进日志)

[步骤] MariaDB & MySQL root 密码的重置

注意:

在重置 MariaDB & MySQL 的 root 密码之前要先安装 MariaDB & MySQL

正文:

步骤目录:

步骤一:免密进入数据库
1.1 在 MariaDB&MySQL 文件中添加免密登录参数
1.2 使修改的配置生效
1.2.1 MariaDB 使修改的配置生效
1.2.2 MySQL 使修改的配置生效

步骤二:将 root 密码设置为空
2.1 不使用密码进入数据库
2.2 清空 root 用户密码
2.2.1 MariaDB 和 MySQL 5.7 及以下的版本将 root 密码设置为空
2.2.2 MySQL 8.0 及以上的版本将 root 密码设置为空
2.3 退出数据库

步骤三:给 root 设置新密码
3.1 在 MariaDB&MySQL 文件中将免密登录参数注释掉
3.2 使修改的配置生效
3.2.1 MariaDB 使修改的配置生效
3.2.2 MySQL 使修改的配置生效
3.3 进入数据库
3.4 给 root 设置新密码
3.5 退出数据库

具体的操作步骤:

步骤一:免密进入数据库
1.1 在 MariaDB&MySQL 文件中添加免密登录参数

# vim /etc/my.cnf

将部分内容修改如下:

......
[mysqld]
skip-grant-tables
......

1.2 使修改的配置生效
1.2.1 MariaDB 使修改的配置生效

# systemctl restart mariadb

(注意:只有当重置 MariaDB 的时候才执行这一步)

1.2.2 MySQL 使修改的配置生效

# systemctl restart mysqld

(注意:只有当重置 MariaDB 的时候才执行这一步)

步骤二:将 root 密码设置为空
2.1 不使用密码进入数据库

# mysql -u root -p

(补充:当提示输入密码时直接敲回车)

2.2 清空 root 用户密码
2.2.1 MariaDB 和 MySQL 5.7 及以下的版本将 root 密码设置为空

> update mysql.user set password='' where user='root';

(注意:只有当是重置 MariaDB 和 MySQL 5.7 及以下版本密码的时候才需要执行这一步)

2.2.2 MySQL 8.0 及以上的版本将 root 密码设置为空

> update mysql.user set authentication_string='' where user='root';

(注意:只有当是重置 MySQL 8.0 及以上版本密码的时候才需要执行这一步)

2.3 退出数据库

> quit;

步骤三:给 root 设置新密码
3.1 在 MariaDB&MySQL 文件中将免密登录参数注释掉

# vim /etc/my.cnf

将部分内容修改如下:

......
[mysqld]
# skip-grant-tables
......

3.2 使修改的配置生效
3.2.1 MariaDB 使修改的配置生效

# systemctl restart mariadb

(注意:只有当重置 MariaDB 的时候才执行这一步)

3.2.2 MySQL 使修改的配置生效

# systemctl restart mysqld

(注意:只有当重置 MySQL 的时候才执行这一步)

3.3 进入数据库

> mysql -u root -p

(补充:当提示输入密码时直接敲回车)

3.4 给 root 设置新密码

> alter user 'root'@'localhost' identified by '<password>';

3.5 退出数据库

> quit;