如何配置Rails以实现对远程数据库的无密码访问

时间:2014-11-06 07:49:35

标签: mysql ruby-on-rails ruby ssh

注意:这与Use Ruby on Rails and SSH to access remote MySQL database on remote server类似,但是OP没有提供太多信息,并且给出的唯一答案没有回答这个问题。

背景

我们最近将远程数据库从密码身份验证切换为基于ssh密钥的身份验证。我已经验证我可以通过优雅的Sequel Pro图形数据库客户端使用以下设置访问数据库(某些名称被故意混淆):

MySQL Host: woofwoof.us-west-2.rds.amazonaws.com
Username:   bowser
Database:   canine
Port:       3306

SSH Host:   salt.woofwoof.com
SSH User:   guardian
SSH Key:    ~/.ssh/id_rsa

现在我需要Rails连接到同一个数据库,也使用基于ssh密钥的身份验证。

问题

我的config/database.yml文件中包含哪些内容?

到目前为止,我有:

canine:
    adapter: mysql2
    database: canine
    username: bowser
    host: woofwoof.us-west-2.rds.amazonaws.com
    port: 3306

...但如何在SSH Host文件中指定SSH UserSSH Keyconfig/database.yml

其他信息

当我们的数据库有密码验证时,以下工作:

canine:
    adapter: mysql2
    database: canine
    username: bowser
    password: *secret*
    host: woofwoof.us-west-2.rds.amazonaws.com
    port: 3306

2 个答案:

答案 0 :(得分:23)

首先,您需要在MySQL服务器上建立SSH隧道。在客户端计算机上,运行:

ssh -fNg -L 3307:127.0.0.1:3306 guardian@salt.woofwoof.com

这将建立到salt.woofwoof.com服务器的SSH隧道。与localhost端口3307的任何连接都将通过隧道发送到端口3306上的远程主机。

然后就像配置本地连接一样配置你的database.yml,但是指定转发端口3307:

canine:
  adapater: mysql2
  database: canine
  username: bowser
  password: *secret*
  port: 3307

您可能还希望将ssh隧道设置添加到/ etc / inittab,以便在引导后建立隧道。有关如何执行此操作的示例,请参阅http://chxo.com/be2/20040511_5667.html

答案 1 :(得分:2)

还有一个纯Rails解决方案

将以下内容添加到您的Gemfile

 gem 'net-ssh-gateway'

然后创建一个课程

module RemoteConnectionManager
  SSH_USER = 'YOUR_SSH_USER'

  def self.port_through_tunnel(remote_host, port, local_port: nil, db_host:'localhost')
    return Net::SSH::Gateway.new(remote_host, SSH_USER)
      .open(db_host,port,local_port)
  end
end

最后更改您的数据库。yml

  adapter: mysql2
    host: 127.0.0.1
    port:  <%= RemoteConnectionManager.port_through_tunnel('your_ssh_host', 3306, db_host: 'your_db_host_eg_some_aws_rds_db' ) %>
    username: your_db_username
    password: your_db_password
    database: your_db_name

如果local_port为nil,Net / ssh将选择一个免费的