如何在Heroku上存储私钥?

时间:2013-01-05 22:21:50

标签: python heroku flask

我有一个托管在Heroku上的烧瓶应用,需要使用boto.cmdshell在AWS EC2实例(Amazon Linux AMI)上运行命令。几个问题:

  1. 使用密钥对访问EC2实例是最佳做法吗?或者更好地使用用户名/密码?
  2. 如果使用密钥对是首选方法,那么在Heroku上管理/存储私钥的最佳做法是什么?显然,将私钥放在git中不是一种选择。
  3. 感谢。

3 个答案:

答案 0 :(得分:5)

Heroku可让您利用config variables来管理您的应用。这是我的config.py文件的一个例子,它位于我的烧瓶应用程序中:

import os

# flask
PORT = int(os.getenv("PORT", 5000))
basedir = str(os.path.abspath(os.path.dirname(__file__)))
SECRET_KEY = str(os.getenv("APP_SECRET_KEY"))
DEBUG = str(os.getenv("DEBUG"))
ALLOWED_EXTENSIONS = str(os.getenv("ALLOWED_EXTENSIONS"))
TESTING = os.getenv("TESTING", False)

# s3
AWS_ACCESS_KEY_ID = str(os.getenv("AWS_ACCESS_KEY_ID"))
AWS_SECRET_ACCESS_KEY = str(os.getenv("AWS_SECRET_ACCESS_KEY"))
S3_BUCKET = str(os.getenv("S3_BUCKET"))
S3_UPLOAD_DIRECTORY = str(os.getenv("S3_UPLOAD_DIRECTORY"))

现在我可以有两组不同的结果。它来自我的Environment variables。一个是我的应用程序在我的本地计算机上,而是在生产时从Heroku配置变量。例如。

 DEBUG = str(os.getenv("DEBUG")) 

在我的本地计算机上为“TRUE”。但是Heroku上的假。为了检查你的Heroku配置运行。

Heroku config

另请注意,如果您希望将某些文件保留在本地项目的一部分而不是heroku或github,则可以使用git ignore。当然,那些文件将不会存在于您的生产应用程序中。

答案 1 :(得分:4)

我在寻找的是如何处理私钥的指导。 @DrewV和@yfeldblum都向我指出了正确的方向。我最终将我的私钥变成了一个字符串并将其存储在Heroku配置变量中。

如果有人想要做类似的事情,这里有一个使用paramiko的示例代码snippit:

import paramiko, base64
import StringIO
import os

key = paramiko.RSAKey.from_private_key(StringIO.StringIO(str(os.environ.get("AWS_PRIVATE_KEY"))))
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(str(os.environ.get("EC2_PUBLIC_DNS")), username='ec2-user', pkey=key)
stdin, stdout, stderr = ssh.exec_command('ps')

for line in stdout:
    print '... ' + line.strip('\n')
ssh.close()

感谢@DrewV和@yfeldblum的帮助(upvote for both)。

答案 2 :(得分:3)

您可以使用config vars在Heroku上运行的应用程序中存储配置项。

您可以使用用户名/密码组合。您可以使用户名变得简单;但请务必生成一个强密码,例如openssl rand -base64 32