mysql 安全和用户权限

本文详细介绍了MySQL的密码过期策略、安全配置,包括密码错误锁定、密码复杂度设置,以及用户权限管理,包括权限级别、权限解释和权限修改。此外,还讨论了限制用户资源使用、修改用户密码和账户锁定的方法,最后提到了重命名或禁用默认账户以及超级账户的分离策略。

1、配置密码最长有效期为90天。
查看:show variables like 'default_password_lifetime';

mysql> show variables like 'default_password_lifetime';
+---------------------------+-------+
| Variable_name             | Value |
+---------------------------+-------+
| default_password_lifetime | 60    |
+---------------------------+-------+
1 row in set (0.01 sec)

mysql>

修改:set global default_password_lifetime=90;     设置90天过期

设置系统参数default_password_lifetime作用于所有的用户账户
设置MySQL用户密码过期策略
default_password_lifetime=180 设置180天过期
default_password_lifetime=0 设置密码不过期 
如果为每个用户设置了密码过期策略,则会覆盖上述系统参数

ALTER USER 'mytest'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
ALTER USER 'mytest'@'localhost' PASSWORD EXPIRE NEVER; 密码不过期
ALTER USER 'mytest'@'localhost' PASSWORD EXPIRE DEFAULT; 默认过期策略
  

手动强制设置某个用户密码过期

ALTER USER 'mytest'@'localhost' PASSWORD EXPIRE;

2、密码安全配置
配置密码错误n次后锁定账户30分钟;建议设置登录无操作30分钟后自动退出;登陆失败
安装安全插件:

INSTALL PLUGIN CONNECTION_CONTROL SONAME 'connection_control.so';
INSTALL PLUGIN CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS SONAME 'connection_control.so';


查看:

show variables like "connection_control%";
+-------------------------------------------------+------------+
| Variable_name                                   | Value      |
+-------------------------------------------------+------------+
| connection_control_failed_connections_threshold | 3          |
| connection_control_max_connection_delay         | 2147483647 |
| connection_control_min_connection_delay         | 1000       |
+-------------------------------------------------+------------+

参数含义:
connection_control_failed_connections_threshold:单个用户登录失败(由于密码错误引起)次数上限,默认3次
connection_control_max_connection_delay:失败上限之后再次尝试登录前最小等待时间,单位ms
connection_control_min_connection_delay:失败上限之后再次尝试登录前最小等待时间,默认1秒(1000ms)
上述3个参数均可以利用 set global 的方式在线修改。

mysql> set global connection_control_failed_connections_threshold=5;
mysql> set global connection_control_max_connection_delay=214748364;
mysql> set global connection_control_min_connection_delay=2000;
mysql> show variables like "connection_control%";
+-------------------------------------------------+-----------+
| Variable_name                                   | Value     |
+-------------------------------------------------+-----------+
| connection_control_failed_connections_threshold | 5         |
| connection_control_max_connection_delay         | 214748364 |
| connection_control_min_connection_delay         | 2000      |
+-------------------------------------------------+-----------+
3 rows in set (0.01 sec)

mysql>

密码复杂度,安装插件:install plugin validate_password soname 'validate_password.so';
查看已经安装的插件:

mysql> SELECT * from mysql.`plugin`;
+------------------------------------------+-----------------------+
| name                                     | dl                    |
+------------------------------------------+-----------------------+
| CONNECTION_CONTROL                       | connection_control.so |
| CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS | connection_control.so |
| validate_password                        | validate_password.so  |
+------------------------------------------+-----------------------+
3 rows in set (0.06 sec)

mysql>


查看是否启用:

mysql> show plugins;
+------------------------------------------+----------+--------------------+-----------------------+---------+
| Name                                     | Status   | Type               | Library               | License |
+------------------------------------------+----------+--------------------+-----------------------+---------+
| validate_password                        | ACTIVE   | VALIDATE PASSWORD  | validate_password.so  | GPL     |
| CONNECTION_CONTROL                       | ACTIVE   | AUDIT              | connection_control.so | GPL     |
| CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS | ACTIVE   | INFORMATION SCHEMA | connection_control.so | GPL     |
+------------------------------------------+----------+--------------------+-----------------------+---------+


