我一直在阅读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策略中的恶意谓词函数是否会导致特权用户通过生成引用恶意函数的谓词来运行用户提供的代码,而这些代码在某种程度上是分开的.)
我正在关注本教程,以便通过 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。为此,我想到了interceptionContext在Opened()方法中使用参数。interceptionContext有DbContexts(复数)属性。没有关于此的文档,所以我假设这样的事情会起作用:
public void Opened(DbConnection connection, DbConnectionInterceptionContext interceptionContext)
{
var firstDbContext = interceptionContext.DbContexts.FirstOrDefault(d …Run Code Online (Sandbox Code Playgroud) 语境
我将行级安全性与触发器一起使用,以实现纯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) 我有一份关于患者和治疗师的申请。他们都在同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) 有没有办法让用户只有拥有确切的文档 ID 才能读取文档?
我想避免创建用户,因此唯一的安全性是保存在浏览器内存中的随机 guid - 设置将保存在 id=guid 的“设置”表中。
因此,当页面打开时,它将获取
supabase.from('设置').select('*').eq('id', guid)
如何保护该设置(无需创建(虚拟)用户)
在 Firebase 中就像这样: Firebase firestore 仅允许在用户具有确切文档 ID 时读取,但对于 postgresql/supabase
我遇到了这个奇怪的问题:
规则有什么问题?另一个奇怪的事情是,测试规则没问题,当我测试用户时规则不起作用......
有人知道吗?多谢!
在 postgres 中的表上启用行级安全性非常简单:
alter table some_table enable row level security;
Run Code Online (Sandbox Code Playgroud)
您将如何检查给定模式中的哪些表启用了行级安全性(用于测试)?
我在 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 的情况下启用和禁用系统版本控制的正确方法是什么?
我正在努力解决基本的行级安全问题。
我首先尝试创建一个“租户”表,该表的每一行只能由租户本身看到,然后将类似的规则应用于引用租户主键的其他表。
我在策略中使用会话变量,并且还想从客户端强制执行租户 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)
现在我希望如果我选择所有租户,结果应该只有一行。
然而,事实并非如此: …
我有三张桌子
| 旅程 |
|---|
| ID |
| 用户身份 |
| ... |
| 部分 |
|---|
| ID |
| 旅程_id |
| ... |
| 停止 |
|---|
| ID |
| 节号 |
| ... |
我想使用行级安全性来确保用户只能插入 astop如果与via -> ->引用的the 相uid()匹配。user_idjourneystopstops.section_idsections.journey_idjourneys.user_id
换句话说,用户应该只能设置stops.section_id为a section,从而设置为journey属于他的a。
如何在 Supabase 中通过行级安全连接实现此目的?
我是 Postgres 的 RLS 功能的新手。我相信我正确地遵循了文档,但出现了意外的行为。考虑以下情况:
report_filespolicy <name> for all using (true)grant all对表具有权限(grant all on all tables in schema testing to testuser;以及架构的grant execute on all functions ...权限)grant usageinsert读取记录,这与预期相反这是psql的一个非常短的片段,演示了上述内容:https ://gist.github.com/cdaringe/85dd9a7b1278afe4770869dc494216f3
我制定了一项宽松的政策,该政策明确评估了“OK”,如成功的select命令所证明的那样。
我可以排除哪些故障才能使其insert正常工作?
谢谢!
我正在使用 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) 有许多用户连接到数据库。我必须仅对一个用户 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 ×8
sql ×2
sql-server ×2
supabase ×2
c# ×1
database ×1
oracle ×1
performance ×1
powerbi ×1
psql ×1
security ×1
triggers ×1