我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何理解MySQL管理基础中的安全、访问控制和权限

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何理解MySQL管理基础中的安全、访问控制和权限

如何理解MySQL管理基础中的安全、访问控制和权限,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

MySQL权限系统确保所有的用户只执行允许的操作。当连接MySQL服务器时,用户身份由其所在的主机和使用的用户名来决定。当用户在连接后发出请求时,系统根据其身份和要进行的操作来授予权限。

1.MySQL授权表

 1)user表

mysql> select host, user, password from mysql.user;
+-----------+------+-------------------------------------------+
| host      | user | password                                  |
+-----------+------+-------------------------------------------+
| localhost | root | *25B0A985780CE19647D8E41C2B50E7FB300EA6E8 |
| %         | root | *25B0A985780CE19647D8E41C2B50E7FB300EA6E8 |
+-----------+------+-------------------------------------------+
2 rows in set (0.00 sec)

注:“%”用作通配符,这里表示允许从任何主机以root用户访问。除db表外的其它授权表中,空host值与“%”相同。

[@more@]MySQL授权表一般都包含两类字段:范围字段和权限字段。上面看到的user表的host、user、password属于范围字段,此外还有一些名称以“_priv”结尾的权限字段,用于指定用户拥有的权限。这里赋予用户的权限适用于系统的每个数据库,因此一般将它们都设置为N,而使用host和db表进行更为精细的权限设置。其余字段则与SSL加密以及用户资源限制有关。

 2)db和host表

   db表有三个范围字段host、db和user,指定该条记录是针对某用户从某主机连接某数据库而言的;其余的字段为权限字段。
   host有两个范围字段host、db,其余的字段为权限字段。如果db表中记录的host字段留空,MySQL服务器在验证用户权限时会从host表中获取相应的主机名。host表不受GRANT和REVOKE语句的影响。大多数MySQL安装根本不需要使用该表。

 3)tables_priv和columns_priv表

   这两个表可以分别限制对数据库中具体的表和表中具体的列的访问。

   当MySQL需要决定是否允许用户执行某一数据库操作时,首先要查看user表中该用户是否具有足够的权限,如果没有,再查看db和host表。一些管理操作,如RELOAD、PROCESS涉及整个系统,只有user表中有相应的列。
   可以手工修改授权表的内容来进行权限设置(但tables_priv和columns_priv表不建议这样做),修改后需要使用FLUSH PRIVILEGES语句、mysqladmin flush-privileges或mysqladmin reload命令重新装载授权表。

2.授予和回收权限

   通常使用GRANT和REVOKE命令授予和回收用户的权限,下面通过一些例子来演示它们的用法。
   首先,创建一个从本机连接MySQL服务器的ggyy用户:

mysql> create user ggyy@localhost identified by 'password';
Query OK, 0 rows affected (0.00 sec)

mysql> select host, user from mysql.user;
+-----------+------+
| host      | user |
+-----------+------+
| %         | root |
| localhost | ggyy |
| localhost | root |
+-----------+------+
3 rows in set (0.00 sec)

   现在可以使用ggyy用户连接服务器,但还没有访问数据库的权限。

C:>mysql -u ggyy -p
Enter password: ****
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 18
Server version: 5.1.34-community MySQL Community Server (GPL)

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)

   下面授予ggyy用户在ggyy数据库上的查询权限:

mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> grant select on ggyy.* to ggyy@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for ggyy@localhost;
+-------------------------------------------------------------------------------------------------------------+
| Grants for ggyy@localhost                                                                                   |
+-------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'ggyy'@'localhost' IDENTIFIED BY PASSWORD '*484FFAA42C12F40931C794D33A11B7F075B91467' |
| GRANT SELECT ON `ggyy`.* TO 'ggyy'@'localhost'                                                              |
+-------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> select host, db, user, select_priv, insert_priv, update_priv, delete_priv from mysql.db;
+-----------+------+------+-------------+-------------+-------------+-------------+
| host      | db   | user | select_priv | insert_priv | update_priv | delete_priv |
+-----------+------+------+-------------+-------------+-------------+-------------+
| localhost | ggyy | ggyy | Y           | N           | N           | N           |
+-----------+------+------+-------------+-------------+-------------+-------------+
1 row in set (0.00 sec)

