特権および許可
許可によって、ユーザは、データの読み取りや書き込み、ツールの使用など、何らかのアクションを実行できます。許可はリソースと関連付けられて、特権を形成します。特権は、%DB_Sales:Read のように、リソース名の後にコロンで区切って許可を記す書式で記述します。これは、ユーザが実行できるアクションを示します。
特権のグループは、ロールと呼ばれます。アクションを実行するユーザは、適切な特権を保有するロールのメンバであることが必要です。このモデルにより、ユーザ (またはユーザのグループ) が実行できる操作を指定する際に、精度が確保されます。調整を行うには、そのユーザのロールで特権を調整するだけです。
特権の機能
特権によって、リソースが許可に関連付けられます。この関連付けにより、特権を保持しているロールは、データベースに対する読み取りや書き込み、アプリケーションの使用などの特定のアクションを実行できます。使用できる許可は以下のとおりです。
-
Read — データベースなどのリソースのコンテンツを閲覧できますが、それを変更することはできません。
-
Write — データベースなどのリソースのコンテンツを閲覧および変更できます。
-
Use — アプリケーションや InterSystems サービスなどの実行可能プログラムやツールを実行、またはその他の方法で使用します。
それぞれの許可の意味は、それと組み合わせるリソースによって異なります。許可の名前は、そのフル・ネームまたは先頭の文字で表すことができます。この名前では、大文字と小文字が区別されません。
パブリック許可
リソースごとに、許可をパブリックとして指定できます。これは、リソースに対してこの許可を保持しているすべてのユーザが実質的に同等の扱いになるということです。例えば、%DB_SALES:Read 特権がパブリックであれば、どのユーザでも %DB_SALES リソースで保護されているデータベースをすべて読み取ることができます。ただし、この例では %DB_SALES:Write 特権がパブリックではないので、これらのデータベースにすべてのユーザが書き込めるわけではありません。
以下のデータベースは既定でパブリックになっています。
リソース | 許可 |
---|---|
%DB_IRIS | Read |
%DB_IRISLIB | Read |
%DB_IRISTEMP | Read、Write |
プロセスの特権の確認
InterSystems IRIS® データ・プラットフォームには、$SYSTEM.Security.Check という、現在のプロセスで保持されている特権を確認するためのメソッドが用意されています。1 つの引数で構成した形式でこの関数を使用すると、プロセスが特定のリソースに対して保持している特権が示されます。2 つの引数で構成した形式では、特定のリソースに対してプロセスが特権を保持しているかどうかが返されます(次のセクションで説明する、組み込みの権限確認機能を持つメソッドもあります)。
1 つの引数で構成した形式では、リソースに対してプロセスが保持している許可が、コンマ区切りリストで返されます。以下に例を示します。
$SYSTEM.Security.Check("%DB_TESTDATABASE")
プロセスが %DB_TESTDATABASE に対して Read 許可および Write 許可を保持している場合は、READ,WRITE が返されます。許可名は、必ずすべて大文字のフルネームで返されます。プロセスがリソースに対して許可を保持していない場合、この関数では空文字列が返されます。
2 つの引数で構成した形式では、プロセスが特定の特権を保持しているかどうかを示す True または False の値 (1 または 0) が返されます。以下に例を示します。
$SYSTEM.Security.Check("%DB_TESTDATABASE", "WRITE")
プロセスが %DB_TESTDATABASE リソースに対して Write 許可を保持している場合は 1 が返されます。
以下のように、許可のリストを指定してこの関数を呼び出すこともできます。
$SYSTEM.Security.Check("%DB_TESTDATABASE", "WRITE,READ")
ここで要求されたすべての許可をプロセスが保持している場合は 1、それ以外の場合は 0 が返されます。以下のように、確認する特権の最初の文字のみを使用することもできます。
$SYSTEM.Security.Check("%DB_TESTDATABASE", "W,R")
このメソッドの一般的な動作は以下のとおりです。
-
パブリックなリソース特権に対しては、プロセスがその特権を明示的に保持しているかどうかに関係なく、必ず 1 が返されます。
-
許可名では、大文字と小文字が区別されません。
-
許可名は、上の例のようにフルネームで記述できるほか、先頭の文字のみに省略して記述することもできます。また、許可名では大文字と小文字が区別されません。したがって、“WRITE,READ”、“W,R”、および “R,Write” はすべて同じ許可を指定していることになります。
組み込みの特権確認機能を持つメソッドの使用
InterSystems IRIS では、メソッドを呼び出すプロセスが特定の特権を持っていることをメソッドで要求できます。
この機能では、Requires メソッド・キーワードを使用します。Requires メソッド・キーワードは、特権のコンマ区切りリストである、引用符で囲まれた文字列値を持ちます。各特権では、リソースとそれに関連する許可 (Use、Read、または Write) を標準形式で指定します。
例えば、MyAction メソッドに Service_FileSystem:Use 特権が必要な場合、そのシグニチャは以下のようになります。
ClassMethod MyAction() [ Requires="Service_FileSystem:Use"]
{
// Method content
}
Requires キーワードに値がある場合、メソッドは、呼び出し側プロセスがそのメソッドを呼び出す際に必要な特権を持っている場合にのみ実行されます。プロセスに必要な特権がない場合は、<PROTECT> エラーが生成されます。
このキーワードを継承するメソッドは、キーワードをオーバーライドして新しい値を設定することによって、追加のリソースを要求できます。この要件を削除することはできません。
特権の変更が有効になるタイミング
InterSystems IRIS は、セキュリティ設定が格納されたデータベースを永続的に保持しています。InterSystems IRIS が起動されると、その情報が抽出され共有メモリのセグメントに配置されるため、統合化された設定への迅速なアクセスが可能になります。プロセスが実行されている間、そのプロセスに付与されている特権のキャッシュが独自に保持されます。これは、新しい特権が必要になり認可されると更新されます。
ロールや特権などを編集すると、その情報の永続コピーに変更が反映されます。この変更は、ユーザまたはアプリケーションの次回の認証時に認識されます。