如何通过 SSMS 拒绝某些登录访问 SQL Server,但允许通过 .Net SqlClient 数据提供程序

Ale*_*sko 12 sql-server permissions access-control logins connections

我们有一种情况,开发人员没有任何UPDATE权限,但他们使用应用程序并查看连接字符串 -> 他们知道来自某些SQLLogin1具有 UPDATE 权限的SQL 帐户(示例)的密码。我们目前的操作并不完善,有时需要修改生产数据(目前还没有 GUI)。

开发人员没有联系 DBA 并要求他修改数据,而是(不正确地)使用 SQL 帐户SQLLogin1(有权修改数据),并通过 SQL Server Management Studio 连接自己修改数据。

DBA 无法SQLLogin1在 Developer 看到新连接字符串和新密码的情况下更改密码,因为使用的应用程序连接字符串SQLLogin1是由 Developer 维护的。

题:

有没有办法拒绝访问SQLLogin1SQL 登录,但前提是它通过 SSMS 连接?

同时如果SQLLogin1正在连接.Net SqlClient Data Providerprogram_namesys.dm_exec_sessions),必须允许登录。

这样我们就不想让开发人员使用 SSMS 连接SQLLogin1,而使用的应用程序SQLLogin1仍然可以连接。

sep*_*pic 16

我认为没有可靠的解决方案可以解决您的问题,因为任何用户都可以Application Name修改parameter它。

以下是如何更改它SSMS

Connect to Database Object对话框中选择选项,打开 Additional Connection Parameters并选择任何名称,Application Name如下所示:

在此处输入图片说明

现在sys.dm_exec_sessionsDMV 和 Program_name() 将显示您在Application Name参数中的连接字符串中传递的内容:

在此处输入图片说明


EzL*_*zLo 13

您可以使用服务器登录触发器进行自定义登录验证,并在您认为合适时拒绝它们。如果您使用的是 SSMS,您将在“服务器对象”下方和“触发器”内看到此触发器。

例如:

CREATE TRIGGER strRejectSSMSConnectionForSQLLogin1
ON ALL SERVER FOR LOGON
AS
BEGIN

    IF ORIGINAL_LOGIN() = N'SQLLogin1' AND PROGRAM_NAME() LIKE N'Microsoft SQL Server Management Studio%'
    BEGIN
        RAISERROR('Direct connection by SSMS refused.', 16, 1)
        ROLLBACK
    END

END
Run Code Online (Sandbox Code Playgroud)

ROLLBACK内部触发器将拒绝连接(有包装调用的登录事件触发的隐式交易)。

在实现登录触发器时要小心,如果没有正确编码,您将拒绝应该能够登录的登录(包括您自己的!)。确保首先在测试/开发环境中进行测试。

请记住,此代码在创建会话之前执行,因此依赖于会话 ID (SPID) 的系统视图将不包含当前检查的登录,直到触发器结束而没有回滚或足够高的故障。

  • 这将工作几分钟,直到开发人员使用不同的工具。如果他们知道具有权限的登录,您就无法将优秀的开发人员拒之门外。 (6认同)
  • 如果您使用 DAC(专用管理员连接)连接,您可以删除触发器而不触发它。这是一个特定的单用户连接,您可以在出现问题时针对服务器发出该连接。它通常直接与 sqlcmd 一起使用,但您也可以使用 SSMS 来完成。https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms178068(v=sql.105) (5认同)
  • 这与其说是一种安全解决方案,不如说是一种策略解决方案。IE 登录触发器明确指出直接连接到生产数据库是违反政策的。而且由于无论如何您都不太可能防御_实际上是恶意的_开发人员,所以这可能已经足够了。 (5认同)

Sol*_*zky 7

  1. 在理想意义上,这是一个流程/政策/管理问题。即使有人知道密码,如果除了 DBA 之外的任何人连接到生产违反公司政策(好吧,您可能有一个发布工程团队和/或系统管理员等),并且违反规则会受到处罚,那么这应该就足够了(假设这些规则得到执行)。

  2. 试图阻止特定应用程序连接是不可能的。正如sepupic 所展示的,更改“程序名称”相当容易。但即使开发人员无法弄清楚,还有很多其他程序可以连接到 SQL Server。大多数人都可以访问SQLCMD.exe甚至已弃用的OSQL.exe。开发人员可以从Visual Studio中连接,并且他们甚至可以创建自己的应用程序通过“.net SqlClient数据提供程序”进行连接。哦,现在我们甚至拥有 Azure Data Studio。实在是太多了。

  3. 尽管如此,如果我们从另一个方向接近它,这仍然是可能的:与其阻止应用程序 X 连接,只允许应用程序 Y 连接怎么样?当然,我们再次进入“程序名称”,甚至“主机名”都可以被欺骗,但是,我很确定客户端的 IP 地址不能被欺骗(至少不能通过连接字符串关键字)。您知道应用服务器的 IP 地址,或者可以从sys.dm_exec_connectionsDMV(在client_net_address现场)轻松找到它。

    EzLo 建议登录触发器开始,我们可以修改确定连接是否有效的逻辑如下:

    IF (ORIGINAL_LOGIN() = N'SQLLogin1'
        AND (
                 CONVERT(VARCHAR(10), CONNECTIONPROPERTY('net_transport')) <> 'TCP'
              OR CONVERT(VARCHAR(10), CONNECTIONPROPERTY('client_net_address')) <> '10.10.10.10'
     -- uncomment below (and comment-out line above) if app uses multiple IP addresses
     --       OR CONVERT(VARCHAR(10), CONNECTIONPROPERTY('client_net_address'))
     --                   NOT IN ( '10.10.10.10', '10.10.10.11', ...)
            ))
    BEGIN
        RAISERROR('Non-application connection refused.', 16, 1);
        ROLLBACK;
    END;
    
    Run Code Online (Sandbox Code Playgroud)

    现在唯一的方法是登录到生产机器,或者让他们的工作站欺骗应用程序服务器的 IP。希望开发人员无权登录生产。并且欺骗网络上的现有 IP 会导致问题,这可能会对生产产生不利影响,因此他们不会尝试这样做,对吗?对?