5

我有一个我想保留在主域上的数据库,但阻止域管理员写入它。读取访问不是问题。为此,看起来我必须确保任何具有写入权限的帐户仅使用 SQL 登录名(因为域管理员可以重置任何其他域帐户的密码)。我确实意识到这还有其他安全隐患。另一个问题是,Windows 服务器上的管理员获取数据库 mdf 文件并将其附加到另一个实例并修改数据库内容,然后替换原始服务器上的 mdf。我首先想知道这是否可能,还是需要通过 sql server 重新附加?

由于服务器仍在域上,域管理员显然是服务器上的管理员。他们是否有其他方法可以获得我应该担心的数据库的写访问权限(例如删除主数据库 mdf)?

4

1 回答 1

6

哇。大问题....我可以假设您是 dba 吗?在继续之前,快速免责声明:更改登录权限时要非常小心。尤其是属于 sysadmin 固定服务器角色的登录。可以从该角色中删除所有登录名。如果您的服务器仅使用 Windows 身份验证(或没有人知道 sa 密码),您可以将自己锁定在 sql 实例之外。那很不好。很坏...

服务器级登录 域管理员和 sql server 系统管理员是不等价的。如果您在 SSMS 中,请深入研究 Security|Logins 并展开。可能有一个“BUILTIN\Administrators”登录帐户。双击它以检查该登录名的属性。选择“服务器角色”。如果选中“sysadmin”服务器角色,则所有域管理员都对您的 sql 实例具有“sysadmin”权限。如果您取消选中它,您将取消该特权。要让域管理员(或本地计算机管理员)拥有 sysadmin 权限,必须将他们显式添加到 sysadmin 服务器角色。在 SQL 的早期版本(2000 和 2005 年)中,默认情况下 BUILTIN\Administrators 是 sysadmin 的一部分。MS 在以后的版本中对此进行了更改,因为这是一个安全问题。如果每个域管理员都有自己的登录名(即 YourDomain\JSmith),那么您必须从 sysadmin 角色中删除这些个人登录名。这将向您显示属于 sysadmin 的所有登录名: SELECT * FROM sys.syslogins WHERE sysadmin = 1

数据库用户 接下来,您需要确定哪个本地数据库用户与 sql server 登录相关联。系统管理员登录会自动以数据库所有者 (db_owner) 的身份连接,因此您可能看不到任何数据库用户(默认用户除外)。从 SSMS 深入研究 YourDbName|Security|Users 并展开。双击用户以打开“属性”对话框。“常规”页面将显示该用户的登录信息。“Membership”将显示用户所属的数据库级角色。如果有一个用户映射回网络管理员的 sql server 登录名,那就太好了。但是,假设您从 sysadmin 固定服务器角色中删除了 BUILTIN\Administrators sql 登录名,该登录名将不再能够以 dbo 身份连接到数据库。您必须创建一个新的数据库用户并将其与登录名相关联。CREATE USER [DomainAdminUser] FOR LOGIN [BUILTIN\Administrators] 然后,您可以开始对用户的权限进行分层。您只想允许读取访问权限,对吗?将 db 用户添加到固定的 db 角色 db_datareader: EXEC sp_addrolemember N'db_datawriter', 'DomainAdminUser'。如果他们需要更多权限,请根据需要添加。

您提到的其他事情是域管理员可能会分离数据库,将其附加到他们具有系统管理员权限的另一个 SQL Server 实例,更改数据库中的数据,然后将其重新附加回原始 SQL Server 实例。我不确定您可以采取什么措施来防范这种情况。作为域管理员,他/她将能够关闭 SQL Server NT 服务并获取 mdf/ldf 文件并随意使用它们。对于域管理员来说,这似乎有点极端。如果发生这种情况,我希望这是终止的理由。他们真的会走到这一步吗?

最后,SQL Server 安全/权限层次结构相当复杂。请不要依赖这篇文章来获得所有答案。从其中一些链接开始,尽可能多地学习。

权限层次结构(数据库引擎)

服务器级角色

数据库级角色

于 2014-03-25T18:29:32.057 回答