查看默认策略:

mysql> show variables like 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password_check_user_name    | OFF    |
| validate_password_dictionary_file    |        |
| validate_password_length             | 8      |
| validate_password_mixed_case_count   | 1      |
| validate_password_number_count       | 1      |
| validate_password_policy             | MEDIUM |
| validate_password_special_char_count | 1      |
+--------------------------------------+--------+


修改策略:
set global validate_password_length = 16;

各项参数介绍:
validate_password_policy:密码安全策略,默认MEDIUM策略

策略                检查规则
0 or LOW            Length
1 or MEDIUM            Length; numeric, lowercase/uppercase, and special characters
2 or STRONG            Length; numeric, lowercase/uppercase, and special characters; dictionary file

validate_password_dictionary_file:密码策略文件,策略值为STRONG时才需要

validate_password_length:密码最少的长度 

validate_password_mixed_case_count:大小写字符长度,至少1个

validate_password_number_count :数字至少1个

validate_password_special_char_count:特殊字符至少1个

卸载插件sql:
mysql> UNINSTALL PLUGIN validate_password;

连接超时相关的两个参数interactive_timeout和wait_timeout
(1)interactive_timeout针对交互式连接,wait_timeout针对非交互式连接。所谓的交互式连接,即在mysql_real_connect()函数中使用了CLIENT_INTERACTIVE选项。
通过mysql客户端连接数据库是交互式连接,通过jdbc连接数据库是非交互式连接。
interactive_timeout:交互式连接超时时间(mysql工具、mysqldump等)
wait_timeout:非交互式连接超时时间,默认的连接mysql api程序,jdbc连接数据库等

(2)如何设置和查看:

mysql> set global interactive_timeout=1800;
mysql> set global wait_timeout=300;

mysql> show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  | 300   |
+---------------+-------+
1 row in set (0.00 sec)

mysql> show global variables like 'interactive_timeout';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| interactive_timeout | 1800 |
+---------------------+-------+
1 row in set (0.00 sec)

mysql>

3、限制默认账户的默认权限。
mysql 中控制权限的表,分别是mysql.user、mysql.db、mysql.tables_priv、mysql.columns_priv ;
user表:存放用户账户信息以及全局级别(所有数据库)权限,决定了来自哪些主机的哪些用户可以访问数据库实例,如果有全局权限则意味着对所有数据库都有此权限 ;
db表:存放数据库级别的权限,决定了来自哪些主机的哪些用户可以访问此数据库 ;
tables_priv表:存放表级别的权限,决定了来自哪些主机的哪些用户可以访问数据库的这个表 ;
columns_priv表:存放列级别的权限,决定了来自哪些主机的哪些用户可以访问数据库表的这个字段 ;
procs_priv表:存放存储过程和函数级别的权限。

最重要的还是user表
3.1 mysql权限表的校验过程是:
(1) 先从user表中的Host,User,Password这3个字段中判断当前连接的ip、用户名、密码是否匹配,对应匹配则通过验证。

(2)通过身份认证后,进行权限分配,按照user,db,tables_priv,columns_priv的顺序进行验证。即先检查全局权限表user,
如果user中对应的权限为Y,则此用户对所有数据库的权限都为Y,将不再检查db表, tables_priv表,columns_priv表;如果为N,
则到db表中检查此用户对应的具体数据库,并得到db中为Y的权限;如果db中为N,则检查tables_priv中此数据库对应的具体表,
取得表中的权限Y,以此循序校验。
3.2 mysql 的权限级别分为:
全局性的管理权限: 作用于整个实例级别 
数据库级别的权限: 作用于指定的数据库上 
数据库对象级别的权限:作用于指定的数据库对象上(表、视图等)。3.3 查看具体用户权限

