数据库安全管理
在讨论安全时,我们需要考虑整个服务器主机安全(⽽不仅仅是MySQL服务)需要抵御攻击, 窃听, 扫描, 破解等。
MySQL 对所有连接数据库⽤户进⾏了 ACL 访问控制,减少服务器被内部不规范操作导致故障。
MySQL 还⽀持客户端和服务器之间的 SSL 加密连接。
当然这⾥讨论的许多概念都不是特定于 MySQL ⼏乎所有的应⽤程序都适⽤相同的⼀般思路。
MySQL 运⾏时,请遵循以下准则:
不要给⽤户(应⽤)配置超级⽤户权限,授权最⼩化
不要在数据库中存储明⽂密码
不要使⽤较为简单的字符密码
不允许⾮授信任主机使⽤扫描 数据库跟谁打交道 业务层java 公司堡垒机开放
# 用户账户管理
1.登录和退出 MySQL , 使⽤ mysql -u root -p 可以连接数据库, 但这只是本地连接数据库的⽅式, 在⽣产很多情况
下都是连接⽹络中某⼀个主机上的数据库
-P //指定连接远程数据库端⼝[默认3306]
-h //指定连接远程数据库地址[默认localhost]
-u //指定连接远程数据库账户[默认root]
-p //指定连接远程数据库密码[默认密码为空]
-e //执⾏mysql数据库sql指令
-S //指定mysql数据库Socket
//不安全
[root@sql ~]# mysql -uroot -p"Wing@123"
//推荐⽅式
[root@sql ~]# mysql -uroot -p
Enter password:
//推送远程登录⽅式
[root@sql ~]# mysql -h10.1.106.70 -P3306 -uroot -p
Enter password:
//⾮交互式操作数据库
[root@sql ~]# mysql -uroot -pWing@123 -e "show databases;"
# 创建⽤户
CREATE USER 'username'@'127.0.0.1' IDENTIFIED BY 'password'; //username 是要创建的⽤户名, hostname 是该⽤户所在的主机名或IP地址, password 是该⽤户的密码。
//如果要创建⼀个可以从任何主机连接到MySQL服务器的⽤户,可以将 hostname 设置为 % ,
CREATE USER 'username'@'%' IDENTIFIED BY 'password';
//创建⽤户后,需要为该⽤户授予适当的权限,以便该⽤户可以执⾏所需的操作。可以使⽤ GRANT 语句来授予权限
GRANT SELECT, INSERT, UPDATE ON database.* TO 'username'@'hostname'; //授予⽤户在 database 数据库中执⾏ SELECT 、 INSERT 和 UPDATE 操作的权限。
# 删除⽤户
//1.drop user 语句删除
mysql> drop user 'wing'@'localhost';
#注意mysql5.6:先回收权限, 然后删除
mysql> revoke all privilege user_name;
mysql> drop user user_name;
//2.delete语句删除
delete from mysql.user where user='wing' and host='localhost';
# 修改root密码
//⽅法1, Shell修改⽅式
# mysqladmin -uroot -p'Wing@123' password 'NewWing@123'
//⽅法2, 修改数据表
# mysql -uroot -p'NewWing@123'
mysql> update mysql.user set
authentication_string=password('Wing@123')
where user='root' and host='localhost';
//刷新权限
mysql> flush privileges;
//⽅法3, 设定密码
mysql> set password=password('Wing@123');
# 修改其他用户密码
//⽅法1
mysql> create user wing1@'localhost' identified by 'Wing1@123';
mysql> set password for wing1@'localhost'=password('NewWing1@123');
//⽅法2, 修改数据表
mysql> update mysql.user set
authentication_string=password('Wing1@123')
where user='wing1' and host='localhost';
//刷新权限
mysql> flush privileges;
//普通⽤户⾃⼰修改⾃⼰密码
set password=password("Wing1@123");
# 访问权限系统
//mysql权限表
mysql.user 全局授权
⽤户字段
权限字段
安全字段
资源控制字段
mysql> select * from mysql.user where user='root'\G
*************************** 1. row ***************************
Host: localhost
User: root
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string: *FBBAE4DB31FB8548A70C45A2D8CB413D885A64E4
password_expired: N
password_last_changed: 2025-03-11 15:50:52
password_lifetime: NULL
account_locked: N
*************************** 2. row ***************************
Host: %
User: root
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
References_priv: Y
Index_priv: Y
Alter_priv: Y
Show_db_priv: Y
Super_priv: Y
Create_tmp_table_priv: Y
Lock_tables_priv: Y
Execute_priv: Y
Repl_slave_priv: Y
Repl_client_priv: Y
Create_view_priv: Y
Show_view_priv: Y
Create_routine_priv: Y
Alter_routine_priv: Y
Create_user_priv: Y
Event_priv: Y
Trigger_priv: Y
Create_tablespace_priv: Y
ssl_type:
ssl_cipher:
x509_issuer:
x509_subject:
max_questions: 0
max_updates: 0
max_connections: 0
max_user_connections: 0
plugin: mysql_native_password
authentication_string: *FBBAE4DB31FB8548A70C45A2D8CB413D885A64E4
password_expired: N
password_last_changed: 2025-03-11 16:17:33
password_lifetime: NULL
account_locked: N
2 rows in set (0.00 sec)
// mysql.db (数据库级)
⽤户字段
权限字段
mysql> select * from mysql.db\G
*************************** 1. row ***************************
Host: localhost
Db: performance_schema
User: mysql.session
Select_priv: Y
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Execute_priv: N
Event_priv: N
Trigger_priv: N
*************************** 2. row ***************************
Host: localhost
Db: sys
User: mysql.sys
Select_priv: N
Insert_priv: N
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Execute_priv: N
Event_priv: N
Trigger_priv: Y
2 rows in set (0.00 sec)
mysql.tables_priv(表级)
mysql.columns_priv(列级)
权限应⽤的顺序:user->db->tables->columns
grant 权限列表 on 库名.表名 to '⽤户名'@'客户端主机' [identified by ' 密码' with option 参数];
相关参数:
all 所有权限(不包括授权权限)
单独授权 select,update,insert,delete
*.* 所有库下的所有表 Global level
test.* 针对 test 库下的所有表 Database level
test.student 针对 test 库下的 student 表 Table level
SELECT (id),INSERT (name,age) ON wing.t1 针对 wing 库下⾯ t1 表的字段 Column level
localhost 指定本机
10.1.106.70 指定具体主机
10.1.106.0 ⽹段的所有主机
10.1.106.% ⽹段的所有主机
% 指定所有主机
with参数:
GRANT OPTION 授权选项
MAX_QUERIES_PER_HOUR 定义每⼩时允许执⾏的查询数
MAX_UPDATES_PER_HOUR 定义每⼩时允许执⾏的更新数
MAX_CONNECTIONS_PER_HOUR 定义每⼩时可以建⽴的连接数
MAX_USER_CONNECTIONS 定义单个⽤户同时可以建⽴的连接数
# 访问权限回收
1.查看⽤户权限
mysql> show grants;
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> SHOW GRANTS\G
*************************** 1. row ***************************
Grants for root@localhost: GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION
*************************** 2. row ***************************
Grants for root@localhost: GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION
2 rows in set (0.00 sec)
#查看所有⽤户
mysql> select user,host,authentication_string from mysql.user;
+---------------+-----------+-------------------------------------------+
| user | host | authentication_string |
+---------------+-----------+-------------------------------------------+
| root | localhost | *FBBAE4DB31FB8548A70C45A2D8CB413D885A64E4 |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| root | % | *FBBAE4DB31FB8548A70C45A2D8CB413D885A64E4 |
+---------------+-----------+-------------------------------------------+
4 rows in set (0.00 sec)
//查看其它⽤户权限
mysql> show grants for root@'%';
+-------------------------------------------------------------+
| Grants for root@% |
+-------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION |
+-------------------------------------------------------------+
1 row in set (0.00 sec)
# 回收权限
语法: REVOKE 权限列表 ON 数据库名 FROM ⽤户名@'客户端主机';
# 回收Delete权限
revoke DELETE on *.* from test@'%';
# 回收所有权限
mysql> revoke ALL PRIVILEGES ON *.* from 'test'@'%';
# 回收grant权限
mysql> revoke GRANT OPTION ON *.* from 'test'@'%';
mysql> show grants for test@'%'\G
⚠️:开发⼈员 就是select 权限 或者对某⼀个库有权限 ⼀定不能root权限
业务测java程序 连接都有单独⾃⼰权限 app ⽤户只能访问app库 权限最⼩化

浙公网安备 33010602011771号