Apache user permissions on PostgreSQL database
我打算在Ubuntu 10.04上使用Apache + mod_wsgi和PostgreSQL部署Django站点。
我打算使用IDENT身份验证连接到数据库。为此,我需要为Apache(
然后我创建了一个数据库。我在测试期间实际上做了两次。我第一次将Apache用户设置为所有者;第二次我将所有者设置为我自己(超级用户),并将数据库的所有权限授予Apache用户。
当我使用Django syncdb管理命令(就像我自己)时,Apache用户无法访问创建的表。这可以通过向每个表的Apache用户授予所有权限来解决,但这有点令人讨厌。
替代方案似乎是允许以超级用户身份进行访问。
我的项目作为Postgresql超级用户访问本地数据库是否安全/可接受,并且使用IDENT身份验证是否安全?如果没有,通常的做法是什么?
编辑:我已经发现切换PostgreSQL使用md5身份验证进行本地连接使生活更轻松。
使用ident身份验证时,在正常操作期间通过Apache用户与数据库建立连接。使用Django管理命令时,连接是通过当前用户进行的。
如果使用MD5,则两种情况都将使用settings.py文件的DATABASES部分中指定的详细信息连接到数据库,从而避免上面列出的问题。
我仍然有兴趣知道使用PostgreSQL超级用户是否明智。
IDENT认证最终比它的价值更麻烦。以下是我最终要做的就是避免使用PostgreSQL超级用户角色......
切换到
1 | sudo su - postgres |
编辑PostgreSQL基于主机的身份验证配置文件:
1 | nano /etc/postgresql/8.4/main/pg_hba.conf |
滚动到此文件底部附近,查找如下所示的行:
1 | local all all ident |
将
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': '', } } |
运行
让应用程序以超级用户身份连接几乎绝对是不明智的。除非应用程序需要实际创建和/或删除数据库本身(这是极不可能的),我认为这不是必要的。如果应用程序作为该数据库的所有者连接到数据库,则它实际上是该数据库范围内的超级用户,这可能不是太糟糕。
我通常让应用程序使用通过MD5进行身份验证的帐户访问数据库。例如,可以设置pg_hba.conf,使得应用程序帐户是唯一可以使用MD5身份验证的帐户,本地计算机上的所有其他用户都使用身份/对等身份验证。
听起来你真正需要的是将Apache用户和其他Django用户组合在一起的角色,因此你可以集体授予他们访问权限。
Postgresql确实有一种方法可以同时为模式中的所有表等授予权限,也可以指定应用于新对象的默认权限。之前的回答可能会有所帮助:如何在PostgreSQL中创建只读用户?