mysql> select user,host from mysql.user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| root          | %         |
| erika         | localhost |
| mysql.session | localhost |
| mysql.sys     | localhost |
+---------------+-----------+
mysql> show grants for erika@localhost;
+-------------------------------------------+
| Grants for erika@localhost                |
+-------------------------------------------+
| GRANT USAGE ON *.* TO 'erika'@'localhost' |
+-------------------------------------------+
mysql> show create user erika@localhost;
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE USER for erika@localhost                                                                                                                                    |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| CREATE USER 'erika'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*3A854BE883C1C8D720E94A7B4929887F4918CB9E' REQUIRE NONE PASSWORD EXPIRE ACCOUNT UNLOCK |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.06 sec)

mysql>


3.4 具体权限解释
All/All Privileges 权限代表全局或者全数据库对象级别的所有权限
Alter 权限代表允许修改表结构的权限,但必须要求有create和insert权限配合。如果是rename表名,则要求有alter和drop原表, create和insert新表的权限;

Alter routine 权限代表允许修改或者删除存储过程、函数的权限;

Create 权限代表允许创建新的数据库和表的权限;

Create routine 权限代表允许创建存储过程、函数的权限;

Create tablespace 权限代表允许创建、修改、删除表空间和日志组的权限;

Create temporary tables 权限代表允许创建临时表的权限;

Create user 权限代表允许创建、修改、删除、重命名user的权限;

Create view 权限代表允许创建视图的权限;

Delete 权限代表允许删除行数据的权限;

Drop权 限代表允许删除数据库、表、视图的权限,包括truncate table命令;

Event 权限代表允许查询,创建,修改,删除MySQL事件;

Execute 权限代表允许执行存储过程和函数的权限;

File 权限代表允许在MySQL可以访问的目录进行读写磁盘文件操作,可使用的命令包括load data infile,select … into outfile,load file()函数;

Grant option 权限代表是否允许此用户授权或者收回给其他用户你给予的权限,重新付给管理员的时候需要加上这个权限;

Index 权限代表是否允许创建和删除索引;

Insert 权限代表是否允许在表里插入数据,同时在执行analyze table,optimize table,repair table语句的时候也需要insert权限;

Lock 权限代表允许对拥有select权限的表进行锁定,以防止其他链接对此表的读或写;

Process 权限代表允许查看MySQL中的进程信息,比如执行show processlist, mysqladmin processlist, show engine等命令;

Reference 权限是在5.7.6版本之后引入,代表是否允许创建外键;

Reload 权限代表允许执行flush命令,指明重新加载权限表到系统内存中,refresh命令代表关闭和重新开启日志文件并刷新所有的表;

Replication client 权限代表允许执行show master status,show slave status,show binary logs命令;

Replication slave 权限代表允许slave主机通过此用户连接master以便建立主从复制关系;

Select 权限代表允许从表中查看数据,某些不查询表数据的select执行则不需要此权限,如Select 1+1, Select PI()+2;而且select权限在执行update/delete语句中含有where条件的情况下也是需要的;

Show databases 权限代表通过执行show databases命令查看所有的数据库名;

Show view 权限代表通过执行show create view命令查看视图创建的语句;

Shutdown 权限代表允许关闭数据库实例,执行语句包括mysqladmin shutdown;

Super 权限代表允许执行一系列数据库管理命令,包括kill强制关闭某个连接命令, change master to创建复制关系命令,以及create/alter/drop server等命令;

Trigger 权限代表允许创建,删除,执行,显示触发器的权限;

Update 权限代表允许修改表中的数据的权限;

Usage 权限是创建一个用户之后的默认权限,其本身代表连接登录权限。

3.5 修改用户权限
(1)云rds实例,可以直接再控制台界面修改,用户具体权限。
(2)自建库环境再SQL执行授权
执行Grant,revoke,set password,rename user命令修改, MySQL会自动将修改后的权限信息同步加载到系统内存中

若执行insert/update/delete操作上述的系统权限表之后,则必须再执行刷新权限命令才能同步到系统内存中,
刷新权限命令包括: flush privileges/mysqladmin flush-privileges / mysqladmin reload

