标签: row-level-security

在Oracle VPD/RLS中,如何防止恶意用户谓词泄露信息?

我一直在阅读Oracle VPD(虚拟专用数据库,也就是细粒度安全性,基于标签的安全性的基础)的文档,而且我很难掌握.VPD如何防止用户在WHERE条款中使用恶意功能泄露信息?

假设你有一个生成静态谓词的VPD策略cust_no = SYS_CONTEXT('order_entry', 'cust_num');(就像在Oracle VPD教程中一样).

这导致查询被重写,因此:

SELECT * FROM orders;
Run Code Online (Sandbox Code Playgroud)

变为:

SELECT * FROM orders 
  WHERE cust_no = SYS_CONTEXT('order_entry', 'cust_num');
Run Code Online (Sandbox Code Playgroud)

到目前为止很好.但是如果用户写道:

SELECT * FROM orders WHERE my_malicious_function(secret_column);
Run Code Online (Sandbox Code Playgroud)

?当my_malicious_function插入它看到到被恶意用户控制拥有的另一个表中的每个值,这样的话,他们可以通过选择表中看到的秘密数据.

根据文档,VPD重写器将产生如下内容:

SELECT * FROM orders 
  WHERE cust_no = SYS_CONTEXT('order_entry', 'cust_num')
    AND my_malicious_function(secret_column);
Run Code Online (Sandbox Code Playgroud)

但Oracle可以自由地重新订购子条款WHERE.my_malicious_function如果它认为那将是更便宜或更具选择性的谓词,是什么阻止它首先运行?(当安全条件是SYS_CONTEXT查找时,不太可能,但如果条件是针对另一个表的子查询,或者是自己的UDF,则很可能).

我已经阅读了文档,我没有看到它在执行VPD谓词和用户提供的谓词时指定任何顺序保证.是否有这样的保证或任何其他机制来防止恶意谓词功能?

(我也很好奇VPD策略中的恶意谓词函数是否会导致特权用户通过生成引用恶意函数的谓词来运行用户提供的代码,而这些代码在某种程度上是分开的.)

security oracle row-level-security

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

实体框架 - 使用 IDbConnectionInterceptor 设置 session_context

我正在关注本教程,以便通过 Entity Framework 6 CodeFirst 在 SQL Server 中使用行级安全性。教程代码示例展示了如何使用 IDbConnectionInterceptor 并在session_context. 为了检索用户 ID,它使用静态访问器方法HttpContext.Current.User.Identity.GetUserId(),该方法与 Asp.Net 身份和 System.Web 命名空间相结合。

在我的多租户 Web 应用程序中,我希望将tenantId注入到DbConnectionInterceptorusing Unity 中(不创建与 硬耦合HttpContext)并在session_context. 我发现DbConnectionInterceptor需要全局注册(例如在应用程序启动时),因此您不能让 UnityDbConnectionInterceptor为每个请求创建实例。

我的解决方案中还有 2 个 DbContexts,代表 2 个不同的数据库(租户数据库和系统数据库),我只想应用于session_context租户数据库。

如此看来,留给我唯一的选择是有tenantId注入DbContext通过Unity isntance并访问DbContext内部实例Opened()的方法DbConnectionInterceptor。为此,我想到了interceptionContextOpened()方法中使用参数。interceptionContextDbContexts(复数)属性。没有关于此的文档,所以我假设这样的事情会起作用:

