首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于用于用户创建的GRANT语句

问关于用于用户创建的GRANT语句
EN

Database Administration用户
提问于 2013-02-04 15:52:58
回答 1查看 95关注 0票数 1

我对数据库很陌生,通过课本学习MySQL。

我对grant的声明表示怀疑。

我是在本地主机环境中学习的(服务器和客户端都是我自己的系统)。

首先怀疑

如果我创建一个新的用户帐户

代码语言:javascript
复制
 GRANT ALL on mydb.* TO 'violetkiwi' IDENTIFIED BY '12345';

命令已成功执行。当我试图登录这个帐户时

代码语言:javascript
复制
mysql -u violetkiwi -p

Access denied for user 'violetkiwi'@'localhost' (using password: YES)

如果我在GRANT ALL中指定@'localhost‘,问题就解决了:

代码语言:javascript
复制
 GRANT ALL on mydb.* TO 'violetkiwi'@'localhost' IDENTIFIED BY '12345';

@'localhost'或@'IP ADDRESS'在创建GRANT ALL用户帐户时是必需的吗?

第二个疑问是GRANT ALL中针对用户帐户的IPADDRESS规范

考虑一下,我必须通过互联网连接到MySQL服务器。

如何通过ADSL调制解调器实现与MySQL服务器的连接,该调制解调器在创建GRANT ALL用户帐户时不需要指定静态IP?

第三次怀疑

有时,我可以不指定MySQL就可以访问-p:

代码语言:javascript
复制
mysql -u root;

mysql -u violetkiwi;

但我不能对DB执行操作。为什么在不指定密码的情况下提供此访问?是我系统里的窃听器吗?它有目的吗?

EN

回答 1

Database Administration用户

回答已采纳

发布于 2013-02-04 16:53:39

让我们看看您创建用户的方式。

示例:我有一个名为zipcodes的数据库。我将创建一个名为rolando的用户

代码语言:javascript
复制
mysql> grant all on zipcodes.* to rolando identified by 'blahblah';
Query OK, 0 rows affected (0.04 sec)

mysql> show grants for rolando;
+--------------------------------------------------------------------------------------------------------+
| Grants for rolando@%                                                                                   |
+--------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'rolando'@'%' IDENTIFIED BY PASSWORD '*446525BB82B5E22BD9E525261D37C494F623C52B' |
| GRANT ALL PRIVILEGES ON `zipcodes`.* TO 'rolando'@'%'                                                  |
+--------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

我指定了没有IP或网卡的rolando。使用“%”。这应该允许远程IP地址登录。

你说你试图登录你的帐户

代码语言:javascript
复制
 mysql -u violetkiwi -p

为什么这不管用?简单地说,你没有远程连接。您创建了用户violetkiwi@'%'。您应该创建用户violetkiwi@localhost。然后,它可以干净地连接。

您需要确保您的mysql身份验证方案已经清理完毕。

MySQL 5.0认证研究指南第498页第6段在其公报中介绍了如何清理身份验证过程:

在Unix上,MySQL附带了一个mysql_secure_installation脚本,可以在安装过程中执行几个有用的与安全相关的操作。该脚本具有以下功能:

  • 为根帐户设置密码。
  • 删除任何可远程访问的根帐户。
  • 删除匿名用户帐户。这提高了安全性,因为它防止任何人以根用户身份从远程主机连接到MySQL服务器。结果是,任何想要以root用户身份连接的人都必须首先能够登录服务器主机,这提供了抵御攻击的额外屏障。
  • 删除测试数据库(如果删除匿名帐户,也可能希望删除它们访问的测试数据库)。

远程访问帐户是一个以%为主机的帐户,它允许任何人和他的祖母。要查找这些帐户,请运行以下查询:

代码语言:javascript
复制
SELECT user,host FROM mysql.user WHERE host='%';

您还应该了解MySQL用户身份验证是如何发生的。

根据MySQL 5.0认证研究指南第486,487页,下面描述mysql的身份验证算法:

客户端访问控制有两个阶段:在第一阶段,客户端尝试连接,而服务器要么接受连接,要么拒绝连接。要想成功,用户表中的某些条目必须与客户端连接的主机、用户名和密码匹配。在第二阶段(只有当客户端已经成功连接时才会发生),服务器将检查它从客户端收到的每一个查询,以查看客户机是否有足够的权限来执行它。服务器根据客户端连接的主机和客户端提供的用户,根据授予表中的条目匹配客户端。但是,可能有多条记录匹配:当模式包含通配符值时,可以指定授予表amy中的宿主值。如果授予表包含来自myhost.example.com、%.example.com、%.com和%的入口,则它们都匹配从myhost.example.com连接的客户端。授予表条目中的用户值不允许使用模式,但是可以将用户名作为空字符串来指定匿名用户。空字符串匹配任何用户名,因此实际上是通配符。当主机和用户在多个用户表记录中的值与客户端匹配时,服务器必须决定使用哪一个。它首先对具有最特定主机和用户列值的记录进行排序,然后选择排序列表中首先发生的匹配记录,排序如下:在主机列中,文字值(如localhost、127.0.0.1和myhost.example.com排序)先于具有模式字符的值(如%.example.com )。模式值根据它们的具体程度进行排序。例如,%.example.com比%.com更具体,后者比%更具体。在User列中,非空白用户名在空白用户名之前排序.也就是说,非匿名用户优先于匿名用户排序。服务器在启动时执行此排序。它将授权表读入内存,对它们进行排序,并使用内存中的副本进行访问控制.

摘要

如果您有任何必须具有远程访问权限的用户,请将每个拥有%的用户的主机更改为您将要连接的公共IP。

例如,如果用户myuser必须从208.21.42.184连接,则替换主机如下

代码语言:javascript
复制
UPDATE mysql.user SET host='208.21.42.184' WHERE user='myuser' AND host='%';
FLUSH PRIVILEGES;

您还应该检查是否存在任何测试数据库。测试数据库的存在。任何名为test的数据库或其前五个字符为**`test`_ _need的数据库将被重命名为immediately_![我之前写了一篇关于**的方式和原因的文章](https://dba.stackexchange.com/q/13361/877)。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/34071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档