所有権の継承
複数のデータベース オブジェクトが連続して互いにアクセスしている場合、このシーケンスはチェーンと呼ばれます。このようなチェーンは単独では存在しませんが、SQL Server 2005 がチェーン内のリンクを移動する際に、構成要素であるオブジェクトに対する権限が、オブジェクトに個別にアクセスした場合とは異なる方法で評価されます。このような違いには、セキュリティを管理する上で重要な意味があります。
所有権の継承を使用すると、ビューなどの 1 つのオブジェクトに権限を設定することにより、複数のテーブルなどの複数のオブジェクトへのアクセスを管理できるようになります。権限チェックをスキップすることが可能なシナリオでは、わずかにパフォーマンスも向上します。
チェーン内での権限のチェック方法
チェーンを使用してオブジェクトにアクセスすると、SQL Server により、オブジェクトの所有者が呼び出し元オブジェクトの所有者と最初に比較されます。これはチェーン内の直前のリンクです。両方のオブジェクト所有者が同じであれば、参照されているオブジェクトに対する権限は評価されません。
所有権の継承の例
次の例では、July2003 ビューの所有者は Mary です。Mary はビューに対する権限を Alex に付与しました。Alex はこのインスタンス内のデータベース オブジェクトに対する他の権限は持っていません。Alex がビューを選択するとどうなるでしょうか。
- Alex が July2003 ビューに対して SELECT * を実行します。すると、SQL Server でビューに対する権限がチェックされ、Alex がビューに対する選択権限を持っていることが確認されます。
- July 2003 ビューでは、SalesXZ ビューの情報が必要です。SQL Server で SalesXZ ビューの所有権がチェックされます。このビューと呼び出し元のビュの所有者は同じ (Mary) であるため、SalesXZ に対する権限はチェックされません。必要な情報が返されます。
- SalesXZ ビューでは InvoicesXZ の情報が必要です。SQL Server で InvoicesXZ ビューの所有権がチェックされます。このビューは前のオブジェクトと所有者が同じなので、InvoicesXZ に対する権限はチェックされません。必要な情報が返されます。この時点では、シーケンス内のすべてのアイテムの所有者は 1 人 (Mary) です。これを、途切れていない所有権の継承といいます。
- InvoicesXZ ビューでは AcctAgeXZ の情報が必要です。SQL Server で AcctAgeXZ ビューの所有権がチェックされます。このビューの所有者は前のオブジェクトの所有者とは異なる (Mary ではなく Sam) ため、このビューに対する権限の完全な情報が取得されます。AcctAgeXZ ビューに Alex によるアクセスを許可する権限がある場合、情報が返されます。
- AcctAgeXZ ビューでは ExpenseXZ テーブルの情報が必要です。SQL Server で ExpenseXZ テーブルの所有権がチェックされます。このテーブルの所有者は前のオブジェクトの所有者とは異なる (Sam ではなく Joe) ため、このテーブルに対する権限の完全な情報が取得されます。ExpenseXZ テーブルに Alex によるアクセスを許可する権限がある場合、情報が返されます。
- July2003 ビューが ProjectionsXZ テーブルの情報を取得しようとすると、サーバーはまず、データベース 1 とデータベース 2 の間で複数データベースの組み合わせ所有権が有効化されているかどうかをチェックします。複数データベースの組み合わせ所有権が有効化されている場合は、ProjectionsXZ テーブルの所有権がサーバーでチェックされます。このテーブルの所有者は、呼び出し側のビューと同じ (Mary) なので、このテーブルの権限はチェックされません。要求した情報が返されます。
複数データベースの組み合わせ所有権
特定のデータベース間、または SQL Server の 1 つのインスタンス内のすべてのデータベース間で所有権の継承を許可するように SQL Server を構成できます。複数データベースの組み合わせ所有権は、既定では無効になっています。特に必要がなければ有効にしないでください。
潜在的な脅威
所有権の継承はデータベース上の権限を管理するうえで非常に便利ですが、オブジェクト所有者がセキュリティ保護可能なリソースに対する権限の付与を決定するたびに、その影響を完全に見込んでいることが前提になります。上記の例では、July2003 ビューの基になるオブジェクトの多くを Mary が所有しています。Mary には、Mary が所有しているオブジェクトに他の任意のユーザーがアクセスできるようにする権限があります。そのため、SQL Server の動作としては、チェーン内の最初のビューへのアクセスを Mary が許可するたびに、そのビューによって参照されているビューやテーブルも共有すると意図的に決定したかのようになります。これは、現実的に有効な想定とはいえません。運用データベースの場合は、この例で示したデータベースよりも複雑です。また、運用データベースへのアクセスを決定する権限が、データベースを使用する組織の管理構造に完全に一致することはほとんどありません。
高いレベルの特権を持つデータベース ロールのメンバは、複数データベースの組み合わせ所有権を使用して、所有外のデータベース内のオブジェクトにアクセスできることを理解しておく必要があります。たとえば、データベース A とデータベース B の間で複数データベースの組み合わせ所有権が有効になっている場合、いずれかのデータベースの固定データベース ロール db_owner のメンバは、他のデータベースのメンバになりすますことができます。このプロセスは単純です。Diane (データベース A の db_owner のメンバ) がデータベース A で Stuart というユーザーを作成します。Stuart はデータベース B のユーザーとして既に存在します。次に、Diane がデータベース A に (Stuart が所有している) オブジェクトを作成します。これは、データベース B にあり Stuart が所有している任意のオブジェクトを呼び出します。呼び出し元のオブジェクトと呼び出し先のオブジェクトの所有者が同じであるため、Diane が自分で作成したオブジェクトを使用して、データベース B 内のオブジェクトにアクセスするときに、このオブジェクトに対する権限はチェックされません。