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

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

最佳答案

哇。大问题....我可以假设你是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服务器登录名相关联。 Sysadmin登录名自动以数据库所有者(db_owner)的身份连接,因此您可能看不到任何数据库用户(默认用户除外)。在SSMS中,深入研究YourDbName | Security | Users并展开。双击用户以打开“属性”对话框。 “常规”页面将显示该用户的登录名。 “成员资格”将显示用户所属的数据库级别角色。如果有一个用户映射回网络管理员的sql服务器登录名,那就太好了。但是,假设,如果您从sysadmin固定服务器角色中删除了BUILTIN\Administrators sql登录名,则该登录名将不再能够以dbo身份连接到数据库。您必须创建一个新的数据库用户并将其与登录名相关联。像CREATE USER [DomainAdminUser] FOR LOGIN [BUILTIN\Administrators]这样的东西,然后您就可以在用户权限上开始分层。您只想允许读取访问,对吗?将db用户添加到固定的db角色db_datareader:EXEC sp_addrolemember N'db_datawriter', 'DomainAdminUser'。如果他们需要更多权限,请根据需要添加。

您还提到了域管理员分离数据库,将其附加到具有sysadmin权限的另一个SQL Server实例,更改数据库中的数据,然后将其重新附加到原始SQL Server实例的可能性。我不确定您可以采取很多措施来防止这种情况的发生。作为域管理员,他/她将能够关闭SQL Server NT服务并获取mdf/ldf文件,并根据需要对其进行处理。这似乎是域管理员应采取的一种极端措施。如果发生这种情况,我希望这是终止的理由。他们真的会走这么远吗?

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

Permissions Hierarchy (Database Engine)

Server-Level Roles

Database-Level Roles

关于sql-server - 如何从域管理员保护SQL数据库?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22640292/

10-11 02:44
查看更多