若是修改tables和columns级别的权限,则客户端的下次操作新权限就会生效

若是修改database级别的权限,则新权限在客户端执行use database命令后生效

若是修改global级别的权限,则需要重新创建连接新权限才能生效

若是修改global级别的权限,则需要重新创建连接新权限才能生效 (例如修改密码)

3.6 限制用户资源的使用
MAX_QUERIES_PER_HOUR 用来限制用户每小时运行的查询数量
grant select on *.* to 'mytest'@'localhost' identified by '123456' with max_queries_per_hour 5;
MAX_UPDATES_PER_HOUR 用来限制用户每小时的修改数据库数据的数量。
mysql> grant select on *.* to 'mytest'@'localhost' with max_updates_per_hour 5;
MAX_CONNECTIONS_PER_HOUR用来控制用户每小时打开新连接的数量。
mysql> grant select on *.* to 'mytest'@'localhost' with max_connections_per_hour 5;
MAX_USER_CONNECTIONS 限制有多少用户连接MYSQL服务器。
mysql> grant select on *.* to 'mytest'@'localhost' with max_user_connections 2;
将所有账户当前的记数重设为零,可以执行FLUSH USER_RESOURCES语句。还可以通过重载授权表来重设记数。
mysql> flush user_resources;

3.7 mysql 修改用户密码
修改用户密码的方式有:

mysql> ALTER USER 'mytest'@'localhost' IDENTIFIED BY 'mypass';
mysql> SET PASSWORD FOR 'mytest'@'localhost' = PASSWORD('mypass');
mysql> GRANT USAGE ON *.* TO 'mytest'@'localhost' IDENTIFIED BY 'mypass';
shell# mysqladmin -u user_name -h host_name password "new_password"


修改当前会话本身用户密码的方式包括:

mysql> ALTER USER USER() IDENTIFIED BY 'mypass';
mysql> SET PASSWORD = PASSWORD('mypass');

3.8 mysql 用户 lock
通过执行create user/alter user命令中带account lock/unlock子句设置用户的lock状态
Create user语句默认的用户是unlock状态

# 创建的时候给用户锁定

mysql> create user mytest@localhost identified by 'mysql' account lock;


Alter user语句默认不会修改用户的lock/unlock状态

# 修改用户为unlock

mysql> alter user mytest@'localhost' account unlock;

4、重命名或禁用默认账户。
重命名:root是默认的账号

mysql> use mysql;
mysql> update user set user='xly' where user='root';

5、对超级账户进行分离,可分为系统管理员、安全管理员、安全审计员等;建议禁用拥有所有权限的账户,使用自建账户进行登录,建立对于不同管理的账户,实现用户最小权限管理。
对于云数据库rds实例,可在控制台按照要求改每个用户的权限。


mysql的相关插件

