【问题标题】:Read-only access for Heroku Postgres DatabasesHeroku Postgres 数据库的只读访问权限
【发布时间】:2020-09-26 12:10:21
【问题描述】:

我的应用程序有一个 Heroku Postgres 数据库。我可以使用 Heroku 提供的 DATABASE_URL 轻松访问 psql shell

psql $(heroku config:get DATABASE_URL -a my_app)
psql (9.6.1)
SSL connection (protocol: TLSv1.2, cipher: ECDSE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

d5i032ahpfiv07=> 

默认情况下,此用户似乎拥有更新和删除表的完全访问权限

d5i032ahpfiv07=> SELECT 
  table_name, 
  string_agg(privilege_type, ', ') as privileges
FROM information_schema.role_table_grants 
WHERE table_schema = 'public'
  AND grantee = current_user
GROUP BY 1
;

            table_name             |                          privileges
-----------------------------------+---------------------------------------------------------------
 articles                          | INSERT, TRIGGER, REFERENCES, TRUNCATE, DELETE, UPDATE, SELECT
 comment_flags                     | TRIGGER, INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES
 comment_likes                     | TRUNCATE, REFERENCES, TRIGGER, INSERT, SELECT, UPDATE, DELETE
 comments                          | INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER
 communities                       | TRIGGER, REFERENCES, TRUNCATE, DELETE, UPDATE, SELECT, INSERT
 .....

我很想在数据库中设置“只读”用户,这样人们就可以查看这些数据,而不必担心运行“DROP TABLE”或其他一些破坏性命令。

如何在 Heroku Postgres 上设置只读用户?

谢谢!

【问题讨论】:

    标签: sql postgresql heroku readonly


    【解决方案1】:

    创建Heroku Postgres Follower Database

    数据库追随者是领导者数据库的只读副本, 与领导者数据库数据保持同步。作为写和其他 数据修改在领导者数据库中提交,更改 实时流式传输到关注者数据库。

    然后只需针对关注者运行您的分析、数据剪辑和其他只读应用程序。这是一种非常标准的配置,可以保护您的主数据库,并增加了性能优势:您可以通过查询(通常是密集的并且具有不同的缓存配置文件)对其进行锤击,而不会影响您面向用户的应用程序。

    【讨论】:

    • 谢谢,这是一个不错的解决方案。小后续:如果有人不小心对追随者运行了一些破坏性命令,我将不得不重建它的数据对吗?如果发生这种情况,我如何收到警报(或手动检查)?我确定有一些方法可以将追随者的状态与领导者的状态进行比较?
    • 我猜破坏性命令不可能在跟随者上运行,因为它是只读的,但我刚才也在想同样的事情......
    • 在后台,Heroku 追随者使用 Postgres 热备用。热备份不允许任何修改数据的查询,所以这同样适用于 Heroku 追随者。 postgresql.org/docs/current/hot-standby.html
    【解决方案2】:

    Adam 建议创建追随者数据库通常是解决此问题的正确方法,但可以为任何 Heroku Postgres 数据库创建只读角色(或您想要的任何其他权限),即使不是追随者。

    Heroku 在Heroku Postgres Credentials 上提供了详细的文档,但简要说明:

    创建 Heroku 凭据

    heroku pg:credentials:create <addon_name> --name new_credential -a <app_name>
    

    &lt;addon_name&gt; 是 Postgres 插件的名称,您可以通过运行 heroku pg:info -a &lt;app_name&gt; 并检查输出中的“插件”行来找到它。

    在上面的命令中,新的凭证被命名为new_credential,但是你可以使用任何你想要的名字。

    设置权限

    创建new_credential 凭据还会在您的 Postgres 数据库中创建一个new_credential 角色 (see Postgres roles documentation)。您可以使用 psql 像任何其他角色一样设置new_credential 的权限。默认情况下,该角色没有权限。 Heroku 文档给出了这个例子,在 psql 中运行:

    GRANT USAGE ON SCHEMA PUBLIC TO new_credential;
    GRANT SELECT ON ALL TABLES IN SCHEMA public TO new_credential;
    ALTER DEFAULT PRIVILEGES IN SCHEMA public
      GRANT SELECT ON TABLES TO new_credential;
    

    以上设置new_credential 角色具有只读权限。有关详细信息,请参阅Postgres documentation on privileges。

    附上凭证

    在您可以使用凭证之前,您需要将其附加到您的应用:

    heroku addons:attach <addon_name> --credential new_credential -a <app_name>
    

    当您运行addons:attach 命令时,输出将包含一个名为HEROKU_POSTGRESQL_&lt;COLOUR&gt;_URL 的新配置变量,其中&lt;COLOUR&gt; 是某种颜色。此配置变量包含一个 Postgres 连接 URL,您可以使用 new_credential 角色连接到数据库。

    使用凭证

    在应用程序中,使用在上一步中创建的新配置变量而不是默认的 DATABASE_URL(仍包含默认的读写凭据)连接到数据库。

    你也可以使用psql中的新角色:

    heroku pg:psql <addon_name> --credential new_credential -a <app_name>
    

    或者,如果您想像示例中那样直接使用 psql,您可以使用新的颜色 URL:

    psql $(heroku config:get HEROKU_POSTGRESQL_<COLOUR>_URL -a <app_name>)
    

    当您使用新角色连接到 Postgres 时,由于角色的权限,任何创建、更新或删除数据的尝试都将被 Postgres 拒绝。

    【讨论】:

      【解决方案3】:

      已经说过了,但是对于那些不想获得真正技术的人来说,这是一个简单的解决方案。

      https://data.heroku.com/dataclips

      您可以在此处为您拥有的每个或任何单独的 Heroku 应用程序创建数据剪辑。您可以运行任何您喜欢的查询,然后您可以通过 URL、CSV、JSON、Google 表格分享它,或者您甚至可以添加个人或团队来访问它们。

      这很好,因为您可以使用 Heroku Web UI(而不是通过 CLI),而且它不一定让某人完全访问数据库,只是您希望他们看到的内容;适合某些人的特定需求/场景。

      【讨论】:

        猜你喜欢
        • 2015-07-10
        • 1970-01-01
        • 2011-06-07
        • 1970-01-01
        • 2016-11-30
        • 2016-07-13
        • 1970-01-01
        • 2011-04-23
        • 2021-11-13
        相关资源
        最近更新 更多