【问题标题】:"Correct" way to store postgres password in python website在python网站中存储postgres密码的“正确”方式
【发布时间】:2013-04-09 07:23:57
【问题描述】:

我正在用 Python(在 Linux 系统上的 Apache 服务器上)编写一个需要连接到 Postgres 数据库的 Web 应用程序。因此,它需要数据库服务器的有效密码。在我的 Python 文件中硬编码密码似乎不太令人满意。

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

【问题讨论】:

  • 主目录并不总是/home/username -- 运行gawk -F: '($1 ~/www-data/) {print $6}' /etc/passwd 找出它在哪里。
  • 谢谢!结果发现主目录是 /var/www,这是有道理的,但由于这是服务器向世界开放文件的地方,我猜这可能不是存储 .pgpass 文件的好地方,对吧?
  • Django 将数据库密码存储在 python 配置文件中,我不明白为什么它会让人不满意。好吧,虽然它并不是真正的硬编码。
  • 你的意思是这样的吗? docs.python.org/3/library/configparser.html

标签: python apache postgresql mod-wsgi


【解决方案1】:

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

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

  • 使用 apache suexec 模块以单独的用户身份运行脚本;
  • 使用 fast-cgi (fcgi) 或 scgi 以其他用户身份运行 cgi;或
  • 让应用运行自己的最小 HTTP 服务器并为其安装 Apache 反向代理

其中,目前最好的选择通常是使用 scgi/fcgi。它让您可以轻松地以不同的 unix 用户身份运行您的应用,但避免了反向代理的复杂性和开销。

【讨论】:

  • 这听起来很明智。它是否适用于 mod-wsgi,还是完全不同的做事方式?
  • @AdamJacobs 是的,或者您可以通过 fcgi 使用 wsgi 到 fcgi 接口。
  • Apache/mod_wsgi 守护程序模式还允许您以不同的用户身份运行代码。
【解决方案2】:

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

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

mod_wsgi siteQuick Configuration GuideConfiguration GuidelinesConfiguration Directives 中清楚地描述了所有这些以及更多内容

【讨论】:

  • 谢谢,这看起来确实很有用。虽然我不确定我是否完全同意你的说法,即“描述清楚”。看起来我可能会花几天时间试图让我的头脑在我开始工作之前得到它。但也许这是值得的,因为它看起来确实是一种确保安全的好方法。
  • @Adam 从最简单的“hello word”开始,一步一步来。这样一来,您就可以在所有问题发生时解决它们,而不是一路走来迷路。那里描述的模式非常成熟。如果您没有太多 Apache 经验并且尝试自己的方式,您可能会以多点失败告终。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
  • 1970-01-01
  • 2010-10-24
  • 2014-02-06
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多