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

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

Share

Written by Masayuki.Ozawa

4月 28th, 2016 at 10:17 pm

Posted in SQL Server

Tagged with

Leave a Reply