web-dev-qa-db-ja.com

EXECUTE ASでのsysadminロールの使用

_EXECUTE AS OWNER_句をプロシージャの一部として使用して、そのプロシージャの本体を別のユーザーとして実行できることは私の理解です。私の目標は、sysadminロール(DBCC TRACEON(1224))を必要とするコマンドを実行することです。このプロシージャは、権限のないユーザーによって呼び出されることになっています。

saユーザーの下で次のスクリプトを実行しました。

_SELECT USER_NAME(), USER_ID(), IsSysAdmin = IS_SRVROLEMEMBER('sysadmin')
-- dbo  1   1

IF EXISTS(SELECT * FROM sys.procedures WHERE name = 'MyProc')
    DROP PROCEDURE MyProc

GO
CREATE PROCEDURE MyProc
WITH EXECUTE AS OWNER
AS 
    SELECT USER_NAME(), USER_ID(), IsSysAdmin = IS_SRVROLEMEMBER('sysadmin');
-- dbo  1   0

    DBCC TRACEON(1224)
--Msg 2571, Level 14, State 3, Procedure MyProc, Line 7
--User 'dbo' does not have permission to run DBCC TRACEON.

RETURN
GO

EXEC MyProc
_

出力はコメントのインラインです。プロシージャの外では、sysadminメンバーシップを持っているように見えますが、プロシージャの内部ではないことがわかりました。

プロシージャはdboユーザーが所有しています。データベースユーザーにsysadminロールを付与することはできないことを理解しています(少なくともGUIはこの可能性を提供していません)。そのため、データベースユーザーにサーバーの役割を持たせる方法がわかりません。

_EXECUTE AS 'sa'_も試してみたところ、結果は_Cannot execute as the user 'sa', because it does not exist or you do not have permission._になりました。 documentation は、ログイン名ではなく、ユーザー名のみを指定できることを示しています。それがうまくいかなかった理由を理解しています。

sysadminロールメンバーシップでプロシージャを実行するにはどうすればよいですか?

7
usr

それはできますが、一般的にはかなり危険だと考えられています。非常に基本的なレベルでは、データベースにtrustworthyフラグを設定し、次に使用するときにexecute as sp上では、サーバーレベルのプリンシパルセキュリティアクセスを利用できます。

これは非常に危険なので、ここでは詳しく説明しません。しかし、私はそれについてブログを書いています ここ それを行う方法についての具体的な指示があります。

言われていることはすべて、あなたが絶対にNEEDこの方法でそれを行うことを非常に確実にします。あなたは大きなセキュリティホールを開いています。実行する場合は、SPを独自のデータベースに配置し、spへの接続と実行のアクセス権のみをユーザーに付与します。

5
Kenneth Fisher

私の目標は、sysadminロールを必要とするコマンドを実行することです(DBCC TRACEON(1224))

非特権ユーザーがsysadminロールとして実行できるようにすることで、セキュリティに穴を開けています。

ロック数に基づいてロックのエスカレーションを無効にする_1224_トレースフラグを設定しようとしている場合は、_ALTER TABLE_を使用してテーブルレベルで設定できます。

例えば以下では、パーティションテーブルのパーティションレベルへのロックエスカレーションを有効にします。テーブルが分割されていない場合、ロックのエスカレーションはTABLEレベルで設定されます。

ALTER TABLE dbo.T1 SET (LOCK_ESCALATION = AUTO);-有効なオプションは、AUTO、TABLE、およびDISABLEです。

これで、権限のないユーザーにテーブルの変更権限を与えることができます。

HTH

6
Kin Shah

SQL Serverエージェントジョブ(sysadminメンバーが所有)を作成するとうまくいきますが、これはあまりきれいな解決策ではないことがわかりました。

ユーザーはmsdb.dbo.sp_start_jobを使用してジョブを(非同期で)開始できます。ただし、エージェントジョブを同期的に実行するには、これが必要な場合、さらに数行のコードが必要です。また、明らかに、SQL Serverエージェントサービスを起動して実行する必要があります。

0