mysql> select * from mysql.tables_priv;
Empty set (0.00 sec)

   使用ggyy用户查看ggyy数据库中的内容:

mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| ggyy@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> use ggyy
Database changed
mysql> show tables;
+----------------+
| Tables_in_ggyy |
+----------------+
| blob_text_test |
| char_test      |
| contact        |
| date_time_test |
| float_test     |
| groups1        |
| groups2        |
| int_test       |
| members        |
| members_temp   |
| processes1     |
| test_crttb     |
| test_crttb2    |
| test_crttb3    |
| test_crttb4    |
| test_crttb5    |
| ts_dt_test     |
| users1         |
+----------------+
18 rows in set (0.00 sec)

mysql> select * from processes1 limit 1;
+------+-------+------+
| pid  | pname | ppid |
+------+-------+------+
|    1 | init  |    0 |
+------+-------+------+
1 row in set (0.00 sec)

   接下来,再创建一个从远程主机192.168.7.100连接MySQL服务器的ggyy用户,授予查询ggyy数据库中user1表的权限。使用GRANT命令可以在授权时创建被授权的用户:

mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> grant select on ggyy.users1 to ggyy@192.168.7.100 identified by 'ggyy';
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for ggyy@192.168.7.100;
+-----------------------------------------------------------------------------------------------------------------+
| Grants for ggyy@192.168.7.100                                                                                   |
+-----------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'ggyy'@'192.168.7.100' IDENTIFIED BY PASSWORD '*484FFAA42C12F40931C794D33A11B7F075B91467' |
| GRANT SELECT ON `ggyy`.`users1` TO 'ggyy'@'192.168.7.100'                                                       |
+-----------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> select host, user from mysql.user;
+---------------+------+
| host          | user |
+---------------+------+
| %             | root |
| 192.168.7.100 | ggyy |
| localhost     | ggyy |
| localhost     | root |
+---------------+------+
4 rows in set (0.00 sec)

mysql> select host, db, user, select_priv, insert_priv, update_priv, delete_priv from mysql.db where host = '192.168.7.1
00';
Empty set (0.00 sec)

mysql> select * from mysql.tables_priv where host = '192.168.7.100';
+---------------+------+------+------------+----------------+---------------------+------------+-------------+
| Host          | Db   | User | Table_name | Grantor        | Timestamp           | Table_priv | Column_priv |
+---------------+------+------+------------+----------------+---------------------+------------+-------------+
| 192.168.7.100 | ggyy | ggyy | users1     | root@localhost | 2010-01-17 14:02:42 | Select     |             |
+---------------+------+------+------------+----------------+---------------------+------------+-------------+
1 row in set (0.00 sec)


   可以看到,由于授予的是表的权限,host表中没有相应记录,需要到tables_priv表中查看。
   在远程主机上访问数据库:

C:>mysql -h 192.168.7.101 -u ggyy -p
Enter password: ****
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 20
Server version: 5.1.34-community MySQL Community Server (GPL)

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql> select current_user();
+--------------------+
| current_user()     |
+--------------------+
| ggyy@192.168.7.100 |
+--------------------+
1 row in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ggyy               |
+--------------------+
2 rows in set (0.00 sec)

mysql> use ggyy
Database changed
mysql> show tables;
+----------------+
| Tables_in_ggyy |
+----------------+
| users1         |
+----------------+
1 row in set (0.00 sec)

