标签: row-level-security

PostgreSQL 9.6 中不受欢迎的 Nest Loop vs. Hash Join

我在 PostgreSQL 9.6 查询计划方面遇到了麻烦。我的查询如下所示:

SET role plain_user;

SELECT properties.*
FROM properties
JOIN entries_properties
  ON properties.id = entries_properties.property_id
JOIN structures
  ON structures.id = entries_properties.entry_id 
WHERE structures."STRUKTURBERICHT" != ''
  AND properties."COMPOSITION" LIKE 'Mo%'
  AND (
    properties."NAME" LIKE '%VASP-ase-preopt%'
    OR properties."CALCULATOR_ID" IN (7,22,25)
  )
AND properties."TYPE_ID" IN (6)
Run Code Online (Sandbox Code Playgroud)

我为上面使用的表启用了行级安全性。

VACUUM ANALYZE在运行查询之前做过,但没有帮助。

我知道这不是一个好的做法set enable_nestloop = False,对于计划者来说,还有任何其他类似的选择。但是我怎样才能“说服”规划器在不禁用嵌套循环的情况下使用散列连接?

重写查询是一种选择。

如果我在绕过 RLS 的角色下运行相同的查询,那么它的执行速度非常快。行级安全策略如下所示:

CREATE POLICY properties_select …
Run Code Online (Sandbox Code Playgroud)

postgresql performance join row-level-security postgresql-9.6 query-performance

17
推荐指数
1
解决办法
9824
查看次数

SQL Server 逐行访问

我有一个这样结构的表(简化)

Name, EMail, LastLoggedInAt
Run Code Online (Sandbox Code Playgroud)

我在 SQL Server (RemoteUser) 中有一个用户,该用户应该只能看到 LastLoggdInAt 字段不为空的数据(通过选择查询)。

看起来我可以做到这一点?是否可以?

sql-server row-level-security

12
推荐指数
1
解决办法
982
查看次数

Webapp 和 MySQL:行级安全

我正在尝试在我使用 MySQL 开发的 webapp 上模拟行级安全性。

使用此方法:使用所需的表创建一个数据库,其中将存储与所有用户有关的数据,并为表的列建立适当的索引。

根据用户 ID 为特定用户创建 mysql“视图”。

为了实现行级安全,我还必须为每个用户创建 mysql 帐户,并在视图上设置“授予”权限。

对于 Web 界面,将使用基于 PHP 的 MVC 框架。

但是,根据我的研究:

1] Having separate mysql account per user "make the webapp less secure".
2]Having separate mysql account per user "increases the disk I/O".

问题:
1] How does creating mysql user per webapp user make the webapp less secure?
2] Does the disk I/O increase considerably?
3] Is there a better way to implement row-level-security in MySQL?
4]What are …

mysql database-design best-practices row-level-security

7
推荐指数
1
解决办法
1812
查看次数

允许用户仅修改具有行级安全性的 PostgreSQL 表中的某些(但不是全部)字段

我有一个 Postgres 表,如下所示:

用户身份 电子邮件地址 角色
68f00c4c-5dff-4886-a584-d44a23e47160 大卫 大卫@example.com 行政人员
3ed36117-e632-4b8b-b672-0b29f5f8b5c9 马丁 休斯 martin@example.com 顾客

我想写一份政策:

  • 允许客户在自己的记录中更新first_name,last_name和,但显然不是他们的或(因为这将授予客户管理权限)email_addressuser_idrole
  • 允许管理员编辑除user_id所有记录之外的所有字段(包括更改其他用户的角色)。

我是 Postgres 的新手,我正在尝试掌握编写行级安全策略的技巧。我很难在 SQL 中阐明更复杂的策略,因此如果有人能为我的应用程序中的场景提供示例,我将不胜感激。

我正在使用 Supabase,它有一个auth.uid()函数(示例),其中包含 JSON Web 令牌中的用户 ID。

postgresql row-level-security

7
推荐指数
2
解决办法
2540
查看次数

仅当使用 SESSION_CONTEXT 时在 Azure 中非并行计划

