能否在 SQL Server 2008(或 R2)上禁用 Windows 身份验证登录?

jco*_*and 8 sql-server-2008 security sql-server

所以我们可以使用 Windows 登录或混合模式,但是我们可以将 SQL Server 配置为仅使用内部登录并阻止所有 Windows 登录吗?

作为预防性(或反应性)过程添加所有潜在的 Windows 登录并将其设置为受限权限的唯一解决方案是什么?

小智 6

据我所知,无法在 SQL Server 2008 + R2 上禁用 Windows 身份验证:

http://msdn.microsoft.com/en-us/library/ms144284%28v=sql.105%29.aspx

唯一可以访问的 Windows 帐户是那些明确添加为登录名的帐户(或者是具有登录名的组的成员)。


Jon*_*gel 5

它不能完全禁用,原因有两个:

  • 安装时,为NT AUTHORITY\SYSTEMNT SERVICE\SQLSERVERAGENT(或包含 SQL 代理服务帐户NT SERVICE\MSSQLSERVER的组)和(或包含 SQL 数据库引擎服务帐户的组)提供登录。这些是sysadminSQL Server 正常运行所需的级别登录。

    虽然快速测试显示删除所有这三个登录名只会阻止 SQL Agent 重新启动(数据库引擎运行良好),但我确定还有其他功能依赖于其他两个登录名……它们是默认创建的出于某种原因,所以我不会惹他们。(仅供参考,如果您自己进行测试:SSMS 中登录的删除和创建脚本选项不会脚本服务器角色成员资格。)

  • 在单用户模式下,sysadmin无论是否创建了“包含”这些用户的登录,都会自动授予本地管理员级别权限。当你把钥匙锁在车里时,这是一个衣架。

如另一个答案中所述,只有明确创建的 Windows 登录名才能访问连接(我的原始评论不正确)——删除所有用户创建的 Windows 登录名足以阻止访问。

如果您需要更进一步并阻止创建Windows 登录,这是一个起点(基于策略的管理,至少在 2008 年,不支持在发生这种情况时阻止它):

CREATE TRIGGER trg_PreventWindowsLogins
    ON ALL SERVER
    AFTER CREATE_LOGIN
AS
BEGIN

    SET NOCOUNT ON;
    
    IF (EVENTDATA().exist('/EVENT_INSTANCE[1]/LoginType[1]/text()[1] eq "Windows (NT) Login"') = 1)
    BEGIN
        RAISERROR(N'Not allowed to create Windows logins!', 16, 1);
        ROLLBACK;
    END
    
END
Run Code Online (Sandbox Code Playgroud)

当然,任何拥有足够权限的人都可以解决这个问题,但这是一个单独的问题......