1

この回答は次のように述べています。

両方のエンドポイントで同じ conversation_id があります。

また、各エンドポイントで異なる必要がある conversation_handle があります。

そのため、会話の各エンドポイントで監査テーブルに conversation_id を書き込むと、トラブルシューティングに役立つと考えました。そうすれば、特定の会話の各エンドポイントで監査情報を簡単に追跡できます。

問題は、conversation_id をどこから取得するかです。私は当初、sys.conversation_endpoints から、送受信したばかりのメッセージの conversation_handle を検索できると考えていました。ただし、メッセージを送受信するデータベース ユーザーには、sys.conversation_endpoints のメタデータを表示する権限がありません。

メッセージを送受信するユーザーをデータベース所有者にすることでこれを回避できますが、セキュリティ上の理由からそうしないことをお勧めします。sys.conversation_endpoints のレコードを表示するために最低限必要なアクセス許可は何ですか? あるいは、送信または受信したばかりのメッセージの conversation_id を読み取るにはどうすればよいでしょうか (dbo または sysadmin 権限を持たない、送信または受信を行うコードから)。

編集:メタデータの可視性の構成に関するBooks Online の記事を読みました。

メタデータの可視性は、ユーザーが所有しているか、ユーザーが何らかの権限を付与されているセキュリティ保護可能なものに限定されます

sys.tables や sys.procedures などのカタログ ビューの場合、ユーザーにアクセス許可を付与する必要があるセキュリティ保護可能な要素は明らかです。しかし、sys.conversation_endpoints: 会話、会話エンドポイントにリストされているセキュリティ保護可能なものは何ですか? そして、どのようにアクセス許可を付与しますか? ユーザーは既にダイアログを開始したり会話を終了したりする権限を持っているので、会話に対する適切な権限が既にあると思っていたでしょう。

4

1 に答える 1

2

から入手するのが最適sys.conversation_endpointsです。

アプリケーションが現在のユーザーが保持していない特権を必要とするという問題に直面した場合、最善の選択肢はコード署名を利用することです。SQL Server では、管理者は証明書を使用してストアド プロシージャを検査および署名し、署名にアクセス許可を付与できます。これにより、ユーザーはプロシージャを呼び出すことができ、プロシージャはユーザーが直接アクセスできない情報にアクセスできます。

例については、 Activated Procedure への署名を参照してください。

自分の会話が表示されない理由については、バグです。実行sp_helptext 'sys.conversation_endpoints'すると、適用されたアクセス許可フィルターが表示されます。

 CREATE VIEW sys.conversation_endpoints AS
SELECT ce.conversation_handle,
    ...
    FROM sys.conversation_endpoints$ ce
LEFT JOIN sys.syssingleobjrefs f 
      ON f.depid = ce.service_id 
      AND f.class = 21 
      AND f.depsubid = 0 -- SRC_SVCTOQUEUE
WHERE has_access('CO', f.indepid) = 1

syssingleobjrefsビューには、ダイアログが属するサービスのキューに対する CONTROL アクセス権をユーザーが持っている会話が表示されます (ビューの状態が何であるかを理解するには、ある程度のノウハウが必要ですが、それが何に変換されるかを理解する必要があります)。//このサービスのメッセージにRECEIVE必要なパーミッションであるため、パーミッションチェックはパーミッションに対して行う必要があります。BEGIN DIALOGSENDEND

ダイアログを開始するには、現在のユーザーは、コマンドの FROM 句で指定されたサービスのキューに対する RECEIVE 権限と、
指定されたコントラクトに対する REFERENCES 権限を持っている必要があり ます メッセージを送信するには、現在のユーザーはすべてのキューで RECEIVE 権限を持っている必要がありますメッセージを送信するサービス。

MSND は、END CONVERSATION「アクティブな会話を終了するには、現在のユーザーが会話の所有者であるか、sysadmin 固定サーバー ロールのメンバーであるか、db_owner 固定データベース ロールのメンバーである必要があります」と述べているとき、アクセス許可のトピックに関して実際には間違っています。必要なパーミッションは for と同じですSEND(これは簡単にテストできます)。

セキュリティ保護可能なものを操作できる (そして、SEND、END が明らかに会話を操作している) 場合、操作されているセキュリティ保護可能なもののメタデータを確認できるはずであると簡単に主張できます。

于 2013-10-31T15:46:45.560 に答える