我有一个数据库,我想保留在主域名,但阻止域管理员写入它。读访问不是问题。为此,看起来我必须确保任何具有写入权限的帐户仅使用SQL登录(因为域管理员可以重置任何其他域帐户的密码)。我确实意识到这有其他安全隐患。另一个问题是Windows服务器上的管理员获取数据库mdf文件并将其附加到另一个实例并修改数据库内容,然后替换原始服务器上的mdf。我首先想知道这是否可能,还是需要通过sql server重新连接?
由于服务器仍在域中,域管理员显然是服务器上的管理员。是否还有其他方法可以获取我应该担心的数据库写入权限(例如删除master数据库mdf)?
答案 0 :(得分:5)
哇。大问题....我可以假设你是dba吗?在继续之前,快速免责声明:在更改登录权限时要格外小心。特别登录属于sysadmin固定服务器角色的一部分。可以从该角色中删除所有登录。如果您的服务器仅使用Windows身份验证(或者没有人知道sa密码),您可以将自己锁定在sql实例之外。那很不好。很糟糕......
服务器级登录
域管理员和SQL Server sysadmins不等效。如果您在SSMS中,请深入研究安全性|登录并展开。可能有“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 |安全|用户并展开。双击用户以打开“属性”对话框。 “常规”页面将显示该用户的登录信息。 “Membership”将显示用户所属的数据库级角色。如果有用户映射回网络管理员的sql server登录,那很好。但是,假设您从sysadmin固定服务器角色中删除了BUILTIN \ Administrators sql登录,则该登录将无法再以dbo身份连接到数据库。您必须创建一个新的数据库用户并将其与登录相关联。像CREATE USER [DomainAdminUser] FOR LOGIN [BUILTIN\Administrators]
这样的东西然后你可以开始分层用户的权限。你只想允许读取权限,对吧?将db用户添加到固定数据库角色db_datareader:EXEC sp_addrolemember N'db_datawriter', 'DomainAdminUser'
。如果他们需要更多权限,请根据需要添加。
您提到的其他内容是域管理员可能会分离数据库,将其附加到具有sysadmin权限的另一个SQL Server实例,更改数据库中的数据,然后将其重新附加回原始SQL Server实例。我不确定你能做些什么来防止这种情况发生。作为域管理员,他/她将能够关闭SQL Server NT服务并获取mdf / ldf文件并随意使用它们。对于域管理员而言,这似乎是一种极端的措施。如果发生这种情况,我认为这是终止的理由。他们真的会走这么远吗?
最后,SQL Server安全/权限层次结构相当复杂。请不要依赖这篇文章来获取所有答案。从其中一些链接开始,尽可能多地学习。