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


10

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

与其联系DBA并要求他修改数据,开发人员将(不当地)使用SQL帐户SQLLogin1(具有修改数据的权限),并通过SQL Server Management Studio连接以自己修改数据。

DBA无法更改密码,SQLLogin1除非开发人员看到新的连接字符串和新密码,因为使用的应用程序连接字符串SQLLogin1由开发人员维护。

题:

有一种方法可以拒绝对SQLLogin1SQL登录名的访问,但仅当它通过SSMS连接时才可以?

同时,如果SQLLogin1通过.Net SqlClient Data Providerprogram_name中的sys.dm_exec_sessions)连接,则必须允许其登录。

这样,我们不想让Developer使用来通过SSMS进行连接SQLLogin1,而使用的应用程序SQLLogin1仍然可以进行连接。

Answers:


11

您可以使用服务器登录触发器进行自定义登录验证,并在认为合适时拒绝它们。如果您使用的是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

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

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

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


谢谢!问题-如果我在登录触发器中犯了任何错误,并且它甚至阻止了sysadmin帐户登录,是否还有办法进入SQL Server并禁用登录触发器?
Aleksey Vitsko,

3
如果您与DAC(专用管理员连接)连接,则可以在不触发的情况下丢弃触发器。这是一个特殊的单用户连接,每当出现问题时,您都可以针对服务器发出该连接。它通常直接与sqlcmd一起使用,但是您也可以使用SSMS来完成。docs.microsoft.com/en-us/previous-versions/sql/…–
EzLo

6
这将持续几分钟,直到开发人员使用其他工具为止。如果他们知道具有权限的登录名,则根本无法将优秀的开发人员拒之门外。

3
这比安全解决方案更多是策略解决方案。IE登录触发器清楚地表明,直接连接到生产数据库违反了政策。而且由于无论如何您都不太可能抵御恶意的开发人员,所以这可能就足够了。
David Browne-微软

1
@voo我应该澄清。您无法通过访问生产环境来防范恶意开发人员。
David Browne-微软

13

我觉得这是你的问题没有可靠的解决方案,因为Application Name是修改parameter该凸轮被任何用户更改。

以下是如何在其中进行更改SSMS

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

在此处输入图片说明

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

在此处输入图片说明


4

您无法切断特定的客户,如其他答案中已详述。

解决方案是从开发人员的帐户中删除对生产系统的访问权限。

任何更改都必须编写脚本,并且dba将运行该脚本。

部署由系统管理员执行;开发人员生产的软件包会提供给具有适当特权的人员,而开发人员则永远不会看到生产系统上使用的配置。

调试是根据具体情况安排的,在临时环境中将生产数据的副本作为首选解决方案,或者在需要时使用具有有限特权的临时帐户。


4
  1. 从理想的意义上讲,这是一个流程/策略/管理问题。即使有人知道密码,如果DBA以外的任何人都无法连接到Production,这违反公司政策(好吧,您可能会有Release Engineering团队和/或sys admin等),并且违反规定会受到处罚,那么应该是足够的(假设这样的规则强制执行)。

  2. 试图阻止特定应用程序连接是不可能的。如sepupup所示,更改“程序名称”非常容易。但是,即使开发人员无法弄清楚这一点,也有许多其他程序可以连接到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;

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


1

我以前曾在一家开发人员遇到此问题的公司工作。他被解雇了,但我们还通过登录触发器实现了一个具有LoginName和AllowedMachine(Application Server)的表。这解决了我们的问题。也许是由于解雇。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.