标签: security

许多嵌套对象的 SA 权限问题

我有一个相对复杂的经纪人应用程序。

今天,在我进行了一些更改后,我开始收到错误消息:

服务器主体“sa”无法在当前安全上下文下访问数据库“XYZ”。

到错误点为止的整个场景是:

(在数据库ABC 中

  • 代理消息被提交到队列中
  • 队列阅读器拿起它
  • 队列读取器更新表以指示工作正在开始
  • 该表有一个更新触发器。触发
    • 检查数据库XYZ 中的表以确保此字段的插入值有效
    • 该表通过同义词访问

我认为触发器中的检查是导致问题的原因。

如果我手动运行更新,它工作正常。我也曾经EXECUTE AS手动运行更新,因为sa它工作正常。

其他相关事实:

  • sa是数据库ABC和数据库XYZ的所有者
  • sa 帐户没有什么有趣的事情 - 它也是两个数据库中的 db_owner 角色

是否有某种奇怪的作用域发生,因为所有这些都在代理的上下文中运行?

更新

更多信息:

  • 数据库所有权链接在服务器级别上,但不在数据库中。我打开它并没有什么区别。
  • 使用三部分名称而不是同义词没有区别
  • 探查器跟踪显示这些语句作为 SA 而不是另一个登录运行
  • 将两个数据库 TRUSTWORTHY 设置为 ON 没有任何区别
  • 如果我手动运行队列激活过程,它会正确处理(在我的凭据下)。

security sql-server permissions sql-server-2008-r2 service-broker

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

服务器代理队列的激活存储过程的服务器权限

我有一个查询sys.dm_exec_requests视图的存储过程。在存储过程中,视图只返回一行,而存储过程需要查看所有行。视图上的MSDN文章说返回什么取决于用户权限:

如果用户在服务器上有 VIEW SERVER STATE 权限,用户将看到 SQL Server 实例上所有正在执行的会话;否则,用户将只能看到当前会话。

存储过程实际上是一个broker队列的激活存储过程:

CREATE QUEUE test_queue
  WITH 
  STATUS = ON,
  RETENTION = OFF ,
  ACTIVATION (
    STATUS = ON,
    PROCEDURE_NAME = test_procedure,
    MAX_QUEUE_READERS = 1, 
    EXECUTE AS SELF ),
POISON_MESSAGE_HANDLING (STATUS = ON) 
ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

当我阅读MSDN文章时,我改变了

EXECUTE AS SELF
Run Code Online (Sandbox Code Playgroud)

EXECUTE AS 'dbo'
Run Code Online (Sandbox Code Playgroud)

这没有任何区别。sys.dm_exec_requests仍然会返回一行。

我也试着做

EXECUTE AS OWNER
Run Code Online (Sandbox Code Playgroud)

这也没什么区别。据我了解,存储过程所有者是谁创建的,也就是我。由于我处于系统管理员角色中,应该可以正常工作,但事实并非如此。我将不胜感激任何故障排除提示。

特别是我想知道如何列出给定用户的服务器权限,以便我可以根据文章检查它们是否包含“查看服务器状态”权限。

令人困惑的部分是我所理解的用户是在数据库级别,所以我不清楚它如何获得服务器权限。如果你能澄清这一点,那就太好了。

security sql-server sql-server-2012

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

SQL Server 2012 中的两个“连接 SQL”权限

SQL Server 2012 中这两个“Connect SQL”权限有什么区别?

在此处输入图片说明

security permissions sql-server-2012

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

SQL 日志显示我找不到的登录信息

在我的 SQL Server 日志中,我显示从一个SERVER\loginnameSecurity > LoginsOR 中找不到的帐户 ( )成功登录到数据库Database > Security > Users。程序正在使用此登录名来执行任务(它成功完成),因此这不是安全隐患,但我终生无法弄清楚它在哪里,我需要找到它来进行调整。

还有一些注意事项:我确实记得不久前添加了这个特定的登录名,并且我必须这样做有一些特别之处,因为它不是域帐户。相反,它使用传递身份验证(应用程序和 SQL 服务器上的相同本地帐户名称和相同的密码)。我无法使用它通过 SSMS 登录。它不是组成员资格的一部分。当我SELECT从主syslogins表做 a 时它没有显示。

有人对我的脑放屁有什么想法吗?

security sql-server

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

行级安全或多个表

我正在寻找有关以下场景的最佳实践的文档。

托管应用程序包含一些“全局”数据和一些“每租户”数据。“租户”不应该访问另一个租户的表,我希望在 DBMS 级别强制执行此操作(除了强制执行到应用程序级别)。

因此,作为示例,该应用程序可以向视频租赁商店提供管理系统。

店主和员工以及与租借电影的人有关的信息是全球性的。一旦客户注册,他们就无需再次注册从另一家商店租用。

商店(租户)有自己的数据库(客户列表、库存、当前预订的电影等)。因此,当店主登录应用程序时,只显示他自己的数据,我对此没有意见。

系统是否应该为每个租户/商店创建一组新表?

或者系统是否应该使用 DBMS 安全/授权...换句话说,在后端,商店 1 的库存与商店 2 的库存在同一表中,但通过 DBMS 安全性,视图只允许为谁选择该商店的行用户已登录应用程序。

我不确定我的问题是否足够清楚?

security database-design row-level-security

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

为什么/何时创建 mysql 触发器需要超级权限?

我试图解析和理解 MySQL 文档所说的何时创建触发器需要 SUPER 权限。他们说:

如果启用了二进制日志,CREATE TRIGGER 可能需要 SUPER 权限[1]

这种暗示在某些情况下它不需要 SUPER 特权。他们指的是 log_bin_trust_function_creators=1 设置,还是还有其他东西?

其次,在[2]中他们说:

... 信任不会创建将导致不安全事件写入二进制日志的存储函数。

这里究竟有什么危险?二进制日志中哪些类型的事件可能是“不安全的”,对谁来说?

[1] https://dev.mysql.com/doc/refman/5.7/en/create-trigger.html

[2] https://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_log_bin_trust_function_creators

mysql trigger security

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

如何巧妙地提出数据库的缺点?

一点背景:

在最初的开发人员离开后,我最近继承了支持和开发数据库应用程序的责任。查看应用程序,数据库似乎有几个...问题。

  • 每周收缩和重新索引计划
  • 用于 Web 应用程序访问的数据库帐户具有 db_owner 角色
  • 没有外键
  • 所有表都使用 GUID 列作为主键
  • C# 中内置的查询未参数化

我该如何向管理层提出这些问题?

通常,这应该没有问题,但我有一个问题:我的 SQL 经验不到六个月,而经理和前开发人员在这个项目上工作了好几年。

security sql-server best-practices

5
推荐指数
2
解决办法
242
查看次数

无法使数据库从恢复挂起状态联机

我正在尝试使处于恢复挂起状态的 SQL Server 数据库联机并可访问。SQL Server 服务使用一个 Active Directory 帐户,该帐户是域管理员并且是sysadminsql server 上的成员。SQL Server 帐户应该拥有 SQL 文件夹中的权限,因为它是域管理员。但是,它不是 SQL Server 中的本地管理员。

错误消息是:

消息 5120,级别 16,状态 101,第 1 行无法打开物理文件“F:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DBName.ndf”。操作系统错误 5:“5(访问被拒绝。)”。消息 5120,级别 16,状态 9,第 1 行无法打开物理文件“F:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\DBName.ndf”。操作系统错误 5:“5(访问被拒绝。)”。

尽管

alter database [DBName] set online;
Run Code Online (Sandbox Code Playgroud)

导致以下错误:

消息 945,级别 14,状态 2,第 1 行由于无法访问的文件或内存或磁盘空间不足,无法打开数据库“databs”。有关详细信息,请参阅 SQL Server 错误日志。消息 5069,级别 16,状态 1,第 1 行 ALTER DATABASE 语句失败。

你能想到解决办法吗?

sql-server-2008 security recovery corruption

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

我们可以配置基于证书的身份验证来连接(登录)sql 客户端吗?

我们可以配置基于证书的身份验证来连接(登录)sql 客户端吗?或使用相互身份验证(sql server 和 sql client)连接 sql 客户端的任何其他方法?

security sql-server ssl

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

使用 SQL Server 2014 Standard 审核数据库管理员操作

我们需要审计数据库管理员对客户数据库的访问——至少,知道他们正在访问哪个客户数据库(最好是为什么)。如果不升级到 SQL Enterprise 或安装 GreenSQL 之类的代理,是否有其他选择可供我们选择?

例如,我正在考虑某种特权脚本,它提升(sudo 风格)您访问数据库的权限,将其记录到事件日志中,然后再减少它们。

有没有办法实现这一点,可以可靠地审计?我们还应该考虑其他方法吗?

security sql-server audit

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