4

別のデータベースで作成されているオブジェクトに基づいて、あるデータベースにオブジェクトを作成する必要があるシステムを使用しています。オブジェクトは複製ではないため、オブジェクトを単純に複製することはできません。

私がやろうとしていることの簡単なデモンストレーションを提供する以下のコードがあります。ステートメントのコメントを外すと、ALTER DATABASEエラーなしで実行されます。しかし、それはセキュリティホールを作る可能性があるので、できれば避けたいと思っています。

証明書と偽装を使用してみましたが、何も機能していないようです。ユーザー対ログインに関しては、DDLトリガーは多くのセキュリティを無視していると思います。また、Test_DB_1 の SP を呼び出す Test_DB_2 にストアド プロシージャを作成し、代わりにそのストアド プロシージャをトリガーで呼び出すことも試みましたが、どちらも役に立ちませんでした。

したがって、あなたの挑戦は、あなたがそれを受け入れても構わないと思っているなら、TRUSTWORTHY ON を設定せずに (または、効果がある場合は db chaining をオンにせずに) 以下のコードを動作させることです。

あなたが与えることができる助けをありがとう!

/************************
   SET-UP THE TEST
************************/
USE master
GO
CREATE LOGIN Test_Security_Login WITH PASSWORD = 'p@ssw0rd1!'
CREATE DATABASE Test_DB_1
CREATE DATABASE Test_DB_2
GO
USE Test_DB_1
GO
CREATE PROCEDURE dbo.Create_View
AS
BEGIN
 EXEC('CREATE VIEW Test_View AS SELECT 1 AS one')
END
GO
CREATE USER Test_Security_User FOR LOGIN Test_Security_Login
GRANT EXECUTE ON dbo.Create_View TO Test_Security_User
GO
USE Test_DB_2
GO
CREATE TRIGGER DDL_TRIGGER ON DATABASE WITH EXECUTE AS 'dbo' FOR DDL_VIEW_EVENTS
AS
BEGIN
 EXEC Test_DB_1.dbo.Create_View
END
GO
CREATE USER Test_Security_User FOR LOGIN Test_Security_Login
EXEC sp_addrolemember 'db_ddladmin', 'Test_Security_User'

/************************
   RUN THE TEST
************************/
USE Test_DB_2
GO
--ALTER DATABASE Test_DB_1 SET TRUSTWORTHY ON
--ALTER DATABASE Test_DB_2 SET TRUSTWORTHY ON
EXECUTE AS USER = 'Test_Security_User'
GO
CREATE VIEW dbo.Test_View_2 AS SELECT 2 AS two
GO
REVERT
GO

/************************
   CLEAN-UP
************************/
USE master
GO
DROP DATABASE Test_DB_1
DROP DATABASE Test_DB_2
DROP LOGIN Test_Security_Login
GO
4

1 に答える 1

7

簡単すぎる。コード署名を使用する:

  • db1 に自己署名証明書を作成する
  • 証明書でトリガーに署名する
  • 悪用を防ぐために秘密鍵を削除する
  • 証明書を db2 にエクスポート (ファイルからバックアップ/作成)
  • db2 の証明書から資格情報を作成する
  • AUTHENTICATE およびその他の必要なアクセス許可を、証明書から派生した資格情報に付与します
  • ?
  • 利益

これは防弾です。完全な例については、アクティブ化されたプロシージャーから別のデータベース内のプロシージャーを呼び出すを参照してください。

于 2010-08-16T17:17:09.910 に答える