[root@172-20-10-13 plugin]# ll
total 55672
-rwxr-xr-x. 1 mysql mysql   104480 Dec 10  2020 adt_null.so
-rwxr-xr-x. 1 mysql mysql   375160 Dec 10  2020 authentication_ldap_sasl_client.so
-rwxr-xr-x. 1 mysql mysql    50485 Dec 10  2020 auth_socket.so
-rwxr-xr-x. 1 mysql mysql   678943 Dec 10  2020 connection_control.so
drwxr-xr-x. 2 mysql mysql     4096 Apr  6 19:08 debug
-rwxr-xr-x. 1 mysql mysql 16953160 Dec 10  2020 group_replication.so
-rwxr-xr-x. 1 mysql mysql   357325 Dec 10  2020 ha_example.so
-rwxr-xr-x. 1 mysql mysql   674450 Dec 10  2020 innodb_engine.so
-rwxr-xr-x. 1 mysql mysql   928676 Dec 10  2020 keyring_file.so
-rwxr-xr-x. 1 mysql mysql   302017 Dec 10  2020 keyring_udf.so
-rwxr-xr-x. 1 mysql mysql   998948 Dec 10  2020 libmemcached.so
-rwxr-xr-x. 1 mysql mysql  7938446 Dec 10  2020 libpluginmecab.so
-rwxr-xr-x. 1 mysql mysql    56273 Dec 10  2020 libtest_framework.so
-rwxr-xr-x. 1 mysql mysql    59733 Dec 10  2020 libtest_services.so
-rwxr-xr-x. 1 mysql mysql    67810 Dec 10  2020 libtest_services_threaded.so
-rwxr-xr-x. 1 mysql mysql    98191 Dec 10  2020 libtest_session_detach.so
-rwxr-xr-x. 1 mysql mysql   121159 Dec 10  2020 libtest_session_info.so
-rwxr-xr-x. 1 mysql mysql    67881 Dec 10  2020 libtest_session_in_thd.so
-rwxr-xr-x. 1 mysql mysql   110781 Dec 10  2020 libtest_sql_2_sessions.so
-rwxr-xr-x. 1 mysql mysql   114424 Dec 10  2020 libtest_sql_all_col_types.so
-rwxr-xr-x. 1 mysql mysql   194185 Dec 10  2020 libtest_sql_cmds_1.so
-rwxr-xr-x. 1 mysql mysql   116250 Dec 10  2020 libtest_sql_commit.so
-rwxr-xr-x. 1 mysql mysql   143478 Dec 10  2020 libtest_sql_complex.so
-rwxr-xr-x. 1 mysql mysql   112546 Dec 10  2020 libtest_sql_errors.so
-rwxr-xr-x. 1 mysql mysql   111400 Dec 10  2020 libtest_sql_lock.so
-rwxr-xr-x. 1 mysql mysql   103326 Dec 10  2020 libtest_sql_processlist.so
-rwxr-xr-x. 1 mysql mysql   133334 Dec 10  2020 libtest_sql_replication.so
-rwxr-xr-x. 1 mysql mysql   105888 Dec 10  2020 libtest_sql_shutdown.so
-rwxr-xr-x. 1 mysql mysql   139246 Dec 10  2020 libtest_sql_sqlmode.so
-rwxr-xr-x. 1 mysql mysql   138642 Dec 10  2020 libtest_sql_stored_procedures_functions.so
-rwxr-xr-x. 1 mysql mysql   138605 Dec 10  2020 libtest_sql_views_triggers.so
-rwxr-xr-x. 1 mysql mysql    68557 Dec 10  2020 libtest_x_sessions_deinit.so
-rwxr-xr-x. 1 mysql mysql    85092 Dec 10  2020 libtest_x_sessions_init.so
-rwxr-xr-x. 1 mysql mysql    16724 Dec 10  2020 locking_service.so
-rwxr-xr-x. 1 mysql mysql    59489 Dec 10  2020 mypluglib.so
-rwxr-xr-x. 1 mysql mysql    48381 Dec 10  2020 mysql_no_login.so
-rwxr-xr-x. 1 mysql mysql 22908676 Dec 10  2020 mysqlx.so
-rwxr-xr-x. 1 mysql mysql    57096 Dec 10  2020 rewrite_example.so
-rwxr-xr-x. 1 mysql mysql   617807 Dec 10  2020 rewriter.so
-rwxr-xr-x. 1 mysql mysql   719229 Dec 10  2020 semisync_master.so
-rwxr-xr-x. 1 mysql mysql   162476 Dec 10  2020 semisync_slave.so
-rwxr-xr-x. 1 mysql mysql    59530 Dec 10  2020 test_security_context.so
-rwxr-xr-x. 1 mysql mysql    54244 Dec 10  2020 test_udf_services.so
-rwxr-xr-x. 1 mysql mysql   214614 Dec 10  2020 validate_password.so
-rwxr-xr-x. 1 mysql mysql   362969 Dec 10  2020 version_token.so
[root@172-20-10-13 plugin]# pwd
/usr/local/mysql-5.7/lib/plugin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值