SQL Server でのストアド プロシージャの署名 (ADO.NET)
SQL Server 2005 以降では、証明書や非対称キーを使ってストアド プロシージャに署名することができます。 この機能は、動的 SQL などのように、組み合わせ所有権によって権限を継承できない場合や、組み合わせ所有権が壊れている場合を想定して用意されています。 証明書に割り当てられたユーザーを作成し、その証明書ユーザーにストアド プロシージャがアクセスする必要があるオブジェクトへの権限を与えることができます。
ストアド プロシージャが実行されると、証明書ユーザーの権限が呼び出し元の権限と組み合わされます。 EXECUTE AS 句とは異なり、プロシージャの実行コンテキストは変更されません。 ログイン名とユーザー名を返す組み込み関数を実行すると、証明書ユーザーの名前ではなく、呼び出し元の名前が返されます。
デジタル署名は、署名者の秘密キーで暗号化されたデータ ダイジェストです。 秘密キーにより、デジタル署名がその保持者または所有者に固有であることが保証されます。 ストアド プロシージャ、関数、またはトリガーに署名することができます。
メモ |
---|
マスター データベースに証明書を作成することで、サーバー レベルの権限を許可できます。 |
証明書の作成
証明書を使用してストアド プロシージャに署名すると、ストアド プロシージャのコードの暗号化ハッシュで構成されたデータ ダイジェストが秘密キーを使用して作成されます。 実行時に、このデータ ダイジェストが公開キーを使用して復号化され、ストアド プロシージャのハッシュ値と比較されます。 ストアド プロシージャに変更が加えられるとハッシュ値が無効になり、デジタル署名が一致しなくなります。 これによって、秘密キーにアクセスできない人物によってストアド プロシージャのコードが変更されることを防ぎます。 そのため、プロシージャを変更するたびに署名し直す必要があります。
モジュールへの署名は、次の 4 つの手順で行います。
Transact-SQL ステートメント CREATE CERTIFICATE [certificateName] を使用して、証明書を作成します。 このステートメントには、開始日、終了日、パスワードを設定するためのオプションがあります。 既定の有効期限は 1 年間です。
Transact-SQL ステートメント CREATE USER [userName] FROM CERTIFICATE [certificateName] を使用して、証明書に関連付けられたデータベース ユーザーを作成します。 このユーザーはデータベース内のみに存在し、ログインには関連付けられません。
証明書ユーザーに、データベース オブジェクトに対して必要な権限を与えます。
メモ |
---|
証明書では、DENY ステートメントを使用して権限が取り消されているユーザーに権限を与えることはできません。DENY は常に GRANT よりも優先されるため、証明書ユーザーに許可された権限を呼び出し元が継承することはできません。 |
- Transact-SQL ステートメント ADD SIGNATURE TO [procedureName] BY CERTIFICATE [certificateName] を使用して、証明書によってプロシージャに署名します。
外部リソース
詳細については、次のリソースを参照してください。
リソース |
説明 |
---|---|
モジュール署名 (SQL Server 2008 オンライン ブック) |
モジュールの署名について説明し、サンプル シナリオと、関連する Transact-SQL のトピックへのリンクを示します。 |
モジュール署名 (SQL Server 2005 オンライン ブック) |
モジュールの署名について説明し、サンプル シナリオと、関連する Transact-SQL のトピックへのリンクを示します。 |
証明書を使用したストアド プロシージャへの署名 (SQL Server 2005 オンライン ブック) |
証明書を使用したストアド プロシージャの署名のチュートリアルです。 |
参照
概念
SQL Server におけるアプリケーション セキュリティのシナリオ (ADO.NET)
SQL Server でのストアド プロシージャを使用した権限の管理 (ADO.NET)
SQL Server での安全な動的 SQL の作成 (ADO.NET)
SQL Server での借用を使用した権限のカスタマイズ (ADO.NET)