mysql> select * from users1 limit 1;
+------+----------+------+
| uid  | uname    | gid  |
+------+----------+------+
|  202 | fengsong |  200 |
+------+----------+------+
1 row in set (0.00 sec)


   要回收权限使用REVOKE命令,例如:

mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> revoke select on ggyy.* from ggyy@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql> revoke select on ggyy.users1 from ggyy@192.168.7.100;
Query OK, 0 rows affected (0.00 sec)


   也可以采用db和host表相结合的方式管理数据库的权限,例如:

mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> insert into mysql.db (db, user, select_priv, delete_priv) values ('ggyy', 'ggyy', 'Y', 'Y');
Query OK, 1 row affected (0.00 sec)

mysql> insert into mysql.host (db, host, select_priv, insert_priv) values ('ggyy', 'localhost', 'Y', 'Y');
Query OK, 1 row affected (0.00 sec)

mysql> select host, db, user, select_priv, insert_priv, delete_priv from mysql.db where db = 'ggyy';
+------+------+------+-------------+-------------+-------------+
| host | db   | user | select_priv | insert_priv | delete_priv |
+------+------+------+-------------+-------------+-------------+
|      | ggyy | ggyy | Y           | N           | Y           |
+------+------+------+-------------+-------------+-------------+
1 row in set (0.00 sec)

mysql> select host, db, select_priv, insert_priv, delete_priv from mysql.host where db = 'ggyy';
+-----------+------+-------------+-------------+-------------+
| host      | db   | select_priv | insert_priv | delete_priv |
+-----------+------+-------------+-------------+-------------+
| localhost | ggyy | Y           | Y           | N           |
+-----------+------+-------------+-------------+-------------+
1 row in set (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)


   使用ggyy用户在本机上访问数据库:

mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| ggyy@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| ggyy               |
+--------------------+
2 rows in set (0.00 sec)

mysql> use ggyy
Database changed
mysql> show tables;
+----------------+
| Tables_in_ggyy |
+----------------+
| blob_text_test |
| char_test      |
| contact        |
| date_time_test |
| float_test     |
| groups1        |
| groups2        |
| int_test       |
| members        |
| members_temp   |
| processes1     |
| test_crttb     |
| test_crttb2    |
| test_crttb3    |
| test_crttb4    |
| test_crttb5    |
| ts_dt_test     |
| users1         |
+----------------+
18 rows in set (0.00 sec)

mysql> select * from groups1 limit 1;
+------+-------+
| gid  | gname |
+------+-------+
|    0 | root  |
+------+-------+
1 row in set (0.00 sec)

mysql> insert into groups1 values (255, 'test');
ERROR 1142 (42000): INSERT command denied to user 'ggyy'@'localhost' for table 'groups1'
mysql> delete from groups1 where gname = 'root';
ERROR 1142 (42000): DELETE command denied to user 'ggyy'@'localhost' for table 'groups1'

   db表中的权限列相当于“总开关”,host表中的权限列相当于“分开关”,只有两个“开关”都打开了,用户才拥有相应操作的权限。

mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> update mysql.db set insert_priv = 'Y' where db = 'ggyy';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update mysql.host set delete_priv = 'Y' where db = 'ggyy';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select host, db, user, select_priv, insert_priv, delete_priv from mysql.db where db = 'ggyy';
+------+------+------+-------------+-------------+-------------+
| host | db   | user | select_priv | insert_priv | delete_priv |
+------+------+------+-------------+-------------+-------------+
|      | ggyy | ggyy | Y           | Y           | Y           |
+------+------+------+-------------+-------------+-------------+
1 row in set (0.00 sec)

