2013-04-09 68 views
3

我正在编写一个需要连接到Postgres数据库的Python(在Linux系统上的Apache服务器上)的Web应用程序。因此它需要数据库服务器的有效密码。在我的Python文件中对密码进行硬编码似乎并不令人满意。“正确”的方式来存储python网站postgres密码

我确实想知道如何使用.pgpass文件,但它需要属于www-data用户,对吧?默认情况下,没有/ home/www-data目录,这是我希望存储.pgpass文件的地方。我可以创建一个这样的目录并将.pgpass文件存储在那里吗?如果不是,那么使我的Python脚本连接到数据库的“正确”方法是什么?

+0

首页目录并非总是'/家庭/ username' - 运行'GAWK -F:“($为1〜/www-data /){print $ 6}'/ etc/passwd'来找出它在哪里。 – 2013-04-09 07:32:09

+0

谢谢!原来主目录是/ var/www,哪种类型是有道理的,但是因为这是服务器向世界打开文件的地方,所以我猜这可能不是一个存放.pgpass文件的好地方,对吧? – 2013-04-09 07:55:10

+1

Django在Python配置文件中存储DB密码,我不明白为什么它可能不令人满意。那么,它并没有真正的硬编码。 – gatto 2013-04-09 08:05:57

回答

1

无论您使用什么方法,运行为www-data的其他应用程序都将能够读取您的密码并登录到您的数据库。使用peer身份验证不会帮助你,它仍然会信任在www-data下运行的所有应用程序。

如果您希望您的应用程序能够将其数据与其他数据库隔离,则需要将其作为单独的用户标识运行。与此有关的主要方法是:

  • 使用apache suexec模块作为单独的用户运行脚本;
  • 使用fast-cgi(fcgi)或scgi以不同的用户身份运行cgi;或
  • 了该应用程序运行其自己的最小的HTTP服务器,并Apache的反向代理吧

其中,迄今为止最好的选择通常是使用SCGI/FCGI。它可让您轻松地将您的应用作为不同的unix用户运行,但可以避免反向代理的复杂性和开销。

+0

这听起来很合理。它与mod-wsgi一起工作,还是完全不同的做事方式? – 2013-04-09 09:22:52

+0

@AdamJacobs是的,或者你可以通过'fcgi'使用wsgi到fcgi接口。 – 2013-04-09 09:26:42

+0

Apache/mod_wsgi守护进程模式还允许您以不同的用户身份运行代码。 – 2013-04-10 00:56:26

1

将应用程序及其配置文件安装在与静态文件目录不同的目录中,并且只能由应用程序用户读取。

设置另一个用户来运行应用程序并使用WSGIDaemonProcess指令。

所有这些以及更多的mod_wsgi site清楚地说明,在Quick Configuration GuideConfiguration GuidelinesConfiguration Directives

+0

谢谢,这确实看起来很有用。虽然我不确定我是否完全同意你所说的“清楚描述”。看起来像是我可能花了几天的时间试图让我的脑袋在我开始工作之前。但也许这是值得的,因为它看起来确实是保持安全的一种非常好的方式。 – 2013-04-10 06:37:39

+0

@Adam从最简单的“你好”字开始,一步一步来。这样,你就可以在发生问题时得到所有的问题,而不是整个过程中迷路。这里描述的模式非常完善。如果你没有太多的Apache经验,并且你尝试自己的方式,你可能会以多点失败而告终。 – 2013-04-10 09:33:27