千金良方:MySQL性能优化金字塔法则
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 简单安全加固

1.3.1 登录MySQL

MySQL 5.6.x初始化完成并启动之后,可以使用免密码的root用户登录MySQL,同时查看MySQL版本和登录用户是否是想要的结果。

[root@localhost mysql]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.35-log MySQL Community Server(GPL)
Copyright(c)2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help; ' or '\h' for help. Type '\c' to clear the current input statement.
# 查看当前登录用户
mysql> select user();
+----------------+
| user()        |
+----------------+
| root@localhost |
+----------------+
1 row in set(0.00 sec)
# 查看当前MySQL版本是否正确
mysql> select version();
+------------+
| version() |
+------------+
| 5.6.35-log |
+------------+
1 row in set(0.00 sec)

1.3.2 删除非root或非localhost的用户并修改root密码

在默认情况下,MySQL初始化完成之后,创建了一些默认用户:匿名用户、允许127.0.0.1和localhost登录的非root用户,建议删除这些无用且可能给数据库带来安全风险的用户。

提示:MySQL安全加固也可以使用命令行工具mysql_secure_installation,根据提示一步一步执行即可。

mysql> select user, host from mysql.user;
+------+------------------------+
| user | host                   |
+------+------------------------+
| root | 127.0.0.1              |
| root | ::1                    |
|      | localhost              |
| root | localhost              |
|      | localhost.localdomain  |
| root | localhost.localdomain  |
+------+------------------------+
6 rows in set(0.00 sec)
mysql> delete from mysql.user where user! ='root' or host! ='localhost';
Query OK, 5 rows affected(0.01 sec)
## 如果是MySQL 5.7.x 较新的版本或者8.0.x版本,则删除操作需要排除几个系统用户
mysql>DELETE FROM mysql.user WHERE user NOT IN('mysql.sys', 'mysql.session', 'mysqlxsys', 'root', 'mysql.infoschema')OR host NOT IN('localhost');
# 查看删除结果是否正确
mysql> select user, host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| root | localhost |
+------+-----------+
1 row in set(0.00 sec)
mysql> set password for 'root'@'localhost' = PASSWORD('admin');  #  MySQL 5.7.x 版本中可以不需要PASSWORD函数,直接使用明文密码也可以自动转换为加密格式密码写入mysql.user表中,且该用法将在后续版本中移除
Query OK, 0 rows affected(0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected(0.00 sec)
mysql>
# 重新使用新密码登录MySQL
[root@localhost mysql]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.6.35-log MySQL Community Server(GPL)
Copyright(c)2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help; ' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

1.3.3 删除test库,清理mysql.db表

在默认情况下,MySQL 5.6.x初始化安装之后会生成一个测试用途的test库,这个库在生产环境中一般不需要使用,如果确定不使用,请删除。

在默认情况下,MySQL 5.6.x初始化完成MySQL之后,在mysql.db库级别权限表中会有针对test库的任意用户、任意地址的访问权限,即:无任何权限用户或匿名用户登录到MySQL中都可以对test库进行任意操作。因此,建议MySQL完成初始化安装之后,清理这些不安全的用户或删除mysql.db表中对test库预设的访问权限。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set(0.00 sec)
mysql> drop database test;
Query OK, 0 rows affected(0.00 sec)
# 查看删除结果是否正确
mysql> show databases;
+--------------------+
| Database            |
+--------------------+
| information_schema |
| mysql               |
| performance_schema |
+--------------------+
3 rows in set(0.00 sec)
mysql> select * from mysql.db\G  # MySQL 5.7.x版本移除了test库之后,该库的权限也没有了,但增加了sys库,有对应的sys库的默认权限,所以5.7.x版本忽略清理该表
*************************** 1. row ***************************
                Host: %
                  Db: test
                User:
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
          Grant_priv: N
      References_priv: Y
          Index_priv: Y
          Alter_priv: Y
Create_tmp_table_priv: Y
    Lock_tables_priv: Y
    Create_view_priv: Y
      Show_view_priv: Y
  Create_routine_priv: Y
  Alter_routine_priv: N
        Execute_priv: N
          Event_priv: Y
        Trigger_priv: Y
*************************** 2. row ***************************
                Host: %
                  Db: test\_%
                User:
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: Y
            Drop_priv: Y
          Grant_priv: N
      References_priv: Y
          Index_priv: Y
          Alter_priv: Y
Create_tmp_table_priv: Y
    Lock_tables_priv: Y
    Create_view_priv: Y
      Show_view_priv: Y
  Create_routine_priv: Y
  Alter_routine_priv: N
        Execute_priv: N
          Event_priv: Y
        Trigger_priv: Y
2 rows in set(0.00 sec)
mysql> truncate mysql.db;
Query OK, 0 rows affected(0.00 sec)
## 如果是MySQL 5.7.x 较新的版本或者8.0.x版本,则清理操作需要排除几个系统用户
mysql>DELETE FROM mysql.db where user NOT IN('mysql.sys', 'mysql.session', 'mysqlxsys', 'root', 'mysql.infoschema')OR host NOT IN('localhost');
# 查看清理结果是否正确
mysql> select * from mysql.db\G
Empty set(0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected(0.00 sec)
mysql>

提示:MySQL 5.7.x版本移除了test库,因此也就不存在删除test库这个步骤了。但如果有使用test库的需要,则可自行创建。