天天看點

【DB吐槽大會】第26期 - PG 沒有基于角色權限的ACL控制

背景

1、産品的問題點

  • PG 沒有基于角色權限的ACL控制

2、問題點背後涉及的技術原理

  • PG 通過pg_hba.conf 配置通路控制規則, 配置條目包括
# local         DATABASE  USER  METHOD  [OPTIONS]    
# host          DATABASE  USER  ADDRESS  METHOD  [OPTIONS]    
# hostssl       DATABASE  USER  ADDRESS  METHOD  [OPTIONS]    
# hostnossl     DATABASE  USER  ADDRESS  METHOD  [OPTIONS]    
# hostgssenc    DATABASE  USER  ADDRESS  METHOD  [OPTIONS]    
# hostnogssenc  DATABASE  USER  ADDRESS  METHOD  [OPTIONS]          
  • 隻能控制到user級别, 而這個USER到底是普通使用者還是superuser并不知道
    • 拒絕或允許連接配接是在建立連接配接之前完成, 資料庫端通過協定層擷取到客戶連接配接的username, dbname, IP, 即可通過ACL規則進行判斷是否放行.
    • 如果要實作USER對應的角色來進行判定, 需要查詢中繼資料, 使得認證過程變得更複雜.
postgres=# \d pg_shadow     
                       View "pg_catalog.pg_shadow"    
    Column    |           Type           | Collation | Nullable | Default     
--------------+--------------------------+-----------+----------+---------    
 usename      | name                     |           |          |     
 usesysid     | oid                      |           |          |     
 usecreatedb  | boolean                  |           |          |     
 usesuper     | boolean                  |           |          |     
 userepl      | boolean                  |           |          |     
 usebypassrls | boolean                  |           |          |     
 passwd       | text                     | C         |          |     
 valuntil     | timestamp with time zone |           |          |     
 useconfig    | text[]                   | C         |          |     
    
    
postgres=# \d pg_roles     
                         View "pg_catalog.pg_roles"    
     Column     |           Type           | Collation | Nullable | Default     
----------------+--------------------------+-----------+----------+---------    
 rolname        | name                     |           |          |     
 rolsuper       | boolean                  |           |          |     
 rolinherit     | boolean                  |           |          |     
 rolcreaterole  | boolean                  |           |          |     
 rolcreatedb    | boolean                  |           |          |     
 rolcanlogin    | boolean                  |           |          |     
 rolreplication | boolean                  |           |          |     
 rolconnlimit   | integer                  |           |          |     
 rolpassword    | text                     |           |          |     
 rolvaliduntil  | timestamp with time zone |           |          |     
 rolbypassrls   | boolean                  |           |          |     
 rolconfig      | text[]                   | C         |          |     
 oid            | oid                      |           |          |           

3、這個問題将影響哪些行業以及業務場景

  • 通用

4、會導緻什麼問題?

  • 無法滿足超級使用者角色的通用規則配置, 例如不允許超級使用者使用非unix socket端口連接配接, 這也可能是某些企業的安全規則. 防止超級使用者通過tcpip從本地或網絡層通路, 造成更大破壞力.

5、業務上應該如何避免這個坑

  • 找到所有的超級使用者, 并在pg_hba.conf中逐條配置, 例如
host all sup1,sup2,sup3 0.0.0.0/0 reject    
local all sup1,sup2,sup3 md5          

6、業務上避免這個坑犧牲了什麼, 會引入什麼新的問題

  • 如果使用者的角色權限發生變化, 需要重新調整pg_hba.conf, 管理成本增加, 也容易出現遺漏.

7、資料庫未來産品疊代如何修複這個坑

  • 希望核心層支援, 例如使用login hook來進行多重條件判定, 支援更多的規則.

https://github.com/digoal/blog/blob/master/202109/20210903_01.md#postgresql-%E8%AE%B8%E6%84%BF%E9%93%BE%E6%8E%A5 https://github.com/digoal/blog/issues/76