我发现本地计算机上的查询计划和 Azure SQL 上的查询计划之间存在奇怪的差异。我正在尝试实现行级安全性,其中我从 SESSION_CONTEXT 读取用户标识符,然后在 TVF 中检查用户是否具有访问权限。

在我的本地计算机上 - SQL Server 2019 Developer Edition,兼容级别 150 的数据库,查询计划符合预期。但是当我在兼容级别为 150 的 Azure DB 上运行它时,我只能获得带有NonParallelPlanReason="NonParallelizableIntrinsicFunction". 我尝试了超大规模数据库以及弹性池中的数据库,两个数据库的结果相同。

您可以使用以下代码重现该内容:

CREATE TABLE Users (
    UserIdentifier nvarchar(100) PRIMARY KEY CLUSTERED
)

INSERT INTO Users (UserIdentifier) VALUES ('MyUserIdentifier')

CREATE TABLE TableWithRLS (
    Id int NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED,
    DataColumn nvarchar(100) NULL
)

INSERT INTO TableWithRLS (DataColumn) 
SELECT TOP 10000000 A.[name] FROM sys.all_columns  AS A
CROSS JOIN sys.all_columns  AS B
CROSS JOIN sys.all_columns  AS C …
Run Code Online (Sandbox Code Playgroud)

performance sql-server parallelism azure-sql-database row-level-security

7
推荐指数
1
解决办法
1041
查看次数

Postgresql 9.5 行级安全性中的角色和策略

按照这些帖子中的信息,我想使用角色系统和策略,即我系统中的每个用户都有一个 db 角色。我想对以下属性进行建模,但我无法提出角色层次结构。

考虑以下表格: companies(id, name) users(id, name) projects(id, name, company_id) users_companies(user_id, company_id, type) users_projects(user_id, project_id)

每个用户在公司内可以有不同的类型(管理员/员工/客户),并且取决于策略应该改变。因此,当用户通过身份验证时,我们知道他的 user_id 和 company_id 可以提供策略中所需的 id,例如 set local user_vars.user_id = 10 set local user_vars.company_id = 20 获得此权限所需的角色和策略是 什么

  • 您只能在公司表中看到您的公司行
  • 管理员可以看到他们公司的所有项目
  • 员工只能看到分配给他们的项目
  • 没有人可以看到/更改 users_companies 中的条目(这是在注册和触发器时以某种方式完成的)
  • 管理员可以看到 users_projects 条目,但只与他们公司中的用户和项目相关
  • 员工只能看到分配给他们的项目的 users_projects 条目
  • 管理员可以看到他们公司的所有用户
  • 员工可以看到他们公司中参与相同项目的用户

我正在寻找一个我可以建立的基本案例。我的主要问题是用户可以根据当前公司拥有不同的角色/类型

postgresql authorization role row-level-security postgresql-9.5

6
推荐指数
0
解决办法
420
查看次数

Azure SQLDB 中的 IS_MEMBER() 不适用于 AD 组?

我正在尝试设置 RLS 并希望利用 AD 组。DB 是在 Azure 中创建的,我知道 AD 正在工作,因为我可以使用 AD 帐户和 SSMS 进行连接

首先测试本地机器,按预期工作(img 1)

在此处输入图片说明

现在试试 Azure

在此处输入图片说明

IS_MEMBER() 在 Azure for AD Groups 中似乎没有按预期工作,但它将其识别为域/组的有效 AD 域(请参阅前 2 行)

有任何想法吗??我希望能够拥有一个具有 ADGroups 的视图,然后将 Row Level Security RLS 用于过滤不同组的视图

干杯

标记

row-level-security active-directory azure

6
推荐指数
1
解决办法
975
查看次数

行级安全或多个表

我正在寻找有关以下场景的最佳实践的文档。

托管应用程序包含一些“全局”数据和一些“每租户”数据。“租户”不应该访问另一个租户的表,我希望在 DBMS 级别强制执行此操作(除了强制执行到应用程序级别)。

因此,作为示例,该应用程序可以向视频租赁商店提供管理系统。

