- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在提供一项托管在Heroku上的服务,该服务使用户可以使用自己的数据库报告自己的数据。我的客户必须将我的Heroku应用程序连接到他们的数据库。他们中的一些人显然害怕让数据通过Internet清晰地传输。
Heroku是否可以打开从我的应用程序(Play框架/ Java)到他们的计算机的SSH隧道?
注意:我知道SSH tunneling to a remote DB from Heroku?,但是在这个问题上,可以使用内置的Heroku db。
谢谢,
阿德里安
最佳答案
是的你可以。
现在走了这条路:是的,可以设置来建立从heroku到外部数据库的SSH隧道。 [注意:我的特定应用程序是用Ruby on Rails编写的,但此处给出的解决方案应适用于Heroku上托管的任何语言。]
问题陈述
我正在Heroku上运行一个应用程序。该应用程序需要访问外部MySQL数据库(托管在AWS上),并从中获取数据进行分析。使用ssh密钥保护对MySQL数据库的访问,即您无法使用密码访问它:您需要一个ssh密钥对。由于Heroku重新启动每个dyno,您如何设置具有适当凭据的SSH隧道?
简短答案
创建一个脚本文件,例如ssh_setup.sh。将其放在$ {HOME} /。profile.d / ssh_setup.sh中。 Heroku将注意到$ {HOME} /。profile.d中的任何文件,并在创建dyno时执行该文件。使用脚本文件来设置〜/ .ssh / id_rsa和〜/ .ssh / id_rsa.pub,然后以隧道模式启动ssh。
完整食谱
1.生成密钥对以访问外部数据库
创建一个密钥对,并将其保存在〜/ .ssh / heroku_id_rsa和〜/ .ssh / heroku_id_rsa.pub中。使用空密码(否则,Heroku dyno将在启动时尝试提示输入密码):
$ ssh-keygen -t rsa -C "me@example.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/.ssh/id_rsa): /home/.ssh/heroku_id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/.ssh/heroku_id_rsa.
Your public key has been saved in /home/.ssh/heroku_id_rsa.pub.
$ ssh -v -i ~/.ssh/heroku_id_rsa -N -L 3307:${REMOTE_MYSQL_HOST}:3306 ${TUNNEL_USER}@${TUNNEL_SITE}
debug1: Authentication succeeded (publickey).
...
debug1: forking to background
debug1: Entering interactive session.
$ heroku config:set HEROKU_PRIVATE_KEY=`cat ~/.ssh/heroku_rsa_id`
$ heroku config:set HEROKU_PUBLIC_KEY=`cat ~/.ssh/heroku_rsa_id.pub`
$ heroku config:set REMOTE_MYSQL_HOST=<your value of REMOTE_MYSQL_HOST from above>
$ heroku config:set TUNNEL_USER=<your value of TUNNEL_USER from above>
$ heroku config:set TUNNEL_SITE=<your value of TUNNEL_SITE from above>
# file: .profile.d/ssh-setup.sh
#!/bin/bash
echo $0: creating public and private key files
# Create the .ssh directory
mkdir -p ${HOME}/.ssh
chmod 700 ${HOME}/.ssh
# Create the public and private key files from the environment variables.
echo "${HEROKU_PUBLIC_KEY}" > ${HOME}/.ssh/heroku_id_rsa.pub
chmod 644 ${HOME}/.ssh/heroku_id_rsa.pub
# Note use of double quotes, required to preserve newlines
echo "${HEROKU_PRIVATE_KEY}" > ${HOME}/.ssh/heroku_id_rsa
chmod 600 ${HOME}/.ssh/heroku_id_rsa
# Preload the known_hosts file (see "version 2" below)
# Start the SSH tunnel if not already running
SSH_CMD="ssh -f -i ${HOME}/.ssh/heroku_id_rsa -N -L 3307:${REMOTE_MYSQL_HOST}:3306 ${REMOTE_USER}@${REMOTE_SITE}"
PID=`pgrep -f "${SSH_CMD}"`
if [ $PID ] ; then
echo $0: tunnel already running on ${PID}
else
echo $0 launching tunnel
$SSH_CMD
fi
$ git add .
$ git commit -m 'launching ssh when Heroku dyno starts up'
$ git push heroku master
$ heroku run sh
Running `sh` attached to terminal... up, run.1926
bash: creating public and private key files
bash: launching tunnel
The authenticity of host 'example.com (11.22.33.44)' can't be established.
ECDSA key fingerprint is 1f:aa:bb:cc:dd:ee:ff:11:22:33:44:55:66:77:88:99.
Are you sure you want to continue connecting (yes/no)?
yes
,让脚本运行完成。现在,我们将捕获known_hosts文件的输出:
heroku $ cat ~/.ssh/known_hosts
|1|longstringofstuff= ecdsa-sha2-nistp256 more stuff=
|1|morestuff= ecdsa-sha2-nistp256 yetmorestuff=
# Preload the known_hosts file (see "version 2" below)
echo '|1|longstringofstuff= ecdsa-sha2-nistp256 more stuff=
|1|morestuff= ecdsa-sha2-nistp256 yetmorestuff=' > ${HOME}/.ssh/known_hosts
# Start the SSH tunnel if not already running
... etc ...
$ git add .
$ git commit -m 'preload known_hosts file to avoid prompt'
$ git push heroku master
$ heroku run sh
Running `sh` attached to terminal... up, run.1926
bash: creating public and private key files
bash: launching tunnel
SSH_CMD="ssh -v -f -i ${HOME}/.ssh/heroku_id_rsa -N -L ${LOCAL_PORT}:${REMOTE_MYSQL_HOST}:${MYSQL_PORT} ${REMOTE_USER}@${REMOTE_SITE}"
git add ... git commit ... git push
序列并调用
heroku run sh
。它将打印很多调试输出。拥有比我更多的头脑的sysadmin friend 应该能够解码该输出以告诉您问题出在哪里。
config/database.yml
文件中(更改名称):
mysql_legacy:
adapter: mysql2
database: mysql_legacy
username: <%= ENV['LEGACY_DB_USERNAME'] || 'root' %>
password: <%= ENV['LEGACY_DB_PASSWORD'] || '' %>
host: 127.0.0.1
port: 3307
-L 3307:${REMOTE_MYSQL_HOST}:3306
关于heroku - 来自Heroku的SSH隧道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21575582/
是否有任何解决方案/补丁可以使 nginx 与上游的 socks 一起工作? 像这样: server { location / { proxy_pass socks5://ip:port
我的连接隧道有问题。因此,我正在使用两个安装了oracle xe(端口1521)的ubuntu服务器虚拟机,我们将它们称为uvm1和uvm2。我的目标是为两个服务器创建两个隧道,并将端口映射到主机,并
我正在使用 sshd 通过托管 Debian 的远程计算机隧道传输我所有的互联网流量。但是我的互联网连接变得很慢(大约 5 到 10 kbps!)。默认配置有什么问题会导致此问题吗? 提前致谢 最佳答
有没有办法在 OpenStreetMap 上显示所有隧道 + 道路?我正在为旅行制作自行车导航系统。在隧道中,我们丢失了 GPS 位置,因为隧道中没有 GPS 数据。我想知道我的位置进入隧道和离开隧道
我目前正在尝试在 Java 客户端(包括 Netty)和服务器之间实现一个 Http 隧道,所以我想知道是否有任何服务器也基于 Netty 来支持这个隧道,或者我应该构建服务器端我自己? 最佳答案 我
我希望从远程主机通过 SSH 建立一个端口。我希望将此实现为 oclif 插入;我希望用户体验如下所示: laptop$ give-jupyter http://localhost:4040/ lap
我正在寻找一种允许我使用 SSH 隧道连接到 R 中的 MySQL 服务器(而不是文件)的方法;我假设它需要 RCurl 和 RODBC 的组合,但我似乎无法让它正常工作。 我遇到了this post
基本上我想以编程方式通过代理服务器创建 SSL 隧道。我正在使用 openssl 创建 ssl 隧道,我可以创建它,但不确定如何通过代理服务器创建隧道。 最佳答案 快速谷歌搜索给我这个 pytunne
我想设置一个简单的 ssh 隧道,从本地机器到互联网上的机器。 我在用着 ssh -D 8080 -f -C -q -N -p 12122 @ 设置工作正常(我认为)导致 ssh 返回要求我提供的凭据
昨天,我接受了一家公司的 UI 开发面试。重点是面试官问了一个重要问题what is HTTP tunneling . 我从未遇到过有关 javascript、HTML 和 jquery 等 UI 内
对不起,长篇大论,我试图说得一清二楚。 * 一点背景 * 作为项目的一部分,我们需要能够使用远程桌面 (RDP) 从具有有效 IP 地址的服务器访问某些计算机(以下称为客户端)。这些客户端位于 NAT
我尝试了命令 killall ngrok,但我得到'killall' 未被识别为内部或外部命令、可操作程序或批处理文件。 killall 不应该和 ngrok 一起出现吗?我在互联网上找不到任何关于该
我需要连接到特定的 API,但该 API 只接受来 self 的配对服务器的请求。然后将这些信息包含在我们的网站中。 所以基本上我需要连接到服务器,使请求接收到答案并将其传输到我的主机,以便我可以使用
使用虚拟主机而不是部署的 Docker 容器,创建 ssh 隧道以便从我的本地机器访问分隔的机器对我来说是一个正常的工作过程。例如,将我的 psql 客户端连接到我只能从堡垒箱访问的 Postgres
我有一个从 Cloud Foundry 数据库转储数据的脚本,它的工作方式如下: cf ssh -L 33001:db.host:3306 --skip-remote-execution App &
我对以下系统架构有疑问: 假设我们有三台机器: SERVER A SERVER B EXTERNAL A SERVER A 正在提供一些流媒体服务,它在一个未知的网络后面,所以它在指定的端口上打开一个
我想从家庭计算机访问位于防火墙后面的工作计算机。 由于工作防火墙阻止意外的传入连接,我必须打开从工作计算机到家庭计算机的反向 SSH 隧道,如下所示: ssh -R 12345:localhost:2
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
我遇到了 SSH 隧道问题,我知道这可能是我的本地端口的权限问题,很可能是 127.0.0.1:3308。但是,我已经以管理员身份运行了我的程序(sudo python3 myprogram.py),
我使用此链接在 centos linux 中创建 ip 隧道 http://www.techonia.com/create-tunnel-interface-linux . 然后我想删除现有的隧道,我
我是一名优秀的程序员,十分优秀!