无法远程连接到 EC2 MySQL 安装

Ben*_*Ben 4 mysql amazon-ec2

我的系绳结束,数小时的变化......

我正在尝试访问在 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 的权限
  • 创建另一个用户,并且只授予特定数据库的特权 GRANT ALL PRIVILEGES ON mydb.* TO 'myuser2'@'%' IDENTIFIED BY 'password';
  • 重复 %,我的个人外部 ip
  • 将 root@'%' 添加到列表中并尝试使用该用户(基于此建议:Can't Connect to MySQL instance Remotely that running on EC2 Instance (Not RDS)

(之后总是重新启动服务器)

没有任何效果,测试总是

$ mysql --host=54.xxx --port=3306 --user=myuser -p 输入密码:ERROR 1045 (28000): Access denied for user 'myuser'@'54.xxx' (using password: YES)

然而我注意到

  1. SELECT * from information_schema.user_privileges; 将 IS_GRANTABLE 设置为 N 的 myser:但我不认为这是一个限制因素(为什么 GRANT 在 MySQL 中不起作用?
  2. netstat -a 显示不同的端口和套接字监听!?

    下面的 netstat 中的侦听端口不是 3306 但我已经从外部 telneted 到该端口,它显示 mysql IS 正在侦听

谁能建议我错过的任何步骤?

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
Run Code Online (Sandbox Code Playgroud)

Dre*_*rew 5

我发现的最好的工具是 sqlyog,(也许还有 mysql 工作台),它实际上会在连接失败时告诉您来自的主机名。

我喜欢它的原因是它保持安全性,显示类似于用户“fred123@hdm38.newyork.comcastbusiness.net”拒绝访问的内容。请注意,该主机名是我刚刚编造的,但它很重要,无论您输入的是什么。否则是通配符时间,我不会这样做。你可能会选择。

这很重要,因为该主机名(hdm38.newyork.comcastbusiness.net)是我在 mysql 期间使用的主机名create user,而不是使用像 % 这样的通配符

我让上面的连接失败,但我注意到上面的主机名是什么。你会在下面看到它。

快速检查清单

1) 您的远程用户正在通过使用适当user,host条目创建的帐户进行连接(查看来自 的输出select user,host from mysql.user order by 1,2

CREATE USER 'santa'@'hdm38.newyork.comcastbusiness.net' IDENTIFIED BY 'mypassword';
Run Code Online (Sandbox Code Playgroud)

使用上面的命令,我们现在有了一个有机会进入的新用户。不能做任何事情。无法更改为 db。基本上他们可以做这样的事情select now();

2)您曾grantsflush privileges(至少是前者)一起表演

GRANT ALL PRIVILEGES ON mydb123.* TO 'santa'@'hdm38.newyork.comcastbusiness.net';
Run Code Online (Sandbox Code Playgroud)

我们使用上述命令的用户现在可以在 mydb123 数据库/模式中执行任何操作。在手册中探索上面的 Grant 命令,以微调您创建的用户对最低限度的访问。

如果您不熟悉 mysql 安全,请在WITH GRANT OPTION研究之前不要包含。

有些人会说上面的主机名是第 1 步和第 2 步的“%”。这意味着圣诞老人可以从任何主机连接。这是你的选择。开始紧张,一旦你到达某个地方并对其进行了研究,就放松。

3) 您已修改my.cnf并更改bind-address127.0.0.1localhost,而支持0.0.0.0

如果 bind-address 不是0.0.0.0,则您仅使用 ssh 连接

4) 你已经修改了my.cnf并且有一个 rem'd out line #skip-networking。即使您必须创建该行只是为了将其清除,也请这样做。

3/4 更改需要重启 mysql 守护进程

5)防火墙问题。因此,对于 EC2,您需要您AWS Security Group的实例处于活动状态以包括开放端口 3306