public void Opened(DbConnection connection, DbConnectionInterceptionContext interceptionContext)
{
    var firstDbContext = interceptionContext.DbContexts.FirstOrDefault(d …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework row-level-security

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

Postgres触发器的副作用与行级安全性选择策略乱序发生

语境

我将行级安全性与触发器一起使用,以实现纯SQL RBAC实现。这样做时,我在INSERT触发器和SELECT行级安全策略之间遇到了奇怪的行为。

为简单起见,本问题的其余部分将使用以下简化表讨论该问题:

CREATE TABLE a (id TEXT);
ALTER TABLE a ENABLE ROW LEVEL SECURITY;
ALTER TABLE a FORCE ROW LEVEL SECURITY;

CREATE TABLE b (id TEXT);
Run Code Online (Sandbox Code Playgroud)

问题

考虑以下策略和触发器:

CREATE POLICY aSelect ON a FOR SELECT
USING (EXISTS(
    select * from b where a.id = b.id
));

CREATE POLICY aInsert ON a FOR INSERT
WITH CHECK (true);

CREATE FUNCTION reproHandler() RETURNS TRIGGER AS $$
BEGIN
    RAISE NOTICE USING MESSAGE = 'inside trigger handler';
    INSERT INTO …
Run Code Online (Sandbox Code Playgroud)

postgresql triggers row-level-security

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

为什么行级安全性 (RLS) 不使用索引?

我有一份关于患者和治疗师的申请。他们都在同users一张桌子上。患者应该能够看到他们的治疗师,治疗师应该能够看到他们的患者。

我已经建立了一个user_access_pairs具有成对用户 ID的物化视图 ( ),如果两个用户在视图中有一行,那么这意味着他们应该可以互相访问。

database> \d user_access_pairs
+----------+---------+-------------+
| Column   | Type    | Modifiers   |
|----------+---------+-------------|
| id1      | integer |             |
| id2      | integer |             |
+----------+---------+-------------+
Indexes:
    "index_user_access_pairs" UNIQUE, btree (id1, id2)
Run Code Online (Sandbox Code Playgroud)

这是users表格的定义,它有很多与这个问题无关的列。

database> \d users
+-----------------------------+-----------------------------+-----------------------------------------------------+
| Column                      | Type                        | Modifiers                                           |
|-----------------------------+-----------------------------+-----------------------------------------------------|
| id                          | integer                     |  not null default nextval('users_id_seq'::regclass) |
| first_name                  | character varying(255)      |                                                     |
| last_name                   | character varying(255)      |                                                     |
+-----------------------------+-----------------------------+-----------------------------------------------------+ …
Run Code Online (Sandbox Code Playgroud)

postgresql performance row-level-security

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

仅当用户具有确切的文档 ID postgresql 行级安全性/supabase 时才允许读取

有没有办法让用户只有拥有确切的文档 ID 才能读取文档?

我想避免创建用户,因此唯一的安全性是保存在浏览器内存中的随机 guid - 设置将保存在 id=guid 的“设置”表中。

因此,当页面打开时,它将获取

supabase.from('设置').select('*').eq('id', guid)

如何保护该设置(无需创建(虚拟)用户)

在 Firebase 中就像这样: Firebase firestore 仅允许在用户具有确切文档 ID 时读取,但对于 postgresql/supabase

postgresql row-level-security supabase supabase-database

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

行级安全性在带有组的 Power BI 中不起作用

我遇到了这个奇怪的问题:

  • 首先我用Power BI Desktop准备了一些报告
  • 然后我进入“管理角色”创建一条仅显示区域“意大利”数据的规则
  • 我将报告上传到 Power BI 服务
  • 我转到数据集下的安全选项卡,并将一些用户 (myuser@mytenant.com) 关联到规则
  • 最后,我创建一个共享点页面,在其中嵌入我准备的报告
  • 当我通过 myuser@mytenant.com 访问报告时,我会看到所有数据,而不仅仅是所需的区域 =“意大利”。

规则有什么问题?另一个奇怪的事情是,测试规则没问题,当我测试用户时规则不起作用......

有人知道吗?多谢!

row-level-security powerbi

3
推荐指数
1
解决办法
1万
查看次数

如何检查是否为 postgres 中的表启用了行级安全性

在 postgres 中的表上启用行级安全性非常简单:

alter table some_table enable row level security;
Run Code Online (Sandbox Code Playgroud)

您将如何检查给定模式中的哪些表启用了行级安全性(用于测试)?

database postgresql row-level-security

3
推荐指数
1
解决办法
1158
查看次数

无法更改“表”,因为它被对象“谓词”引用 - SQL Server RLS with Temporal

我在 SQL Server 数据库中的临时表上使用行级安全性。为了遵守 GDPR,我不仅需要能够删除该表中当前的数据,还需要能够删除其 _History 表(临时表)。

在 RLS 之前,我曾经这样做过:

ALTER TABLE [dbo].[Table] SET (SYSTEM_VERSIONING = OFF);
DELETE FROM [dbo].[Table_History] WHERE UserID=@userID;
ALTER TABLE [dbo].[Table] SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[Table_History]));
Run Code Online (Sandbox Code Playgroud)

但现在,这会产生错误:

Cannot ALTER 'Table' because it is being referenced by object 'fn_Table_Predicate'.
Run Code Online (Sandbox Code Playgroud)

在启用 RLS 的情况下启用和禁用系统版本控制的正确方法是什么?

sql-server row-level-security temporal-tables

3
推荐指数
1
解决办法
5776
查看次数

Postgresql 简单行级安全性 (RLS)

我正在努力解决基本的行级安全问题。

我首先尝试创建一个“租户”表,该表的每一行只能由租户本身看到,然后将类似的规则应用于引用租户主键的其他表。

我在策略中使用会话变量,并且还想从客户端强制执行租户 UUID(不是由服务器本身生成)。

所以首先我创建我的表:

CREATE TABLE tenants (
    tenant_id UUID,
    name text UNIQUE,
    PRIMARY KEY("tenant_id")
)
Run Code Online (Sandbox Code Playgroud)

然后我启用 RLS 和强制使用给定会话变量的策略:

ALTER TABLE tenants ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenants_isolation_policy ON tenants
        USING (tenant_id = current_setting('my.tenant')::UUID)
        WITH CHECK (tenant_id = current_setting('my.tenant')::UUID)