店主和员工以及与租借电影的人有关的信息是全球性的。一旦客户注册,他们就无需再次注册从另一家商店租用。

商店(租户)有自己的数据库(客户列表、库存、当前预订的电影等)。因此,当店主登录应用程序时,只显示他自己的数据,我对此没有意见。

系统是否应该为每个租户/商店创建一组新表?

或者系统是否应该使用 DBMS 安全/授权...换句话说,在后端,商店 1 的库存与商店 2 的库存在同一表中,但通过 DBMS 安全性,视图只允许为谁选择该商店的行用户已登录应用程序。

我不确定我的问题是否足够清楚?

security database-design row-level-security

5
推荐指数
1
解决办法
1409
查看次数

具有单个数据库用户和连接池的行级安全性

我正在使用node-postgres连接到启用了连接池的 PostgreSQL 9.6 数据库。所有连接都使用同一个数据库用户。我不能使用多个数据库用户的一个原因是,据我所知,在这种情况下,行级安全性和视图不能很好地协同工作,因为视图的所有者用于 RLS。

我现在正在考虑在 Postgres 中使用行级安全性,我想确保我这样做是正确的。

我正在使用SET LOCAL设置当前应用程序用户 ID,然后由行级安全性 USING 子句使用。我能想到通过连接池实现这一点的唯一方法是使用 node-postgres 将每个查询包装在一个事务中,并SET LOCAL在每个事务中执行如下命令。

SET LOCAL postgres.my_user = 20;
Run Code Online (Sandbox Code Playgroud)

以下代码是我想如何定义行级安全性的简化示例,真实版本还有一些条件:

CREATE POLICY table_a_read_policy ON table_a FOR SELECT
USING (
    EXISTS (
    SELECT * 
    FROM permissions 
    WHERE 
        user_id = current_setting('postgres.my_user')::int AND 
        permission_type = 'read'
    )
);
Run Code Online (Sandbox Code Playgroud)

我的理解是,在这种情况下,任何 SQL 注入也会使攻击者能够以这种方式设置任何用户 ID 并规避行级安全性。但是我没有看到任何方法可以避免这种情况,因为我连接的数据库用户必须能够查看整个应用程序的所有数据。

有几点我不完全确定:

  • 使用SET LOCAL作为存储当前应用程序用户身份以实现行级安全的方式是否安全?尤其是在连接池的上下文中?
  • 有没有比在 node-postgres 中的事务中包装每个查询并SET LOCAL每次执行命令更好的方法?
  • 有没有办法以一种 SQL 注入不会自动提供规避行级安全性的能力的方式来构造它(限制使用单个数据库用户建立数据库连接)?

postgresql row-level-security

5
推荐指数
1
解决办法
2493
查看次数

与内联版本相比,Postgres 行级安全策略优化不佳

我有一个看起来像这样的查询:

  SELECT post.id, post.author_id, post.published_at, post.content
    FROM post
   WHERE post.group_id = 1
ORDER BY post.published_at DESC, post.id
   LIMIT 5;
Run Code Online (Sandbox Code Playgroud)

(group_id, published_at DESC, id)当没有使用行级别安全性 (RLS) 策略时,此查询具有一个索引,该索引为其提供此查询计划。

 Limit  (cost=0.14..1.12 rows=5 width=143)
   ->  Index Scan using post_published_at on post  (cost=0.14..15.86 rows=80 width=143)
         Index Cond: (group_id = 1)
Run Code Online (Sandbox Code Playgroud)

然后我添加这个策略:

CREATE POLICY select_member_of ON post FOR SELECT USING
  (EXISTS (SELECT 1
             FROM group_member
            WHERE group_member.account_id = current_setting('current_account_id', false)::INT AND
                  group_member.group_id = post.group_id));
Run Code Online (Sandbox Code Playgroud)

有在化合物主键group_member.account_idgroup_member.group_idgroup_member表中。

我希望Postgres的计划此查询为仅索引扫描的group_member,因为这两个group_member.account_id和 …

postgresql performance execution-plan row-level-security explain query-performance

5
推荐指数
1
解决办法
605
查看次数