提问者:小点点

无法远程连接到EC2 MySQL安装


我的极限,数小时的变化...

我正在尝试访问已安装的运行在EC2实例上的MySQL。经过大量搜索(这似乎最接近我的问题是从远程服务器连接到Amazon EC2上的mysql),我显然遗漏了一些愚蠢的或误解的东西。

EC2 Ubuntu,mysqld运行良好,本地Web/App服务器工作良好,所有连接。我可以从本地的mysql。我需要使用Iron.io对这个开发机器进行外部访问,它需要从外部访问数据库。

我有

  • EC2安全GRUOP全部配置为允许0.0.0.0
  • 我可以SSH/HTTP访问服务器没有问题
  • 配置的mysqld
    • 绑定地址=0.0.0.0(尝试过以下变体)
    • 已从%授予我的非根用户(myuser)的访问权限,例如,授予全部开启权限。到由“密码”标识的MyUser@"%“;刷新权限;

    我试过了

    • 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.*上的所有特权授予由“password”标识的“myuser2”@“%”;
    • 为%重复,我的个人外部IP
    • 将root@“%”添加到列表中并尝试了该用户(基于以下建议:无法远程连接到运行在EC2实例(不是RDS)上的MySQL实例)

    (始终在之后重新启动服务器)

    什么都不起作用,测试总是

    $mysql--host=54.x.x.x--port=3306--user=myuser-p输入密码:错误1045(28000):拒绝用户“myuser”@“54.x.x.x”的访问(使用密码:YES)

    不过我注意到

    >

  • 从information_schema.user_privileges中选择*;具有IS_GRANTABLE的myser是否设置为n:但我不认为这是一个限制因素(为什么GRANT不能在MySQL中工作?)
  • 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
    

共2个答案

匿名用户

我找到的最好的工具是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-address127.0.0.1localhost更改为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