4

私がMSSQLServerの何よりも常に嫌っていたのは、セキュリティの仕組みです。サーバーを面白く見ると、セキュリティコンテキストは常に切り替わり、予測やデバッグが非常に難しいことがよくあります(とにかく私にとっては)。

しかし、今日の問題に対処する際に、「このコードの実行時にSQLServerが使用しているセキュリティコンテキストを表示する行をコードに追加できればいいのにと思います。」そのようなコマンドは存在しますか?例えば、SELECT security_context()

もう少し明確にするために...私がストアドプロシージャを使用していて、そのためにSPの所有者のセキュリティコンテキストの対象である場合は、それを確認したいと思います。sp_executesqlによって呼び出されたコードを使用していて、セキュリティがSQL Serverサービスアカウントのコンテキスト下にある場合は、それを確認したいと思います。

少なくとも、SQLServerが何かにアクセスするべきではないと考える理由を理解できるかもしれません。

ありがとう!


-- Set up
CREATE USER Test_User WITHOUT LOGIN
CREATE TABLE Test_Security_Context (my_id INT)
INSERT INTO Test_Security_Context VALUES (1)
DENY SELECT ON Test_Security_Context TO Test_User
GO
CREATE PROCEDURE Test_Security_Context_SP
AS
  SELECT SUSER_SNAME()
  SELECT * FROM Test_Security_Context  -- This will return ok
  EXEC('SELECT SUSER_SNAME(); SELECT * FROM Test_Security_Context')  -- SUSER_SNAME() will match above but select fails
GO
GRANT EXECUTE ON Test_Security_Context_SP TO Test_User
GO

-- Switch to the new user
SETUSER 'Test_User'
GO

-- Do the test
EXEC Test_Security_Context_SP
GO

-- Clean up
SETUSER
DROP PROCEDURE Test_Security_Context_SP
DROP TABLE Test_Security_Context
DROP USER Test_User
GO
4

3 に答える 3

4

はい、EXECUTE ASやコード署名などのすべての詳細を考慮して、現在のセキュリティコンテキストを表すこのようなビューのペアがあります。

取得するすべてのアクセスは、最終的にこれらの結果の結果の行から派生します。一部のアクセスは、ハードコードされたロールメンバーシップ(db_datareaderデータベースロールやsysadminサーバーロールなど)から暗黙的に行われることに注意してください。

それ以外:

  • ownership chaining is not related to security context: you are not under the 'context' of the SP owner. Ownership chaining simply states that access checks are skipped for objects owned by the same owner as current object (SP, View).
  • sp_executesql does not change the security context in any way
于 2010-08-02T23:07:48.367 に答える
2

これがセキュリティコンテキストの意味であるかどうかはわかりませんが、次のようにセッションに関連付けられているユーザーを取得できます。

select SYSTEM_USER

これは、SQLServerログインまたはWindowsログインの両方で機能します。。を使用したスト​​アドプロシージャ内でも機能しexecute as ownerます。例えば、

create procedure dbo.Test
with execute as owner
as
select SYSTEM_USER
go
exec dbo.Test
select SYSTEM_USER

プリント:

sa
MyMachine\MyName

SQL Serverがユーザーに代わって処理を実行するために使用しているWindowsアカウントを探している場合はwhoami、次のようなコマンドから実行してみてください。

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE

EXEC master..xp_cmdshell 'whoami'

私にとって、それはを返しますnt authority\network service

于 2010-08-02T21:02:09.787 に答える
1

CURRENT_USER現在のセキュリティコンテキストを確認するために使用したいと思います。次に例を示します。

SELECT CURRENT_USER AS 'Current User Name';
GO
EXECUTE AS LOGIN = 'junk'
GO
SELECT CURRENT_USER AS 'Current User Name';
GO
REVERT
SELECT CURRENT_USER AS 'Current User Name';
GO

出力付き(注:このためにSQL Serverの管理者です)

Current User Name
------------------
dbo

(1 row(s) affected)

Current User Name
------------------
Junk

(1 row(s) affected)

Current User Name
------------------
dbo

(1 row(s) affected)
于 2010-08-02T22:12:10.297 に答える