背景
1、産品的問題點
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來進行多重條件判定, 支援更多的規則.