2014-12-05 120 views
0

我的RoR應用程序需要訪問遠程數據庫(FWIW它的mysql託管在rds.amazonaws.com上)。訪問它的唯一方法是通過SSH隧道。在Heroku上設置SSH隧道:安裝SSH密鑰對?

我已經在我的本地機器上測試了訪問權限。我通過相當於建立隧道:

ssh -f -N -L 3307:longname.rds.amazonaws.com:3306 [email protected]_host.com 

(但見https://stackoverflow.com/a/27305457/558639,看看我是如何真正做的話)。無論如何,我需要在Heroku上安裝一個SSH密鑰對(包括私有和公共部分)才能工作。

雖然我在這裏不熟悉的領域。我可以編寫一個腳本,該腳本在安裝密鑰的Heroku會話開始時啓動。什麼是正確的方式來實現這一點,而不是不必要地暴露私鑰?

回答

0

這是我想出的。 (更長的說明,請參閱SSH tunneling from Heroku。)

  1. 設置了一堆的環境變量,包括公共和私有密鑰,使用heroku config:set NAME1=value1 NAME2=value2 etc...
  2. 創建.profile.d/web-setup.sh包含以下內容。請注意,根據https://devcenter.heroku.com/articles/profiled,當dyno第一次設置時,.profile.d目錄中的任何文件都將運行。

注意:這樣,私密SSH密鑰只有在heroku環境中顯示爲配置變量。由於其他敏感信息保留在那裏,我認爲這是一種相對安全的方法。

.profile.d/web-setup.sh文件包含:

# file=.profile.d/web-setup.sh 

# create keypair files on this dyno 
echo $0: creating public and private key files 
mkdir -p ${HOME}/.ssh 
echo "${PUBLIC_KEY}" > ${HOME}/.ssh/heroku_id_rsa.pub 
chmod 644 ${HOME}/.ssh/heroku_id_rsa.pub 
# note the use of double quotes to preserve newlines! 
echo "${PRIVATE_KEY}" > ${HOME}/.ssh/heroku_id_rsa 
chmod 600 ${HOME}/.ssh/heroku_id_rsa 

# You may need to preload known-hosts here. See 
# https://stackoverflow.com/questions/21575582/ssh-tunneling-from-heroku/27361295#27361295 
# on how to do that. 

# open a tunnel if not already running 
SSH_CMD="ssh -f -i ${HOME}/.ssh/heroku_id_rsa -N -L ${LOCAL_PORT}:${REMOTE_MYSQL_HOST}:${MYSQL_PORT} ${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