我们正在为客户管理 kubernetes 中的数据库。对于每个新集群,我们都会创建一个新用户并CREATE ROLE
为其CREATE DB
赋予角色,以便他们可以创建自己的数据库和具有更严格角色的新用户。
问题是,有了CREATE ROLE
权限,用户可以授予自己pg_execute_server_program
角色,然后使用反向 shell 攻击,然后从我们的 pod 中获取 shell 并读取环境变量,这是不希望的。例如,我们在环境变量中有几个秘密,客户可以利用这些秘密,然后增加他们的攻击范围并接管更多东西。
简而言之,我希望有一个可以创建新用户的用户,但不能授予自己特定的预定义角色。
更新:我查看并发现ADMIN_OPTION
PostgreSQL 16 中已添加该功能来解决此类问题。我的问题是我们使用的是 PostgreSQL 版本 13、14、15,我们不能强制升级所有集群。
您必须至少使用 PostgreSQL v16。在该版本中,
CREATEROLE
已进行修改,因此它不允许您授予任意角色的成员资格。您只能授予您有ADMIN
权限的角色的成员资格。对于较旧的 PostgreSQL 版本,您无法安全地向用户提供
CREATEROLE
.解决这个问题的一种方法可能是
SECURITY DEFINER
超级用户拥有的函数,该函数允许调用者创建角色。确保设置search_path
为安全的设置,例如pg_catalog
该功能。如果您不只局限于执行,
CREATE ROLE
那么创建一个自定义函数/过程以允许您的客户创建新用户。该函数需要在SECURITY DEFINER
具有权限的情况下创建,并限制可以提供的选项。显然,客户的用户帐户无法自行创建用户。我能够找到一个使用supautils 库的解决方法,该库的存在只是为了解决我在这里遇到的问题。
由于我这样做是为了解决安全问题,因此创建函数
SECURITY DEFINER
可能只会增加另一个问题。