mysql> select host, db, select_priv, insert_priv, delete_priv from mysql.host where db = 'ggyy';
+-----------+------+-------------+-------------+-------------+
| host      | db   | select_priv | insert_priv | delete_priv |
+-----------+------+-------------+-------------+-------------+
| localhost | ggyy | Y           | Y           | Y           |
+-----------+------+-------------+-------------+-------------+
1 row in set (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

   再次使用ggyy用户尝试插入和删除操作:

mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| ggyy@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> insert into groups1 values (255, 'test');
Query OK, 1 row affected (0.00 sec)

mysql> delete from groups1 where gname = 'root';
Query OK, 1 rows affected (0.00 sec)

   这种由db表和host表一起确定的权限,使用SHOW GRANTS命令看不到,也无法使用REVOKE命令回收。

mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)

mysql> show grants for ggyy@localhost;
+-------------------------------------------------------------------------------------------------------------+
| Grants for ggyy@localhost                                                                                   |
+-------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'ggyy'@'localhost' IDENTIFIED BY PASSWORD '*484FFAA42C12F40931C794D33A11B7F075B91467' |
+-------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> revoke select on ggyy.* from ggyy@localhost;
ERROR 1141 (42000): There is no such grant defined for user 'ggyy' on host 'localhost'

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何理解MySQL管理基础中的安全、访问控制和权限

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何管理和控制Hadoop中数据的访问权限

在Hadoop中,可以通过以下几种方式管理和控制数据的访问权限:使用Hadoop的Access Control Lists(ACLs)来控制数据的访问权限,ACLs允许管理员为每个文件或目录指定用户和组的访问权限。使用Hadoop的文件系统
如何管理和控制Hadoop中数据的访问权限
2024-02-29

如何在Couchbase中实施访问控制和权限管理

在Couchbase中实施访问控制和权限管理可以通过以下方式来实现:使用RBAC(Role-Based Access Control):Couchbase支持基于角色的访问控制,可以通过在管理控制台中创建角色并将用户分配给这些角色来管理用户
如何在Couchbase中实施访问控制和权限管理
2024-04-09

如何理解ACL的访问权限控制

如何理解ACL的访问权限控制,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在普通权限中,Linux用户对文件只有三种身份,就是属主、属组和其他人;每种用户身份拥
2023-06-05

如何为AmazonAurora设置访问控制和权限管理

要为Amazon Aurora设置访问控制和权限管理,可以按照以下步骤进行操作:创建数据库用户:首先,您需要创建数据库用户,并为其分配适当的权限。您可以使用SQL命令在Aurora数据库中创建用户,并为其授予所需的权限。设置数据库访问策略
如何为AmazonAurora设置访问控制和权限管理
2024-04-09

Nagios如何进行用户权限管理和访问控制

Nagios是一个开源的监控系统,它提供了一套用户权限管理和访问控制功能,可以帮助管理员精细地控制用户对监控系统的访问权限。下面是Nagios进行用户权限管理和访问控制的一些常用方法:定义用户角色:在Nagios中,可以定义不同的用户角色,
Nagios如何进行用户权限管理和访问控制
2024-03-15

如何在Prometheus中实现用户权限管理和访问控制

在Prometheus中实现用户权限管理和访问控制可以通过以下步骤来实现:使用基于OAuth2的认证服务:Prometheus本身并不提供用户管理和权限控制功能,但可以通过集成外部OAuth2认证服务来实现用户认证。常见的OAuth2认证服
如何在Prometheus中实现用户权限管理和访问控制
2024-03-04

如何在Couchbase中实现数据访问控制和权限管理

在Couchbase中实现数据访问控制和权限管理可以通过以下几种方式:使用RBAC(基于角色的访问控制):Couchbase支持基于角色的访问控制,可以通过创建用户和角色来管理数据访问权限。可以为每个用户分配不同的角色,每个角色可以拥有不同
如何在Couchbase中实现数据访问控制和权限管理
2024-04-09

如何使用MySQL进行数据安全管理和权限控制?

如何使用MySQL进行数据安全管理和权限控制?随着互联网时代的到来,数据安全问题越来越引起人们的重视。在数据库管理中,MySQL是一种常用的关系型数据库管理系统,具有强大的数据存储和处理能力。为了确保数据的安全性,MySQL提供了一些功能来
2023-10-22

