web-dev-qa-db-ja.com

SQL Serverの偽装

この質問は、Microsoft SQL Serverの偽装についてです。特定のログインに対する偽装権限がある場合、いつでも簡単にそのログインを偽装でき、EXECUTE AS OWNERを使用したスト​​アドプロシージャを使用する必要がないことを知りたいです。その場合、EXECUTE ASを使用したスト​​アドプロシージャの目的は何ですか?

4
Zeshan Mujtaba

すばらしい質問です。はい、LoginA(またはUserA)がLoginB(またはUserB)でIMPERSONATEを付与されている場合、LoginA(またはUserA)は EXECUTE ASstatementを実行できます。 = いつでもなし制限:

EXECUTE AS LOGIN = 'LoginB';

または

EXECUTE AS USER = 'UserB';

では、EXECUTE ASを使用したスト​​アドプロシージャの目的は何ですか。

EXECUTE ASclauseCREATE {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 ASclauseは、別のユーザー(データベースレベルのみ)を偽装することしかできません。別のログイン(インスタンスレベル)を偽装することはできません。この制限により、多くの人がTRUSTWORTHYを有効にして、偽装されているユーザーの同じSIDに一致するログインが一時的に追加の権限を付与できるようになります。しかし、これは非常に危険です。そのため、一時的に権限を昇格させるための理想的な(そしてはるかに優れた)メカニズムは Module Signing です。

なりすまし、およびTRUSTWORTHY ONとクロスDB所有権の連鎖が不適切である理由の詳細、およびモジュール署名がどのように/なぜ優れているかについては、以下を参照してください。

お願い、なりすまし、信頼、クロスDB所有権の連鎖の使用を停止してください

3
Solomon Rutzky