在 中SSMS,由于我不能将多个分配login objects给单个user object,那么实现等效安全模型的最佳实践是什么?
例如,我拥有20 logins并希望在单个数据库上为他们提供所有相同的权限:
我有一个包含数百万行的表,分为几个类别(比如数字 1-5)。访问数据库的应用程序使用一个单一的数据库帐户。但是,该应用程序有自己的用户帐户,每个应用程序用户只能访问某些类别。因此,允许的类别列表通过会话变量传递给数据库:
SET SESSION mydb.allowed_categories = '1,3,5';
Run Code Online (Sandbox Code Playgroud)
我使用 RLS 根据会话变量过滤行:
CREATE POLICY table_select_policy ON big_table
FOR SELECT
USING (ARRAY[category] && string_to_array(current_setting('mydb.allowed_categories'),',')::int[]));
Run Code Online (Sandbox Code Playgroud)
问题在于,使用这种方法,RLS 行过滤需要花费大量时间。另一方面,当我通过以下方式进行实验时:
CREATE POLICY table_select_policy ON big_table
FOR SELECT
USING (category = 1 OR category = 3 OR category = 5);
Run Code Online (Sandbox Code Playgroud)
RLS 过滤几乎快了 10 倍。当然,这种硬编码是行不通的,因为我想在应用程序中动态更改允许的类别列表。
这 category列有一个 btree 索引,但是由于类别的数量相当少,查询计划器总是倾向于对 RLS 过滤器进行顺序扫描。
所以我的问题是 - 有没有办法优化 RLS 表达式,使其至少更接近硬编码方法?你会建议一个不同的解决方案吗?该应用程序有很多用户,所以我不想为每个用户都创建一个数据库帐户。
我的任务是创建一个允许非特权用户启动和停止 SQL Server 代理作业的系统。我正在使用构造运行等dbo在msdb数据库的架构中创建存储过程。WITH EXECUTE AS OWNEREXEC dbo.sp_start_job <JobID>;
在联机丛书主题约EXECUTE AS说,这是一个“最佳实践”:
指定具有执行模块中定义的操作所需的最低权限的登录名或用户。例如,除非需要这些权限,否则不要指定数据库所有者帐户。
在我的情况下,EXECUTE AS OWNER表示[sa],因为这些模块在dbo架构中,在 msdb 数据库中,该数据库始终归[sa].
我这样做是否无意中造成了安全风险?
我没有传入任何可用于 SQL 注入攻击的参数,因为传入的唯一参数是UNIQUEIDENTIFIER表示受影响的作业。
运行存储过程的用户EXECUTE AS OWNER除了我明确创建的数据库角色的成员资格外,无权访问 msdb 数据库,他们拥有对存储过程GRANTs的EXECUTE权限。
其中一个项目的条件是有问题的用户应该不能够以任何方式运行SQL Server代理GUI工具。这排除了为他们提供内置SQLAgentUserRole角色的成员资格。我也宁愿不修改 等的权限dbo.sp_start_job,因为我试图不修改 SQL Server 本身所依赖的任何内容(除了显然将项目添加到 msdb 数据库本身之外)。
有问题的代码在这里。
我们正在尝试清理我们 AlwaysOn 集群之一上的一些旧帐户。
这个特定的帐户拒绝玩好并允许自己被删除。
USE [master]
GO
DROP LOGIN [PROD\dba007]
GO
Run Code Online (Sandbox Code Playgroud)
错误:
Msg 15173, Level 16, State 1, Line 4
Server principal 'PROD\dba007' has granted one or more permission(s). Revoke the permission(s) before dropping the server principal.
Run Code Online (Sandbox Code Playgroud)
它抱怨的权限是对 HADR_ENDPOINT 的连接权限
Select perm.* from sys.server_permissions perm
INNER JOIN sys.server_principals prin ON perm.grantor_principal_id = prin.principal_id
where prin.name = N'PROD\dba007'
class class_desc type permission_name state state_desc
105 ENDPOINT CO CONNECT G GRANT
Run Code Online (Sandbox Code Playgroud)
现在下一个合乎逻辑的事情是撤销连接权限。
USE master;
REVOKE CONNECT ON ENDPOINT ::HADR_endpoint from [PROD\dba007]
Run Code Online (Sandbox Code Playgroud)
但这会产生消息 …
在我们的数据库(为简洁起见是 DB)中,我们存储了一些非常敏感的政府数据,并希望尽可能保护这些数据。
这里有两种考虑安全性的方法:
我的问题集中在后者。
信息的敏感性被认为如此之高,以至于我们面临着内部员工极有可能接触到这些数据的可能性。
换句话说,我们担心内部员工可以批量窃取数据并进行交易(数据只有在完全被盗时才有意义,因为它是人们私人信息的巨大数据库)。
我们的应用程序以逐条记录的方式访问数据库。这被认为是好的,因为使用逐条记录方式访问数据人员不会大规模窃取信息。
一个显而易见的解决方案是:将“数据库的钥匙”交给一个最值得信赖的人。然而,我们担心的是,即使在这种情况下,有人也可以用枪指着他的头并要求制作 DB 的副本。
有什么办法可以保护数据库,这样即使 DBA 用枪指着他的头,他也无法窃取数据?
注意:我们使用的数据库管理系统是 PostgreSQL,但如果它提供我们正在寻求的安全保证,我们可以轻松切换到另一个。
我的一项任务是提升我的数据库,要求我将安全功能和非安全功能分开。根据补充阅读,这似乎是在谈论处理加密、身份验证、授权和审计的硬件、软件和固件。
根据这个目标,正如向有经验的人提出的一般问题一样,DBA 是否可以同时担任安全管理员?职责分离似乎说不,因为 DBA 工作虽然在性质上具有管理性和高度特权,但本质上大多与安全无关。但是,如果雇用一个人担任 DBA 和另一个人担任安全管理员是令人望而却步的,那么如果一个人同时履行这两项职责,那么最大的关注领域是什么(如果有的话)?
ETA:就我对我的限制的理解,我无法提供很多细节,但安全问题很高,预算紧张,数据库范围从用户很少的小型非应用程序数据库到数千名用户大量的表,每个表都有大量的信息行。DBA 正在使用 DBA 角色,因此是最广泛的特权集。看起来我不小心删除了 oracle 标签,所以我将把它放回去并提到这是一个 Oracle 数据库。
为便于讨论,让我们关注最大的数据库子集。其中包含个人和财务信息。我想我可以说我们正在寻找一个严重依赖 NIST 数据库标准的标准,但无论出于何种原因,它都不是 NIST。不确定这是否有帮助。
我不确定这是否是一个奇怪的问题,所以请让我知道我在下面描述的内容是否可行。
我们有一个服务器,它是由其他人配置的,我们没有人“添加到其中”。
截至目前,我只sa登录了所述服务器。
我正在通过
SQLCMD -E -S ".\SQLServer"
Run Code Online (Sandbox Code Playgroud)
然后通过
SELECT name FROM sys.syslogins
Run Code Online (Sandbox Code Playgroud)
输出是
sa
Run Code Online (Sandbox Code Playgroud)
我只想对表运行 SELECT 语句以查看值。
题
有什么我可以做的吗?
我曾尝试 DB 更改和可信赖,但由于我根本不是会员,因此我的访问被拒绝。
我只需要运行 SELECT 语句。
我参与了将旧的 AS400 系统转换为 SQL 服务器的项目。服务器用于我们的工资单处理。工资单流程的一部分是分解我们从事的每项工作的双周工资百分比。为此,在 AS400 流程中,将一个 csv 文件从 P&B 管理员加载到只有管理员有权访问的数据访问区域中的服务器。我需要在 SQL 服务器环境中复制它。我计划使用 SQLCMD 将本地文件导入到临时表中。我知道任何人都不太可能在使用临时表时查询临时表中的数据,但无论如何只授予执行 SQLCMD 脚本的用户的访问权限?
由于 GDPR,我们正在寻找一种方法来帮助识别来自我们生产 SQL Server 的恶意活动或数据泄露。
如果我们使用 Azure,这似乎是一个开关轻弹。
什么可用于本地服务器?
首先,这是针对 SQL Server 2016 的。如果我在 2017+ 上,我会使用sp_add_trusted_assembly. 在问这个问题之前只是想澄清一下。
如何在不使用 的情况下注册程序集System.DirectoryServices.AccountManagement.dllTRUSTWORTHY ON?我无法使用System.DirectoryServices.dll生成的非对称密钥使其工作。AccountManagement dll 的签名与System.DirectoryServices.dll不同。
我什至尝试从System.DirectoryServices.AccountManagement.dll创建一个单独的非对称密钥,但这会导致:
消息 15468,级别 16,状态 7,行 XXXXX
在生成非对称密钥期间出错。
这是我为尝试创建此程序集而编写的测试脚本。
USE master
IF DB_ID('CLR_Test') IS NULL BEGIN
CREATE DATABASE CLR_Test
END
GO
USE [CLR_Test]
GO
EXEC sp_configure @configname=clr_enabled, @configvalue=1
GO
RECONFIGURE
GO
/*************************************************************************************/
-- DROP OBJECTS IF FOUND FIRST
/*************************************************************************************/
-- DROP System.DirectoryServices.AccountManagement
IF EXISTS(SELECT 1 FROM sys.assemblies WHERE name = 'System.DirectoryServices.AccountManagement') BEGIN
RAISERROR( 'DROP ASSEMBLY [System.DirectoryServices.AccountManagement]', 0, …Run Code Online (Sandbox Code Playgroud) security sql-server sql-clr active-directory sql-server-2016
security ×10
sql-server ×6
permissions ×3
logins ×1
optimization ×1
oracle ×1
postgresql ×1
sql-clr ×1
sqlcmd ×1
ssms ×1