【发布时间】:2015-10-31 13:44:07
【问题描述】:
我的束缚结束,数小时的变化......
我正在尝试访问在 EC2 实例上运行的已安装 MySQL。大量搜索(这似乎最接近我的问题Connect to mysql on Amazon EC2 from a remote server),我显然遗漏了一些愚蠢或误解的东西。
EC2 Ubuntu,mysqld 运行良好,本地 Web/应用程序服务器运行良好,所有连接都正常。我可以从本地mysql。我需要对这台开发机器进行外部访问,因为使用需要从外部访问数据库的 iron.io。
我有
- ec2 安全组全部配置允许 0.0.0.0
- 我可以通过 ssh/http 访问服务器没有问题
- 配置mysqld
- 绑定地址=0.0.0.0(已尝试以下变体)
- 从 % 为我的非 root 用户 (myuser) 授予访问权限 例如GRANT ALL ON . to myuser@'%' IDENTIFIED BY 'password';刷新特权;
- 确保我的 ubuntu 实例 iptables 未配置 例如我只使用 ec2 安全组来保护实例)
我试过了
- ssh 进入服务器
- telnet 到 mysqld 端口 3306 上的公共 ip 以确保其监听 - 请参阅下面的注释
- 删除/etc/mysql/my.cnf中的绑定地址
- 检查它不是 sock v 端口错误:总是通过端口连接(本地检查,例如 mysql -h - localhost -u root -p --port=3306)
- 绑定地址0.0.0.0
- 绑定地址 EC2 本地 ip 例如172.
- 绑定地址 EC2 外部 ip 例如51.x
- mysql 用户在 % 上授予权限
- mysql 用户授予我个人外部 ip 的权限
- 创建另一个用户,并且只将权限授予特定数据库 将 mydb.* 上的所有权限授予 'myuser2'@'%' 由 'password' 识别;
- 重复 %,我的个人外部 ip
- 将 root@'%' 添加到列表并尝试该用户(基于此建议:Can't Connect to MySQL instance Remotely that is running on EC2 Instance (Not RDS))
(之后总是重启服务器)
没有任何效果,测试总是在进行
$ mysql --host=54.x.x.x --port=3306 --user=myuser -p 输入密码: ERROR 1045 (28000): Access denied for user 'myuser'@'54.x.x.x' (使用密码: YES)
我注意到了
- 从 information_schema.user_privileges 中选择 *;将 myser 的 IS_GRANTABLE 设置为 N: 但我不认为这是一个限制因素 (Why is GRANT not working in MySQL?)
-
netstat -a 显示不同的端口和套接字侦听!?
下面 netstat 中的监听端口不是 3306,但我已经从外部远程登录到该端口,它显示 mysql 正在监听
谁能建议我错过的任何步骤?
db 权限的摘录,my.cnf 下面
# user_privileges
# e.g. SELECT * from information_schema.user_privileges;
+--------------------------------+---------------+-------------------------+--------------+
| GRANTEE | TABLE_CATALOG | PRIVILEGE_TYPE | q1 |
+--------------------------------+---------------+-------------------------+--------------+
| 'root'@'localhost' | def | SELECT | YES |
...
| 'myuser'@'%' | def | SELECT | NO |
| 'myuser'@'%' | def | INSERT | NO |
| 'myuser'@'%' | def | UPDATE | NO |
#
]$ netstat -a | grep 'mysql'
tcp 0 0 *:mysql *:* LISTEN
unix 2 [ ACC ] STREAM LISTENING 61212 /var/run/mysqld/mysqld.sock
$ telnet 54.x.x.x 3306
Trying 54.x.x.x...
Connected to ec2-54-x-x-x.us-west-2.compute.amazonaws.com.
Escape character is '^]'.
[
5.5.44-0ubuntu0.14.04.1+c<>d^+W?1*!e\{wdp&hZmysql_native_password
# my.cnf
[mysqld]
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
#skip-external-locking
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address = localhost
# donts seem to work
bind-address = 0.0.0.0
# does not work
# ec2 external ip
#bind-address = 54.x.x.x
# ec2 internal ip
#bind-address = 172.x.x.x
【问题讨论】:
-
你会因为无法识别错误消息不代表的含义而造成很多不必要的麻烦。您在这里没有连接、路由、安全组、网络、端口与套接字或任何类似问题。错误 1045 访问被拒绝意味着您确实连接到服务器,并且它不喜欢您的用户名+主机+密码。列表结束。创建一个非特权测试帐户,新用户名。
GRANT USAGE ON *.* TO 'foo'@'%' IDENTIFIED BY 'bar';。以“foo”身份登录。有用吗? -
....羊...是的。但我还是很困惑。我最初创建了“myuser”,例如我从 % 授予了我的非 root 用户 (myuser) 的访问权限,例如全部授予。 to myuser@'%' IDENTIFIED BY 'password'; ...我错过了什么 - 有什么不同?
-
SELECT * FROM MySQL.user;并查看结果。 MySQL 上的“帐户”并不像通常假设的那样仅由用户名定义。它实际上是用户名 + 主机,但也有一些可能违反直觉的匹配规则。这就是为什么我建议使用不同的用户名。我假设您拥有比您预期更多的“myuser”帐户,可能使用不同的密码。 -
GRANT USAGE是一个“特殊”授权,默认情况下允许一个帐户登录到服务器,但没有别的。我建议只是为了简单起见。 -
"..username +host.." 这是一个有趣的见解,因为我几乎可以保证它会因使用密码等而感到困惑。感谢您抽出宝贵的时间。
标签: mysql amazon-ec2