PostgreSQL数据库上的Apache用户权限

时间:2012-01-10 14:00:18

标签: django apache postgresql

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

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

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

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

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

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


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

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

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

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

2 个答案:

答案 0 :(得分:4)

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

切换到postgres linux用户:

sudo su - postgres

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

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

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

local   all   all   ident

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

/etc/init.d/postgresql-8.4 restart

创建PostgreSQL用户:

createuser django_user --pwprompt

提示时不要接受任何特殊权限。现在创建一个新数据库:

createdb -E UTF8 -O django_user django_db

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

exit

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

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管理命令时,上述设置将用于对数据库进行身份验证。

答案 1 :(得分:3)

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

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

听起来你真正需要的是将Apache用户和其他Django用户组合在一起的角色,这样你就可以批准他们访问。

Postgresql确实可以同时为模式中的所有表等授予权限,也可以指定要应用于新对象的默认权限。之前的回答可能会有所帮助:How do you create a read-only user in PostgreSQL?