暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

升级PostgreSQL密码到SCRAM的方法

本文作者:jonathan katz

任职于Crunchy Data公司,2013年加入United States PostgreSQL Association (PGUS).

个人博客为https://info.crunchydata.com/blog/author/jonathan-s-katz

在许多PostgreSQL环境中,通常的做法是使用密码保护用户帐户。从PostgreSQL 10开始,这种PostgreSQL的管理基于密码的认证的方法得到了重大升级,这个重大升级就是SCRAM认证的引入,SCRAM认证是一个对PostgreSQL当前系统显著改善的良好定义的标准。

更好的是

现在几乎所有的PostgreSQL驱动程序(https://wiki.postgresql.org/wiki/List_of_drivers)都支持这种新的密码身份验证方法,这应该有助于推动该方法的进一步采用。

虽然在新的PostgreSQL部署中利用SCRAM身份验证可能很容易,但是升级现有系统以使用此方法涉及一些步骤。

本文将简要说明SCRAM在PostgreSQL中的工作方式(以鼓励您升级!),然后引导您完成如何升级现有PostgreSQL群集以使用SCRAM身份验证的步骤。

SCRAM概述

在PostgreSQL 10之前,可以使用md5方法进行密码身份验证(当然,对于不支持md5的驱动程序也有明文),其中PostgreSQL定义了自己的唯一身份验证方案。使用这种身份验证方法,密码在PostgreSQL中存储如下:

    'md5' || md5(password + username)

    尽管此方法有效,但确实存在一些挑战:

    • 如果您可以访问某人的用户名/密码组合或他们的PostgreSQL MD5样式的哈希,则可以登录到该用户具有相同用户名/密码的任何PostgreSQL集群。

    • 尽管每个PostgreSQL驱动程序实现对该方法的支持都非常简单,但是它没有遵循任何特定的标准。无需赘述,知道每次使用PostgreSQL风格的md5身份验证方法时,都会在网络上有效地共享PostgreSQL客户端和服务器之间的“共享机密”。

    Salted Challenge Response Authentication Mechanism(也称为SCRAM)旨在允许双方验证彼此知道共享的机密(例如密码),而无需在彼此之间发送机密。

    为了使这种说法不太抽象,在PostgreSQL中,使用了SCRAM,以便PostgreSQL服务器可以验证客户端知道正确的密码,同样,客户端也可以验证服务器也知道正确的密码,而所有这些都不会发送实际密码,甚至不采用哈希格式!

    更好的是,SCRAM是已定义的标准(RFC5802);PostgreSQL实现SCRAM-SHA-256(RFC7677),其显着区别在于它使用SHA-256哈希函数而不是SHA-1。

    深入探讨SCRAM身份验证的工作原理是一个更长的话题(这也是我绝对喜欢谈论的话题)。本文的其余部分说明了如何升级当前系统以利用SCRAM身份验证。

    升级到SCRAM认证

    步骤0:确定你是否需要能升级到SCRAM

    有关键的两个标准去确定能否升级你的password-based authentication systems到SCRAM

    • 你正在运行PostgreSQL 10及其更高版本

    • 你用来连接到PostgreSQL数据库的驱动有SCRAM兼容性。PostgreSQL社区已经提供了一个驱动清单(https://wiki.postgresql.org/wiki/List_of_drivers#Drivers),请检查该清单以确保驱动支持SCRAM。

    如果你的系统满足上述两个标准,你可以开始处理升级到SCRAM的过程。

    步骤1: 验证你的pg_hba.conf设置

    pg_hba.conf文件决定了你的客户端怎么连接到PostgreSQL Cluster中。如果你已经看过pg_hba.conf文件,你可能注意到与下面类似的行:

      # TYPEDATABASEUSERADDRESSMETHOD
      localallallmd5

      上面的行表示任何尝试通过local connection连接到PostgreSQL Cluster中的user必须使用md5认证方法,

      基于升级到SCRAM的目的,请确保你的password-based authentication 方法已经设置为md5,我们将在所有密码升级后更改此设置

      步骤2:改变PostgreSQL的password_encryption参数

      在Postgresql.conf参数文件中,有一个password_encryption参数,该参数决定了密码怎么被hash。此时,该参数很可能设置为md5。

      为了开始升级过程,你需要将password_encryption参数值改为scram-sha-256,如下所示:

        password_encryption = scram-sha-256

        当上述修改完成后,请reload以便修改生效(不需要restart)

        步骤3:决定哪些user需要升级

        下一步是确定哪些user需要升级他们的密码。由于您可能无法自行设置他们的所有密码,因此您可能想与这些用户联系,让他们升级他们的密码。

        要确定谁需要将特权用户(例如,超级用户)的密码升级到SCRAM,可以运行以下SQL:

          SELECT
          rolname, rolpassword ~ '^SCRAM-SHA-256\$' AS has_upgraded
          FROM pg_authid
          WHERE rolcanlogin;

          该查询查找具有LOGIN特权的用户(即他们可以登录到PostgreSQL集群),并确定他们的密码是否仍存在于PostgreSQL风格的MD5哈希中。

          如果has_upgraded为FALSE,则用户需要重新哈希其密码。

          注意:在某些极端情况下,上面的查询将注册一个误报(例如,如果您有一个以SCRAM-SHA-256 $开头的纯文本密码),但以上情况很可能起作用。

          步骤4:升级密码

          有两种建议的重新哈希密码的方法:

          升级方法1:通过psql中的\ password

          使用psql的命令行界面,可以使用\ password命令,即:

            \password

            或者,如果您想为系统上的其他人设置密码:

              \password username

              系统将提示您输入新密码。此新密码将转换为SCRAM验证程序,并且此用户的升级将完成。

              升级方法2:创建自己的SCRAM验证程序+ ALTER ROLE

              第二种方法是创建您自己的SCRAM验证程序,然后创建ALTER ROLE用户名PASSWORD'$ SCRAM_VERIFIER'。我已经编写了一个小Python脚本(使用Python 3.7)来帮助解决这个问题:

              https://gist.github.com/jkatz/e0a1f52f66fa03b732945f6eb94d9c21

              为了方便起见,以下内容也嵌入其中:

              如果您能够成功运行脚本,则应收到类似于以下内容的输出:

                SCRAM-SHA-256$4096:UrxBRgDElbaS4iwfRzn59g==$SErsniXa5gEr03cXhcFPLSM4C/22IKTJ9emTh
                T+wPrM=:rSaLPYfC3eor3cq3f1Zq6Dw2Rl7HwIUHCMP7avpJQak=

                这是PostgreSQL存储的SCRAM验证程序的示例,在SCRAM身份验证期间使用。如果我想将其设置为新密码的一部分:

                  ALTER ROLE jkatz
                  PASSWORD
                  'SCRAM-SHA-256$4096:UrxBRgDElbaS4iwfRzn59g==$SErsniXa5gEr03cXhcFPLSM4C/22IKTJ9emTh
                  T+wPrM=:rSaLPYfC3eor3cq3f1Zq6Dw2Rl7HwIUHCMP7avpJQak='

                  为什么不使用“ ALTER ROLE user_name PASSWORD 'newpassword';”?

                  虽然上面的命令将重新哈希您的密码,但副作用是最终您的纯文本密码可能会根据您的群集日志记录设置而被记录!

                  因此,它有效地挫败了SCRAM的优点之一,即不必公开两方之间的共享秘密。因此,请不要使用以上方法。

                  步骤5:更新pg_hba.conf以仅使用“ scram-sha-256”

                  这是一个有趣的事实:为了简化升级,即使选择了md5作为身份验证方法,您的应用程序仍然可以执行SCRAM验证!

                  如果用户帐户的密码已经升级到SCRAM验证程序,则即使md5是身份验证方法,它也将使用SCRAM身份验证!

                  但是,一旦所有密码都升级,您将需要更新pg_hba.conf文件,并将所有使用md5的条目切换为现在使用scram-sha-256。

                  首先,检查所有用户是否已升级为可以使用SCRAM,即:

                    SELECT
                    rolname, rolpassword ~ '^SCRAM-SHA-256\$' AS has_upgraded
                    FROM pg_authid
                    WHERE rolcanlogin;

                    然后,修改pg_hba.conf文件中的md5整体以使用scram-sha-256,例如使用上面的示例:

                      # TYPEDATABASEUSERADDRESSMETHOD
                      localallallscram-sha-256

                      当上述修改完成后,请reload以便修改生效(不需要restart)

                      祝贺您!所有的PostgreSQL用户账户都已经升级为使用SCRAM进行身份验证!


                      I Love PG

                      关于我们

                      PostgreSQLPG2017PostgreSQLPG非盈利行业协会组织。我们致力于在中国PostgreSQLPostgreSQL


                      欢迎投稿

                      做你的舞台,show出自己的才华 。

                      投稿邮箱:partner@postgresqlchina.com

                                          

                                          ——愿能安放你不羁的灵魂


                      技术文章精彩回顾




                      PostgreSQL学习的九层宝塔
                      PostgreSQL职业发展与学习攻略
                      2019,年度数据库舍 PostgreSQL 其谁?
                      Postgres是最好的开源软件
                      PostgreSQL是世界上最好的数据库
                      从Oracle迁移到PostgreSQL的十大理由
                      从“非主流”到“潮流”,开源早已值得拥有

                      PG活动精彩回顾




                      创建PG全球生态!PostgresConf.CN2019大会盛大召开
                      首站起航!2019“让PG‘象’前行”上海站成功举行
                      走进蓉城丨2019“让PG‘象’前行”成都站成功举行
                      中国PG象牙塔计划发布,首批合作高校授牌仪式在天津举行
                      群英论道聚北京,共话PostgreSQL
                      相聚巴厘岛| PG Conf.Asia 2019  DAY0、DAY1简报
                      相知巴厘岛| PG Conf.Asia 2019 DAY2简报
                      独家|硅谷Postgres大会简报
                      直播回顾 | Bruce Momjian:原生分布式将在PG 14版本发布

                      PG培训认证精彩回顾




                      中国首批PGCA认证考试圆满结束,203位考生成功获得认证!
                      中国第二批PGCA认证考试圆满结束,115位考生喜获认证!
                      重要通知:三方共建,中国PostgreSQL认证权威升级!
                      近500人参与!首次PGCE中级、第三批次PGCA初级认证考试落幕!
                      2020年首批 | 中国PostgreSQL初级认证考试圆满结束
                      一分耕耘一分收获,第五批次PostgreSQL认证考试成绩公布

                      PG专辑预览阅读




                      开源软件联盟PostgreSQL分会专辑之活动篇

                      文章转载自开源软件联盟PostgreSQL分会,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论