【重学 MySQL】一百、MySQL的权限管理与访问控制
【重学 MySQL】一百、MySQL的权限管理与访问控制
- **1. 用户管理:身份认证与账户创建**
- **2. 权限体系:多层级权限控制**
- **3. 访问控制策略:动态与静态结合**
- **4. 安全实践:最佳实践与风险规避**
MySQL的权限管理与访问控制是数据库安全的核心,通过精细化的权限分配和严格的访问控制策略,确保只有授权用户才能执行特定操作。
1. 用户管理:身份认证与账户创建
- 用户账户结构:MySQL用户由
用户名@主机名
唯一标识(如admin@localhost
),支持通配符(如admin@'192.168.%'
)或匿名用户(''@'localhost'
)。 - 创建与删除用户:
- 创建用户:
CREATE USER 'user'@'host' IDENTIFIED BY 'password';
(MySQL 8.0+推荐使用IDENTIFIED BY
,旧版本可用PASSWORD()
函数)。 - 删除用户:
DROP USER 'user'@'host';
。
- 创建用户:
- 密码策略:支持密码复杂度(长度、大小写、数字、特殊字符)、过期时间(
DEFAULT PASSWORD LIFETIME
)、历史密码检查(password_history
)等,通过mysql.user
表或ALTER USER
动态调整。
2. 权限体系:多层级权限控制
MySQL权限分为全局、数据库、表、列四级,通过GRANT
和REVOKE
动态管理:
- 权限类型:
- 全局权限(如
CREATE USER
,SHUTDOWN
):作用于所有数据库,存储在mysql.user
表。 - 数据库权限(如
CREATE
,DROP
):作用于特定数据库,存储在mysql.db
表。 - 表/视图权限(如
SELECT
,INSERT
):作用于特定表,存储在mysql.tables_priv
表。 - 列权限(如
SELECT (col1, col2)
):作用于特定列,存储在mysql.columns_priv
表。 - 存储过程/函数权限(如
EXECUTE
):存储在mysql.procs_priv
表。
- 全局权限(如
- 权限分配示例:
-- 授予全局权限 GRANT CREATE, RELOAD ON *.* TO 'admin'@'localhost'; -- 授予数据库级权限 GRANT SELECT, INSERT ON sales.* TO 'user'@'%'; -- 授予列级权限 GRANT SELECT (id, name) ON employees.staff TO 'reporter'@'192.168.1.%';
- 权限撤销:
REVOKE [权限] ON [对象] FROM 'user'@'host';
(如REVOKE DELETE ON sales.orders FROM 'user'@'%';
)。 - 角色管理(MySQL 8.0+):通过
CREATE ROLE
定义角色,GRANT [权限] TO [角色]
分配权限,再将角色授予用户(GRANT [角色] TO 'user'@'host'
),实现权限的批量管理。
3. 访问控制策略:动态与静态结合
- 主机访问控制:通过
host
字段限制用户来源IP(如'user'@'10.0.0.5'
仅允许该IP访问),配合防火墙(如iptables)限制3306端口访问。 - SSL/TLS加密:强制客户端使用SSL连接(
REQUIRE SSL
),保护数据传输安全。 - 插件认证:支持LDAP、Kerberos等外部认证集成,或自定义认证插件(如
authentication_ldap
)。 - 视图与存储过程:通过视图限制用户访问特定列(如
CREATE VIEW sales_summary AS SELECT product, total FROM sales;
),或封装业务逻辑到存储过程(仅授予EXECUTE
权限)。 - 审计与日志:启用
audit_log
插件(企业版)或第三方工具(如Percona Audit Log)记录用户操作;通过general_log
和slow_query_log
监控活动。
4. 安全实践:最佳实践与风险规避
- 最小权限原则:用户仅授予完成工作所需的最小权限(如应用账户仅需
SELECT
,INSERT
,避免DROP
)。 - 避免root账户滥用:日常操作使用非特权账户,保留root仅用于管理任务。
- 定期审计权限:使用
SHOW GRANTS FOR 'user'@'host';
检查权限,或通过mysql.user
表分析全局权限。 - 权限刷新:
GRANT
/REVOKE
后无需手动FLUSH PRIVILEGES
(8.0+自动处理),但修改系统表后需执行。 - 密码安全:禁用匿名账户,定期更新密码,使用
mysql_native_password
或caching_sha2_password
(8.0+默认)加密存储。 - 连接限制:通过
max_connections
控制并发连接数,避免资源耗尽;使用max_user_connections
限制单个用户的连接数。
总结:MySQL权限管理通过用户-主机-权限的三维模型实现精细控制,结合角色管理、访问层策略和安全实践,可构建从身份认证到操作审计的完整安全体系。企业级环境中,建议配合防火墙、VPN、数据库防火墙等外部措施,形成纵深防御。