对于您提出的方案(Web 服务器主机完全受损),没有什么可以保护您。黑客至少可以在 DB 服务器上做 Web 服务器可以做的所有事情。而且我想说,纵深防御可以教你在这种情况下最大限度地减少损失:将你的网络服务器使用的帐户的数据库权限减少到绝对最低要求,仅此而已。其次,确保如果 Web 服务器主机被入侵,它不能用于提升比 Web 服务器帐户更高的权限(即,在 WWW 主机上没有其他服务使用比 WWW 帐户在 DB 上具有更高权限的凭据)。这些是基本的安全原则,与使用的身份验证方案无关。
虽然 sql auth 与 windows auth 在您的方案中都没有明显的优势,但还有其他问题需要考虑:
但是,如果您已指定身份,则该用户帐户将需要访问 SQL Server。虽然您是对的,如果攻击者破坏了 Web 服务器,他们实际上拥有与身份帐户相同的访问权限,但事实是,使用 SQL Server 登录不会改变任何事情。获得访问权限后,我可以修改 Web 应用程序以执行我想要的操作,并且在后端 SQL Server 上最大程度地允许您的安全性。
现在至于为什么要使用 SSPI。首先,您没有使用基于 SQL Server 的登录。这意味着 Active Directory 是唯一的安全来源。这意味着您有正常的审计手段来确定无效访问。其次,这意味着除非有其他应用程序需要它,否则您可以让 SQL Server 处于仅 Windows 身份验证模式。这意味着不允许任何 SQL Server 登录。这意味着对 sa 的任何攻击在它们开始之前就被停止了。最后,它使恢复更容易。如果您使用基于 SQL Server 的登录,则需要使用 SID 和加密密码提取登录。如果您使用基于 Windows 的用户帐户作为“服务帐户”,当您转到新的 SQL Server 时,通过创建登录,
我想说使用 SQL 身份验证只有两个正当理由:
对于您提出的方案(Web 服务器主机完全受损),没有什么可以保护您。黑客至少可以在 DB 服务器上做 Web 服务器可以做的所有事情。而且我想说,纵深防御可以教你在这种情况下最大限度地减少损失:将你的网络服务器使用的帐户的数据库权限减少到绝对最低要求,仅此而已。其次,确保如果 Web 服务器主机被入侵,它不能用于提升比 Web 服务器帐户更高的权限(即,在 WWW 主机上没有其他服务使用比 WWW 帐户在 DB 上具有更高权限的凭据)。这些是基本的安全原则,与使用的身份验证方案无关。
虽然 sql auth 与 windows auth 在您的方案中都没有明显的优势,但还有其他问题需要考虑:
最后一点:TDS 协议在流量上以明文形式公开 sql auth 密码,但这通常通过请求对流量进行 SSL 加密来缓解。
那么,为什么您仍然看到在 web.config 中以明文形式存储密码的 sql auth WWW 主机?那些是糟糕的开发人员/管理员,不要成为其中之一。
msdn.microsoft.com/en-us/library/aa378326(VS.85).aspx
technet.microsoft.com/en-us/library/ms189067.aspx
如果您不使用 SSPI,则将用户名和密码硬编码到源文件中。
如果您将用户名和密码硬编码到源文件中,您的所有员工都可以访问它。
这是相对不安全的。心怀不满的前雇员可能会恶意使用这些信息。访问者可能会在某处的屏幕上看到代码。或者源代码可能会不小心泄露出去。
SSPI 的优点是密码永远不会以明文形式存储在任何地方。
到目前为止,其他答案都很好,但我会提出另一个答案:管理。
迟早,您可能最终会拥有多个 SQL Server。管理您的应用程序和多个 SQL Server 之间的 SQL 身份验证会有点痛苦,尤其是当您遇到安全问题时。如果您更改一次 Windows 身份验证密码,它会立即在您的所有服务器上更改。如果您需要轮换 SQL 身份验证密码,那就更痛苦了——甚至到了您可能根本不会这样做的地步。这是一个安全风险。
我在这里不是 100% 确定,但我认为主要的一点是 SQL 身份验证是不安全的,所以最好使用 Windows 身份验证。根据您的应用程序的设置方式,您还可以使用 Windows 身份验证将正确的凭据以加密形式存储在计算机上。我认为使用 SQL 身份验证真的不可能。你可以混淆它,但最终它必须是清楚的。
此外,仅仅因为黑客可以进入服务器并不意味着游戏结束。黑客可能会控制非特权进程,但不会在服务器上执行任何其他操作。这就是为什么重要的是不要以管理员或系统身份运行所有内容,而是使用最低权限的服务帐户。
最好的办法是限制他们如果/当他们闯入 Web 服务器时可以做什么。这意味着只授予应用程序运行所需的 SQL 权限。授予应用程序 DBO 权限要容易得多,但如果网络服务器受到成功攻击,这会使 DB 更容易受到攻击。
我将通过假设您正在谈论内部专用网络上的内部 Web 服务器来作为所有这一切的开场白。
让我们从模拟机器开始。如果应用程序池标识是网络服务并且在 .NET 应用程序中没有模拟,那么是的,Web 应用程序将使用计算机的计算机帐户连接到后端 SQL Server。这意味着您已授予对所述机器帐户的访问权限。微软的 CRM 就是这样工作的。
但是,如果您已指定身份,则该用户帐户将需要访问 SQL Server。虽然您是对的,如果攻击者破坏了 Web 服务器,他们实际上拥有与身份帐户相同的访问权限,但事实是,使用 SQL Server 登录不会改变任何事情。获得访问权限后,我可以修改 Web 应用程序以执行我想要的操作,并且在后端 SQL Server 上最大程度地允许您的安全性。
现在至于为什么要使用 SSPI。首先,您没有使用基于 SQL Server 的登录。这意味着 Active Directory 是唯一的安全来源。这意味着您有正常的审计手段来确定无效访问。其次,这意味着除非有其他应用程序需要它,否则您可以让 SQL Server 处于仅 Windows 身份验证模式。这意味着不允许任何 SQL Server 登录。这意味着对 sa 的任何攻击在它们开始之前就被停止了。最后,它使恢复更容易。如果您使用基于 SQL Server 的登录,则需要使用 SID 和加密密码提取登录。如果您使用基于 Windows 的用户帐户作为“服务帐户”,当您转到新的 SQL Server 时,通过创建登录,
问题是哪个“更好”?这很难回答,因为它依赖于提问者的背景、价值观和优先事项。
就个人而言,我喜欢 SQL 身份验证。
最后一点:您编写连接管理器类来尝试每个连接字符串,这样您就可以在配置中的第一个更改密码,将更改推送出去,它将故障转移到第二个连接,然后您在 MSQL 上更新密码第一个将再次使用。需要进行最后的配置更改,以将第二个密码设置为与第一个密码相同,以备下次使用。
如果用户不会直接操作数据库(通过其他客户端工具,例如 SQL Server Management Studio),那么我通常只会为应用程序创建一个 SQL 登录名并授予它所需的访问权限。此时,用户在 Web 应用程序界面允许的范围内可以做的事情受到限制。