SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

サーバーレベルの権限を必要とする操作を一般ユーザーで実施する

leave a comment

運用方法によるかと思いますが、一般ユーザーで「sp_configure」を実行したい場合などの対応として。

Cannot create login in stored procedure with EXECUTE AS OWNER?
の対応と近い内容です。

一般ユーザーで sp_configure を実行するために、sysadmin のログインで、master データベースに対して、以下のようなストアドを作成して、その後一般ユーザーで実行させてみます。

CREATE PROCEDURE set_configuration
	@parametername nvarchar(255),
	@parametervalue int
WITH EXECUTE AS OWNER
AS
BEGIN
	EXECUTE sp_configure @parametername, @parametervalue
END
GO

GRANT EXECUTE ON OBJECT::dbo.set_configuration TO TestUser

 

「TestUser」は、一般ユーザーなのですが、このユーザーで以下のクエリを実行してもエラーとなります。

EXEC set_configuration 'show advanced options', 0

メッセージ 15247、レベル 16、状態 1、プロシージャ sp_configure、行 106

ユーザーにはこの操作を実行する権限がありません。

 

これですが、冒頭で紹介した stackoverflow の以下の記述に合致しているためですね。

A login is a server level object and therefore requires server level permissions. EXECUTE AS <database-user> is a database-scoped security context.

 

sp_configure のような操作は、データベースレベルではなく、サーバーレベルのパーミッションでの制御となります。

パーミッションについては、SQL Server Database Engine Permission Posters が参考になります。

一般ユーザーで sp_configure を実行したい場合は、

モジュール署名 (データベース エンジン)

チュートリアル:証明書を使用したストアド プロシージャへの署名

の情報を参考にするとよいかと。

ストアドプロシージャを介して実行させるために、


CREATE PROCEDURE set_configuration
	@parametername nvarchar(255),
	@parametervalue int
-- WITH EXECUTE AS OWNER は不要 (つけると動作しない)
AS
BEGIN
	EXECUTE sp_configure @parametername, @parametervalue
END
GO

GRANT EXECUTE ON OBJECT::dbo.set_configuration TO TestUser
GO

CREATE CERTIFICATE ImpersonateCert
   ENCRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y'
      WITH SUBJECT = 'Impersonate Access', 
      EXPIRY_DATE = '12/05/2100'
GO

ADD SIGNATURE TO set_configuration 
   BY CERTIFICATE ImpersonateCert
    WITH PASSWORD = 'pGFD4bb925DGvbd2439587y'
GO

CREATE LOGIN ImpersonateLogin FROM CERTIFICATE ImpersonateCert
GO

GRANT ALTER SETTINGS TO ImpersonateLogin
GO

のようなクエリを使用して、ストアドに署名をして、権限偽装のような形で実行させると良いのかと。

Written by masayuki.ozawa

4月 28th, 2016 at 10:17 pm

Posted in SQL Server

Tagged with

Leave a Reply

*