Run Code Online (Sandbox Code Playgroud)

然后我在表中插入 3 个条目tenants

INSERT INTO "tenants" ("tenant_id", "name") VALUES ('9c8e4f83-c036-4fcc-a775-228887d20851', 'Tenant 1');
INSERT INTO "tenants" ("tenant_id", "name") VALUES ('1953be83-683e-4960-a689-db8d53ba8cd2', 'Tenant 2');
INSERT INTO "tenants" ("tenant_id", "name") VALUES ('064767f7-9541-4492-9a7d-0466ac94e2ec', 'Tenant 3')
Run Code Online (Sandbox Code Playgroud)

然后我冒充租户1:

SET my.tenant = '9c8e4f83-c036-4fcc-a775-228887d20851'
Run Code Online (Sandbox Code Playgroud)

现在我希望如果我选择所有租户,结果应该只有一行。

然而,事实并非如此: …

postgresql row-level-security

3
推荐指数
1
解决办法
806
查看次数

行级安全双连接

我有三张桌子

旅程
ID
用户身份
...
部分
ID
旅程_id
...
停止
ID
节号
...

我想使用行级安全性来确保用户只能插入 astop如果与via -> ->引用的the 相uid()匹配。user_idjourneystopstops.section_idsections.journey_idjourneys.user_id

换句话说,用户应该只能设置stops.section_id为a section,从而设置为journey属于他的a。

如何在 Supabase 中通过行级安全连接实现此目的?

postgresql row-level-security supabase

2
推荐指数
1
解决办法
836
查看次数

当用户具有“授予所有”权限和松散策略时,如何使用 RLS 将记录插入到 Postgres 中

我是 Postgres 的 RLS 功能的新手。我相信我正确地遵循了文档,但出现了意外的行为。考虑以下情况:

  • 我有一张名为report_files
  • 该表有一个简单的策略,policy <name> for all using (true)
  • 用户grant all对表具有权限(grant all on all tables in schema testing to testuser;以及架构的grant execute on all functions ...权限)grant usage
  • 用户现在可以读取表中的所有字段,但不能insert读取记录,这与预期相反

这是psql的一个非常短的片段,演示了上述内容:https ://gist.github.com/cdaringe/85dd9a7b1278afe4770869dc494216f3

我制定了一项宽松的政策,该政策明确评估了“OK”,如成功的select命令所证明的那样。

我可以排除哪些故障才能使其insert正常工作?

谢谢!

sql postgresql row-level-security

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

具有行级安全性的 SQL Server 2016 - 解决瓶颈

我正在使用 Microsoft SQL Server 2016 进行开发,目前在向数据库添加行级安全性 (RLS) 时面临性能大幅下降的问题。我已经认为我已经找到了问题所在,即查询优化器先生不太喜欢我的非确定性过滤功能。我的问题是,是否有人有 RLS、过滤功能和优化此类案例的经验。- 索引、更巧妙的RLS过滤功能等可以提高性能吗?

我使用 RLS 根据过滤器函数过滤查询中返回/可用的行。下面我设置了一个函数来根据 SESSION_CONTEXT() 函数中的变量过滤行。因此,这很像向 WHERE 子句添加过滤器(除了它不会优化相同的内容,而且这更容易应用于现有的大型应用程序,因为它是在数据库级别完成的)。

请注意,下面的脚本和测试是实际情况的非常简单的版本,但它确实表明应用过滤时性能会下降。在脚本中,我还包含(注释掉)了一些我已经尝试过的东西。

要进行设置,首先运行下面的脚本,这将创建数据库、示例表、过滤功能和安全策略。

-- note: this creates the test database 'rlstest'. when you're tired of this, just drop it.

-- initalize
SET NOCOUNT ON
GO

-- create database
CREATE DATABASE rlstest
GO

-- set database
USE rlstest
GO

-- create test table 'member'
CREATE TABLE dbo.member (
    memberid INT NOT NULL IDENTITY,
    ownercompanyid INT NULL
)
GO

-- create some sample …
Run Code Online (Sandbox Code Playgroud)

sql sql-server row-level-security

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

postgres如何仅为一个用户应用RLS

有许多用户连接到数据库。我必须仅对一个用户 david 应用行级安全性(RLS),所有其他用户应该能够像往常一样访问表。

ALTER TABLE accounts ENABLE ROW LEVEL SECURITY;
CREATE POLICY accounts_web ON accounts TO david USING (id = current_setting('rls.tenant_id' )::uuid);
Run Code Online (Sandbox Code Playgroud)

我可以创建一个类似的策略CREATE POLICY accounts_no_rls ON accounts TO Michel USING (true); ,但我必须为每个用户创建一个策略。

是否可以仅使用两项策略(一项针对大卫的策略,第二项针对所有其他用户的策略)?

postgresql row-level-security psql

0
推荐指数
1
解决办法
562
查看次数