web-dev-qa-db-ja.com

sysadmin以外のドメインユーザーが所有するSQLエージェントジョブからSSISパッケージを実行する

問題なく、大規模なSSIS展開の一部として(SQL Serverエージェントを介して)夜間にスケジュールされて実行される2つのSSISパッケージがあります。すべてがWindows認証を使用しており、スケジュールされたジョブはsysadmin(まあ、私)とrun as SQL Serverエージェントサービスアカウントが所有しています。

したがって、データは基本的にsource system ~> transit db ~> staging ~> NDSに一晩で行きます。

私が気にする2つのSSISパッケージは、特定のデータセットのtransit db ~> stagingstaging ~> NDSの部分をそれぞれ処理します。

ドメインユーザー(sysadmin以外)がsource systemで何かを行うと、興味深いデータがtransit dbにプッシュされるため、勤務時間中にこの更新されたデータをフェッチしてNDS:このETLをトリガーする最も簡単な方法は、ODBCを使用してSQL Serverに接続する、マクロが有効なExcelブックのボタンをクリックすることでした。 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]ユーザーは、ドメインユーザーのログインから[msdb]で作成したWindowsユーザーで、このexecuteプロシージャにUpdateMaterialInventory権限を付与しました。これにより、ドメインユーザーにexecute権限をmsdb.dbo.sp_start_jobに付与する必要がなくなります。

SQLエージェントジョブNDS-ManualMaterialInventoryはドメインユーザーが所有し、[SQL Server Integration Services Package]タイプの2つのステップがあり、それぞれRun asSSISProxyに設定されています。

SSISProxyは、資格情報名SSISProxyCredentialsを使用して[SQL Server Integration Services Package]サブシステムにマップされるSQL Serverエージェントプロキシです。ドメインユーザーのログインがプロキシアカウントプリンシパルに追加されました。

SSISProxyCredentialsは、SSIS ETL全体を一晩実行しているのと同じドメインユーザーのIdentityを使用して作成され、そのパスワードは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.

ジョブは失敗し、何もログに記録されません。

ジョブの所有者を自分に変更し、ステップのrun asをSQL Serverエージェントサービスアカウントに変更すると、ジョブが実行され、成功し、1,067行が[Metadata]。[dbo]に記録されます。 。[sysssislog]。

プロキシ/認証情報の設定方法に問題があるようです。どの部分が間違っているのですか?

15
Mathieu Guindon

問題は実際よりも複雑に見えます。 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サーバーへのアクセス権がある場合でも)。
ログインをSSISDBユーザーにマップし、Integration ServicesのSSISDBフォルダー/プロジェクトへのアクセスを構成する必要があります。

このMSDNブログの投稿 SSISカタログアクセス制御のヒント および SQL 2012 SSISカタログのアクセス許可 をご覧ください。

パッケージが実際にロードされると、他のセキュリティコンテキストの問題が発生する可能性がありますが、統合サービス自体からより良いロギングを取得する必要があります。