标签: least-privilege

Entify Framework插入需要选择权限

我们使用LINQ to Entities将条目写入Audit数据库(SQL Server 2008).由于这是一个专用的审计数据库,我们插入行 - 我们从不读取任何行,从审计应用程序更新或删除它们.

审计应用程序应使用最小权限原则,因此我们不希望授予它超出其需要的权限.由于我们从未读过任何行,因此我们不希望授予从数据库中进行选择的权限.

但是,当我们尝试写入数据时,会收到以下错误消息:

对象'AuditEvent',数据库'IdentifyAudit',架构'dbo'上的SELECT权限被拒绝.

代码是非常标准的EF代码:

var auditEvent = new AuditEvent();
auditEvent.EventType = eventType;
auditEvent.Timestamp = timestamp;
auditEvent.UserName = userName;
auditEvent.ApplicationId = this.ApplicationId;

this.objectContext.AddToAuditEvents(auditEvent);
this.objectContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

为什么我们需要SELECT权限才能写入表格,更重要的是:我们有什么办法可以删除这个要求吗?


编辑

SQL事件探查器显示正在执行的语句:

exec sp_executesql N'insert [dbo].[AuditEvent]([EventType], [Timestamp], [UserName], [ApplicationId])
values (@0, @1, @2, @3)
select [Id]
from [dbo].[AuditEvent]
where @@ROWCOUNT > 0 and [Id] = scope_identity()',N'@0 nvarchar(10),@1 datetimeoffset(7),@2 nvarchar(11),@3 nvarchar(36)',@0=N'UpdateUser',@1='2009-11-10 10:58:33.2814740 +01:00',@2=N'foo',@3=N'bar'
Run Code Online (Sandbox Code Playgroud)

这解释了为什么需要SELECT权限,因为该操作返回插入行的自动生成的ID.

问题现在仍然存在:我不需要知道我刚刚插入的行的ID,所以有什么方法可以关闭此功能吗?

.net security linq-to-entities entity-framework least-privilege

10
推荐指数
2
解决办法
1876
查看次数

受限制的Web应用程序的PostgreSQL权限

目标

创建一个有三个用户的数据库并限制他们的权限(我只是大声思考,所以我的用户分离也可以纠正):

  1. 超级用户 - 此用户允许最初的数据库配置.创建应用程序数据库,创建其他用户,设置其权限.默认postgres超级用户适合我,所以这一个完成.
  2. 管理员 - 此用户只能访问在配置期间创建的数据库.管理员可以CRUD所有表中的所有数据,也可以CRUD表等"仅用于此数据库的超级用户"类型的情况.在更新应用程序时,管理员是自动化工具用于处理数据库迁移的用户.
  3. 应用程序用户 - 此用户最终是支持Web应用程序功能的用户.请注意,这与网页上的用户无关 - 这是服务器用来运行查询,插入和删除数据的用户.我明确地希望这个用户能够修改任何东西的权限,也不希望创建/销毁表或索引或任何结构.

我试过的

首先,看看(通常很棒的)PostgreSQL文档,Grant上页面几乎让我眼花缭乱.花了几个小时阅读有关PostgreSQL角色和特权的消息后,我常常感到困惑.我认为通过更多的工作,我将能够确定我想要的管理员用户,但我非常坚持"应用程序用户".我已经知道了这一点(命名和密码都只是占位符):

$ psql -U postgres
postgres=# CREATE USER "app-admin" WITH PASSWORD 'password';
CREATE ROLE
postgres=# CREATE USER "app-user" WITH PASSWORD 'password';
CREATE ROLE
postgres=# CREATE DATABASE "test-database" WITH OWNER "app-admin";
CREATE DATABASE
postgres=# \c "test-database"
You are now connected to database "test-database" as user "postgres".
test-database=# DROP SCHEMA "public";
DROP SCHEMA
test-database=# CREATE SCHEMA "app" AUTHORIZATION …
Run Code Online (Sandbox Code Playgroud)

database postgresql privileges web-applications least-privilege

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