web-dev-qa-db-ja.com

偽装ユーザーまたは証明書にマップされたログイン

データベースに作成された証明書があると仮定します

create certificate certName
    with subject = 'subj';
GO

そして、この証明書にマッピングされたユーザー

create user userName
    from certificate certName;
GO

このユーザーに直接なりすまそうとしています

execute as user = 'userName';
GO

または、モジュールのexecute as句でユーザーを指定する

create procedure procName
with execute as 'userName'
as
    set nocount on;
GO

エラーを返します

メッセージ15517、レベル16、状態1 ...
プリンシパル「userName」が存在しないか、このタイプのプリンシパルが偽装できないか、または権限がないため、データベースプリンシパルとして実行できません。

ただし、ドキュメントで言及されているこの制限を見つけることができませんでした( ここ および ここ )。

user_nameは現在のデータベースに存在している必要があり、シングルトンアカウントである必要があります。 user_nameは、グループ、ロール、証明書、キー、またはビルトインアカウント(NT AUTHORITY\LocalService、NT AUTHORITY\NetworkService、NT AUTHORITY\LocalSystemなど)にすることはできません。

証明書にマップされたユーザー(またはログイン)を偽装することは可能ですか?

4
i-one

証明書と非対称キーから作成されたログインとユーザーは偽装できません。これらは、同じ証明書または非対称キーで署名されたモジュールに追加される一連の権限のプロキシにすぎません。

また、次の理由により、これらのログインとユーザーを偽装することはあまり意味がありません。

  1. これらのプロキシ権限は、セキュリティコンテキストを置き換えるではなく(署名済みの実行モジュールの)現在のセキュリティコンテキストに追加されます 、これは偽装が行うことです。これはまったく異なるアプローチであり、本質的に同じものに対する異なるメカニズムだけではありません。
  2. モジュール署名は、アドホッククエリ用ではありません。偽装よりもモジュール署名の方が安全なアプローチになる理由の1つは、昇格されたアクセス許可を付与する人が(モジュールに署名して追加のアクセス許可セットに関連付けることにより)、コードが何を行っているかを知っていることと、コードが与えられると、昇格されたアクセス許可を変更することはできません。たとえば、モジュールの署名を行う人が承認しないような何かを行うことはできません。これは、署名されたモジュールに変更が加えられたときにシグネチャが削除されることで処理され、モジュールのテキスト(CREATEステートメントのオプションのEXECUTE AS句を含む)を使用して作成されます。署名。テキストが変更されると、署名が一致しなくなります。

結局、非対称鍵と証明書から作成されたログインやユーザーを使用することで、偽装の必要性がなくなります。

それでも、より公式の指標を探している場合、 CREATE USER のMSDNページには次のように記載されています。

認証できないユーザーこれらのユーザーはSQL ServerまたはSQLデータベースにログインできません。

  • ログインしていないユーザー。ログインできませんが、権限を付与できます。 CREATE USER CustomApp WITHOUT LOGIN;
  • 証明書に基づくユーザー。ログインできませんが、権限を付与でき、モジュールに署名できます。 CREATE USER TestProcess FOR CERTIFICATE CarnationProduction50;
  • 非対称キーに基づくユーザー。ログインできませんが、権限を付与でき、モジュールに署名できます。 CREATE User TestProcess FROM ASYMMETRIC KEY PacificSales09;

ただし、ログイン/認証できないことは、「ログインできない」ユーザーがそのリストに含まれ、EXECUTE AS USER='{user_without_login}';を実行できることを前提として、「偽装できない」という意味ではありません。

CREATE LOGIN のMSDNページには、次のように記載されています。

証明書または非対称キーから作成されたログインは、コード署名にのみ使用されます。 SQL Serverへの接続には使用できません。

2番目の文はCREATE USERのドキュメントの内容を繰り返していますが、最初の文は少し具体的です。これらはコード署名専用です。

最後に、ドキュメント内で EXECUTE ASEXECUTE AS句 の両方について混乱しているように表現されていても、制限のステートメントは正しいです。彼らは述べています(太字の強調が追加されています):

nameはシングルトンアカウントである必要があり、グループ、ロール、certificate、key、またはNT AUTHORITY\LocalService、NT AUTHORITY\NetworkService、NT AUTHORITY\LocalSystemなどの組み込みアカウント。

その引用はEXECUTE ASのドキュメントから引用され、EXECUTE AS Clauseのドキュメント(ほぼ同じ表現)が質問で引用されています。これらのページではどちらも「証明書」と「キー」という用語を使用していますが、実際にはそれぞれ「証明書ベースのログイン/ユーザー」と「非対称キーベースのログイン/ユーザー」を意味しています。指定されたプリンシパルタイプのリストはすべてsys.server_principals(ログイン用)およびsys.database_principals(ユーザー用)にあり、証明書も非対称キーもどちらにもリストされないという事実に基づいて、これを想定しています。それらのシステムカタログビューの。

5
Solomon Rutzky