【问题标题】:Restricting a user to only have access in a ssis package限制用户只能访问 ssis 包
【发布时间】:2020-03-27 10:20:54
【问题描述】:

我们正在运行 SQL Server 2016。出于内部政治原因,我无法以我想要的方式限制访问。假设我不能改变前提。

我们有一个在 SSIS 包中使用的用户。不幸的是,一些开发人员使用这个用户直接使用 ssms 登录到数据库。我需要在不更改密码或其他内容的情况下防止这种情况。我需要的是,只有在数据库从 SSIS 包运行时才允许用户访问数据库,而不是在以任何其他方式运行时才允许用户访问数据库。

我不是在寻找有关如何解决此问题的其他建议。我已经了解其中的大多数,因为我无法改变的管理决策而陷入困境。

谁能告诉我如何以这种方式限制用户?

【问题讨论】:

  • 登录触发器是否适合您?虽然不是万无一失,但如果不是 SSIS,您可以拉取源应用程序名称并拒绝连接

标签: sql-server ssis user-permissions


【解决方案1】:

一种方法是使用 LOGON 触发器

第一个脸红的方法可能是拒绝任何看起来像 SSMS 应用程序的进程

CREATE OR ALTER TRIGGER logon_developer_check
ON ALL SERVER
FOR LOGON
AS 
BEGIN
    IF (ORIGINAL_LOGIN() = 'triskydeveloper'
    and EXISTS
    (
    SELECT
        *
    FROM
        sys.sysprocesses AS S
    WHERE
        S.spid = @@SPID
        AND S.program_name LIKE 'Microsoft SQL Server Management%'
    )
    BEGIN
        ROLLBACK
    END
END

但是开发人员,作为狡猾的小虫子,然后会编写自己的 .NET 应用程序或使用 SQLCMD,这样您就会陷入一场试图识别所有可能出现的程序名称的激烈竞争。

我会改为查看sys.sysprocesses 上的hostname 列 - 如果连接不是来自服务器本身,则拒绝它。除非您必须与能够 RDP 到服务器上的开发人员打交道。

哦,如果您破坏了登录触发器并且它拒绝了所有内容,请使用 SQLCMD 和专用的管理控制台、DAC 和

sqlcmd.exe -S localhost -d master -Q "DISABLE TRIGGER ALL ON SERVER" -A

【讨论】:

  • 你可以走另一条路,只允许与 SSIS 程序名称的连接,而不是明确拒绝 SSMS。尤其是当很多人使用 ADS 以及 SSMS 时。
  • 不过,我会检查该连接的APP_NAME 的值,而不是检查该登录名的所有连接。
  • @Larnu 通过S.spid = @@SPID 过滤帐户名和仅当前 pid 解决了对“所有连接”的担忧,是吗?
  • 我只是说我会做什么;因为它会更简洁。
  • 啊,现在我明白了。 TSQL 语言中有一个 APP_NAME 函数,我对此一无所知
猜你喜欢
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 2012-07-13
相关资源
最近更新 更多