この質問は、Microsoft SQL Serverの偽装についてです。特定のログインに対する偽装権限がある場合、いつでも簡単にそのログインを偽装でき、EXECUTE AS OWNER
を使用したストアドプロシージャを使用する必要がないことを知りたいです。その場合、EXECUTE AS
を使用したストアドプロシージャの目的は何ですか?
すばらしい質問です。はい、LoginA(またはUserA)がLoginB(またはUserB)でIMPERSONATE
を付与されている場合、LoginA(またはUserA)は EXECUTE AS
statementを実行できます。 = いつでもなし制限:
EXECUTE AS LOGIN = 'LoginB';
または
EXECUTE AS USER = 'UserB';
では、EXECUTE ASを使用したストアドプロシージャの目的は何ですか。
EXECUTE AS
clause (CREATE {module}
ステートメントの一部)の目的は一時的付与することですそのIMPERSONATE
権限は、そのモジュールのコンテキストでのみです。これにより、IMPERSONATE
を明示的に付与する必要がなくなります。違いは、EXECUTE AS {SomeUser}
のあるモジュールのコンテキストの外では、そのモジュールを実行している人は誰でも、そのユーザーになりすますことができないはずです。ログイン/ユーザーがいつでも他人になりすますことができるようにしたくない。これはセキュリティ上のリスクです。 EXECUTE AS
句を使用すると、プリンシパルに別のユーザーを偽装させることができますのみあなた必要な場合しない =ときthey自分で試してみてください(昇格されたアクセス許可で彼らが行うことを制限することはできません)。したがって、実際にはEXECUTE AS
句が必要であり、notは誰にでもIMPERSONATE
を付与したいと考えます(回避できる場合、可能性が高い場合) 。
例:TRUNCATE TABLE
権限がありません。誰かが特定のテーブルを切り捨てることができるようにしたい場合は(それを実行する権限があるため、所有していない)、IMPERSONATE
に対してdbo
を付与できます。ただし、その場合、アクションをTRUNCATE TABLE
の発行のみに制限し、その特定のテーブルのみに制限する方法はありません。そのユーザーは、いつでもEXECUTE AS USER = 'dbo';
を実行して、必要なことをすべて実行できます。ただし、EXECUTE AS 'dbo'
をCREATE PROCEDURE .... AS TRUNCATE TABLE {TableName};
ステートメントに追加すると、そのモジュールを実行する人はだれでもdbo
を偽装しますが、ここでは特定のテーブルを切り捨てるだけの、そのモジュールのアクションについてのみです。
もちろん、CREATE
ステートメントのEXECUTE AS
clauseは、別のユーザー(データベースレベルのみ)を偽装することしかできません。別のログイン(インスタンスレベル)を偽装することはできません。この制限により、多くの人がTRUSTWORTHY
を有効にして、偽装されているユーザーの同じSIDに一致するログインが一時的に追加の権限を付与できるようになります。しかし、これは非常に危険です。そのため、一時的に権限を昇格させるための理想的な(そしてはるかに優れた)メカニズムは Module Signing です。
なりすまし、およびTRUSTWORTHY ON
とクロスDB所有権の連鎖が不適切である理由の詳細、およびモジュール署名がどのように/なぜ優れているかについては、以下を参照してください。