我的极限,数小时的变化...
我正在尝试访问已安装的运行在EC2实例上的MySQL。经过大量搜索(这似乎最接近我的问题是从远程服务器连接到Amazon EC2上的mysql),我显然遗漏了一些愚蠢的或误解的东西。
EC2 Ubuntu,mysqld运行良好,本地Web/App服务器工作良好,所有连接。我可以从本地的mysql。我需要使用Iron.io对这个开发机器进行外部访问,它需要从外部访问数据库。
我有
我试过了
(始终在之后重新启动服务器)
什么都不起作用,测试总是
$mysql--host=54.x.x.x--port=3306--user=myuser-p输入密码:错误1045(28000):拒绝用户“myuser”@“54.x.x.x”的访问(使用密码:YES)
不过我注意到
>
netstat-a显示不同的端口和套接字监听!?
下面的netstat中的侦听端口不是3306,但我已经从外部telnet到该端口,它显示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
我找到的最好的工具是sqlyog(也许也是mysql工作台),它实际上会在连接失败时告诉您要从哪里进入。
我喜欢它的原因是它保持了严密的安全性,显示了用户“fred123@hdm38.newyork.comcastbusiness.net”的访问被拒绝。注意,那个主机名,我刚刚编出来的,但它很重要,不管你的是什么。否则就是通配符时间,我不会做的。你可以选择。
这一点很重要,因为我在mysqlcreate user
期间使用的是该主机名(hdm38.newyork.comcastbusiness.net),而不是使用通配符,如%
我让上面连接失败,但我注意到上面的主机名。你会在下面看到。
1)远程用户正在通过使用适当的用户、主机
条目创建的帐户进行连接(查看从mysql.user order by 1,2
中选择用户、主机的输出)
CREATE USER 'santa'@'hdm38.newyork.comcastbusiness.net' IDENTIFIED BY 'mypassword';
有了上面的命令,我们现在就有了一个有机会进入的新用户。什么也做不了。无法更改为DB。基本上,它们可以执行以下操作:select now();
2)您已经使用刷新特权
执行了授予
(至少是前者)
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.1
或localhost
更改为0.0.0.0
如果bind-address不是0.0.0.0
,则您只是在使用ssh进行连接
4)您已经修改了my.cnf并且有一个rem d out行#skip-networking
。即使您必须创建一行只是为了rem out它,也要这样做。
3/4更改需要重新启动mysql后台进程
5)防火墙问题。因此,对于EC2,您需要您的AWS安全组
,它对实例是活动的,以包括端口3306的打开
我在Amazon Linux上使用mysqld 5.6.37时一直遇到同样的问题,解决方案是在[mysqld]
下方但在[mysqld_safe]
上方的/etc/my.cnf
中添加bind-address=0.0.0.0
行