结束我的束缚,几个小时的变化。。。
我正在尝试访问在EC2实例上运行的已安装MySQL。大量的搜索(这似乎与我的问题最为接近),我显然遗漏了一些愚蠢或错误的理解。
EC2 Ubuntu,mysqld运行良好,本地web/app服务器运行良好,所有连接正常。我可以从本地mysql。我需要外部访问这个dev机器,就像使用iron.io一样,它需要从外部访问数据库。
我有
ec2安全组全部配置允许0.0.0.0
我可以通过ssh/http访问服务器没有问题
已配置mysqld
绑定地址=0.0.0.0(已尝试以下变体)
已从%授予我的非根用户(my user)的访问权限
全部同意。给myuser@“%”,由“password”标识;刷新权限;
确保我的ubuntu实例iptables没有配置
例如,我只使用ec2安全组来保护实例)
我试过了
ssh到服务器
telnet到mysqld端口3306上的公共ip,以确保其监听-请参阅下面的注释
删除/etc/mysql/my.cnf中的绑定地址
检查它不是sock v port错误:总是通过端口连接(本地检查,例如mysql-h-localhost-u root-p--port=3306)
绑定地址0.0.0.0
绑定地址EC2本地ip,例如172。
绑定地址EC2外部ip,例如51.x
mysql用户授予%
mysql用户授予我的个人外部ip权限
创建另一个用户,并只向特定数据库授予特权
将mydb.*上的所有权限授予由“password”标识的“myuser2”@“%”;
重复%我的个人外部ip
将根@“%”添加到列表中并尝试使用该用户(基于此建议:Connect to mysql on Amazon EC2 from a remote server
(始终在之后重新启动服务器)
什么都不管用,考试总是
$mysql--host=54.x.x.x--port=3306--user=myuser-p
输入密码:
错误1045(28000):用户“myuser”@“54.x.x.x”的访问被拒绝(使用密码:是)
但我注意到
从information schema.user_privileges;中选择*将myser with IS_GRANTABLE设置为N:但我不认为这是一个限制因素(Can't Connect to MySQL instance Remotely that is running on EC2 Instance (Not RDS)
netstat-a显示了一个不同的端口&一个套接字监听!?
下面netstat中的监听端口不是3306,但我已经在外部对该端口进行了telneted,它显示mysql正在监听
有人能告诉我我错过了什么吗?
db priviledges摘录,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

最佳答案

我找到的最好的工具是sqlyog(也许mysql workbench也是),它实际上可以告诉您在失败的连接上的主机名。
我喜欢它的原因是它能保证安全
拒绝用户“fred123@hdm38.newyork.comcastbusiness.net”的访问。注意,主机名,我刚编好,但很重要,不管你的是什么。否则就是通配符时间了,我不会这么做的。你可以选择。
这很重要,因为我在mysqlcreate user期间使用的是主机名(hdm38.newyork.comcastbusiness.net),而不是像%
我让上面的连接失败了,但是我注意到上面的主机名是什么。你将在下面看到它。
快速检查表
1)您的远程用户正在通过使用适当的user,host条目创建的帐户进行连接(查看select user,host from mysql.user order by 1,2的输出)

CREATE USER 'santa'@'hdm38.newyork.comcastbusiness.net' IDENTIFIED BY 'mypassword';

有了上面的命令,我们现在有了一个有机会进入的新用户。什么都做不了。无法更改为数据库。基本上他们可以做一些事情,比如select now();
2)您已经用grants执行了flush privileges(至少是前者)
GRANT ALL PRIVILEGES ON mydb123.* TO 'santa'@'hdm38.newyork.comcastbusiness.net';

使用上述命令的用户现在可以在mydb123数据库/模式中执行任何操作。探索手册中的上述Grant命令,以便为您创建的用户微调访问权限,使其达到最低限度。
如果您不熟悉mysql安全性,请在研究之前不要包含WITH GRANT OPTION
对于步骤1和2,有人会说上面的主机名是“%”。这意味着圣诞老人可以从任何主机连接。选择权在你。一旦你找到了某个地方并做了相关的研究,就要开始努力,放松。
3)您已修改my.cnf,并将bind-address改为127.0.0.1localhost,以支持0.0.0.0
如果绑定地址不是0.0.0.0,则仅使用ssh连接
4)您已经修改了my.cnf,并且有一个rem'd out line#skip-networking。即使你必须创建一条线来删除它,也要这样做。
3/4更改需要重新启动mysql后台程序
5)防火墙问题。因此对于EC2,您需要您的AWS Security Group是活动的,以便实例包括打开端口3306

07-24 12:33
查看更多