目标
创建一个数据库,其中包括三个用户,并限制他们的权限(我只是在胡思乱想,所以我的用户分离也可以更正):
- 超级用户 - 这个用户允许对数据库进行最初的配置。创建应用程序数据库,创建其他用户,设置他们的权限。默认的
postgres
超级用户适用于我,所以这一部分已经完成。 - 管理员 - 这个用户仅有权限访问在配置期间创建的数据库。管理员可以 CRUD 所有表中的所有数据,并且还可以 CRUD 表等等。这是一种“仅针对此数据库的超级用户”的情况。当应用程序正在更新时,管理员是自动化工具使用的用户,用于处理数据库迁移。
- 应用程序用户 - 这个用户最终支持 Web 应用程序的功能。请注意,这与网页上的用户等无关 - 这是服务器利用来运行查询、插入和删除数据的用户。我明确地希望这个用户不能修改任何权限,也不能创建/销毁表或索引或任何结构性内容。
我尝试过的
首先,查看(通常优秀的)PostgreSQL文档,授权页面几乎让我眼花缭乱。在阅读了几个小时有关PostgreSQL角色和权限的内容后,我感到晕头转向。我认为再多做一点工作,我就能确定管理员用户所需的内容,但是我对“应用用户”感到非常困惑。我已经完成了这一步(名称和密码都只是占位符):
$ psql -U postgres
postgres=# CREATE USER "app-admin" WITH PASSWORD 'password';
CREATE ROLE
postgres=# CREATE USER "app-user" WITH PASSWORD 'password';
CREATE ROLE
postgres=# CREATE DATABASE "test-database" WITH OWNER "app-admin";
CREATE DATABASE
postgres=# \c "test-database"
You are now connected to database "test-database" as user "postgres".
test-database=# DROP SCHEMA "public";
DROP SCHEMA
test-database=# CREATE SCHEMA "app" AUTHORIZATION "app-admin";
CREATE SCHEMA
这里是我不确定的地方。我觉得我想要避免的答案是“默认撤销所有权限,然后枚举你在所有不同对象的所有不同级别上所需要的所有特权”。我想避免这个答案,因为我根本不知道我需要什么。如果那最终成为了答案,那我就只能花更多时间去阅读,但通常当我开始走这样的路时,我会错过一些东西。
问题
如何限制
app-user
的权限,使其无法修改任何结构数据(例如不能添加或销毁表),但仍能连接并对行执行任何操作(行级安全性甚至不在我的考虑范围内)。这种权限的一般模型是否真的与PostgreSQL的期望不太一致?如果我必须遍历“授予”页面上的每个选项来完成这样的事情 - 无论是我做这件事的动机还是我采取的方式 - 我感觉自己可能已经错过了什么。背景
我正在尝试构建我的第一个端到端网络应用程序。我已经完成了足够的通用软件开发和网络应用程序开发,现在我正在尝试理解我平常认为理所当然的部分。在考虑最小权限原则的情况下,我正在尝试设置PostgreSQL服务器。
支线任务
我还没有在我曾加入开发团队的网络应用程序中看到过这样的做法,尽管它们通常很小且使用不多。这么做实际上会有什么效果吗?是否有令人信服的理由来解释为什么要这样做或者这是一个糟糕或无效的想法?我的假设是,如果最终出现了SQL注入漏洞,这将减轻损害,因为数据库用户的访问权限受到限制。这个想法是错误的吗?
我发现的有关主题的好文章:
- http://www.ibm.com/developerworks/opensource/library/os-postgresecurity/index.html
- PDF警告: https://wiki.postgresql.org/images/d/d1/Managing_rights_in_postgresql.pdf
- https://www.digitalocean.com/community/tutorials/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on-a-vps--2
- http://blog.2ndquadrant.com/auditing-users-and-roles-in-postgresql/
注:这些链接提供了与PostgreSQL相关的安全性和访问控制的信息。
app_user
使用默认特权执行所有操作,不如在每个CREATE TABLE
之后添加一个GRANT
语句,以授予app_user
所需的权限”。我认为,使用单个数据库用户登录应用程序是一种好的实践。 - Laurenz Albe