| 【はじめに】
前回は、「ログイン」「ユーザー」「サーバーロール」「ロール」について説明しました。
今回は、これらをつかって、テーブルやストアドプロシージャなどへ権限を設定します。セキュリティの基本は、「権限は最小限に」です。
不正にアクセスされた場合にも、権限が制限されていれば被害を抑えることができます。
あわせて、SQL Server 2000 サービスパック3で導入された「組み合わせ所有権の設定」についても見ていきましょう。
【権限は、3タイプ】
権限には、次のタイプがあります。
| オブジェクト権限 |
データベース、テーブル、ストアドプロシージャなどに対する権限 |
| ステートメント権限 |
データベースにテーブルを作成する権限など |
| 暗黙の権限 |
sysadmin など固定のロールについている権限 |
|
オブジェクト権限は、たとえばユーザーがテーブルに SELECT を実行できるかどうかに対して許可、拒否を指定します。
オブジェクト権限を設定するオブジェクトと与えられる権限、権限の一覧は次のようになります。
オブジェクトと権限の対応一覧
| |
SELECT |
INSERT |
UPDATE |
DELETE |
EXEC |
DRI |
| テーブル |
○ |
○ |
○ |
○ |
|
○ |
| ビュー |
○ |
○ |
○ |
○ |
|
○ |
| 列 |
○ |
|
○ |
|
|
|
| ストアドプロシージャ |
|
|
|
|
○ |
|
| 拡張ストアドプロシージャ |
|
|
|
|
○ |
|
| ユーザー定義関数 |
|
|
|
|
○ |
○ |
|
権限の一覧
| SELECT |
選択 |
| INSERT |
挿入 |
| UPDATE |
更新 |
| DELETE |
削除 |
| EXEC |
実行 |
| DRI |
宣言参照整合性 |
|
例として、Enterprise Manager にてテーブルの権限の一覧を表示してみます。
Transact-SQL にて、オブジェクト権限の一覧を得るには、次のようにします。
EXEC sp_helprotect @permissionarea='o'
特定のオブジェクトに与えられている権限の一覧を得るには、次のようにします。
EXEC sp_helprotect N'Product',
@permissionarea='o'
このクエリーは、Product テーブルに与えられた権限の一覧を出力します。
ステートメント権限はデータベース作成、バックアップなどの操作に対して与えます。
ステートメント権限は次のようになります。
| CREATE DATABASE |
データベースの成 |
| CREATE DEFAULT |
デフォルトの作成 |
| CREATE FUNCTION |
関数作成 |
| CREATE PROCEDURE |
ストアドプロシージャ作成 |
| CREATE RULE |
ルールの作成 |
| CREATE TABLE |
テーブルの作成 |
| CREATE VIEW |
ビューの作成 |
| BACKUP DATABASE |
データベースのバックアップ |
| BACKUP LOG |
ログのバックアップ |
|
例として、Enterprise Manager にてデータベースの権限の一覧を表示してみます。
Transact-SQL にて、ステートメント権限の一覧を得るには、次のようにします。
EXEC sp_helprotect @permissionarea='s'
暗黙の権限は、サーバーロールとデータベース所有者にあらかじめ定義されている権限です。たとえば、サーバーロール「sysadmin」は、SQL
Serverについてあらゆる操作ができる権限を与えられています。Enterprise Manager にて、サーバーロール「System
Administrator (sysadmin)」のプロパティにて権限を確認すると図のようになります。
Transact-SQL にて、sysadmin の権限の一覧を得るには、次のようにします。
EXEC sp_srvrolepermission 'sysadmin'
【権限を設定する】
権限の設定は、権限の許可、取り消し、拒否があります。ここで注意点は、権限の拒否です。許可と拒否が両方設定されていると、結果として拒否になります。
たとえば、データベースユーザー「田中」さんは、データベースロール「営業部」に属しているとします。ここで、テーブル「売上」に対して、「営業部」に許可、「田中」さんに拒否が設定されていると、田中さんは、テーブル「売上」にアクセスすることができません。拒否は優先するということを覚えておく必要があります。
では、オブジェクトに権限を設定します。
Enterprise Managerを起動して、データベースの中の権限を設定したいテーブルやビューなどのオブジェクトを選択します。右クリックのメニュー「すべてのタスク(K)」から「権限の管理」を選択します。
権限の設定が表示されますので、設定したい権限にチェックを入れます。チェック項目をクリックしていくと、許可 、拒否 、取り消し と変化します。
テーブルの列の権限は、テーブルの権限のダイアログの「列」のボタンをクリックすると、設定することができます。
Transact-SQL にて、権限を設定するには、次のようにします。
GRANT SELECT、INSERT
ON [Products]
TO [Public]
これは、テーブル「Products」に、データベースロール「Public」が「SELECT」「INSERT」する許可を与えています。GRANT
のあとに、権限、ONのあとに設定するオブジェクト名、TOのあとに、設定するユーザー、データベースロールを指定します。
拒否する場合は、次のようにGRANTの代わりにDENYを指定します。
DENY SELECT
ON [Products]
TO [Public]
取り消す場合は、REVOKEを指定します。
REVOKE SELECT
ON [Products]
TO [Public]
ところで、権限をユーザーとデータベースロールのどちらに与えるべきでしょうか。
ユーザーが10個以下で、互いに役割が明確なのであればユーザーに対して権限を与えるといいでしょう。たとえば、ASP.NETのシステムであれば、ユーザーは、データベース管理者と、ASP.NETだけのシステムになる場合があります。
このときは、直接ユーザーに権限を与えます。
一方、実際の利用者ごとにユーザーを作成する場合や、ユーザーの役割が変化する場合は、役割ごとにデータベースロールを作成し、ユーザーをデータベースロールに設定し、権限は、データベースロールに対して与えるようにします。
たとえば、社員一人づつにユーザーを作成している場合、部署、役職、プロジェクト名の単位でデータベースロールを作成し、そのロールに対して権限を与えます。
これにより、人事異動や組織変更に柔軟に対応できるとともに、権限の変更漏れを防ぐことができます。
【組み合わせ所有権の設定】
SQL Server 2000 のサービスパック3では、権限について一部変更がありました。
サービスパック3をインストール中に表示される「複数データベースの組み合わせ所有権」です。この設定はサービスパック3以前はオンとなっていましたが、今後、必要が認められなければオフにしておいてください。
一部のアプリケーションでは、オンにする必要があります。設定をオンにする時は、この設定がどのような機能をもち、オンにすることによりどのような効果があるのか正しく理解して運用に注意する必要があります。
詳しくは、マイクロソフトのサポート情報を参照してください。
[INF] SQL Server 2000 Service Pack 3 での数データベースの組み合わせ所有権の動作の変更点
http://support.microsoft.com/default.aspx?scid=kb;ja;810474
まず、組み合わせ所有権は、ふたつ以上のデータベースを利用している場合に影響します。
たとえば、次のような構成を考えます。
| データベース |
営業部 |
| テーブル |
売り上げ一覧 |
| ビュー |
プロモーション別売り上げ一覧
参照: 売り上げ一覧・プロモーション一覧 |
| データベース |
広報部 |
| テーブル |
プロモーション一覧 |
|
ビュー「プロモーション一覧別売り上げ」は、テーブル「売り上げ一覧」と「プロモーション一覧」を参照しています。
ここで、問題となるのは、次の二つへのアクセス権です。
- ビュー「プロモーション別売り上げ一覧」
- テーブル「プロモーション一覧」
まず、組み合わせ所有権のオン、オフにかかわらず、ビュー「プロモーション別売り上げ一覧」にアクセス権があれば、テーブル「売り上げ一覧」にアクセス権があるかどうかは関係ありません。
次に、組み合わせ所有権がオンの場合、テーブル「プロモーション一覧」にアクセス権があるかどうかも関係なく、ビュー「プロモーション別売り上げ一覧」にアクセスができます。
組み合わせ所有権がオフの場合、テーブル「プロモーション一覧」にアクセス権がなければ、ビュー「プロモーション別売り上げ一覧」にアクセス権があっても、アクセスすることはできません。表にすると次のようになります。
| |
ビュー
「プロモーション別売り上げ一覧」 |
| 許可 |
不許可 |
テーブル
「プロモーション一覧」 |
許可 |
○ |
× |
| 不許可 |
オフの場合:×
オンの場合:○ |
× |
|
つまり、オンの場合、およびサービスパック3以前の場合は、ビューへのアクセスは、ビューの中で参照するオブジェクトそのものへの許可にかかわらず、常に許可されていたことになります。
では、オンにする場合の問題点は、なんでしょう。
それは、データベースごとに管理者を指定して運用している場合に発生します。
広報部の管理者は、営業部に対して、限定したテーブルのみ参照を許可していたとします。
ところが、もし営業部の管理者が上記のビュー「プロモーション別売り上げ一覧」を作成してしまうと、広報部が許可したくないテーブルにまでアクセスされてしまいます。
データベースの内容を、それぞれのデータベース管理者が管理している場合、きわめて不都合になります。
オフにしている場合は、たとえ営業部の管理者がビューを作成しても、広報部の管理者が明示的にテーブルに対して、ユーザーに参照を許可しないかぎりは、アクセスエラーとなります。
SQL Serverの権限の機能を正しく利用するためにも、できるだけ組み合わせ所有権はオフにしておきましょう。
【おわりに】
権限は、ユーザー、データベースロールに対して、最小限に与えるようにしてください。できれば、管理者以外の利用者には、オブジェクトへの直接アクセスの許可を一切与えず、専用のストアドプロシージャを作成し、許可を与えるようにしましょう。
専用のストアドプロシージャであれば、不正なデータベース操作を事前にストアドプロシージャ内で判定、捜査の記録、エラーの記録、データベースの設計変更対応が、柔軟に行うことができます。
また、システムの権限の設定について、定期的に確認し、不用意な権限の許可が行われていないか確認しましょう。
|