关于django:PostgreSQL数据库上的Apache用户权限

Apache user permissions on PostgreSQL database

我打算在Ubuntu 10.04上使用Apache + mod_wsgi和PostgreSQL部署Django站点。

我打算使用IDENT身份验证连接到数据库。为此,我需要为Apache(www-data)创建一个Postgresql用户。我选择不使其成为超级用户或提供任何特殊权限。

然后我创建了一个数据库。我在测试期间实际上做了两次。我第一次将Apache用户设置为所有者;第二次我将所有者设置为我自己(超级用户),并将数据库的所有权限授予Apache用户。

当我使用Django syncdb管理命令(就像我自己)时,Apache用户无法访问创建的表。这可以通过向每个表的Apache用户授予所有权限来解决,但这有点令人讨厌。

替代方案似乎是允许以超级用户身份进行访问。

我的项目作为Postgresql超级用户访问本地数据库是否安全/可接受,并且使用IDENT身份验证是否安全?如果没有,通常的做法是什么?

编辑:我已经发现切换PostgreSQL使用md5身份验证进行本地连接使生活更轻松。

使用ident身份验证时,在正常操作期间通过Apache用户与数据库建立连接。使用Django管理命令时,连接是通过当前用户进行的。

如果使用MD5,则两种情况都将使用settings.py文件的DATABASES部分中指定的详细信息连接到数据库,从而避免上面列出的问题。

我仍然有兴趣知道使用PostgreSQL超级用户是否明智。


IDENT认证最终比它的价值更麻烦。以下是我最终要做的就是避免使用PostgreSQL超级用户角色......

切换到postgres linux用户:

1
sudo su - postgres

编辑PostgreSQL基于主机的身份验证配置文件:

1
nano /etc/postgresql/8.4/main/pg_hba.conf

滚动到此文件底部附近,查找如下所示的行:

1
local   all   all   ident

ident更改为md5,退出并保存。这告诉PostgreSQL使用MD5加密的密码在本地连接上进行身份验证。现在重启PostgreSQL:

1
/etc/init.d/postgresql-8.4 restart

创建PostgreSQL用户:

1
createuser django_user --pwprompt

出现提示时,请勿接受任何特殊权限。现在创建一个新数据库:

1
createdb -E UTF8 -O django_user django_db

这些选项以UTF8编码数据库,并将所有者设置为django_user。您现在可以退回到原始的linux用户帐户:

1
exit

您的项目设置文件(settings.py)需要包含以下内容:

1
2
3
4
5
6
7
8
9
10
DATABASES = {
    'default': {
        'ENGINE': 'django.contrib.gis.db.backends.postgis',
        'NAME': 'django_db',
        'USER': 'django_user',
        'PASSWORD': '[your password]',
        'HOST': '',
        'PORT': '',
    }
}

运行python manage.py syncdb或任何其他Django管理命令时,上述设置将用于对数据库进行身份验证。


让应用程序以超级用户身份连接几乎绝对是不明智的。除非应用程序需要实际创建和/或删除数据库本身(这是极不可能的),我认为这不是必要的。如果应用程序作为该数据库的所有者连接到数据库,则它实际上是该数据库范围内的超级用户,这可能不是太糟糕。

我通常让应用程序使用通过MD5进行身份验证的帐户访问数据库。例如,可以设置pg_hba.conf,使得应用程序帐户是唯一可以使用MD5身份验证的帐户,本地计算机上的所有其他用户都使用身份/对等身份验证。

听起来你真正需要的是将Apache用户和其他Django用户组合在一起的角色,因此你可以集体授予他们访问权限。

Postgresql确实有一种方法可以同时为模式中的所有表等授予权限,也可以指定应用于新对象的默认权限。之前的回答可能会有所帮助:如何在PostgreSQL中创建只读用户?