アプリケーション
ほとんどのユーザは、主にアプリケーションを使用して Caché との対話操作を実行します。そのため、ユーザのアクションを制御するための一連の重要なツールがアプリケーション・セキュリティによって提供されています。アプリケーション・セキュリティでは、Caché の承認ツールを使用して、適切なユーザのみにアプリケーションの使用が許可されます。アプリケーションでは、そのアプリケーションを使用するユーザの特権をエスカレートすることもできます。
この章では、以下の項目について説明します。
アプリケーション、およびそのプロパティと特権
セキュリティの観点から捉えた場合、アプリケーションは次のように定義されます。
-
ユーザによるアクションの実行を可能にするエンティティです。
-
1 つ以上のリソースに関連付けられています。
-
その動作を制御するプロパティを持ちます。
-
実行中に実行ユーザの特権を強化することができます。
-
プログラムによる特権チェックを内包することができます。
これらの特性および機能はいずれも Caché 承認ツールの一部です。アプリケーションが Caché で正式に定義されている場合、そのアプリケーションでこれらの機能を使用できます。アプリケーションには、以下の 3 つの種類があります。
-
Web アプリケーション : CSP または Zen で構築したアプリケーション
-
特権ルーチン・アプリケーション : 一般に、Caché クラスまたは ObjectScript ルーチンで構築した (または、その両方で構築した) アプリケーション
-
クライアント・アプリケーション : Caché Direct を使用して構築したアプリケーション
このセクションでは以下について説明します。
アプリケーションとそのプロパティ
アプリケーションでは、データベースに対する読み書きや他のアセットの使用など、ユーザに許可するアクションのセットを指定できます。この制限を可能にするため、Caché では、アプリケーション定義という機能をサポートしています。この定義は、Caché 内でアプリケーションを表現するために使用される一連の情報です (アプリケーションとアプリケーション定義の関係は、アセットとリソースの関係に似ています)。アプリケーション定義を設定することによって、アプリケーションを制御および管理できます。
アプリケーションとアプリケーション定義は、しばしば同じ意味で使用されます。この 2 つの区別が重要になるのは、実行可能コードまたはそのコードのユーザ・エクスペリエンスが、Caché 内でのそのコードの表現と異なる設定に限られます。この場合、前者 (実行可能コード) はアプリケーションそのものであり、後者 (Caché 内でのそのコードの表現) はアプリケーション定義になります。
各アプリケーションは、それぞれのアプリケーション定義を通して、次のプロパティを持ちます。
アプリケーション名。アルファベット文字で始まり、その後にアルファベット文字、数字、またはアンダースコア文字が続く名前であることが必要です。アプリケーション定義の名前は、どのリソース名にも依存しません。
アプリケーションの説明。
アプリケーションが使用可能かどうかを示すスイッチ。有効になっていないアプリケーションは、%All ロールのメンバも含めて誰も実行できません。このプロパティによって各タイプのアプリケーションがどのように制御されるかについての詳細は、アプリケーションのタイプに応じて "Web アプリケーション"、"特権ルーチン・アプリケーション"、または "クライアント・アプリケーション" を参照してください。
アプリケーションの動作を管理するリソース。リソースが及ぼす影響は、アプリケーションのタイプに応じて異なります。Web アプリケーションとクライアント・アプリケーションの場合は、このリソースによって、ユーザがアプリケーションにアクセスできるかどうかが制御され、特権ルーチン・アプリケーションの場合は、アプリケーションの特権のエスカレーションが制御されます。Web アプリケーションまたはクライアント・アプリケーションにリソースが割り当てられていない場合、すべてのユーザがそのアプリケーションを実行できます。特権ルーチン・アプリケーションにリソースが割り当てられていない場合、すべてのユーザに対して特権のエスカレーションがそのアプリケーションで実行されます。
各アプリケーション定義は単一のリソースにのみ関連付けることができます。このプロパティによって各タイプのアプリケーションがどのように制御されるかについての詳細は、アプリケーションのタイプに応じて "Web アプリケーション"、"特権ルーチン・アプリケーション"、または "クライアント・アプリケーション" を参照してください。アプリケーションとリソースとの対話の詳細は、“リソースへのアプリケーションの関連付け” を参照してください。
アプリケーションのユーザが割り当てられる 1 つ以上のロール。アプリケーションの実行中、ユーザはそのアプリケーションのアプリケーション・ロールに割り当てられます。この割り当ては、$Roles 変数のロールのリストに、該当するアプリケーション・ロールを付加することで設定されます。アプリケーション・ロールの使用の詳細は、“アプリケーションおよび特権のエスカレーション” を参照してください。
アプリケーションの実行中に、ユーザが何らかの追加ロール (“ターゲット・ロール”) に割り当てられるように作用する 1 つ以上のロール。ユーザがいずれかのマッチングロールに割り当てられている場合、アプリケーションの使用中、そのユーザはターゲット・ロールにも割り当てられます。この割り当ては、$Roles 変数のロールのリストに、該当するロールを付加することで設定されます。例えば、マッチングロールが %Admin_Manage の場合、このロールのメンバがこのアプリケーションを使用すると、そのメンバはターゲット・ロール %Admin_Secure のメンバにもなります。マッチングロールの使用の詳細は、“アプリケーションおよび特権のエスカレーション” を参照してください。
すべてのアプリケーションはこれらのプロパティを持ちます。その他にも、3 つのアプリケーション・タイプのそれぞれが独自の特性を備えています。
リソースへのアプリケーションの関連付け
アプリケーション (および、結果としてそのアプリケーション定義) が 1 つの単体の全体である場合、そのアプリケーションのリソースは 1 つのみとなり、アプリケーションとリソースは一対一の関係になります。複数のアプリケーション (および、結果として複数のアプリケーション定義) が 1 つのリソースに関連付けられるように定義することもできます。この場合、アプリケーションとリソースの関係は多対一になります。アプリケーションの数がいくつでも、状況はこの 2 つの条件を何らかの形で組み合わせたものに帰着します。
アプリケーションが独立した複数の部分で構成される場合は、さらに状況が複雑になります。この各部分は、サブアプリケーションと呼ばれています。サブアプリケーションのグループで成立しているアプリケーションは、単体 (全体で 1 つ) のものとして動作するように設計されますが、それぞれのサブアプリケーションが異なるセキュリティの種類またはレベルを要求できます。このような状況では、サブアプリケーションごとに固有のアプリケーション定義を割り当て、それぞれを別のリソースに関連付けると便利です。この方法によって、各サブアプリケーションに独立したセキュリティ関連の動作を個別に割り当てることができます。アプリケーションの観点では、複数のサブアプリケーションによって 1 つの大きなアプリケーションが構成されることになりますが、Caché のセキュリティの観点では、それぞれに独自のアプリケーション定義を持つ複数の個別アプリケーションが存在し、ユーザは意識することなくそれらのアプリケーション間を通過することになります。この場合も、一対一のケースと多対一のケースに帰着します。ただし、複数のアプリケーション定義は、エンドユーザには 1 つのアプリケーションに見えます。ユーザは既に認証されており、そのプロセスでロールが設定されているため、サブアプリケーション間の受け渡し時に認証は不要です。
例えば、経費レポートのアプリケーションがあるとします。このアプリケーションでは、全従業員が経費レポートを入力できますが、小切手を生成できるのは会計責任者だけです。この場合、アプリケーションは 1 つのアプリケーション全体のように見え、小切手を生成する機能は会計責任者を除くすべての従業員にグレー表示されます。このようなアプリケーションを作成するには、1 つはレポートの入力、もう 1 つは小切手の生成に使用する、2 つの独立したサブアプリケーションが必要になります。1 つ目のサブアプリケーションはすべてのユーザが使用できますが、2 つ目のアプリケーションを使用できるのは会計責任者だけです。2 つのサブアプリケーションは 1 つのアプリケーション内の独立した 2 つの画面にしか見えず、それ以上の外観上の違いはありません。
アプリケーションおよび特権のエスカレーション
ユーザのロールはアプリケーション・リソースを使用することでエスカレートできるため、それらのリソースには動的に推移する承認のニーズを満たすメカニズムが用意されています。アプリケーションの特権のエスカレーションを実行するには、以下の操作を実行します。
-
既存のアプリケーションに対してリソースを作成し、そのリソースにアプリケーションを関連付けます。
-
そのリソースに対して Use 許可を持つロールを 1 つ以上作成します。
-
アプリケーションの実行に必要な特権のリストを決定します。そのアプリケーションが複数のサブアプリケーションで構成される場合、リストが複数になる場合があります。
-
各特権リストを個々のロールに関連付けます。各ロールを、そのアプリケーションまたはサブアプリケーションのアプリケーション・ロールとして設定します。
-
そのアプリケーションまたはサブアプリケーションのマッチングロールを設定します。それぞれのマッチングロールには、1 つ以上のターゲット・ロールを関連付けます。
-
ユーザが正常にアプリケーションを起動すると、Caché は次の 2 つのアクションを実行します。
-
アプリケーションの使用中、ユーザをそのアプリケーションのロールに割り当てます (特権ルーチン・アプリケーションの場合、この割り当ては、AddRoles メソッドが正常に起動されたかどうかに依存します。詳細は、“特権ルーチン・アプリケーション” を参照してください)。
-
ユーザがいずれかのマッチングロールに割り当てられている場合、ユーザは、アプリケーションの使用中、アプリケーションによってターゲット・ロールに割り当てられます (これについても、特権ルーチン・アプリケーションの場合は、AddRoles メソッドが正常に起動されたかどうかに依存します。詳細は、“特権ルーチン・アプリケーション” を参照してください)。
-
例えば、AppRsrc という専用のリソースを持つアプリケーションがあるとします。AppRsrc:Use 特権を保持している、AppUser と AppOperator という 2 つのロールがあります。AppOperator はマッチングロールでもあり、そのターゲット・ロールは %Manager です。このシナリオでは、AppUser ロールに属するユーザがこのアプリケーションを呼び出しても、$Roles の値は変化しません。一方で、AppOperator ロールに属するユーザがこのアプリケーションを呼び出すと、%Manager を含むように $Roles の値が拡張されます。アプリケーションにアプリケーション・ロール AppExtra がある場合、AppUser ロールに属するユーザがこのアプリケーションを呼び出すと、このユーザは AppExtra ロールを受け取ります。マッチングロールのみの最初のシナリオでは、AppOperator ロールに属しているユーザで、特権のエスカレーションが発生します。マッチングロールとアプリケーション・ロールがある 2 番目のシナリオでは、どちらのロールに属しているユーザにも特権のエスカレーションが発生します。
ユーザ・ベースのセキュリティおよびアプリケーション・ベースのセキュリティ
Caché のセキュリティ・モデルでは、ユーザ・ベース、アプリケーション・ベース、または両方をベースにした柔軟な特権の割り当てが可能です。アプリケーションの使用を特定のユーザのみに限定できるほか、すべてのユーザが使用できるようにすることもできます。アプリケーションの使用を承認されているユーザに対するそのアプリケーションの動作として、次の複数の動作が可能です。
-
ユーザの特権のみでアプリケーションを実行できます。
-
アプリケーションで一部のユーザの特権をエスカレートすることができます (マッチングロールとターゲット・ロールを使用)。
-
アプリケーションですべてのユーザの特権をエスカレートすることができます (アプリケーション・ロールを使用)。
-
一部の特権については、アプリケーションですべてのユーザに対してエスカレーションを発生させ、他の特権については特定のユーザに対してのみエスカレーションを発生させることができます (マッチングロール/ターゲット・ロールとアプリケーション・ロールを組み合わせて使用)。
このように、アプリケーションの使用を、特定のユーザのみに限定して認めるか、すべてのユーザに認めるか制御できます。また、アプリケーションをユーザの特権で実行するか、アプリケーション自体の特権で実行するかも制御できます。これにより、Caché では以下のような極めて柔軟なモデルが実現します。
Privilege Level / Protection Level | Public Application | Restricted Application |
With User-Dependent Privileges | 1.どのユーザでもアプリケーションを実行できます。アプリケーションはユーザの特権で実行されます。 | 2.指定されたユーザのみがアプリケーションを実行できます。アプリケーションはユーザの特権で実行されます。 |
With Privilege Escalation | 3.どのユーザでもアプリケーションを実行できます。アプリケーションは、アプリケーション・ロールとマッチングロールを通して、(拡張された) アプリケーション特権で実行されます。 | 4.指定されたユーザのみがアプリケーションを実行できます。アプリケーションは、アプリケーション・ロールとマッチングロールを通して、(拡張された) アプリケーション特権で実行されます。 |
上記のテーブルで説明した各シナリオは、以下のようなさまざまな承認モデルで広く使用されています。
このモデルは、認証されたすべてのユーザが使用できるアプリケーションを表します。このアプリケーションは実行しても追加の特権は付与しません。例えば、企業の連絡先データベースの場合、その企業全体のロールに属するユーザであれば、任意の社員の所属先電話番号と電子メール・アドレスを知ることができます。管理職は、社員の自宅電話番号を知ることができる上位の特権を保持しています。人事担当のスタッフは、すべてのレコードを閲覧および更新できる、さらに上位の特権を保持しています。このアプリケーションにはすべての社員がアクセスできますが、その動作は、アプリケーションを呼び出したときに各社員が既に持っている特権で決まります。つまり、アプリケーションそのものからロールが与えられるわけではありません。
このモデルは、指定のロールに属するユーザのみが使用できるアプリケーションを表します。このアプリケーションは実行しても追加の特権は付与しません。例えば、時給制の社員を扱う給与アプリケーションでは、勤務時間数や時給などが表示されます。このアプリケーションを実行するユーザは、HourlyEmployee ロールまたは HourlyManager ロールのメンバであることが必要です。このアプリケーションを実行すると、どのロールが指定されたかがチェックされます。このチェックにより、HourlyEmployee ロールのメンバは自身のデータを閲覧できますが、それを編集することはできません。一方、HourlyManager ロールのメンバは、報告の目的でデータの閲覧と編集が可能です。HourlyEmployee ロールのメンバである社員は、このアプリケーションを実行して個人データが正しいかどうかを確認できます。ここで要求されるロールのメンバではない月給制の社員などの他の社員は、このアプリケーションは実行することもできません。
このモデルは、認証されたすべてのユーザが使用できるアプリケーションを表します。このアプリケーションは、実行するとユーザが属するロールに基づいて特権をエスカレートします (特定のロールについてのみ、特権をエスカレートすることもできます)。例えば、学生が自身のレコードを確認および更新できるアプリケーションが、大学にあるとします。ここでは、どの学生も認証されたユーザであり、自身の連絡先情報を編集できます。この機能をサポートするために、アプリケーションにはエントリを編集するためのコードがあります。このコードでは、編集されているエントリが認証ユーザと一致しているかどうかが確認され、一致していれば、レコードを更新できるようにコード自身の特権がエスカレートされます。更新の終了後は、特権が元の状態に戻されます。ある学生が他の学生のレコードを更新しようとしても、このエントリの確認に失敗するので、特権のエスカレートが発生せず、更新も行われません。このアプリケーションでは、ユーザが学籍係の業務ロールのメンバであるかどうかも確認されます。そのメンバである場合は、さらに広範囲に情報を更新できます。
このモデルは、指定のロールに属するユーザのみが使用できるアプリケーションを表します。このアプリケーションは、ユーザが属するロールに基づいて特権をエスカレートします (特定のロールについてのみ、特権をエスカレートすることもできます)。例えば、病院の救急処置室に置かれたアプリケーションでは、現在救急治療を受けている患者のレコードを閲覧できる、特別に幅広い特権を担当の医師に与えることが考えられます。救急処置室では高い緊急性が発生する可能性があることから、この設定では、単純な巡回診療の場合よりも多くの情報を医師に提示できることが必要です。したがって、この場合は特権のエスカレートが発生します。
プログラムによる特権チェック
特定のアクションを実行するために必要な特権をユーザが保持しているかどうか確認するコードを、アプリケーションに組み込むこともできます。この操作には、$SYSTEM.Security.Check メソッドを使用します。これを呼び出すための構文は次のとおりです。
Set status = $SYSTEM.Security.Check(app_resource, app_permission)
以下はその説明です。
-
app_resource は、ユーザが許可を保持していなければならないリソースです。
-
app_permission は、保持していなければならない許可です。
-
status は、メソッドの返り値、True または False (1 または 0) です。
例えば、あるアプリケーションでユーザに Application_Order_Customer への Write 許可を付与する必要がある場合、Check 呼び出しは以下のようになります。
Set status = $SYSTEM.Security.Check("Application_Order_Customer", "WRITE")
$SYSTEM.Security.Check の呼び出しには、特権は必要ありません。
アプリケーション・タイプ
アプリケーションには、以下の 3 つのタイプがあります。
Web アプリケーション
CSP および Zen (それ自体 CSP を使用します) で構築されたアプリケーションです。このアプリケーションでは、%Service_CSP サービスを使用して Caché に接続します。
Web アプリケーションでは、セキュリティ情報が CSP セッションの一部として保持されます。つまり、$USERNAME および $ROLES の値が複数のページ要求にわたって保持されます (より具体的に言うと、ページに対する処理が開始されたとき、$ROLES にはユーザのロールに加えて、アプリケーションに定義されたロールも記述されます)。その前のページを処理したときに、SET $ROLES または $SYSTEM.Security.AddRoles を介して動的に追加されたロールは含まれません。これは、ステートレスおよび “ステートフル” のどちらのセッションにも当てはまります。
Web アプリケーション (Caché Server Page、Zen、または他のテクノロジのどれで作成されたかは問いません) の場合、クライアント (つまりブラウザ) は、サーバに接続するときに、通常はユーザ名とパスワードを送信しません。その代わりにユーザはページを要求し、それを受けたサーバはログイン・ページを送り返します。そのアプリケーションにさらにアクセスするには、ユーザはこのログイン・ページで必要な情報を入力する必要があります。2 要素認証が有効な場合、ユーザがユーザ名とパスワードを入力すると、サーバではセキュリティ・コードを入力するためのページが表示されます。認証に成功すると、ユーザはアプリケーションにアクセスできるようになります。
2 要素認証では、ユーザ名とパスワードのペアが有効でない場合でも、サーバでは、1 回限りのセキュリティ・トークンを入力するためのページが必ず表示されます。1 回限りのセキュリティ・トークンをユーザが入力すると、サーバではアクセス拒否を示すメッセージが表示され、システムで使用可能な最小限の情報が提供されます。
CSP のセキュリティ処理は以下のように行われます。
-
ページ要求が受信されるたびに、そのアプリケーションは要求の URL によって決まります。そのアプリケーションが有効になっていない場合、接続は行われません。
-
そのアプリケーションが CSP セッションで直前に処理されたページのアプリケーションと同じ場合は、既に接続されているため、それ以上のセキュリティ・チェックは要求されません。
-
%Service_CSP の Use 許可がパブリックではなく、この許可をユーザが保持していない場合、接続は行われません。
-
そのアプリケーションまたは CSP サービスが認証を必要とし、ユーザがまだ認証済みでない場合は、要求に CacheUserName および CachePassword パラメータが含まれているかどうかが Caché によって確認されます。
-
CacheUserName と CachePassword が含まれている場合、CSP サーバはログインを試行し、ログインに成功すると、そのアプリケーション・リソースの Use 許可をユーザが保持しているかどうかを確認します。 この両方に成功しないと、接続は行われません。
-
CacheUserName と CachePassword が含まれていない場合、その Web アプリケーションの構成でアプリケーション固有のログイン・ページが定義されていれば、そのページが表示されます (安全なアプリケーションでは、これがログイン前に使用できる唯一のページです)。アプリケーション固有のログイン・ページがないと、ユーザ名とパスワードによる認証に失敗します。また、ユーザがそのアプリケーション・リソースに対する Use 許可を保持していない場合、接続は行われません。
-
Web アプリケーションを編集するには、ポータル付属の以下のページを使用します。
特権ルーチン・アプリケーション
特権ルーチン・アプリケーションは、1 つ以上のクラスまたはルーチンにロールをエスカレートする特権を付与して、それらのクラスまたはルーチンのユーザのためにロールをエスカレートします。特権ルーチン・アプリケーションのクラスまたはルーチンは、ObjectScript、Caché Basic、または MVBasic で作成します。特権ルーチン・アプリケーションを使用するには、以下の操作を実行します。
-
管理者タスクとして、管理ポータルでアプリケーション定義を作成します。詳細は、“アプリケーションの作成および編集 : [一般] タブ” のセクションを参照してください。
-
管理者タスクとして、そのアプリケーション定義にクラスまたはルーチンを追加します。詳細は、“アプリケーションの編集 : [ルーチン/クラス] タブ” のセクションを参照してください。
-
開発者タスクとして、ロールをエスカレートするように開発環境でアプリケーション定義のクラスまたはルーチンを編集します。詳細は、“特権ルーチン・アプリケーションでのロールのエスカレート : AddRoles メソッド” のセクションを参照してください。
ポータルには、特権ルーチン・アプリケーションを編集するための以下のページがあります (これには、前述した最初の 2 つのページが含まれます)。
特権ルーチン・アプリケーションでのロールのエスカレート : AddRoles メソッド
特権ルーチン・アプリケーションでロールをエスカレートするには、%SYSTEM.SecurityOpens in a new tab クラスの AddRoles メソッドを呼び出します。AddRoles を呼び出すには、以下の構文を使用します。
Set sc = $SYSTEM.Security.AddRoles("AppDefName")
この場合、AppDefName はアプリケーション定義の名前で、sc はステータス・コードです。アプリケーション定義に記述されているクラスまたはルーチンがあり、ユーザが適切な特権を持っている場合に、そのクラスまたはルーチンから AddRoles を呼び出すことで、あらゆるアプリケーション・ロール (“アプリケーションの編集 : [アプリケーション・ロール] タブ” を参照) および関連するあらゆるマッチング・ロール (“アプリケーションの編集 : [マッチングロール] タブ” を参照) を扱うことができるように特権がエスカレートされます。
エントリ・ポイントでコードを区切る中括弧をルーチンに使用していない場合は、制御がエントリ・ポイント間で受け渡しされることがあります。その結果、ユーザに過度な特権が与えられ、意図しないレベルのアクセスが可能になる恐れがあります。ルーチンの構造化の詳細は、"Caché ObjectScript の使用法" の “ユーザ定義コード” の章を参照してください。
AddRoles の呼び出は、以下のように処理されます。
-
呼び出しが特権クラスまたはルーチン以外からの場合、呼び出しは失敗します。
-
アプリケーション定義で指定された要求リソースがパブリックではないときに、このリソースに対する Use 権限を保持していないユーザがメソッドまたはルーチンを呼び出した場合、呼び出しは失敗します。
-
上記以外の場合、この呼び出しは成功します。
特権をエスカレートしたルーチンのスコープ外に制御が渡されたときに、ユーザからすべてのアプリケーション・ロールを剥奪してログイン・ロールに戻すには、AddRoles 呼び出しの前に以下のコマンドを含めます。
New $Roles
これらのトピックの詳細は、“ロール” の章の “プログラムで管理するロール” のセクションを参照してください。
特権ルーチン・アプリケーションの使用例
例えば、DB1 という名前のデータベースを使用するアプリケーションがあるとします。このアプリケーションの各ユーザは %DB_DB1 ロールのみを所持していて、そのすべてのユーザが DB1 に対する特権を所持しています。このアプリケーションの一部のユーザは、一時的に別のデータベース (DB2) へのアクセスも必要とします。こうしたユーザは、PRATestClass クラスの PRAEscalateメソッド (“特権ルーチン・アプリケーション” の “PRA”) によって DB2 へのアクセス権を取得します。このメソッドは、該当するユーザの特権をエスカレートします。具体的には、PRAEscalate によって、%DB_DB2 ロールを追加して DB2 へのアクセスを可能します。
PRAEscalate メソッドによって該当するユーザに %DB_DB2 ロールを追加できるようにするには、以下のセキュリティ項目が存在している必要があります。
-
PRATestResource という名前のパブリックではないリソース。
-
PRA_DB2 という名前のロール (1 つの特権 PRATestResource:Use のみを持つロール)。
-
%DB_DB2 ロール (DB2 データベースの作成時に作成したロール)。
-
PRATestApp という名前の特権ルーチン・アプリケーション。PRATestApp に関する説明は以下のとおりです。
-
PRATestApp アプリケーションを実行するには、ユーザが PRATestResource:Use 特権を持っている必要があります。そのため、DB2 データベースへのアクセスを必要とするユーザは、PRA_DB2 ロール (PRATestResource:Use 特権を付与するロール) を持っている必要があります。
-
PRATestClass クラスは、PRATestApp アプリケーションに含まれます (このクラスをアプリケーションに含めるには、PRATestApp の [編集] ページにある [ルーチン/クラス] タブを使用します)。
-
%DB_DB2 ロールは、PRATestApp のアプリケーション・ロールです (アプリケーション・ロールを指定するには、PRATestApp の [編集] ページにある [アプリケーションロール] タブを使用します)。
-
この設定を実行したときに、PRATestBasicUser および PRATestDB2User というユーザが存在すると仮定すると、以下のようになります。
-
PRATestBasicUser は、%DB_DB1 専用のユーザです。そのため、PRATestApp アプリケーションは、PRATestBasicUser のロールをエスカレートすることはありません。また、このユーザは、DB2 へのアクセスを必要とするアプリケーションの部分を使用できません。
-
PRATestDB2User は、%DB_DB1 ロールと PRA_DB2 ロールのメンバです。そのため、PRATestApp アプリケーションは PRATestBasicUser のロールをエスカレートします。このユーザは、DB2 へのアクセスを必要とするアプリケーションの部分を使用できます。
PRAEscalate のコードは以下のとおりです。
Method PRAEscalate()
{
Write "This method is a part of the privileged routine application ",!
Write "called PRATestApp.",!
Write "The user invoking this routine is ",$Username,!
Write "The current value of $Roles is ",$Roles,!,!
Write "Calling the AddRoles method...",!,!
New $Roles
Set sc = $SYSTEM.Security.AddRoles("PRATestApp")
If sc = 1
{
Write "Application roles have been added.",!
Write "$Roles now is ",$Roles,!,!
} Else {
Write "The call to AddRoles has failed.",!
Do $system.Status.DecomposeStatus(sc,.Err)
Write Err(Err),!
}
}
このルーチンを PRATestDB2User が実行した場合のターミナル・セッションは以下のとおりです。
Username: PRATestDB2User
Password: ********
USER>set x = ##class(PRATestClass).PRATest()
This method is a part of the privileged routine application
called PRATestApp.
The user invoking this routine is PRATestDB2User
The current value of $Roles is %DB_DB1, PRA_DB2
Calling the AddRoles method...
Application roles have been added.
The current value of $Roles is %DB_DB1, %DB_DB2, PRA_DB2
Removing %DB_DB2 from $Roles...
$Roles now is %DB_DB1, PRA_DB2
USER>
このルーチンを PRATestBasicUser が実行した場合のターミナル・セッションは以下のとおりです。
Username: PRATestBasicUser
Password: ********
USER>set x = ##class(PRATestClass).PRATestMethod()
This method is a part of the privileged routine application
called PRATestApp.
The user invoking this routine is PRATestUser
The current value of $Roles is %DB_DB1
Calling the AddRoles method...
The call to AddRoles has failed.
ERROR #862: User is restricted from running privileged application PRATestApp
-- cannot execute.
USER>
クライアント・アプリケーション
Caché Direct を使用して Caché に接続するアプリケーションです。
クライアント・アプリケーション・セキュリティは、Caché Direct を使用するアプリケーションでのみ使用できます。ActiveX などの他のテクノロジを使用するクライアント/サーバ・アプリケーションでは、アプリケーション・セキュリティは使用できません。このようなアプリケーションでは、“認証” の章で説明する認証ツールを使用してください。
Caché では、Caché Direct を使用して構築された実行可能ファイルをシステムに識別させることができます。このような実行可能ファイルがサーバに接続しようとすると、Caché で以下の処理が実行されます。
-
%Service_CacheDirect が有効になっていない場合、接続は行われません。%Service_CacheDirect が有効になっている場合、接続試行が続行されます。
-
%Service_CacheDirect サービスの Use 許可がパブリックではなく、このサービスに対する許可をユーザが保持していない場合、接続は拒否されます。
-
アプリケーション定義に指定されているリソースに対する Use 許可がパブリックではなく、そのアプリケーションに対する許可をユーザが保持していない場合、接続は拒否されます。
-
接続先のネームスペースに対する Read 許可または Write 許可がプロセスにあれば、接続は受け入れられます。これらの許可がない場合、この接続は拒否されます。
-
接続が受け入れられると、アプリケーション・ロールが追加されます。同様に、ユーザがいずれかのマッチングロールのメンバになっている場合、該当するターゲット・ロールが追加されます。
クライアント・アプリケーションを編集するには、ポータル付属の以下のページを使用します。
アプリケーションの作成および編集
このセクションでは、以下のトピックについて説明します。
アプリケーションの作成および編集 : [一般] タブ
アプリケーションの作成および編集では、[一般] タブに、アプリケーションの基本操作に必要な情報を指定するフィールドがあります。
アプリケーションの作成
アプリケーションを作成する手順は以下のとおりです。
-
管理ポータルのメニューで、[システム管理]→[セキュリティ]→[アプリケーション] を選択します。これにより、さまざまなアプリケーション・タイプが表示されます。
-
[ウェブ・アプリケーション]、[特権ルーチンアプリケーション]、または [クライアントアプリケーション] を選択します。選択したアプリケーション・タイプのページが表示されます。
-
アプリケーション・ページの左上隅で、新しいアプリケーションの作成ボタンをクリックします。作成しようとしているアプリケーションに応じて、[新規ウェブ・アプリケーション作成]、[新規特権ルーチンアプリケーション作成]、または [新規クライアントアプリケーション作成] を選択します。選択した種類のアプリケーション編集ページが表示されます。次のセクションに記載された情報を使用して、既存のアプリケーションと同様に、アプリケーションを編集できます。
アプリケーションの汎用的な属性の編集
以下のように、管理ポータルの [ウェブ・アプリケーション編集] ページで、Caché が特定の CSP アプリケーションを処理する方法について設定を作成または変更できます。
-
管理ポータル・メニューで、[システム管理]→[セキュリティ]→[アプリケーション]→[ウェブ・アプリケーション] を選択します。
構成済みの Web アプリケーションが一覧表示されます。[タイプ] 列には、アプリケーションが、ユーザ・アプリケーション (CSP) またはシステム・アプリケーション (CSP,System) として示されます。システム・アプリケーションとは、Caché に付属する CSP ベースのユーティリティです。
-
アプリケーションを選択して [編集] をクリックした後、情報を入力または変更します。
-
編集が完了したら、新規設定を有効にするために Caché を再起動します。
[一般] タブには、以下のオプションが表示されます。
フィールド | 説明 |
---|---|
名前 | アプリケーションの名前を入力します。名前の先頭にはスラッシュ (/) を含める必要があります (例えば、/csp/acme アプリケーションのようにします)。 |
説明 | 説明を入力します。 |
ネームスペース | このアプリケーションに対するページが実行されている Caché ネームスペース。 |
ネームスペースの既定アプリケーション | このアプリケーションを、このネームスペースの既定アプリケーションとして設定します。%System.CSP.GetDefaultApp の呼び出しにより、このネームスペースの既定として、このアプリケーションを返します。Caché のインポート機能はこれを使用することで、XML ファイルからの CSP ページ・インポートなどの場合に対処します。この場合においては、現在のネームスペースには CSP ファイルをエクスポートした CSP アプリケーションがありません。CSP は CSP ファイルを、ネームスペースの既定 CSP アプリケーションにインポートします。 |
アプリケーション | アプリケーションが有効かどうかを制御します。選択されていれば、認証および承認されたユーザはアプリケーションを使用できます。チェックが外されていれば、使用できません。 |
CSP、Zen | CSP を有効にすると、CSP および Zen のページが提供されます。 チェックを外すと無効になります。Zen についての詳細は、"Zen の使用法" を参照してください。 |
DeepSee | DeepSee に必要な %-クラスを有効にします。チェックを外すと無効になります。 |
iKnow | iKnow に必要な %-クラスを有効にします。チェックを外すと無効になります。 |
着信 Web サービス | CSP を有効にすると、SOAP 要求を処理します。 チェックを外すと無効になります。SOAP および Caché Web サービスについての詳細は、"Caché での Web サービスおよび Web クライアントの作成" を参照してください。 |
許可されるクラス | このアプリケーションで実行可能なクラスを以下の 3 通りの方法で指定します。1) ObjectScript 一致パターン。例えば、1"myclass".3N では、このアプリケーションで myclass123.cls が実行できるようになりますが、myclassxy.cls は実行できません。2) ブーリアンに評価される ObjectScript 式。@ の接頭語が付きます。要求されたクラス名は class という名前の変数として渡されます。例 : @class = “PermittedClasses.PermittedPage” 3) クラス・メソッドへの呼び出し (@syntax も使用可能)。例えば、##class(MyPackage).CheckClassIsPermitted(class) です。“アプリケーションから %CSP ページへのアクセスの有効化” も参照してください。 |
必要なリソース | アプリケーションを実行するために、ユーザが Use 許可 (ロールで特権の一部として有効化されたもの) を保持していなければならないリソースを指定します。リソースおよび許可の詳細は、"Caché セキュリティ管理ガイド" の “リソースについて” のセクションを参照してください。 |
ID 単位のグループ化 |
このアプリケーションにグループ名を入力して、このグループ名で他のすべてのアプリケーションと認証特権を共有します。このグループ名を使用したすべてのアプリケーションで、認証の同期が保たれます。これらのアプリケーションのいずれかからログアウトすると、すべてのアプリケーションからログアウトされます。ログアウトされた後でいずれかのアプリケーションのページに戻ろうとする場合は、再度ログインする必要があります。ただし、一度ログインすると、再度ログインしなくてもアプリケーション間を移動できます (唯一の例外として、これらのアプリケーションのいずれかが非認証であると、それらのアプリケーションは認証クラスタの一部としては扱われません)。[ID 単位のグループ化] は、ネームスペースではなくアプリケーションにアタッチされます。このため、ネームスペースには関係なく、同じ ID 単位のグループを持つアプリケーションで認証が共有されます。詳細は、“ID 単位のグループ化” のセクションを参照してください。 |
許可された認証方法 |
アプリケーションへの接続に使用できる認証メカニズムを指定します。ここに表示されるオプションは、[認証オプション] ページ ([管理ポータル] >[システム管理] > [セキュリティ] > [システム・セキュリティ] > [認証/CSPセッションオプション]) での設定内容によって異なります。アプリケーションが複数の認証メカニズムをサポートする場合、認証は以下のように行われます。
承認についての詳細は、"Caché セキュリティ管理ガイド" の "認証" の章を参照してください。 |
セッション・タイムアウト | 既定のセッション・タイムアウトを秒単位で指定します。この値は、%CSP.SessionOpens in a new tab オブジェクトの AppTimeout プロパティを使用してオーバーライドできます。
セッションがその有効期間中に CSP アプリケーションを変更する場合、そのタイムアウト値はセッションの移動先のアプリケーションで定義された既定のタイムアウト値に合わせて更新されないことに注意してください。例えば、既定のタイムアウト値が 900 秒の CSP アプリケーション A でセッションが開始し、その後、既定のタイムアウト値が 1800 秒の CSP アプリケーション B に移動した場合、セッションは 900 秒後にタイムアウトになります。 アプリケーションを変更するときにセッション・タイムアウトが新規アプリケーションのセッション・タイムアウトに更新されるようにするには、セッション・イベント・クラスを使用し、OnApplicationChange コールバック・メソッドをオーバーライドして、%session オブジェクトの AppTimeout プロパティの更新を処理するコードを追加します。 |
イベントクラス | CSP クラス (%CSP.SessionEventsOpens in a new tab のサブクラス) の既定名を指定します。この既定名のメソッドは、タイムアウトやセッションの終了などの CSP アプリケーション・イベントを呼び出します。この値は、%CSP.SessionOpens in a new tab オブジェクトの EventClass プロパティを使用してオーバーライドできます。この設定の値として拡張子 (.cls または .zen など) のないクラス名のみを使用してください。例えば、MyApplication.SessionEvents のようになります。 |
セッションにクッキーを使用する | クッキーまたは URL 書き換え手法 (各 URL に値を配置) を使用して、ブラウザがあるセッションを CSP が追跡するかどうかを指定します (アプリケーションで実際に cookie を使用するには、この設定にかかわらず、cookie を使用するようにアプリケーションを記述する必要があります)。選択は、常に cookie を使用する、cookie を使用しない、またはユーザが cookie を無効にしているかどうかを自動検出する (既定) です。具体的な選択は、a) cookie を使用する ([常に])、b) cookie を使用しない ([なし])、c) (既定) クライアント・ブラウザが cookie を無効にしていない限り cookie 使用する ([自動検出]) です。このオプションでは、アプリケーションが cookieを使用するかどうかは設定されません (これは、アプリケーションを記述する方法によります)。このオプションでは、CSP がセッションを管理する方法が制御されるだけです。ユーザが cookie を無効にしている場合、アプリケーションでは、URL 書き換えが使用されます。 |
セッションクッキーパス | セッション cookie のスコープ。ブラウザで Caché へのセッション cookie の返信に使用する URL を指定します。アプリケーションの名前が myapp であれば、既定は /myapp/ になり、その cookie は /myapp/ 以下にあるページのみに送信されます。これをユーザのアプリケーションにとって必要なものだけに限定すると、このマシンで他の CSP アプリケーションがセッション cookie を使用しないように、あるいはこの Web サーバ上の他のアプリケーションがセッション cookie を参照しないようになります。他方では、ブラウザと cookie は、大文字小文字を区別します。セッション cookie を「/」に設定すると、例えば、アプリケーション名を大文字から小文字に変更した場合などに、ライセンスまたはセッションの問題を防止することができます。 |
ディスパッチ・クラス | REST サービスを実装するための %CSP.RESTOpens in a new tab の対応するカスタム・サブクラスを識別します。詳細は、"REST サービスの作成" を参照してください。 |
静的ファイルの提供 | |
静的ファイルの提供タイムアウト | ブラウザで静的ファイルをキャッシュする必要がある時間 (秒)。既定値は 3600 です。 |
CSP ファイル物理パス | Caché サーバ上で、CSP のソース・ファイルの保存先とするディレクトリ。このパスは、Caché サーバ・システムの install-dir/csp/ ディレクトリを基準とする相対パスです。 |
パッケージ名 | CSP コンパイラが使用するオプションのパッケージの接頭語名。この名前は、CSP ファイルから作成されたクラスに使用されるパッケージ名に付加されます。このフィールドが指定されていない場合は、csp の既定値を使用します。 |
デフォルトスーパークラス | CSP ファイルから生成されるクラスについて、CSP コンパイラで使用される既定のスーパークラスの名前。既定は、%CSP.PageOpens in a new tab です。 |
繰り返し | アプリケーション内にサブディレクトリを含むかどうかを指定します。UPath が URL パスで、PPath が物理パスである場合、Recurse が Yes に設定されていれば、UPath/xxx/yyy は、PPath/xxx/yyy で CSP ファイルを検索します。Recurse が No に設定されている場合は、UPath に直接含まれるファイルのみが使用されます。 |
自動コンパイル | [自動コンパイル] は [CSP名ロック] で動作して、アプリケーションがコンパイルされるタイミングを決定できます。 |
CSP名ロック |
2 つの Web アプリケーションがどちらも同一のネームスペースを指し、かつ [CSP名ロック] が両アプリケーションに対して [はい] (True) に設定されている場合、そのネームスペースの CSP ページはいずれも、そのページを最後にコンパイルした Web アプリケーションのみを通じて表示されます。ページ・クラスの CSPURL パラメータを見れば、どちらの Web アプリケーションが CSP ページに適用されているか判別できます。例えば以下のようになります。Parameter CSPURL = "/csp/samples/zipcode.csp"; [CSP名ロック] を [はい] に設定する場合は、[自動コンパイル] を [いいえ] に設定します。また、[自動コンパイル] も [はい] に設定した場合、ネームスペースのあらゆる CSP ページに対する変更が、次回の要求時において、そのページに対する再コンパイルのトリガとなります。また、いずれかの Web アプリケーション定義に対する変更も、次回の要求時において、ネームスペースのあらゆるページに対する再コンパイルのトリガとなります。そのような場合、ページに対する次回の要求にて、いずれかの Web アプリケーションの使用が可能になり、それ以降は、要求に使用した最後の Web アプリケーションのみを通じて、そのページが表示されます。 このシナリオにおける Zen ページについては、[CSP名ロック] を [はい] に設定する場合、各 Zen ページの CSPURL パラメータを設定します。詳細は、"%CSP.PageOpens in a new tab" を参照してください。[自動コンパイル] の設定は Zen ページに影響しません。 |
ログインページ | 名前は CSP ページ名、Zen ページ名、もしくは CSP 対応クラス名にすることができ、それらに CSP アプリケーションのフル・パスを付けることも可能です。次のパターンすべてが許可されます。mylogin.csp、/csp/user/mylogin.csp、MyApp.LoginPage.zen、/csp/user/MyApp.LoginPage.cls。ほとんどの場合、ログイン・ページはユーザが Cache にログインする前にロードされるので、要求プロセスは CSPSystem ユーザ (もしくは CSP ゲートウェイを Caché に接続しているユーザ) の下で実行されます。その結果、CSPSystem ユーザはコードをロードしてログイン・ページで実行するために適切な特権を持つ必要があり、通常はログイン・ページのあるデータベースを保護するリソースに対する READ 権限が要求されます。 |
パスワードの変更ページ | パスワードの変更で使用するページの名前。 |
カスタムエラーページ | アプリケーション内でページを生成する際、エラーが発生すると表示される、末尾が .csp または .cls のページの名前。 |
特権ルーチン・アプリケーションまたはクライアント・アプリケーションで一般的な編集処理を実行する手順は以下のとおりです。
-
管理ポータルのメニューで、[システム管理]→[セキュリティ]→[アプリケーション] を選択します。これにより、さまざまなアプリケーション・タイプが表示されます。
-
[ウェブ・アプリケーション]、[特権ルーチンアプリケーション]、または [クライアントアプリケーション] を選択します。選択したアプリケーション・タイプのページが表示されます。
-
アプリケーションのページで、アプリケーションの名前をクリックして編集用に選択します。そのアプリケーションの [編集] ページが表示されます。
-
既定では、[一般] タブが表示されます。特権ルーチン・アプリケーションとクライアント・アプリケーションの場合、このページには以下のフィールドが表示されます。
-
[特権ルーチン・アプリケーション名] または [アプリケーションのパスと名前] — アプリケーションの識別子。
-
[説明] — アプリケーションの説明。
-
[有効] — アプリケーションが有効かどうかを示します。有効になっていれば、認証および承認されたユーザはアプリケーションを使用できます。無効の場合は使用できません。
-
[アプリケーションの実行に必要なリソース] — ユーザが特定のアクションを実行する場合に Use 許可 (ロールで特権の一部として有効化されたもの) を保持していなければならないリソース。Web アプリケーションおよびクライアント・アプリケーションの場合、このリソースはアプリケーションの単純な操作に必要です。特権ルーチン・アプリケーションの場合、このリソースは、アプリケーションでのロールのエスカレーションを可能にする AddRoles メソッドの呼び出し時に必要になります。
-
アプリケーションの編集 : [アプリケーション・ロール] タブ
アプリケーションのすべてのユーザが特定のロールを取得するように構成できます。こうしたロールは、アプリケーション・ロールと呼ばれます。
アプリケーションのアプリケーション・ロールを指定する手順は以下のとおりです。
-
管理ポータルのメニューで、[システム管理]→[セキュリティ]→[アプリケーション] を選択します。これにより、さまざまなアプリケーション・タイプが表示されます。
-
[ウェブ・アプリケーション]、[特権ルーチンアプリケーション]、または [クライアントアプリケーション] を選択します。選択したアプリケーション・タイプのページが表示されます。
-
アプリケーションのページで、アプリケーションの名前をクリックして編集用に選択します。そのアプリケーションの [編集] ページが表示されます。
-
[編集] ページで、[アプリケーション・ロール] タブを選択します。
-
1 つ以上のアプリケーション・ロールを指定するには、[使用可能] リストに含まれているロールをクリックします。ロールを [選択済み] リストに移動します。
-
[割り当てる] をクリックして、アプリケーション・ロールを設定します。
アプリケーションの編集 : [マッチングロール] タブ
アプリケーションは、マッチングロール とターゲット・ロールをサポートするように構成できます。いずれかのマッチングロールに割り当てられているユーザがそのアプリケーションを実行すると、そのユーザは Caché によって関連するターゲット・ロールに割り当てられます。1 つのアプリケーションに複数のマッチングロールを含めることができます。マッチングロールごとに、複数のターゲット・ロールを含めることができます。また、複数のマッチングロールに同一のターゲット・ロールを含めることができます。
アプリケーションでマッチングロールとそのターゲット・ロールを設定する手順は以下のとおりです。
-
管理ポータルのメニューで、[システム管理]→[セキュリティ]→[アプリケーション] を選択します。これにより、さまざまなアプリケーション・タイプが表示されます。
-
[ウェブ・アプリケーション]、[特権ルーチンアプリケーション]、または [クライアントアプリケーション] を選択します。選択したアプリケーション・タイプのページが表示されます。
-
アプリケーションのページで、アプリケーションの名前をクリックして編集用に選択します。そのアプリケーションの [編集] ページが表示されます。
-
[編集] ページで、[マッチングロール] タブを選択します。
-
[マッチングロール] タブで、[マッチングロールの選択] ドロップ・ダウンからマッチングロールとするロールを選択します。
-
付随するターゲット・ロールを選択するには、[使用可能] リストに含まれているロールをクリックします。ロールを [選択済み] リストに移動します。
-
[割り当てる] をクリックして、マッチングロールとそのターゲット・ロールを設定します。
アプリケーションの編集 : [ルーチン/クラス] タブ
このタブは特権ルーチン・アプリケーションでのみ使用できます。このタブでは、特権ルーチン・アプリケーションに組み込むクラスまたはルーチンを指定できます。
特権ルーチン・アプリケーションにクラスまたはルーチンを追加する手順は以下のとおりです。
-
管理ポータルのメニューで、[特権ルーチンアプリケーション] ページ ([システム管理] > [セキュリティ] > [アプリケーション] > [特権ルーチンアプリケーション]) に移動します。
-
[特権ルーチン・アプリケーション] ページには編集可能なアプリケーションのリストがあります。該当するアプリケーションの [名前] をクリックします。アプリケーションの [特権ルーチンアプリケーション編集] ページが表示されます。
-
[特権ルーチンアプリケーション編集] ページで、[ルーチン/クラス] タブを選択します。
-
[ルーチン/クラス名] フィールドに、アプリケーションに追加するルーチンまたはクラスの名前を入力します。
-
[ルーチン] と [クラス] のうちの追加する方を、該当するチェック・ボックスを選択して指定します。
-
[割り当てる] をクリックして、アプリケーションにルーチンまたはクラスを追加します。
システム・アプリケーション
各 Caché インスタンスには、いくつかのシステム・アプリケーションが付属しています。%Service_CSP サービスが無効になっていても、これらのアプリケーションは常にアクセスされます。システム・アプリケーションには以下のものがあります。
名前 | 目的または管理された対話処理 | 関連付けられたリソース |
---|---|---|
/csp/broker | 共通の静的ファイル・ストア。インターシステムズ内部での使用専用。 | |
/csp/docbook | インターシステムズの主要ドキュメント (このドキュメントを含む)。 | |
/csp/documatic | インターシステムズのクラス・リファレンス・ドキュメント。 | %Development |
/csp/sys | ポータルへの一般アクセス。 | |
/csp/sys/exp | ポータルのデータ管理オプション。 | %Development |
/csp/sys/mgr | ポータルの構成およびライセンス・オプション。 | %Admin_Manage |
/csp/sys/op | ポータルの操作オプション。 | %Admin_Operate |
/csp/sys/sec | ポータルのセキュリティ管理および暗号化オプション。 | %Admin_Secure |
/isc/studio/rules | CSP ルール・ファイルへのマッピング。 | |
/isc/studio/templates | システムで定義されているスタジオ・テンプレート・ファイルへのマッピング。 | %Development |
/isc/studio/rules アプリケーションの詳細は、"Caché Server Pages (CSP) の使用法" の "カスタム・タグの開発" の章を参照してください。/isc/studio/templates アプリケーションの詳細は、"スタジオの使用法" の “スタジオ・テンプレートの使用法” の章を参照してください。