Cacti系统如何进行用户权限管理和访问控制

Cacti系统提供了基本的用户权限管理和访问控制功能,可以通过以下步骤进行设置:创建用户:在Cacti系统中,管理员可以创建新用户账号,并为每个用户分配不同的权限和角色。分配角色:管理员可以为每个用户分配不同的角色,如管理员、操作员、普通用
Cacti系统如何进行用户权限管理和访问控制
2024-03-11

如何解决PHP开发中的安全权限管理问题

在PHP开发中,安全权限管理是一个至关重要的问题。当我们在开发网站或应用时,通过权限管理可以控制用户对不同功能或资源的访问权限,保护敏感数据和功能不受未经授权的用户访问。本文将介绍一些常见的安全权限管理问题,并提供具体的代码示例来解决这些问
2023-10-21

如何使用SQL语句在MongoDB中实现数据权限控制和访问管理?

如何使用SQL语句在MongoDB中实现数据权限控制和访问管理?MongoDB是一种面向文档的NoSQL数据库,而SQL(Structured Query Language)是关系型数据库管理系统的标准语言。尽管MongoDB不支持SQL的
如何使用SQL语句在MongoDB中实现数据权限控制和访问管理?
2023-12-17

如何解决PHP开发中的安全权限管理和防护

数据库安全权限管理 在PHP开发中,数据库是经常用来存储数据的关键组件。因此,确保数据库的安全权限管理是非常重要的。以下是一些建议:1.1 使用最小权限原则:给数据库用户分配最小的权限,只赋予其完成必要操作的权限,如SELECT、INSER
2023-10-21

如何解决PHP开发中的安全认证和权限管理

随着互联网的发展,Web应用程序的安全性变得越来越重要。在PHP开发中,安全认证和权限管理是必不可少的。本文将介绍如何解决PHP开发中的安全认证和权限管理,并提供具体的代码示例。一、安全认证(Authentication)安全认证是验证用户
2023-10-21

phpcms的权限管理如何设置以确保系统安全?(phpcms的权限控制系统应如何配置以保障系统安全?)

phpcms权限管理设置对于系统安全至关重要。管理员应创建角色、分配权限,并限制用户数量以控制访问。此外,还应启用模块、操作和数据表访问控制。其他安全措施包括启用双因素认证、定期更新和强制强密码。通过这些设置,组织可以保护敏感数据并降低未经授权访问的风险,确保phpcms系统的安全性和完整性。
phpcms的权限管理如何设置以确保系统安全?(phpcms的权限控制系统应如何配置以保障系统安全?)
2024-04-02

深入了解Oracle 权限与角色管理函数在安全性控制中的使用

Oracle 权限与角色管理函数在安全性控制中扮演着至关重要的角色。以下是对这些函数及其在安全性控制中应用的深入了解:Oracle 权限Oracle 数据库的权限是授予用户或角色的一种许可,用于控制他们可以执行的操作。这些权限可以限制用
深入了解Oracle 权限与角色管理函数在安全性控制中的使用
2024-10-09

如何使用Python实现对ElasticSearch的安全认证和权限管理?(在Python中,怎样进行ElasticSearch的安全认证和权限设置?)

在Python中实现Elasticsearch安全认证和权限管理涉及以下步骤:创建用户,设置密码和角色。创建角色,指定索引权限。将角色与用户关联。启用安全。启用TLS以加密通信。使用用户名和密码进行身份验证。检查用户权限。最佳实践包括使用强密码、定期轮换密码、创建多个角色和限制特权访问。遵循这些步骤可确保Elasticsearch集群免受未经授权的访问和安全威胁。
如何使用Python实现对ElasticSearch的安全认证和权限管理?(在Python中,怎样进行ElasticSearch的安全认证和权限设置?)
2024-04-02

编程热搜

目录