2012-01-10 101 views
1

我打算在Ubuntu 10.04上使用Apache + mod_wsgi和PostgreSQL部署Django站点。PostgreSQL数据库的Apache用户权限

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

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

当我使用Django syncdb管理命令(和我一样)时,创建的表不能被Apache用户访问。这可以通过给每个表的Apache用户授予所有权限来解决,但这有点麻烦。

另一种方法似乎是允许作为超级用户访问。

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


编辑:因为我已经发现,切换PostgreSQL一起使用MD5认证用于本地连接,使生活更轻松。

使用身份验证时,在正常操作期间通过Apache用户连接到数据库。当使用Django管理命令时,连接通过当前用户。

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

我仍然很想知道使用PostgreSQL超级用户是否明智。

回答

3

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

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

听起来你在这里实际需要的是将Apache用户和其他Django用户组合在一起,因此你可以授予他们访问权限。

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

4

IDENT身份验证结束了比它值得更麻烦。以下是我为了避免使用PostgreSQL超级用户角色而做的事情......

切换到postgres Linux用户:

sudo su - postgres 

编辑PostgreSQL的基于主机的认证配置文件:

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

滚动到接近这个文件的底部,寻找看起来行像这样:

local all all ident 

变化identmd5,退出并保存。这告诉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管理命令,上面的设置将用于对数据库进行身份验证。