【问题标题】:Apache user permissions on PostgreSQL databasePostgreSQL 数据库上的 Apache 用户权限
【发布时间】:2012-02-06 22:24:12
【问题描述】:

我计划在 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 超级用户是否明智。

【问题讨论】:

    标签: django apache postgresql


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2014-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-02
        • 1970-01-01
        • 2013-09-14
        • 2021-01-01
        相关资源
        最近更新 更多