Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 请求临时登录的安全性_Sql Server_Sql Server 2005_Security - Fatal编程技术网

Sql server 请求临时登录的安全性

Sql server 请求临时登录的安全性,sql-server,sql-server-2005,security,Sql Server,Sql Server 2005,Security,我需要建立一个系统,允许开发者为数据库请求一个紧急ID。他们将被分配到一个名为“分析师”的角色,该角色将为他们提供一个下拉框,其中包含他们可以访问的数据库。他们将提交请求,并将生成一个临时SQL登录并显示在屏幕上。登录名将具有一些提升权限。登录名将在12小时后删除 我已经在ASP.net上以SA的身份完成了整个工作,但现在我正在修改过程,以便在应用程序连接字符串中使用SQL登录 我试过一些方法让它工作,但遇到了障碍 这是我做真正工作的程序 USE [SQLEmergencyLoginRe

我需要建立一个系统,允许开发者为数据库请求一个紧急ID。他们将被分配到一个名为“分析师”的角色,该角色将为他们提供一个下拉框,其中包含他们可以访问的数据库。他们将提交请求,并将生成一个临时SQL登录并显示在屏幕上。登录名将具有一些提升权限。登录名将在12小时后删除

我已经在ASP.net上以SA的身份完成了整个工作,但现在我正在修改过程,以便在应用程序连接字符串中使用SQL登录

我试过一些方法让它工作,但遇到了障碍

这是我做真正工作的程序

    USE [SQLEmergencyLoginRequest]
GO
/****** Object:  StoredProcedure [dbo].[SQLELR_Login_CREATE]    Script Date: 12/08/2009 14:48:29 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER  PROCEDURE [dbo].[SQLELR_Login_CREATE] 
@SERVER VARCHAR(50),
@DATABASE VARCHAR(50),
@NTLOGIN VARCHAR(50),
@IR INT,
@LOGIN VARCHAR(50) OUTPUT,
@PWD VARCHAR(20) OUTPUT,
@NotifyDBA INT 
WITH EXECUTE AS OWNER 
AS
/*
Emergency_Access_Login_CREATE:  Create Login/PWD, Create User, Create Role, Add User to Role, return Login/PWD.
*/
DECLARE @Random_Login_Extension VARCHAR(20)
DECLARE @sql VARCHAR(1000)

SET @Database = QUOTENAME(@Database);


BEGIN TRANSACTION

--CREATE LOGIN/PWD
EXEC dbo.random_password @Random_Login_Extension OUTPUT;
EXEC dbo.random_password @PWD OUTPUT;

SET @LOGIN = 'Emergency_Login_' + @Random_Login_Extension;

SET @sql= 'CREATE LOGIN [' + @LOGIN + ']' +
'WITH PASSWORD= ''' + @PWD + ''', DEFAULT_DATABASE=[master], ' +
'CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF';

EXEC(@sql);

--CREATE USER
DECLARE @User_Cmd VARCHAR(1000);

SET @User_Cmd = 'USE ' + @DATABASE + ';' +

'CREATE USER [' + @LOGIN + '] FOR LOGIN [' + @LOGIN + '];' +
'EXEC sp_addrolemember N''db_datareader'',''' + @LOGIN + ''';' +
'EXEC sp_addrolemember N''db_datawriter'',''' + @LOGIN + ''';' +
'EXEC sp_addrolemember N''db_ddladmin'',''' + @LOGIN + ''';';

EXEC (@User_Cmd);

INSERT INTO dbo.SQLELR_Emergency_Logins
           ([CreationTime]
           ,[NTLogin]
           ,[IR]
           ,[SERVER]
           ,[DATABASE]
           ,SQLLoginCreated)
     VALUES
           (GETDATE()
           ,@NTLOGIN
           ,@IR
           ,@SERVER
           ,@DATABASE
           ,@LOGIN)


DECLARE @MYBODY VARCHAR(500)
SET @MYBODY = @NTLOGIN + ' has created a temporary login in the ' + @Database + ' Database.  The login name is ' + @LOGIN;

DECLARE @MYSUBJECT VARCHAR(500) 
SET @MYSUBJECT = 'Emergency Login Creation ON server ' + @@SERVERNAME;

IF @NotifyDBA = 1
BEGIN 
    EXEC msdb.dbo.sp_notify_operator
       @profile_name = 'SQLDBA',
       @name = 'SQLDBA',
       @subject = @MYSUBJECT,
       @body = @MYBODY;
END 

COMMIT TRANSACTION
我不希望应用程序帐户在每个数据库中都具有高度特权,因此我创建了另一个帐户,该帐户将进入每个数据库并拥有
DB\u所有者
。显然,使用固定数据库角色的
sp\u addrolemember
需要一个数据库所有者才能工作,这就是为什么帐户是
db\u所有者的原因。我更喜欢安全管理员,但这似乎是不可能的

回到问题上来-将执行方式与动态代码一起使用不起作用

只有在创建用户的每个数据库中创建一个存储过程,才能实现这一点吗

我们这样做是因为我们想关闭这台服务器上的安全性,并从开发人员手中夺走db_所有者,这是多年来的常态。创建此机制将满足他们关于无法访问的唯一剩余投诉。他们担心我们一页也不回答,他们将无法解决问题,所以这将解决这个问题


当然,如果您对此处的安全漏洞有任何建议,我们也将不胜感激。

工作程序中的执行方式条款将您置于“执行方式”框架中,请参阅。由于过程的EXECUTE AS是数据库主体,因此EXECUTE AS上下文将仅在数据库内部受信任

有两种解决方法,一种是
ALTER DATABASE[SQLEmergencyLoginRequest]上的500lb大锤,另一种是
上的外科精度工具,代码签名,请参见示例。我强烈推荐代码签名方法:

  • 在SQLEmergencyLoginRequest中创建证书
  • 签署程序
  • 删除证书的私钥以防止将来用于签名
  • 导出证书
  • 在master中导入证书
  • 创建从证书派生的登录名
  • 将服务器上的身份验证授予证书派生的登录名

  • 将过程所需的所有其他特权授予此派生登录名

这将确保该过程在任何数据库中都具有执行其工作所需的所有特权。每次更改时,您都必须重新执行整个签名过程。

工作过程上的EXECUTE AS子句将您置于“EXECUTE AS”框架中,请参阅。由于过程的EXECUTE AS是数据库主体,因此EXECUTE AS上下文将仅在数据库内部受信任

有两种解决方法,一种是
ALTER DATABASE[SQLEmergencyLoginRequest]上的500lb大锤,另一种是
上的外科精度工具,代码签名,请参见示例。我强烈推荐代码签名方法:

  • 在SQLEmergencyLoginRequest中创建证书
  • 签署程序
  • 删除证书的私钥以防止将来用于签名
  • 导出证书
  • 在master中导入证书
  • 创建从证书派生的登录名
  • 将服务器上的身份验证授予证书派生的登录名

  • 将过程所需的所有其他特权授予此派生登录名

这将确保该过程在任何数据库中都具有执行其工作所需的所有特权。每次更改时都必须重新执行整个签名过程。

C'mon,使用QUOTENAME。您不需要任何
exec SQLELR\u Login\u CREATE…,@DATABASE='master;exec IAmInUrDatabsePwningUrTables;'如果所有参数都通过.net和SqlParameter提交,这仍然是一个漏洞吗?也许有人可以尝试从另一个SQL模块调用?是的,它仍然是一个漏洞。作为一般规则,永远不要依赖客户端在服务器中实施安全性(即SqlParameter),因为攻击者根本不会使用客户端。特别是,任何低权限用户都可以使用此过程通过Sql注入向量利用“执行为权限”来发起权限提升攻击。换句话说,任何来宾都可以成为sysadmin。来吧,使用QUOTENAME。您不需要任何
exec SQLELR\u Login\u CREATE…,@DATABASE='master;exec IAmInUrDatabsePwningUrTables;'如果所有参数都通过.net和SqlParameter提交,这仍然是一个漏洞吗?也许有人可以尝试从另一个SQL模块调用?是的,它仍然是一个漏洞。作为一般规则,永远不要依赖客户端在服务器中实施安全性(即SqlParameter),因为攻击者根本不会使用客户端。特别是,任何低权限用户都可以使用此过程通过Sql注入向量利用“执行为权限”来发起权限提升攻击。换句话说,任何来宾都可以成为系统管理员。“将该过程所需的所有其他特权授予此派生登录名”我有点困惑,为什么要将用户放入master,以及需要授予哪些权限,以便它可以在每个数据库中创建登录名和用户。再次感谢您的帮助。创建登录需要更改服务器级别的任何登录。创建用户需要更改数据库中的任何用户。您可以向证书派生的登录名授予ALTER ANY LOGIN,但要在数据库中创建用户,还需要服务器级别的权限(因为您无法做到这一点)