SQL のユーザ、ロール、および特権
InterSystems IRIS® データ・プラットフォームは、システム・レベルのセキュリティと、SQL 関連セキュリティ機能の追加セットの両方を備えています。インターシステムズの SQL セキュリティは、インターシステムズのデータベース・レベル保護を超えるレベルのセキュリティ機能を提供します。SQL セキュリティとシステム・レベルのセキュリティの主な違いは以下のとおりです。
-
SQL 保護では、システム・レベルのセキュリティに比べ、詳細な保護が可能です。テーブル、ビュー、およびストアド・プロシージャに対する特権を定義できます。
-
SQL 特権はユーザとロールに与えることができます。システム・レベルの特権はロールに対してのみ与えられます。
-
SQL 特権を保持することにより、SQL アクションの実行に必要なすべての関連システム特権が暗黙的に与えられます(反対に、システム・レベルの特権はテーブル・レベルの特権を意味しません)。特権の種類については、“SQL 特権とシステム特権” のセクションで説明します。
InterSystems SQL は、InterSystems IRIS データ・プラットフォームで ODBC、JDBC、ダイナミック SQL、および SQL シェル・インタフェースの特権チェックを実行します。埋め込み SQL 文は、特権チェックを実行しません。これは、埋め込み SQL 文を使用する前に、その埋め込み SQL を使用するアプリケーションで特権をチェックしていることが前提となっているからです。同様に、%SQL.Statement オブジェクトを伴わないクラス・クエリの直接呼び出しはアプリケーション・アクセスと見なされ、SQL 特権が確認されません。
SQL 特権とシステム特権
SQL 固有のメカニズムを使用してテーブルやその他の SQL エンティティを操作するには、適切な SQL 特権が必要です。システム・レベルの特権では十分ではありません。ユーザに直接 SQL 特権を付与することも、ユーザが SQL 特権を持つロールに属することもできます。
SQL セキュリティとシステム・レベルのセキュリティで、ロールを共有できます。つまり、システム・レベル特権と SQL 特権の両方を 1 つのロールに備えることができます。
Windows マシンの InterSystems IRIS インスタンスについて、以下の例を考えてみましょう。
-
USER ネームスペースに User.MyPerson という永続クラスがあります。このクラスは SQL に SQLUser.MyPerson テーブルとして投影されます。
-
Test という名前のユーザがいます。このユーザはどのロールにも属しません (したがって、システム特権を何も持ちません) が、SQLUser.MyPerson テーブルに対するすべての特権を持ちます (その他の SQL 特権は持ちません)。
-
Test2 という 2 人目のユーザがいます。このユーザは、%DB_USER ロール (このため、USER データベースに対するデータの読み書きが可能)、および %SQL ロール (このため、%Service_Bindings サービスを通じた SQL アクセスが可能) を持ちます。また、カスタム・ロールを通じて、コンソールと %Development を使用するための特権を持ちます。
ユーザ Test が SQL 固有の任意のメカニズム (ODBC を使用するものなど) を通じて SQLUser.MyPerson テーブル内のデータに対して読み取りまたは書き込みを実行すると、この操作は成功します。これは、InterSystems IRIS がユーザ Test を %SQL ロール (%Service_SQL:Use 特権を含む) および %DB_USER ロールのメンバにして、ユーザが接続の確立に必要な特権を持つようにするためです。これは、%System/%Login/Login イベントなど、接続により生成される監査イベントで確認できます (ユーザ Test が、ターミナル・オブジェクト・メカニズムを使用しようとすると失敗します。これは、ユーザ Test がこれらの操作に必要な特権を持たないためです)。
ユーザ Test2 が SQL 固有の任意のメカニズム (ODBC を使用するものなど) を通じて SQLUser.MyPerson テーブル内のデータに対して読み取りまたは書き込みを実行すると、この操作は失敗します。これはユーザ Test2 がこのテーブルに対して必要な特権を持たないからです(ユーザ Test2 が、オブジェクト・メカニズムを使用してターミナルで同じデータを表示しようとすると、この操作は成功します。これはユーザ Test2 が、この種類の接続に必要な特権を持っているためです)。
SQL 特権に関する詳細は、"SQL 特権" を参照してください。
InterSystems IRIS の永続クラスは、行レベル・セキュリティの特権もサポートします。
%Admin_Secure 権限
USE 権限のある %Admin_Secure 管理リソースを持つユーザは、次の操作を実行できます・
%Admin_Secure を使用することにより、ユーザはシステム上で完全なセキュリティ特権が付与されていなくてもこれらの操作を実行できます。
%Admin_RoleEdit 権限
USE 権限のある %Admin_RoleEdit 管理リソースを持つユーザは、次の操作を実行できます。
-
ロールの作成または削除。
%Admin_RoleEdit を使用することにより、ユーザはシステム上で完全なセキュリティ特権が付与されていなくてもこれらの操作を実行できます。%Admin_RoleEdit を持っているが、%Admin_Secure を持っていないユーザは、システム・ロール以外のロールと自身で作成したシステム・ロールを削除できます。
%Admin_UserEdit 権限
USE 権限のある %Admin_UserEdit 管理リソースを持つユーザは、次の操作を実行できます。
-
ユーザの作成、変更、削除。
%Admin_UserEdit を使用することにより、ユーザはシステム上で完全なセキュリティ特権が付与されていなくてもこれらの操作を実行できます。%Admin_UserEdit を持っているが、%Admin_Secure を持っていないユーザは、自身で作成した他のユーザ、および自身で作成したユーザが作成したユーザを削除できます。このようなユーザは、システム・ユーザや自分自身を削除することはできません。
ユーザ
InterSystems SQL ユーザは、InterSystems セキュリティで定義されているユーザと同じです。SQL コマンドまたは管理ポータルを使用してユーザを定義できます。
-
SQL でユーザを作成するには、CREATE USER 文を使用します。これによって、ユーザ名とユーザ・パスワードのみが作成されます。新規に作成したユーザにはロールがありません。ユーザに特権とロールを割り当てるには、GRANT 文を使用する必要があります。既存のユーザ定義を変更するには、ALTER USER 文と DROP USER 文を使用します。
-
管理ポータルで、[システム管理]、[セキュリティ]、[ユーザ] の順に選択します。ページ上部の [新規ユーザ作成] ボタンをクリックします。これによって、[ユーザ編集] ページが表示されます。ここで、ユーザ名、ユーザ・パスワード、およびその他のパラメータを指定できます。ユーザを作成すると、その他のタブが使用可能になります。これらのタブでは、ユーザのロール、ユーザの一般的な SQL 特権、ユーザのテーブルレベルの特権、使用可能なビュー、および実行可能なストアド・プロシージャを指定できます。
ユーザに SQL テーブルの特権または一般的な SQL 特権がある場合、ユーザの [ロール] タブで付与または削除されるロールは、ODBC などの SQL ベースのサービスを使用したテーブルへのユーザ・アクセスには影響しません。SQL ベースのサービスでは、テーブルベースの特権がリソース・ベースの特権よりも優先されるためです。
%Library.SQLCatalogPrivOpens in a new tab クラスのクエリを使用して、以下を示すことができます。
-
すべてのユーザ SQLUsers()
-
指定したユーザに付与されているすべての特権 SQLUserPrivs(“username”)
-
指定したユーザに付与されているすべてのシステム特権 SQLUserSysPrivs(“username”)
-
指定したユーザに付与されているすべてのロール SQLUserRole(“username”)
以下の例は、現在のユーザに付与されている特権を示しています。
SET statemt=##class(%SQL.Statement).%New()
SET cqStatus=statemt.%PrepareClassQuery("%Library.SQLCatalogPriv","SQLUserPrivs")
IF cqStatus'=1 {WRITE "%PrepareClassQuery failed:" DO $System.Status.DisplayError(cqStatus) QUIT}
SET rset=statemt.%Execute($USERNAME)
WRITE "Privileges for ",$USERNAME
DO rset.%Display()
スキーマ名としてのユーザ名
状況によっては、ユーザ名を暗黙的に SQL スキーマ名として使用できます。 SQL 識別子では使用できない文字がユーザ名に使用されていると、この処理によって問題が発生します。例えば、複数ドメイン構成ではユーザ名に “@” 文字が使用されます。
InterSystems IRIS では、区切り識別子の構成パラメータの設定に応じて、この状況が区別して扱われます。
-
区切り識別子が使用できるようになっていると、特別な処理は発生しません。
-
区切り識別子が使用できないようになっていると、スキーマ名に使用できない文字がユーザ名から削除されてスキーマ名が形成されます。 例えば、“documentation@intersystems.com” というユーザ名から “documentationintersystemscom” というスキーマ名が生成されます。
これによって、SQL CURRENT_USER 関数から返される値が変化することはありません。 必ず $USERNAME と同じ値が返されます。
ロール
ユーザまたはロールには SQL 特権が割り当てられます。ロールを使用すれば、複数のユーザに同じ特権を設定できます。SQL セキュリティとシステム・レベルのセキュリティで、ロールを共有できます。つまり、システム特権と SQL 特権の両方を 1 つのロールに備えることができます。
管理ポータルの [システム管理]→[セキュリティ]→[ロール] ページに、InterSystems IRIS インスタンスのロール定義のリストが含まれています。特定のロールの詳細を表示または変更するには、そのロールの [名前] リンクを選択します。表示される [ロール編集] ページには、ロール特権と、その特権を持つユーザまたはロールに関する情報が含まれています。
[一般] タブには、InterSystems セキュリティ・リソースに対するロールの特権が示されます。ロールに SQL 特権のみが含まれている場合、[一般] タブのリソース・テーブルには、ロールの特権として “定義なし” が示されます。
[SQL権限] タブには、InterSystems SQL リソースに対するロールの特権が示されます。ここでネームスペースのドロップダウン・リストを使用すると、各ネームスペースのリソースを表示できます。特権はネームスペース別に示されているため、特定のネームスペースで特権を持たないロールのリストは “なし” と表示されます。
特権の定義にはロールを使用し、それらのロールに特定のユーザを指定してください。これには、以下のような利点があります。
-
SQL エンジンにとって、各ユーザのエントリを確認するより、比較的小規模なロール・データベースを確認することにより特権のレベルを決定する方が、非常に効率的です。
-
多数の個人ユーザ設定を持つシステムに比べ、小規模なロールの集合を使用したシステムの方が、管理が容易です。
例えば、あるアクセス特権を持つ “ACCOUNTING” というロールを定義するとします。Accounting Department (経理部) の人員が増加するにつれ、新しいユーザを定義し、ACCOUNTING ロールに追加します。ACCOUNTING へのアクセス権を変更する必要がある場合、1 回変更を加えれば、その変更が経理部のすべてのメンバに対し自動的に適用されます。
ロールには、他のロールを含めることができます。例えば、ACCOUNTING ロールには BILLINGCLERK ロールを含めることができます。ACCOUNTING ロールを付与されたユーザは、ACCOUNTING ロールと BILLINGCLERK ロールの両方の特権を持つことになります。
CREATE USER、CREATE ROLE、ALTER USER、GRANT、DROP USER、および DROP ROLE の各 SQL コマンドを使用してユーザおよびロールを定義することもできます。
SQLAdminRole という名前のロールを手動で作成し、このロールを持つユーザに DROP ROLE コマンドを発行させる場合、特別な動作が生じます。具体的には、SQLAdminRole に %Admin_Secure リソースを付与し、このロールを持つユーザが DROP ROLE を実行できるようにする必要があります。
%Library.SQLCatalogPrivOpens in a new tab クラスのクエリを使用して、以下を示すことができます。
-
すべてのロール SQLRoles()
-
指定したロールに付与されているすべての特権 SQLRolePrivileges(“rolename”)
-
指定したロールに付与されているすべてのロールまたはユーザ SQLRoleUser(“rolename”)
-
指定したユーザに付与されているすべてのロール SQLUserRole(“username”)
SQL 特権
ユーザまたはロールには SQL 特権が割り当てられます。ロールを使用すれば、複数のユーザに同じ特権を設定できます。
InterSystems SQL は、管理とオブジェクトという 2 つのタイプの特権をサポートしています。
-
管理特権はネームスペース固有のものです。
管理特権は、テーブルの作成に必要な %CREATE_TABLE 特権などの、オブジェクトのタイプの作成、変更、および削除を管理します。%ALTER_TABLE 特権は、テーブルを変更するためだけでなく、インデックスの作成または削除、トリガの作成または削除、および TUNE TABLE の実行にも必要です。
管理特権には、%NOCHECK、%NOINDEX、%NOLOCK、%NOJOURN、および %NOTRIGGER も含まれます。これらにより、INSERT、UPDATE、INSERT OR UPDATE、または DELETE を実行するユーザが、対応するキーワード制約を適用できるかどうかが決まります。TRUNCATE TABLE を実行するユーザには、%NOTRIGGER 管理特権を割り当てる必要があります。
-
オブジェクト特権は、テーブル、ビュー、またはストアド・プロシージャに固有です。オブジェクト特権は、(テーブル、ビュー、列、またはストアド・プロシージャという SQL 用語での) 特定の名前付き SQL オブジェクトに対するアクセスのタイプを指定します。ユーザが SQL オブジェクトの所有者 (作成者) である場合、ユーザにはそのオブジェクトに対するすべての特権が自動的に付与されます。
テーブルレベルのオブジェクト特権では、テーブルまたはビューのすべての列のデータにアクセス (%ALTER、DELETE、SELECT、INSERT、UPDATE、EXECUTE、REFERENCES、CANCEL) できます。現在存在している列と今後追加される列の両方が対象です。
列レベルのオブジェクト特権では、テーブルまたはビューの指定した列のデータのみにアクセスできます。RowID や Identity (ID) などのシステム定義の値を使用して列に列レベルの特権を割り当てる必要はありません。
ストアド・プロシージャ・オブジェクト特権では、プロシージャの EXECUTE 特権の割り当てが指定のユーザまたはロールに対して許可されます。
詳細は、"GRANT コマンド" を参照してください。
SQL 特権の付与
以下のようにして、特権を与えます。
-
管理ポータルを使用します。[システム管理] から、[セキュリティ] を選択し、[ユーザ] または [ロール] を選択します。目的のユーザまたはロールを選択してから、該当するタブを選択します。管理特権の場合は [SQL権限]、オブジェクト特権の場合は [SQLテーブル]、[SQLビュー]、または [SQLプロシージャ] となります。
-
SQL から GRANT コマンドを使用して、指定されたユーザまたはロール (あるいはユーザまたはロールのリスト) に、特定の管理特権またはオブジェクト特権を付与します。REVOKE コマンドを使用して、特権を削除できます。
-
ObjectScript から $SYSTEM.SQL.Security.GrantPrivilege()Opens in a new tab メソッドを使用して、指定されたユーザ (またはユーザのリスト) に特定のオブジェクト特権を付与します。
SQL 特権のリスト
-
管理ポータルを使用します。[システム管理] から、[セキュリティ] を選択し、[ユーザ] または [ロール] を選択します。目的のユーザまたはロールを選択してから、該当するタブを選択します。管理特権の場合は [SQL権限]、オブジェクト特権の場合は [SQLテーブル]、[SQLビュー]、または [SQLプロシージャ] となります。
-
SQL から、%CHECKPRIV コマンドを使用して、現在のユーザに特定の管理特権またはオブジェクト特権があるかどうかを特定できます。
-
ObjectScript から、$SYSTEM.SQL.Security.CheckPrivilege()Opens in a new tab メソッドを使用して、指定されたユーザに特定のオブジェクト特権があるかどうかを特定できます。
特権エラーの監査
InterSystems IRIS プロセスが、ユーザが特権を持っていない SQL 文を呼び出すと、操作は失敗し、SQLCODE –99 エラーが生成されます。監査イベント %System/%SQL/PrivilegeFailure が有効になっている場合、発生した SQLCODE -99 エラーごとに、監査データベースにレコードが配置されます。監査データベース・オプションは、既定では無効になっています。