비 sysadmin 도메인 사용자가 소유 한 SQL 에이전트 작업에서 SSIS 패키지 실행


16

대규모 SSIS 배포의 일부로 아무런 문제없이 SQL Server 에이전트를 통해 밤새 예약 된 두 개의 SSIS 패키지가 있습니다. 모든 것이 Windows 인증을 사용하고 있으며 예약 된 작업은 sysadmin (자신의 저)이 소유 하고 SQL Server 에이전트 서비스 계정 으로 실행됩니다 .

따라서 데이터는 기본적으로 source system ~> transit db ~> staging ~> NDS밤새 진행 됩니다.

내가 관심을 갖는 두 가지 SSIS 패키지 는 특정 데이터 집합에 대해 각각 transit db ~> stagingstaging ~> NDS부분을 처리합니다 .

도메인 사용자 (sysadmin이 아닌 사람)는에 무언가를 수행 source system하고 흥미로운 데이터를에 밀어 넣습니다 transit db. 따라서 근무 시간 동안 업데이트 된 데이터를 가져와 업데이트 할 수있는 방법이 필요합니다 NDS.이 사람이 가장 간단한 방법은 ETL은 매크로 사용 Excel 통합 문서의 단추를 클릭하여 ODBC를 통해 SQL Server에 연결하고 (Windows 인증 사용) 저장 프로 시저를 실행합니다.

저장 프로시 저는 다음과 같습니다.

create procedure dbo.UpdateMaterialInventory
as
begin
    execute msdb.dbo.UpdateMaterialInventory;
end

[msdb]의 "자매"저장 프로시 저는 다음과 같습니다.

create procedure dbo.UpdateMaterialInventory
with execute as 'SqlAgentProxy'
as
begin
    execute msdb.dbo.sp_start_job N'NDS-ManualMaterialInventory';
end

이 [SqlAgentProxy] 사용자는 executeUpdateMaterialInventory절차에 대한 권한을 부여한 도메인 사용자의 로그인을 통해 [msdb]에서 만든 Windows 사용자 입니다. 이렇게하면에 도메인 사용자 execute권한 을 부여 msdb.dbo.sp_start_job할 필요가 없습니다.

SQL 에이전트 작업 NDS-ManualMaterialInventory은 도메인 사용자가 소유하며 각각 [SQL Server Integration Services 패키지] 유형의 두 단계가 다음으로 실행으로 설정 됩니다SSISProxy .

SSISProxy자격 증명 이름을 사용하여 [SQL Server Integration Services 패키지] 하위 시스템에 매핑 된 SQL Server 에이전트 프록시입니다 SSISProxyCredentials. 도메인 사용자의 로그인이 프록시 계정 사용자 에 추가되었습니다 .

이 시스템 SSISProxyCredentials은 전체 SSIS ETL을 밤새 실행하는 동일한 도메인 사용자 의 ID 로 생성 되었으며 암호는 4 배로 확인되었습니다.

이제 이것을 실행하면 :

execute as login=N'DOMAIN\thatperson'
exec NDS.dbo.UpdateMaterialInventory;
go

나는이 출력을 얻는다 :

Job 'NDS-ManualMaterialInventory' started successfully.

그러나 직업 역사는 훨씬 덜 고무적인 이야기를하고 있습니다.

The job failed.  The Job was invoked by User DOMAIN\thatperson.
The last step to run was step 1 (Extract).

그리고 1 단계 세부 사항 :

Executed as user: {domain user that runs SSIS ETL overnight}.
Microsoft (R) SQL Server Execute Package Utility  Version 12.0.4100.1 for 64-bit
Copyright (C) Microsoft Corporation. All rights reserved.
Started:  2:18:50 PM  Failed to execute IS server package because of error 0x80131904.
Server: {server name}, Package path: \SSISDB\Foo\Bar\foobar.dtsx, Environment reference Id: NULL.
Description: Login failed for user '{domain user that runs SSIS ETL overnight}'.
Source: .Net SqlClient Data Provider 
Started:  2:18:50 PM  Finished: 2:18:51 PM  Elapsed:  0.094 seconds.
The package execution failed.
The step failed.

작업이 실패하고 어디에도 기록되지 않습니다.

작업 소유자를 본인으로 변경하고 SQL Server 에이전트 서비스 계정 으로 단계 실행을 변경하면 작업이 실행되고 1,067 개의 행이 [Metadata]. [dbo]. [sysssislog]에 기록됩니다.

프록시 / 자격 증명 설정 방법에 올바르지 않은 것이있는 것 같습니다. 내가 뭘 잘못하고 있니?

답변:


18

문제가 원래보다 더 복잡해 보입니다. SQL 2014를 사용하고 있으므로 2012 년에 도입 된 새로운 보안 기능에 물렸을 것입니다.

실제로 중요한 것은 :

Server: {server name}, Package path: \SSISDB\Foo\Bar\foobar.dtsx, Environment reference Id: NULL.   
Description: Login failed for user '{domain user that runs SSIS ETL overnight}'.

프록시 사용자의 로그인은 SSISDB 카탈로그에 대한 액세스 권한이 없을 가능성이 높습니다 (SQL Server에 대한 액세스 권한이 있더라도).
당신은 SSISDB 사용자에게 로그인을 매핑해야 하고 SSISDB 폴더 / 통합 서비스 프로젝트에 구성 액세스 할 수 있습니다.

이 MSDN 블로그 게시물 SSIS 카탈로그 액세스 제어 팁SQL 2012 SSIS 카탈로그 권한을 살펴보십시오.

패키지를 실제로로드하면 다른 보안 컨텍스트 문제가 발생할 수 있지만 통합 서비스 자체에서 더 나은 로깅을 얻을 수 있습니다.


3
정확히 이것입니다. 주셔서 감사 위 넘어 :-)
마티유 Guindon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.