首页 > 解决方案 > 使 Docker PostgreSql 安全 - 不信任本地连接、用户名和密码最大长度

问题描述

语境

因此,目前我正在创建一个设置/启动器脚本,该脚本在客户端机器上使用 PostgreSql 数据库设置一个安全的 docker 容器。

为了使其真正安全,我的计划是让脚本:

  1. 自动生成随机用户名和密码
  2. 执行docker run-d postgres当然)并使用随机生成的用户名和密码
  3. 自动生成另一组随机用户名和密码
  4. 使用新生成的用户名和密码创建一个新用户
  5. Grant新创建的具有适当权限的用户
  6. 返回新创建用户的凭据(用户名和密码),而不是存储(换句话说,忘记)超级用户凭据(用户名和密码)

问题

  1. Postgresql的用户名和密码有什么限制?从这个来源看来,用户名的最大长度是 64 个字节(所以 64 个字符),从这个来源看来,最大密码长度是 100 个字节(所以 100 个字符)。信息是否准确(来源很老,我可能误解了)?另外,只允许使用字母数字字符吗?它是否支持 Base64、MD5 或 SHA?

  2. 我注意到我可以在不提供超级用户密码的情况下访问Postgres bash。经过进一步研究,这似乎是由于在创建 Postgres 数据库时,本地访问是受信任的,因为它在pg_hba.conf. 不信任所有连接(包括本地连接)的命令是什么,并且任何超级用户操作都需要提供超级用户密码?

  3. 任何增加安全性的建议,甚至更多,不涉及自托管数据库,而不是让客户在他/她的机器上托管它?(我知道这是一个广泛/离题的问题,因此请随意忽略这个问题)

标签: postgresqldockersecurityencryption

解决方案


  1. 用户名和密码长度:

    与所有其他标识符一样,用户名限制为 63 个字节(除非您想重建 PostgreSQL)。

    src/include/pg_config_manual.h有:

    /*
     * Maximum length for identifiers (e.g. table names, column names,
     * function names).  Names actually are limited to one less byte than this,
     * because the length must include a trailing zero byte.
     *
     * Changing this requires an initdb.
     */
    #define NAMEDATALEN 64
    

    密码的最大长度取决于密码加密方法和使用的身份验证。对于scram-sha-256,限制为 1024。

    src/common/saslprep.c

    /*
     * Limit on how large password's we will try to process.  A password
     * larger than this will be treated the same as out-of-memory.
     */
    #define MAX_PASSWORD_LENGTH     1024
    

    您引用的 100 限制来自psql密码提示,但没有人强迫您使用它。

  2. 默认身份验证方法

    使用-A选项 duringinitdb指定不同的身份验证方法。

  3. 使 docker 容器安全

    是的,这太宽泛了。本质上,如果你有构成数据库的文件,你就可以获得所有数据,所以我认为这是不可能的。


推荐阅读