基于云的 MySQL 的主要供应商不授予主用户超级权限。提供者是 Amazon RDS,但我的问题不是专门针对 Amazon RDS,而是针对没有超级权限的数据库所有者/管理员的一般情况。
缺少 SUPER 权限意味着您在创建存储过程时不能使用 DEFINER 子句。
这反过来意味着,您不能锁定您的表以使给定用户无法访问,同时通过存储过程授予该相同用户间接访问权限。
在没有 SUPER 的情况下,是否有另一种方法可以实现相同的“无直接表访问”安全策略?
基于云的 MySQL 的主要供应商不授予主用户超级权限。提供者是 Amazon RDS,但我的问题不是专门针对 Amazon RDS,而是针对没有超级权限的数据库所有者/管理员的一般情况。
缺少 SUPER 权限意味着您在创建存储过程时不能使用 DEFINER 子句。
这反过来意味着,您不能锁定您的表以使给定用户无法访问,同时通过存储过程授予该相同用户间接访问权限。
在没有 SUPER 的情况下,是否有另一种方法可以实现相同的“无直接表访问”安全策略?
正如最初回答的那样,SUPER 特权仅允许具有高特权的用户将存储例程中的定义器设置给他们自己以外的用户。您可以作为定义者登录,以便在不同的安全上下文下创建存储过程、触发器或视图,但需要允许以该用户身份进行身份验证,以便您可以在首次创建时登录。
在 Amazon RDS 上,您不能仅将用户锁定到 localhost,因为您没有对主机的 shell 访问权限。因此,您要么将用户锁定到主机或范围,但必须将其保留在您的例程中,或者使用通配符主机并将用户暴露于潜在的安全漏洞。
对于 MariaDB,我找到了帐户锁定功能。虽然被锁定的帐户不能登录,但它仍然可以执行存储的例程。因此,通配符主机可用于在登录以创建例程时从任何地方授予访问权限,然后可以锁定该用户,允许其仅执行存储的例程。执行锁定的高特权用户当然需要以其他方式保护。
不合逻辑的推论。
您不能显式声明
DEFINER
除您自己之外的其他人,这当然没有意义,因为您已经是定义者……但您仍然可以使用它SQL SECURITY DEFINER | INVOKER
来指定过程在运行时使用的安全上下文。这部分及其安全方面与您拥有SUPER
特权时没有任何不同。唯一的区别是,如果您希望定义者成为特定(特权)用户,以便该过程可以作为该用户在定义者上下文中运行......您必须以 DEFINER 身份实际登录才能声明该过程。