我在 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)
我为上面使用的表启用了行级安全性。
用set enable_nestloop = True,查询规划运行嵌套循环用约37秒的总运行时间加入:https://explain.depesz.com/s/59BR
with set enable_nestloop = False,采用Hash Join方式,查询时间约0.3秒:https : //explain.depesz.com/s/PG8E
我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
我有一个这样结构的表(简化)
Name, EMail, LastLoggedInAt
Run Code Online (Sandbox Code Playgroud)
我在 SQL Server (RemoteUser) 中有一个用户,该用户应该只能看到 LastLoggdInAt 字段不为空的数据(通过选择查询)。
看起来我可以做到这一点?是否可以?
我正在尝试在我使用 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 …
我有一个 Postgres 表,如下所示:
| 用户身份 | 名 | 姓 | 电子邮件地址 | 角色 |
|---|---|---|---|---|
| 68f00c4c-5dff-4886-a584-d44a23e47160 | 大卫 | 桑 | 大卫@example.com | 行政人员 |
| 3ed36117-e632-4b8b-b672-0b29f5f8b5c9 | 马丁 | 休斯 | martin@example.com | 顾客 |
我想写一份政策:
first_name,last_name和,但显然不是他们的或(因为这将授予客户管理权限)email_addressuser_idroleuser_id所有记录之外的所有字段(包括更改其他用户的角色)。我是 Postgres 的新手,我正在尝试掌握编写行级安全策略的技巧。我很难在 SQL 中阐明更复杂的策略,因此如果有人能为我的应用程序中的场景提供示例,我将不胜感激。
我正在使用 Supabase,它有一个auth.uid()函数(示例),其中包含 JSON Web 令牌中的用户 ID。
我发现本地计算机上的查询计划和 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
按照这些帖子中的信息,我想使用角色系统和策略,即我系统中的每个用户都有一个 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
获得此权限所需的角色和策略是
什么
我正在寻找一个我可以建立的基本案例。我的主要问题是用户可以根据当前公司拥有不同的角色/类型
postgresql authorization role row-level-security postgresql-9.5
我正在尝试设置 RLS 并希望利用 AD 组。DB 是在 Azure 中创建的,我知道 AD 正在工作,因为我可以使用 AD 帐户和 SSMS 进行连接
首先测试本地机器,按预期工作(img 1)
现在试试 Azure
IS_MEMBER() 在 Azure for AD Groups 中似乎没有按预期工作,但它将其识别为域/组的有效 AD 域(请参阅前 2 行)
有任何想法吗??我希望能够拥有一个具有 ADGroups 的视图,然后将 Row Level Security RLS 用于过滤不同组的视图
干杯
标记
我正在寻找有关以下场景的最佳实践的文档。
托管应用程序包含一些“全局”数据和一些“每租户”数据。“租户”不应该访问另一个租户的表,我希望在 DBMS 级别强制执行此操作(除了强制执行到应用程序级别)。
因此,作为示例,该应用程序可以向视频租赁商店提供管理系统。
店主和员工以及与租借电影的人有关的信息是全球性的。一旦客户注册,他们就无需再次注册从另一家商店租用。
商店(租户)有自己的数据库(客户列表、库存、当前预订的电影等)。因此,当店主登录应用程序时,只显示他自己的数据,我对此没有意见。
系统是否应该为每个租户/商店创建一组新表?
或者系统是否应该使用 DBMS 安全/授权...换句话说,在后端,商店 1 的库存与商店 2 的库存在同一表中,但通过 DBMS 安全性,视图只允许为谁选择该商店的行用户已登录应用程序。
我不确定我的问题是否足够清楚?
我正在使用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作为存储当前应用程序用户身份以实现行级安全的方式是否安全?尤其是在连接池的上下文中?SET LOCAL每次执行命令更好的方法?我有一个看起来像这样的查询:
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_id和group_member.group_id上group_member表中。
我希望Postgres的计划此查询为仅索引扫描的group_member,因为这两个group_member.account_id和 …
postgresql performance execution-plan row-level-security explain query-performance
postgresql ×5
performance ×3
sql-server ×2
azure ×1
explain ×1
join ×1
mysql ×1
parallelism ×1
role ×1
security ×1