MySQL是一款开源的关系型数据库管理系统,广泛用于Web应用程序开发中。但是,MySQL的强大功能也使它成为了一个潜在的安全风险。如今,越来越多的组织都将安全措施的重点放在对DBMS(数据库管理系统)的控制上。在数据库中,权限管理是非常重要的一环,它可以保护数据库的安全,确保只有授权用户可以访问敏感数据。本文将详细讨论MySQL的权限管理,包括如何创建用户、授权和撤销权限、以及如何管理MySQL的系统用户。
一、 用户的创建和删除
在MySQL内部,用户是用以下格式定义的:username@hostname。其中,username是你要创建的用户名,而hostname则表示这个用户允许连接到哪个主机(或者IP地址)。如果你想让一个用户能够从任何主机连接到MySQL服务器,那么可以使用通配符“%”代替hostname。在MySQL中,创建用户有以下两种方式:
1、 使用GRANT语句创建用户
MySQL的GRANT语句是用来授予用户在MySQL数据库上执行特定操作的权限。在MySQL环境中,执行GRANT语句如下:
GRANT privilege_type ON database_name.table_name TO ‘username’@‘localhost’;
在这个命令中,privilege_type 表示将要授予的权限类型,如SELECT、INSERT、DELETE等等;database_name表示数据库名称,table_name表示表名称,通过这两个字段,可以将不同的权限设置在不同的数据库和表上;而‘username’@‘localhost’则是创建的用户名和对应的主机名。值得注意的是,当要创建用户名‘username’和对应的主机名‘%’时,GRANT命令会显示为:
GRANT SELECT, INSERT ON *.* TO ‘username’@‘%’;
这样可以允许该用户从任何设备与远程数据库通信,但这样会给数据库带来潜在的安全隐患,因此建议在设置远程访问时要采取更高级的安全措施。
2、 使用CREATE USER语句创建用户
CREATE USER语句也是用来创建用户的方法之一。这个语法比GRANT语句更加简洁明了,但是不支持授予或撤销权限。当要创建用户名为‘username’和对应的主机名为‘localhost’的用户时,CREATE USER命令如下:
CREATE USER ‘username’@‘localhost’ IDENTIFIED BY ‘password’;
在这个命令中,IDENTIFIED BY后的password则是创建的用户的登录口令。
从语法上看,这两种创建用户的方式的差别并不大,但是在具体的业务操作中使用哪一种,需要根据实际需要、用户的数量和安全要求来决定。
删除用户时,可以使用DROP USER语句来完全删除一个用户:
DROP USER ‘username’@‘hostname’
如果只需要撤销某个用户的某些权限,使用REVOKE语句。
二、 授权和撤销权限
授权和撤销权限是MySQL权限管理重要的一环。数据管理员在授权的时候,可以设置不同的数据库和表不同的权限,从而为每个用户分配最小量的权限。因此,数据管理员可以按照安全要求来向用户授权,以免某些非授权的用户访问敏感数据。授权指令主要有GRANT、REVOKE、ALTER USER、SHOW GRANTS、SHOW PRIVILEGES和CREATE ROLE等命令。
1、 GRANT语句
GRANT语句用于向MySQL中的用户授权。与CREATE USER语句类似,GRANT语句也需要指定用户名、主机名和授权的权限。但是在GRANT语句中,USERNAME通常不需要使用IDENTIFIED BY口令,因此,其语法格式如下:
GRANT ALL PRIVILEGES ON database_name.* TO ‘username’@‘localhost’;
这条语句将所有权限授予了用户名为“username”、主机名为本地主机“localhost”上的用户。在这里,星号“*”代表你授权的数据库的所有表格,而ALL PRIVILEGES代表你赋予该用户所有的权限。除此之外,还可以使用GRANT语句分别授权:
GRANT SELECT ON employees.* TO ‘thomas’@‘localhost’;
GRANT UPDATE ON sales.* TO ‘james’@‘10.1.0.%’;
GRANT INSERT, DELETE ON testdb.* TO ‘ulysses’@‘192.168.0.101’;
在MySQL中,不同用户可以具有不同的权限,而权限又可以通过不同的方式表示。因此,GRANT命令允许管理员指定那个特定的权限类型赋予一个或者多个用户,比如:
GRANT SELECT, INSERT ON table_name TO ‘username’@‘localhost’;
这里的SELECT和INSERT是两种不同的权限类型,可以被单独地分配给所授权用户。此外,GRANT命令也可以接受多个权限列举,如:
GRANT SELECT, INSERT, UPDATE ON table_name TO ‘username’@‘localhost’;
在MySQL中,一个用户还可以拥有多个权限和角色,可以通过GRANT语句授权给特定用户。
2、 REVOKE语句
REVOKE语句是用来从MySQL中的用户中撤回某些权限。REVOKE指令同样需要指定用户名、主机名和权限名称,格式如下:
REVOKE privilege_type ON database_name.table_name FROM ‘username’@‘hostname’
这里的privilege_type和database_name.table_name分别是你想要从哪种权限和哪个表上撤销,而username@hostname则是你想要撤销权限的用户名和主机名。
让我们假设你已经给用户“john”授予了UPDATE和INSERT权限。但是假设你决定撤销他的INSERT权限,而保留他的UPDATE权限,你可以使用以下命令:
REVOKE INSERT ON employees.* FROM ‘john’@‘localhost’;
3、 ALTER USER命令
MySQL 8.0版本开始,ALTER USER语句还被用来修改用户的属性和行为,如下所示:
ALTER USER ‘username’@‘hostname’ IDENTIFIED BY ‘password’;
使用这条命令,你可以修改用户名“username”和主机名“hostname”的密码。
三、 管理系统用户
在MySQL中,默认的系统用户有两个:root和mysql。其中“root”用户对所有数据库和所有对象都有最高权限。如果用户知道了这个账号的密码,那么他们将能够完全控制MySQL服务器。相反,如果你不希望给用户完全控制你的服务器,那么你需要创建一个新的超级管理员账户,并使用root账户的基本权限来限制这个新账户。
同时,MySQL 使用的系统用户和系统角色也需要进行管理。MySQL系统用户包括:mysql.session、mysql.sys和mysql.infoschema。管理员使用这些账户来管理MySQL内部事务,MySQL的系统角色包括:mysql_innodb_cluster_admin、mysql_innodb_cluster_read_only_admin和mysql_innodb_cluster_server_admin,也是需要进行管理的。
四、 MariaDB
MariaDB是一个MySQL的分支,它开源不只是因为它基于GPL(GNU通用公共许可证)许可协议,而且与MySQL的开发有着非常密切的联系,性能也更加卓越。对于MariaDB,它同样有着复杂的安全问题,用户可以通过GRANT和REVOKE语句来进行授权和撤销MySQL权限。
五、 总结
MySQL是一款功能强大的数据库管理系统,但也极易成为潜在的安全风险。为了保证数据库的安全性,我们需在真实数据处理中加强安全措施,对不同的角色进行不同程度的访问控制,管理多个数据库账户,管理MySQL的系统用户和系统角色,以确保敏感数据得以保护。通过上述方法,我们可以根据不同的业务角色、IT人员的技能水平、数据库访问流量和安全要求来限制敏感数据的访问范围。在MySQL权限管理方面,实施足够的安全措施是非常重要的。