河端善博 ログ

RSS 開発、セキュリティ、日記

)
Please read my disclaimer.

一時ストアドプロシージャでの所有権の継承

一時ストアドプロシージャでの所有権の継承について、
Books Online に明確な表記がないようでしたので、
簡単にテストしてみました。
この件は、PASSJ セキュリティ分科会のML にもだしました

■概要
 ## で始まる一時ストアドプロシージャでは、
 所有権の継承は行われない

■テスト
 SQL Server 2000 SP3a
Windows 2000 Server

■内容
 ストアドプロシージャは、通常、所有権の継承が行われます。
 しかし、##test のように ## で、始まる名前をもつ
 一時ストアドプロシージャは、継承されていませんでした。

 例:
 ログイン sa で接続して、
create procedure ##t
as
select top 1 * from pubs.dbo.titles
go
とします。
 次にログイン userA を作成したあと、
 pubs にユーザー userA を追加し、
 titles テーブルへのアクセスを拒否します。
exec sp_addlogin 'UserA', 'password', 'pubs'
use pubs
exec sp_grantdbaccess 'UserA'
deny select on titles to [UserA]
次に、UserA でデータベースに接続し、##t を実行します。
exec ##t
 すると、次のエラーになります。
 「SELECT 権限は、オブジェクト 'titles'、
  データベース 'pubs'、所有者 'dbo' にありません。」
 テスト終了後、ログイン,ユーザーを削除します
exec sp_revokedbaccess 'UserA'
exec sp_droplogin 'UserA'
■背景
 ## で始まる一時ストアドプロシージャは、
 どのログインからでも呼び出すことができます。
 さらに、特定のログインやユーザーにのみ、実行を
 許可したり、拒否する機能がありません。
 したがって、このようなストアドプロシージャの実装時には、
 各自が適切なユーザーからのみ呼び出せるようにする
 必要があるのではないかと考えました

 たとえば、SYSTEM_USER を評価して、適切なログインのみ
 実行を許可するという方法です。

 例:
 
create procedure ##t2
as
SELECT SYSTEM_USER
IF SYSTEM_USER <> 'DOMAIN\UserP'
  RETURN

SELECT 'OK'
go

exec ##t2
 今回、所有権の継承が行われていないことが
 確認できましたので、特にこのような実装は必要ないかと
 思います。

※もしかしたら、継承させる方法があるのかもしれませんが。
※継承できないのは、それはそれで、使いにくい場合もあるかも。

10/08/2003 5:0 AM | Add Comment | #SQL Server #Security


Subscribe to my RSS feed.

Powered by BlogX