Oracle® Fusion Middleware

Oracle Adaptive Access Manager開発者ガイド

11g リリース2 (11.1.2)

B71697-03(原本部品番号:E27206-08)

2013年9月

このドキュメントは、In-ProcまたはSOAPモードを使用した、OAAMとカスタマ・アプリケーションのネイティブな統合、仮想認証デバイス(VAD)、ユーザー・アクションとフロー、レイアウト、ヘッダーとフッターの主要なカスタマイズの実行、およびカスタム開発の実行を行えるようにインテグレータと開発者を支援します。

Oracle Fusion Middleware Oracle Adaptive Access Manager開発者ガイド, 11gリリース2 (11.1.2)

B71697-03

Copyright © 2007, 2013, Oracle and/or its affiliates. All rights reserved.

原本著者:  Priscilla Lee

原本協力者:  Niranjan Ananthapadmanabha、Mandar Bhatkhande、Josh Davis、Philomina Dorai、Sunil Kumar Joshi、Daniel Joyce、Karthik Kandasamy、Wei Jie Lee、Derick Leo、Srinivas Nagandla、Paresh Raote、Jatin Rastogi、Kuldeep Shah、Nandini Subramani、Elangovan Subramanian、Vidhya Subramanian、Dawn Tyler、Sachin Vanungare、Saphia Yunaeva、およびXiaobin Zheng。

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

このソフトウェアまたは関連ドキュメントが、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供される場合は、次のNoticeが適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs. No other rights are granted to the U.S. Government.

このソフトウェアまたはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアまたはハードウェアは、危険が伴うアプリケーション(人的傷害を発生させる可能性があるアプリケーションを含む)への用途を目的として開発されていません。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用する際、このソフトウェアまたはハードウェアを安全に使用するために、適切な安全装置、バックアップ、冗長性(redundancy)、その他の対策を講じることは使用者の責任となります。このソフトウェアまたはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

OracleおよびJavaはOracle およびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXはThe Open Groupの登録商標です。

このソフトウェアまたはハードウェアおよびドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。

目次

図一覧

表一覧

タイトルおよび著作権情報

はじめに

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

1 開発者ガイドの概要

第I部 ネイティブ統合

2 Oracle Adaptive Access Managerのネイティブ統合

- 2.1 OAAMネイティブ統合について

- 2.1.1 ネイティブ統合について

- 2.1.2 SOAPサービス・ラッパーAPIの統合

- 2.1.3 In-Proc統合

- 2.1.4 SOAPサービス・ラッパーAPIとIn-Procメソッドの比較

- 2.1.5 非ネイティブ統合: SOAPサービス

- 2.2 スタート・ガイド

- 2.2.1 OAAMサンプル・アプリケーションのダウンロード

- 2.2.2 ネイティブSOAPベースのOAAMサンプル・アプリケーションの設定

- 2.2.2.1 前提条件

- 2.2.2.2 OAAMサンプル・アプリケーションのインストールおよび構成

- 2.2.3 ネイティブIn-ProcベースのOAAMサンプル・アプリケーションの設定

- 2.2.3.1 前提条件

- 2.2.3.2 インストールおよび構成

- 2.3 仮想認証デバイス、ナレッジ・ベース認証、およびワンタイム・パスワードの統合

- 2.3.1 ユーザー名ページ(c1)

- 2.3.2 デバイスのフィンガープリントのフロー(r2)

- 2.3.3 認証前ルールの実行(r1)

- 2.3.4 仮想認証デバイスのルールの実行(r3)

- 2.3.5 汎用TextPadの生成(p1)

- 2.3.6 パーソナライズされたTextPadまたはKeyPadの生成(p2)

- 2.3.7 TextPadおよびKeyPadの表示(s2およびs3)

- 2.3.8 仮想認証デバイスの入力のデコード(p3)

- 2.3.9 ユーザーとパスワードの検証(c2)

- 2.3.10 認証ステータスの更新(p4)

- 2.3.11 パスワードのステータス(c3)

- 2.3.12 認証後ルールの実行(r4)

- 2.3.13 ユーザーの登録の確認(p5)

- 2.3.14 登録必須ルールの実行(r5)

- 2.3.15 登録フローの入力(p6)

- 2.3.16 チャレンジのルールの実行(r6)

- 2.3.17 認証ルールの実行(r7)

- 2.3.18 ユーザーへのチャレンジ(p7)

- 2.3.19 チャレンジに対する回答の確認(c4)

- 2.3.20 ロックアウト・ページ(c6)

- 2.3.21 ランディングまたはスプラッシュ・ページ(c5)

3 ネイティブ.NETアプリケーションの統合

- 3.1 概要

- 3.2 Oracle Adaptive Access Managerの.NET SDK

- 3.3 構成プロパティ

- 3.3.1 APIのプロパティの使用方法

- 3.3.2 プロパティ値の暗号化

- 3.3.3 ユーザー定義の列挙を使用した要素の定義

- 3.4 Oracle Adaptive Access ManagerのAPIの使用方法

- 3.4.1 ユーザーの詳細

- 3.4.2 ユーザー・ログインとトランザクション

- 3.4.3 ルール・エンジン

- 3.4.3.1 デバイスID

- 3.4.3.2 一括トランザクションの作成と更新

- 3.4.4 チャレンジ質問でのユーザーの検証

- 3.4.5 チャレンジ失敗カウンタのリセット

- 3.4.6 仮想認証デバイス

- 3.4.6.1 仮想認証デバイスの作成

- 3.4.6.2 仮想認証デバイスのWebページへの埋込み

- 3.4.6.3 仮想認証デバイスでのユーザー入力の検証

- 3.4.7 Oracle Adaptive Access Manager SOAPサーバーへの資格証明の指定

- 3.4.8 トレース・メッセージ

- 3.4.9 X.509 SSL証明書構成の.Net APIサポート

- 3.5 統合の参照用としてのOAAMサンプル・アプリケーション

- 3.5.1 サンプル・パッケージのダウンロード

- 3.5.2 ASP.NETアプリケーション

- 3.5.3 OAAMサンプル・アプリケーションの詳細

- 3.5.3.1 SampleWebApp

- 3.5.3.2 SampleWebAppTracker

- 3.5.3.3 SampleWebAppAuthTracker

- 3.5.3.4 SampleKBATracker

- 3.5.4 環境の設定

- 3.5.4.1 web.configファイルの変更

- 3.5.4.2 イメージのプロパティの設定

- 3.5.4.3 アプリケーションの実行

- 3.5.5 例: トランザクション・ロギングとルール処理の有効化

- 3.5.6 OAAM .NET API

4 OAAMとJavaアプリケーションとのネイティブ統合

- 4.1 Oracle Adaptive Access Managerの共有ライブラリについて

- 4.1.1 統合プロセスの概要

- 4.1.2 WebアプリケーションでのOracle Adaptive Access Managerの共有ライブラリの使用

- 4.1.3 エンタープライズ・アプリケーションでのOracle Adaptive Access Managerの共有ライブラリの使用

- 4.1.4 Oracle Adaptive Access Managerのプロパティのカスタマイズ/拡張/オーバーライド

- 4.2 OAAM Java In-Proc統合

- 4.3 OAAM SOAP統合

- 4.3.1 Webサービスの認証の有効化

- 4.3.2 ユーザーとグループの作成

- 4.3.3 Webサービス認可の構成

- 4.3.4 SOAPユーザー・パスワードを保護するクライアント側のキーストアの設定

- 4.3.5 SOAP関連プロパティのoaam_custom.propertiesへの設定

- 4.4 VCryptResponseについて

- 4.5 Oracle Adaptive Access Manager API

- 4.5.1 addQuestion

- 4.5.2 authenticatePassword

- 4.5.3 authenticateQuestion

- 4.5.4 cancelAllTemporaryAllows

- 4.5.5 clearSafeDeviceList

- 4.5.6 createOAAMSession

- 4.5.7 createOrUpdateEntities

- 4.5.8 createTransaction

- 4.5.9 createUser

- 4.5.10 deleteQuestion

- 4.5.11 getActionCount

- 4.5.12 getCaption

- 4.5.13 getFinalAuthStatus

- 4.5.14 getImage

- 4.5.15 getRulesData

- 4.5.16 getSecretQuestion

- 4.5.17 getSignOnQuestions

- 4.5.18 getUserByLoginId

- 4.5.19 handleTrackerRequest

- 4.5.20 handleTransactionLog

- 4.5.21 IsDeviceMarkedSafe

- 4.5.22 markDeviceSafe

- 4.5.23 processPatternAnalysis

- 4.5.24 processRules

- 4.5.25 resetUser

- 4.5.26 searchEntityByKey

- 4.5.27 setCaption

- 4.5.28 setImage

- 4.5.29 setPassword

- 4.5.30 setTemporaryAllow

- 4.5.31 updateAuthStatus

- 4.5.32 updateLog

- 4.5.33 updateTransaction

- 4.5.34 updateTransactionStatus

5 エンティティAPIを使用したエンティティの作成、更新および検索

- 5.1 エンティティAPIについて

- 5.1.1 エンティティ・タスク

- 5.1.2 処理ステータス

- 5.1.3 エンティティの作成または更新

- 5.1.4 属性の置換またはマージ

- 5.1.5 キーによるエンティティの検索

- 5.2 エンティティとマッピング属性の作成

- 5.2.1 エンティティ・データ・マップ

- 5.2.2 複雑なエンティティ

- 5.2.3 単純なエンティティの作成

- 5.2.4 既存エンティティの属性の更新

- 5.2.5 既存エンティティの属性値の削除

- 5.2.6 最上位レベルのエンティティと関連エンティティの完全なデータを含む関連エンティティを持つエンティティの作成

- 5.2.7 最上位レベルのエンティティと関連エンティティの完全なデータを含む関連エンティティ(単一エンティティの複数のインスタンスを含む)を持つエンティティの作成

- 5.2.8 最上位レベルのエンティティと1つ以上の関連エンティティのエンティティIDによる完全なデータを含む関連エンティティを持つエンティティの作成

- 5.2.9 関連エンティティのエンティティIDを持つエンティティの関連エンティティの更新

- 5.2.10 リンクされたエンティティのリンク解除

- 5.2.11 エンティティIDまたはキー・データに基づくエンティティの検索

- 5.3 データ・ストレージ

- 5.3.1 データ・モデル

- 5.3.2 メタデータ

- 5.3.3 レコードの失効

- 5.3.4 トランザクションとエンティティのマッピング

- 5.3.5 トランザクション作成/更新へのエンティティ関係の格納

- 5.4 一般的なエンティティのシナリオ

第II部 Universal Installation Option

6 Oracle Adaptive Access Managerプロキシ

- 6.1 概要

- 6.1.1 重要な用語

- 6.1.2 アーキテクチャ

- 6.1.3 参照

- 6.2 UIO Apacheプロキシのインストール

- 6.2.1 開始する前に: WindowsおよびLinux向けUIOプロキシ・ファイル

- 6.2.1.1 Windows

- 6.2.1.2 Linux

- 6.2.2 Apache httpdのダウンロードまたはビルド

- 6.2.2.1 Windows

- 6.2.2.2 Linux

- 6.2.3 UIO Apacheプロキシとサポート・ファイルのApacheへのコピー

- 6.2.3.1 Windows

- 6.2.3.2 Linux

- 6.2.4 Memcacheの構成(Linuxのみ)

- 6.2.5 httpd.confの構成

- 6.2.5.1 SSLを使用しない基本構成

- 6.2.5.2 SSLによる構成

- 6.2.6 UIO Apacheプロキシの設定の変更

- 6.2.6.1 UIO_Settings.xml

- 6.2.6.2 UIO_log4j.xml

- 6.2.6.3 アプリケーション構成XML

- 6.3 ルールとユーザー・グループの設定

- 6.4 ポリシーの設定

- 6.5 UIOプロキシの構成

- 6.5.1 UIOプロキシ構成ファイルの要素

- 6.5.1.1 インターセプタのコンポーネント

- 6.5.1.2 条件

- 6.5.1.3 フィルタ

- 6.5.1.4 フィルタの例: ProcessString

- 6.5.1.5 OAAM変更パスワードでURLにエンコードされた特殊文字用のProcessStringのエンコード/デコードのスキーム

- 6.5.1.6 フィルタの例: FormatString

- 6.5.1.7 アクション

- 6.5.1.8 変数

- 6.5.1.9 アプリケーション

- 6.5.2 インターセプション・プロセス

- 6.5.3 Oracle Adaptive Access Managerサーバー・インタフェースへのリダイレクションの構成

- 6.6 アプリケーション検出

- 6.6.1 アプリケーション情報

- 6.6.2 UIO Apacheプロキシの設定

- 6.6.3 シナリオ

- 6.7 OAAMサンプル・アプリケーション

- 6.7.1 インターセプタの説明

- 6.7.2 UIOプロキシを使用しないBigBankのフロー

- 6.7.2.1 ログイン

- 6.7.2.2 ログアウト

- 6.7.3 UIOプロキシを使用してBigBankへのログインおよびログアウトを初めて行うユーザーのフロー

- 6.8 UIO Apacheプロキシのアップグレード

- 6.8.1 UIO Apacheプロキシ・パッチのインストール手順

- 6.8.2 パッチの失敗

第III部 カスタマイズと拡張

7 OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ

- 7.1 列挙の編集によるOAAMのカスタマイズまたは拡張

- 7.2 OAAM拡張共有ライブラリの使用によるカスタマイズの追加

- 7.2.1 前提条件

- 7.2.2 ステップ1 OAAM拡張共有ライブラリの抽出

- 7.2.3 ステップ2 MANIFEST.MFファイルの作成

- 7.2.4 ステップ3 カスタムJavaクラスのコンパイル

- 7.2.5 ステップ4 カスタムJARおよびファイルの追加

- 7.2.6 ステップ5 OAAM拡張共有ライブラリの再パッケージ化

- 7.2.7 ステップ6 再パッケージ化したWARファイルにカスタムJARファイルが含まれているかどうかの確認

- 7.2.8 ステップ7 すべての管理対象サーバーの停止

- 7.2.9 ステップ8 WebLogic管理サーバーの起動

- 7.2.10 ステップ9 WebLogic管理コンソールへのログイン

- 7.2.11 ステップ10 新しいOAAM拡張共有ライブラリのデプロイ

- 7.2.12 ステップ11 機能のテスト

8 OAAM Webアプリケーション・ページのカスタマイズ

- 8.1 OAAM Webアプリケーション・ページのカスタマイズのヒント

- 8.2 OAAMプロパティ

- 8.2.1 列挙の例

- 8.2.2 既存のユーザー定義列挙のオーバーライド

- 8.2.3 要素の無効化

- 8.3 複数のアプリケーションを対象としたOAAMサーバーのカスタマイズ

- 8.3.1 アプリケーションIDの決定

- 8.3.2 デフォルト・ユーザー・グループの決定

- 8.3.3 アプリケーション・プロパティの構成

- 8.3.4 プロパティ拡張

- 8.4 OAAMサーバー・ページの外観のカスタマイズ

- 8.4.1 ヘッダーとフッターのカスタマイズ

- 8.4.2 コンテンツおよびメッセージのカスタマイズ

- 8.4.3 ユーザー・インタフェース・スタイルの変更

- 8.5 シングル・ログイン・ページの有効化

- 8.5.1 パスワードの場所リンクが表示されないようにOAAMシングル・ログイン・ページを構成

- 8.5.2 パスワードとユーザー名を許可するようにOAAMシングル・ログイン・ページを構成

- 8.5.3 OAAMシングル・ログイン・ページのパスワード・フィールドの有効化

- 8.5.4 仮想認証デバイスのかわりにOAAM HTMLパッドを使用するようにOAAMが構成されているかどうかの確認

- 8.6 ユーザー・インタフェースのカスタマイズに関する質問/回答

9 ユーザー・フローとレイアウトのカスタマイズ

- 9.1 ユーザー・フローとレイアウト

- 9.1.1 Strutsアクション

- 9.1.1.1 アクション定義

- 9.1.1.2 アクション・タイプ

- 9.1.2 ベース・レイアウト定義

- 9.1.3 StrutsとTilesを併用する方法

- 9.2 カスタム・ユーザー・フローとレイアウトの例

- 9.2.1 ルック・アンド・フィールのカスタマイズ

- 9.2.2 ユーザー・ページ・フローとアクションのカスタマイズ

- 9.3 Tile定義ファイル

- 9.4 Struts構成ファイル

10 ローカライゼーションのプロパティ構成

- 10.1 ローカライゼーションの終了

- 10.2 ローカライズされたプロパティのオーバーライド

- 10.3 Oracle Adaptive Access Managerの言語デフォルトの構成

- 10.3.1 例1

- 10.3.2 例2

- 10.3.3 例3

- 10.3.4 例4

- 10.4 ロケールの略語と等価のカスタマイズ

11 カスタム・フィンガープリント処理の設定

- 11.1 即時利用可能なフィンガープリント・タイプ

- 11.2 カスタム・フィンガープリント処理の設定

12 ネイティブ統合でのフラッシュ・フィンガープリント処理

- 12.1 デバイスのフィンガープリント処理

- 12.2 変数とパラメータの定義

- 12.3 フラッシュ・フィンガープリント処理の実装

- 12.3.1 オプション1

- 12.3.1.1 オプション1のフロー

- 12.3.1.2 オプション1のコード例

- 12.3.2 オプション2

- 12.3.2.1 オプション2のフロー

- 12.3.2.2 オプション2のコード例

- 12.3.3 オプション3

- 12.3.3.1 オプション3のフロー

- 12.3.3.2 オプション3のコード例

- 12.3.3.3 一般的な更新

- 12.4 ネイティブ統合を行うWebアプリケーションに組み込まれたフラッシュ・フィンガープリント処理

13 デバイス識別の拡張

- 13.1 デバイス識別とは

- 13.1.1 データ収集

- 13.1.2 データ処理

- 13.1.3 データ・ストレージ

- 13.2 デバイス識別を拡張するタイミング

- 13.2.1 前提条件

- 13.2.2 カスタム・デバイス識別拡張の開発

- 13.2.2.1 クライアント・サイド拡張の実装

- 13.2.2.2 カスタム・デバイス識別拡張に関連するプロパティのOAAM拡張共有ライブラリへの追加

- 13.2.2.3 DeviceIdentification拡張クラスの拡張/実装

- 13.2.2.3.1 getPlugInHTML

- 13.2.2.3.2 getFingerPrint

- 13.2.2.3.3 getDigitalCookie

- 13.2.2.3.4 getClientDataMap

- 13.2.3 相互作用の概要

- 13.2.4 コンパイル、アセンブルおよびデプロイ

- 13.2.5 拡張の実装に関する重要な注意

14 デバイス登録の有効化

- 14.1 ネイティブ統合でのデバイス登録の有効化

- 14.2 即時利用可能なデバイス登録の有効化

- 14.3 デバイス情報を使用するポリシーの作成

- 14.4 デバイス登録をリセットするCSR

第IV部 アプリケーションの統合

15 トランザクションに対するクライアント・アプリケーションとOAAMとの統合

- 15.1 トランザクションの例

- 15.2 トランザクション・フローについて

- 15.3 ネイティブ・クライアント・アプリケーションとOAAMとの統合に必要な高度な手順

- 15.4 OAAMの設定と構成

- 15.4.1 トランザクション定義の設定

- 15.4.2 ポリシーとルールの設定

- 15.4.3 サイズ設定と容量の要件

- 15.5 クライアントの設定

- 15.6 エンティティとトランザクションのAPI

- 15.6.1 APIコールのシーケンス

- 15.6.2 即時利用可能なチェックポイント

- 15.6.2.1 トランザクション前のチェックポイント

- 15.6.2.2 トランザクション後のチェックポイント

- 15.6.3 エンティティAPIリスト

- 15.6.3.1 createOrUpdateEntities

- 15.6.3.2 SearchEntityByKey

- 15.7 ランタイム・データ分析

- 15.7.1 調査トランザクションの検索、比較およびユーティリティ・パネル

- 15.7.2 BIPレポート

- 15.8 トランザクションおよびエンティティ・データのターゲット・パージ

16 OTP Anywhereの実装

- 16.1 OTPの実装について

- 16.2 概念と用語

- 16.3 前提条件

- 16.3.1 SOAスイートのインストール

- 16.3.2 Oracle User Messaging Serviceドライバの構成

- 16.3.2.1 電子メール・ドライバ

- 16.3.2.2 SMPPドライバ

- 16.4 OTPの設定

- 16.5 OTPの構成

- 16.5.1 Oracle User Messaging Serviceの統合

- 16.5.2 OTPチャレンジ・タイプの有効化

- 16.5.3 登録とユーザー・プリファレンスの有効化

- 16.6 OTPのカスタマイズ

- 16.6.1 登録フィールドと検証のカスタマイズ

- 16.6.2 ご使用条件のカスタマイズ

- 16.6.3 登録ページのメッセージのカスタマイズ

- 16.6.4 チャレンジ・ページのメッセージのカスタマイズ

- 16.6.5 OTPメッセージ・テキストのカスタマイズ

- 16.6.6 オプトアウト機能の有効化

- 16.7 チャレンジ・タイプの作業を実行するSMSプロセッサの登録

- 16.8 ワンタイム・パスワード生成のカスタマイズ

- 16.9 ワンタイム・パスワードの有効期間のカスタマイズ

- 16.10 チャレンジ・タイプに使用するチャレンジ・パッドの構成

- 16.11 OTP Anywhereのデータ・ストレージのカスタマイズ

- 16.11.1 com.bharosa.uio.manager.user.UserDataManagerIntf

- 16.11.2 デフォルト実装: com.bharosa.uio.manager.user.DefaultContactInfoManager

- 16.11.3 カスタム実装の推奨事項

- 16.11.4 プロパティの構成

- 16.12 構成例

- 16.12.1 追加の登録フィールド定義の例

- 16.12.1.1 電子メール入力

- 16.12.1.2 電話入力

- 16.12.1.3 例: 携帯電話のかわりに電子メール・アドレスのエントリに値を表示するOTP登録ページ

- 16.12.1.4 IM入力

- 16.12.2 追加のチャレンジ・メッセージの例

- 16.12.2.1 OTP電子メール・メッセージのカスタマイズ

- 16.12.2.2 OTP IMメッセージのカスタマイズ

- 16.12.3 追加のプロセッサ登録例

- 16.12.3.1 電子メール・チャレンジ・プロセッサの登録

- 16.12.3.2 IMチャレンジ・プロセッサの登録

- 16.13 チャレンジのユースケース

17 モバイル・アプリケーションとOAAMとの統合

- 17.1 モバイル・アプリケーションとOAAMとの統合の概要

- 17.2 モバイル・デバイス・フィンガープリントの決定

- 17.3 OAAM固有のデータを処理するためのクライアント・サーバー・インタフェースの開発/拡張

- 17.4 即時利用可能なモバイル・デバイスの識別ポリシー

- 17.4.1 モバイルCookieによるデバイスの識別

- 17.4.2 新規デバイス

- 17.5 即時利用可能なセキュリティ・ポリシーのレビューと必要に応じたカスタム・ポリシーの開発

- 17.6 紛失/盗難デバイスの管理プロセス

- 17.7 ブラック・リスト上のデバイスの管理プロセス

- 17.8 モバイル固有のルール結果の処理

- 17.9 モバイル・デバイスのユーザー・インタフェースのカスタマイズ

- 17.10 カスタム・モバイルCSSファイルの包含

18 Juniper Networks Secure Access (SA)とOAAMの統合

- 18.1 概要

- 18.2 認証およびパスワードを忘れた場合のフロー

- 18.2.1 認証フロー

- 18.2.2 パスワードを忘れた場合のフロー

- 18.3 セキュリティおよび認証統合

- 18.3.1 統合ロードマップ

- 18.3.2 前提条件

- 18.3.3 認証プロバイダの構成

- 18.3.4 Oracle Platform Security Services (OPSS)の統合用の構成

- 18.3.5 OAAM管理コンソールを使用したSAML構成関連サーバー・プロパティのインポート

- 18.3.6 アサーションの署名に対する証明書の設定

- 18.3.6.1 証明書の秘密鍵の作成

- 18.3.6.2 証明書リクエストの作成

- 18.3.6.3 証明書署名リクエスト(CSR)の認証局への送信

- 18.3.6.4 独自の認証局としての行動

- 18.3.6.4.1 前提条件

- 18.3.6.4.2 必要なディレクトリの作成

- 18.3.6.4.3 初期OpenSSL構成

- 18.3.6.4.4 CA証明書と秘密鍵の作成

- 18.3.6.4.5 追加のOpenSSL構成(必須)

- 18.3.6.4.6 証明書リクエストの署名

- 18.3.6.5 証明書を自分のキーストアにインポート

- 18.3.7 OAAM管理コンソールを使用した統合プロパティの変更

- 18.3.8 Juniper Networks Secure Access (SA)の構成

- 18.3.8.1 SAML 1.1認証サーバーの作成

- 18.3.8.2 SAMLのユーザー・レルムの作成

- 18.3.8.3 サインイン・ポリシーの作成

- 18.4 統合の検証

- 18.5 統合のデバッグ

- 18.6 一般的な問題のトラブルシューティング

- 18.6.1 Juniper SAとOAAMのクロック同期

- 18.6.2 正しい証明書がJuniperに存在しない

- 18.6.3 SAMLレスポンスの署名の失敗

- 18.6.4 OAAMのエントリ・ポイントURL

19 Java Message Serviceキュー(JMSQ)の統合

- 19.1 JMS定義

- 19.2 非同期統合オプションのインストール

- 19.2.1 前提条件

- 19.2.2 非同期統合オプションのインストール

- 19.2.3 OAAM拡張ライブラリの更新

- 19.2.4 JMSキューの設定

- 19.2.5 OAAMデータベースの更新

- 19.3 JMS統合

- 19.3.1 WebサービスAPI

- 19.3.2 JMS統合の図

- 19.3.3 JMSリスナーの登録

- 19.3.4 メッセージ・プロセッサの構成

- 19.4 JMSメッセージ

- 19.4.1 JMSメッセージの例

- 19.4.1.1 VCryptTracker.updateLog

- 19.4.1.2 VCryptTracker.updateEntity

- 19.4.1.3 VCryptTracker.createTransaction

- 19.4.1.4 VCryptRulesEngine.processRules

- 19.4.1.5 MessageList

- 19.4.2 メッセージの書式を表すXMLスキーマの例

- 19.4.3 JMSキューへのメッセージの送信

- 19.5 エンティティおよびトランザクションのデータベース・ビュー

- 19.5.1 SQLスクリプト・ファイルの生成

- 19.5.2 エンティティ・ビューの詳細

- 19.5.3 トランザクション・ビューの詳細

- 19.5.4 識別子

- 19.6 Pythonルール条件

- 19.6.1 Pythonの式

- 19.6.2 Pythonで使用可能なオブジェクト

- 19.6.3 例

第V部 カスタム開発

20 仮想認証デバイスの使用と開発

- 20.1 仮想認証デバイスについて

- 20.1.1 仮想認証デバイスの用語

- 20.1.2 仮想認証デバイスのタイプ

- 20.1.2.1 TextPad

- 20.1.2.2 PinPadおよびKeyPad

- 20.1.2.3 QuestionPad

- 20.1.3 仮想認証デバイスの構成ファイルとプロパティ

- 20.1.3.1 仮想認証デバイスの構成で使用されるファイル

- 20.1.3.2 仮想認証デバイスのプロパティ構成

- 20.1.3.3 ランダム化とジッターのプロパティ

- 20.1.3.3.1 TextPadのランダム化とジッターのプロパティ

- 20.1.3.3.2 KeyPadのランダム化とジッターのプロパティ

- 20.1.3.3.3 PinPadのランダム化とジッターのプロパティ

- 20.1.3.3.4 QuestionPadのランダム化とジッターのプロパティ

- 20.2 カスタマイズできるオーセンティケータの要素

- 20.2.1 仮想認証デバイスの構成

- 20.2.2 パーソナライズされたイメージ

- 20.2.3 フレーム

- 20.2.3.1 TextPadのオーセンティケータ・イメージおよびフレーム・プロパティ

- 20.2.3.2 PinPadのオーセンティケータ・イメージおよびフレーム・プロパティ

- 20.2.3.3 QuestionPadのオーセンティケータ・イメージおよびフレーム・プロパティ

- 20.2.3.4 KeyPadのオーセンティケータ・イメージおよびフレーム・プロパティ

- 20.2.4 [Enter]キー、パーソナライズされたフレーズおよびタイムスタンプの位置

- 20.2.4.1 TextPadのビジュアル要素

- 20.2.4.2 PinPadのビジュアル要素

- 20.2.4.3 QuestionPadのビジュアル要素

- 20.2.4.4 KeyPadのビジュアル要素

- 20.2.4.5 Apple iPhone用のテキスト・サイズの構成

- 20.2.5 KeysSet

- 20.3 カスタマイズ手順

- 20.4 構成の簡単な例

- 20.4.1 フレームの設計

- 20.4.2 要素の位置決定

- 20.5 仮想認証デバイスの表示

- 20.5.1 get<pad_type>メソッドをコールする前の設定

- 20.5.2 仮想認証デバイスの取得

- 20.5.3 タイムスタンプとタイムゾーンの設定

- 20.5.4 仮想認証デバイスの表示

- 20.6 アクセシビリティ対応バージョンのオーセンティケータの有効化

- 20.7 OAAMサーバー・ページのカスタマイズ

- 20.8 OAAM 11gの仮想認証デバイスのローカライズ

- 20.8.1 概要

- 20.8.2 ドイツ語のロケールの使用例

- 20.9 パスワードの文字制限の変更

- 20.10 KeyPadのシナリオ

21 タスク・プロセッサの統合

- 21.1 概要

- 21.2 統合の参照用としてのOAAMサンプル・フレームワーク

- 21.3 セッション管理

- 21.4 タスク・プロセッサ

- 21.4.1 インタフェースおよび抽象クラス

- 21.4.1.1 TaskProcessorIntf

- 21.4.1.2 AbstractTaskProcessor

- 21.4.1.3 デフォルトのクラス

- 21.4.2 タスク・プロセッサの登録

- 21.5 チャレンジ・プロセッサ

- 21.5.1 チャレンジ・プロセッサとは

- 21.5.2 チャレンジ・プロセッサの作成方法

- 21.5.2.1 クラス

- 21.5.2.2 メソッド

- 21.5.2.3 例: 電子メール・チャレンジ・プロセッサの実装

- 21.5.2.4 秘密(PIN)の実装

- 21.5.3 チャレンジ・プロセッサの配信チャネル・タイプの定義

- 21.5.3.1 チャレンジ・タイプ列挙

- 21.5.3.2 例: OTPチャネル・タイプの定義

- 21.5.4 ユーザー入力プロパティの構成

- 21.5.4.1 登録とプリファレンスの入力の有効化

- 21.5.4.2 連絡先情報の入力の設定

- 21.5.5 各チャレンジ・タイプで使用されるチャレンジ・パッドの構成

- 21.6 チェックポイント・プロセッサ

- 21.7 ルール結果プロセッサ

- 21.8 統合プロセッサ

- 21.8.1 IntegrationProcessorIntfインタフェース

- 21.8.2 共通ユーザー・フロー

- 21.8.3 統合プロセッサのパラメータ

- 21.8.3.1 統合IDの確認

- 21.8.3.2 統合プロセッサの登録

- 21.8.3.3 認証レベルにおけるOracle Access Management Access Manager固有の統合プロパティ

- 21.9 プロバイダ登録

- 21.9.1 認証マネージャ

- 21.9.2 パスワード・マネージャ

- 21.9.3 ユーザー・データ・マネージャ

- 21.10 レガシー・ルール結果プロセッサ

22 OAAMオフラインのカスタム・ローダーの開発

- 22.1 OAAMオフラインのカスタム・ローダーの開発

- 22.2 基本フレームワーク

- 22.2.1 概要

- 22.2.2 重要なクラス

- 22.2.3 一般的なフレームワーク実行

- 22.3 デフォルトの実装

- 22.3.1 デフォルトのロード実装

- 22.3.2 デフォルトの再生実装

- 22.4 実装の詳細: ローダーまたは再生の動作のオーバーライド

- 22.5 RiskAnalyzerDataSourceの実装

- 22.5.1 AbstractJDBCRiskAnalyzerDataSourceの拡張

- 22.5.2 AbstractRiskAnalyzerDataSourceの拡張

- 22.6 RunModeの実装

- 22.6.1 AbstractLoadLoginsRunModeの拡張

- 22.6.2 AbstractLoadTransactionsRunModeの拡張

- 22.6.3 PlaybackRunModeの拡張

23 OAAM Oracle BI Publisherレポートの作成

- 23.1 OAAMデータベース・スキーマ内のデータでのOracle BI Publisherレポートの作成

- 23.1.1 データ・モデルの作成

- 23.1.2 ユーザー定義列挙の数値型コードと読取り可能な名前のマップ

- 23.1.2.1 結果表示

- 23.1.2.2 英語のみのユーザー定義列挙の結果表示

- 23.1.2.3 国際化したユーザー定義列挙の結果表示

- 23.1.3 値リストの追加

- 23.1.3.1 値リストとしてユーザー定義列挙を使用したフィルタ処理 - 英語のみ

- 23.1.3.2 値リストとしてユーザー定義列挙を使用したフィルタ処理 - 国際化

- 23.1.4 地理的位置データの追加

- 23.1.5 セッションおよびアラートの追加

- 23.1.5.1 型コードの参照

- 23.1.6 例

- 23.1.7 レポート定義へのレイアウトの追加

- 23.2 OAAMトランザクション・レポートの作成

- 23.2.1 エンティティおよびトランザクション情報の取得

- 23.2.2 エンティティ・データのマッピング情報の取得

- 23.2.2.1 データ型に関する情報

- 23.2.2.2 エンティティ・データの詳細(データ型、行および列のマッピングなど)の取得

- 23.2.2.3 エンティティ・データのSQL問合せおよびビューの作成

- 23.2.3 トランザクション・データのマッピング情報の取得

- 23.2.3.1 トランザクション・データの詳細(データ型、行および列のマッピングなど)の取得

- 23.2.3.2 トランザクション・データのSQL問合せおよびビューの作成

- 23.2.4 レポートの作成

- 23.2.4.1 エンティティ・データ・レポートの作成

- 23.2.4.2 トランザクション・データ・レポートの作成

- 23.2.4.3 エンティティ・データ表およびトランザクション・データ表の結合

- 23.2.5 エンティティおよびトランザクションのデータベース・ビューの生成

- 23.2.5.1 SQLスクリプト・ファイルの生成

- 23.2.5.1.1 前提条件

- 23.2.5.1.2 SQLスクリプトの生成

- 23.2.5.2 エンティティおよびトランザクションのデータベース・ビューの作成

- 23.2.5.3 エンティティ・ビューの詳細

- 23.2.5.4 トランザクション・ビューの詳細

- 23.2.5.5 識別子

- 23.2.5.6 ビューを作成するSQL問合せの例

24 構成可能なアクションの開発

- 24.1 新しい構成可能なアクションの追加

- 24.2 構成可能なアクションの特定の順序での実行およびデータ共有

- 24.3 構成可能なアクションのトリガーのテスト方法

- 24.4 サンプルのJUnitコード

- 24.5 構成アクション用のサンプルのJavaコード

25 チェックポイントおよび最終アクションの作成

- 25.1 新しいチェックポイントの作成

- 25.2 チェックポイントの例の作成

- 25.3 新規アクション

- 25.4 最終アクション

第VI部 ライフサイクル管理

26 ライフサイクル管理変更の処理

- 26.1 Oracle Virtual Directory (OVD)のホスト、ポートおよびSSL有効化の変更

- 26.2 Oracle Identity Manager (OIM)のURL変更

- 26.3 Oracle Access Management Access Managerのホストとポートの変更

- 26.4 Oracle Internet Directory (OID)のホストとポートの変更およびSSL有効化

- 26.5 データベースのホストとポートの変更

- 26.6 Oracle Adaptive Access Managerの新しい本番環境への移行

- 26.7 Oracle Adaptive Access Managerの既存の本番環境への移行

第VII部 トラブルシューティング

27 FAQ/トラブルシューティング

- 27.1 My Oracle Supportを使用したその他のトラブルシューティング情報

- 27.2 複雑な問題を解決するための手法

- 27.2.1 簡単な手法

- 27.2.2 分断攻略

- 27.2.3 厳密な分析

- 27.2.4 分析のプロセス・フロー

- 27.2.4.1 問題の記述

- 27.2.4.2 問題の詳述

- 27.2.4.3 最初から機能していなかった要素

- 27.2.4.4 「である」および「でないが、かもしれない」

- 27.2.4.5 考えられる原因の展開

- 27.2.4.6 考えられる各原因の詳述書に対するテスト

- 27.2.4.7 原因の確定

- 27.2.4.8 失敗

- 27.3 トラブルシューティング・ツール

- 27.4 構成可能なアクション

- 27.5 デバイスのフィンガープリント処理

- 27.6 デバイス登録

- 27.7 失敗カウンタ

- 27.8 ナレッジベース認証

- 27.9 ローカライゼーション

- 27.10 Man-in-the-Middle/Man-in-the-Browser

- 27.11 ワンタイム・パスワード

- 27.12 OAAM UIOプロキシ

- 27.13 仮想認証デバイス

第VIII部 用語集

用語集

索引

図一覧

- 2-1 SOAPサービス・ラッパーAPIの統合のシナリオ

- 2-2 ローカルAPIコールを使用したIn-Proc統合のシナリオ

- 2-3 仮想認証デバイス、ナレッジ・ベース認証およびOTPのシナリオ

- 2-4 ユーザー名ページ

- 2-5 一般的な、パーソナライズされていないTextPad

- 2-6 パーソナライズされたTextPad

- 2-7 パーソナライズされたKeyPad

- 4-1 ユーザー・グループの作成

- 4-2 ユーザーの作成およびユーザーとグループの関連付け

- 4-3 ユーザーのグループ・メンバーシップの構成

- 4-4 追加したユーザー・ロール

- 4-5 追加したロールと保存したポリシー

- 6-1 Oracle Adaptive Access UIOプロキシのデプロイメント前

- 6-2 UIOプロキシのデプロイメント後

- 6-3 UIOプロキシを使用しないログイン・フロー

- 6-4 UIOプロキシを使用しないログアウト

- 6-5 ログイン取得ページのフロー

- 6-6 ログイン・ページによるフィンガープリント取得後のOAAMサーバーの応答

- 6-7 フィンガープリントとパスワードの収集

- 6-8 OAAMサーバーでユーザーが初めて質問/回答を登録するフロー

- 6-9 ユーザーがBigBankをログアウトするフロー

- 6-10 ユーザーがOAAMサーバーで登録スキップを選択した後のフロー

- 6-11 逸脱フロー: OAAMサーバーによりブロックされたユーザー

- 8-1 Universal Installationのデプロイメント

- 12-1 オプション1

- 12-2 オプション2

- 12-3 オプション3のフロー

- 15-1 OAAMサーバーを追加した場合の標準的なトランザクション・フロー

- 15-2 BIPレポート

- 18-1 Juniper SSL VPNとOAAMの統合アーキテクチャ

- 18-2 Juniper SAおよび認証フローを実現するOAAM

- 18-3 Juniper SAおよびOAAMのパスワード忘れフロー

- 19-1 OAAMとのJMS統合

- 20-1 パーソナライズ

- 20-2 TextPad

- 20-3 PinPad

- 20-4 KeyPad

- 20-5 QuestionPad

- 20-6 ランダム化およびジッター

- 20-7 仮想認証デバイスの構成

- 21-1 OAAM標準Webアプリケーション

- 21-2 OAAMプロセッサ・フレームワーク

- 22-1 カスタム・ローダーの基本フレームワーク

- 22-2 デフォルトのロード実装

- 22-3 デフォルトの再生実装

- 22-4 ローダーまたは再生動作のオーバーライド

表一覧

- 2-1 デバイスのフィンガープリント処理API

- 2-2 認証前ルールの参照API

- 2-3 仮想認証デバイスのルールのAPI

- 2-4 汎用TextPad APIの生成

- 2-5 パーソナライズされたTextPadまたはKeyPad APIの生成

- 2-6 TextPadおよびKeyPad APIの表示

- 2-7 仮想認証デバイスの入力APIのデコード

- 2-8 ユーザーとパスワード検証のAPI

- 2-9 認証ステータス更新のAPI

- 2-10 認証後ルールの参照API

- 2-11 登録必須ルールの参照API

- 2-12 登録フロー

- 2-13 チャレンジ・ルール実行のAPI

- 2-14 ユーザーにチャレンジするAPI

- 2-15 チャレンジに対する回答の検証

- 3-1 .NETプロパティ・ファイル

- 3-2 ASP.NETアプリケーション

- 3-3 OAAM .NET API

- 4-1 addQuestion

- 4-2 authenticatePassword

- 4-3 authenticateQuestion

- 4-4 cancelAllTemporaryAllowsのパラメータ

- 4-5 clearSafeDeviceListのパラメータ

- 4-6 createOAAMSessionのパラメータ

- 4-7 エンティティの作成または更新API

- 4-8 createTransactionのパラメータと戻り値

- 4-9 createUser

- 4-10 deleteQuestion

- 4-11 getActionCountのパラメータ

- 4-12 getCaption

- 4-13 getFinalAuthStatusのパラメータ

- 4-14 getImage

- 4-15 getRulesDataのパラメータ

- 4-16 getSecretQuestion

- 4-17 getSignOnQuestions

- 4-18 getUserByLoginId

- 4-19 handleTrackerRequestのパラメータ

- 4-20 handleTransactionLogのパラメータ

- 4-21 IsDeviceMarkedSafeのパラメータ

- 4-22 markDeviceSafeのパラメータ

- 4-23 processPatternAnalysisのパラメータ

- 4-24 processRulesのパラメータ

- 4-25 resetUserのパラメータ

- 4-26 searchEntityByKey

- 4-27 setCaption

- 4-28 setImage

- 4-29 setPassword

- 4-30 setTemporaryAllowのパラメータ

- 4-31 updateAuthStatusのパラメータ

- 4-32 updateLogのパラメータ

- 4-33 updateTransactionのパラメータと戻り値

- 4-34 updateTransactionStatusのパラメータ

- 6-1 Windowsバイナリ・ファイル

- 6-2 Windowsデータファイル

- 6-3 Linuxバイナリ・ファイル

- 6-4 Linuxデータファイル

- 6-5 Windows UIOプロキシのバイナリ・ファイルのディレクトリ

- 6-6 Windows UIOプロキシのデータファイルのディレクトリ

- 6-7 Linux UIOプロキシのバイナリ・ファイルのディレクトリ

- 6-8 Linux UIOプロキシのデータファイルのディレクトリ

- 6-9 OAAM UIOプロキシの設定

- 6-10 UIO ApacheプロキシのLog4jロガー

- 6-11 インターセプタのコンポーネント

- 6-12 インターセプタに定義される条件

- 6-13 インターセプタに定義されるフィルタ

- 6-14 ProcessStringのエンコード/デコードのスキーム

- 6-15 UIOプロキシによりサポートされる事前定義済変数

- 6-16 OAAMサーバー・インタフェース

- 6-17 HTTP取得の設定

- 6-18 デフォルトのプロキシ動作をリストアする設定

- 6-19 サンプル構成のインターセプタ

- 9-1 アクション・タイプ・クラス

- 12-1 フラッシュ・ムービーのパラメータとレスポンス変数

- 13-1 flashFingerprint.do URLに対するパラメータ

- 13-2 vcrypt.fingerprint.type.enumの要素

- 16-1 OTP Anywhereの用語

- 16-2 SMTPサーバーへの接続

- 16-3 ベンダーへの接続

- 16-4 OTPの設定タスク

- 16-5 Oracle User Messaging Service ServerのURLと資格証明

- 16-6 Oracle User Messaging ServiceのOTPチャレンジ・タイプ

- 16-7 OTPプロファイル登録とプリファレンス設定の有効化

- 16-8 モバイル入力 - プロパティ・ファイル

- 16-9 モバイル入力 - リソース・バンドル

- 16-10 「ご使用条件」チェック・ボックス

- 16-11 ご使用条件のメッセージング

- 16-12 ご使用条件およびプライバシ・ポリシーのポップアップ・メッセージ

- 16-13 登録リソース・バンドル

- 16-14 チャレンジ・タイプ・リソース・バンドルのアイテム

- 16-15 チャレンジ・タイプ・リソース・バンドルのアイテム

- 16-16 OTPのオプトアウト・プロパティ

- 16-17 チャレンジ・タイプの列挙

- 16-18 SMSチャレンジ・プロセッサを登録するプロパティ

- 16-19 認証デバイス・タイプ

- 16-20 連絡先情報入力

- 16-21 電子メール入力

- 16-22 電話入力

- 16-23 IM入力

- 16-24 OTP電子メール・メッセージのカスタマイズ

- 16-25 OTP IMメッセージのカスタマイズ

- 16-26 チャレンジ・タイプの列挙

- 16-27 電子メール・チャレンジ・プロセッサを登録するプロパティ

- 16-28 IMチャレンジ・プロセッサを登録するプロパティ

- 17-1 モバイル・アプリケーション統合の概要

- 18-1 統合ステップ

- 18-2 SAML統合プロパティ

- 18-3 認証サーバーの作成

- 19-1 JMS定義

- 19-2 非同期統合オプションのインストール

- 19-3 JMSの構成プロパティ

- 19-4 Pythonで使用可能なオブジェクト

- 19-5 Pythonの式

- 20-1 VAD用語

- 20-2 オーセンティケータの要素

- 20-3 TextPadのオーセンティケータのプロパティ

- 20-4 PinPadのオーセンティケータのプロパティ

- 20-5 QuestionPadのオーセンティケータのプロパティ

- 20-6 KeyPadのオーセンティケータのプロパティ

- 20-7 独自のセキュリティ機能

- 20-8 行のプロパティ

- 20-9 各キーのプロパティ

- 20-10 仮想認証デバイス: メソッドのパラメータ

- 20-11 仮想認証デバイス: 追加フィールドの設定

- 21-1 AbstractTaskProcessor

- 21-2 チャレンジ・プロセッサのメソッド

- 21-3 チャレンジ・タイプのフラグ

- 21-4 連絡先入力のプロパティ

- 21-5 認証デバイス・タイプ

- 21-6 SessionDataオブジェクト

- 21-7 AbstractAuthManager

- 21-8 PasswordManagerIntf

- 21-9 UserDataManagerIntf

- 21-10 DefaultContactInfoManager

- 22-1 データ・ローダー・クラス

- 22-2 デフォルトの実装

- 22-3 デフォルトの再生実装

- 23-1 VCRYPT_TRACKER_USERNODE_LOGS

- 23-2 VCRYPT_ALERT

- 23-3 データ型に関する情報

- 23-4 generateTrxEntityViewSQLを実行する前に設定するプロパティ

- 23-5 エンティティ・ビューのエンティティ表

- 23-6 oaam_ent_ADDRESS

- 26-1 Oracle Directory Managerのプロパティ値の構成

- 26-2 Oracle Identity Managerのプロパティ値の構成

- 26-3 Oracle Directory Managerのプロパティ値の構成

- 27-1 トラブルシューティング・ツール

- 27-2 トラブルシューティングのヒント

- 27-3 問題およびヒント

はじめに

『Oracle Fusion Middleware Oracle Adaptive Access Manager開発者ガイド』では、Oracle Adaptive Access Managerによる統合とカスタム開発について説明します。

この章の内容は次のとおりです。

- 対象読者

- ドキュメントのアクセシビリティについて

- 関連ドキュメント

- 表記規則

対象読者

このドキュメントは、Oracle Adaptive Access Managerでの統合を担当する管理者と開発者を対象としています。

このドキュメントは、Webサーバー、Oracle Adaptive Access Manager、.NETとJava、および統合対象の製品に精通していることを前提としています。

ドキュメントのアクセシビリティについて

オラクル社のアクセシビリティへの取組みの詳細は、Oracle Accessibility ProgramのWebサイトhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=docaccを参照してください。

Oracleサポートへのアクセス

Oracleのお客様は、My Oracle Supportにアクセスして電子サポートを受けることができます。詳細は、http://www.oracle.com/pls/topic/lookup?ctx=acc&id=infoまたはhttp://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs (聴覚障害者向け)を参照してください。

関連ドキュメント

詳細は、Oracle Fusion Middleware 11g リリース2 (11.1.2)のドキュメント・セットに含まれる次のドキュメントを参照してください。

- 『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』

- 『Oracle Fusion Middleware Oracle Adaptive Access Manager Java APIリファレンス』

- 『Oracle Fusion Middleware Oracle Identity and Acess Managementインストレーション・プランニング・ガイド』

- 『Oracle Fusion Middleware Oracle Identity and Access Managementインストレーション・プランニング・ガイド』

- 『Oracle Fusion Middleware Oracle Identity Management Suite統合ガイド』

- 『Oracle Fusion Middleware Oracle Identity Managementエンタープライズ・デプロイメント・ガイド』

- 『Oracle Fusion Middleware Oracle Identity and Access Managementアップグレードおよび移行ガイド』

- 『Oracle Fusion Middleware高可用性ガイド』

- 『Oracle Fusion Middleware管理者ガイド』

- 『Oracle Fusion Middlewareパフォーマンスおよびチューニング・ガイド』

- 『Oracle Fusion Middleware Oracle Access Management管理者ガイド』

- 『Oracle Fusion Middleware Web Servicesセキュリティおよび管理者ガイド』

- 『Oracle Fusion Middleware Oracle Identity and Access Managementサードパーティ・アプリケーション・サーバー・ガイド』

表記規則

このマニュアルでは次の表記規則を使用します。

規則

意味

太字

太字は、操作に関連するGraphical User Interface要素、または本文中で定義されている用語および用語集に記載されている用語を示します。

イタリック体

イタリックは、ユーザーが特定の値を指定するプレースホルダ変数を示します。

固定幅フォント

固定幅フォントは、段落内のコマンド、URL、サンプル内のコード、画面に表示されるテキスト、または入力するテキストを示します。

1 開発者ガイドの概要

Oracle Adaptive Access Managerには、カスタム・アプリケーションやカスタム開発との統合に対応する各種メカニズムが用意されています。

『Oracle Fusion Middleware Oracle Adaptive Access Manager開発者ガイド』には、Oracle Adaptive Access Managerの統合とカスタマイズ、10gネイティブ・アプリケーションの移行、Oracle Adaptive Access Managerの統合されたデプロイメントにおける構成変更の管理に関して、開発者に役立つ情報が記載されています。

このマニュアルの内容は、次のように分類されています。

- 第I部: ネイティブ統合

- 第II部: Universal Installation Optionのプロキシ

- 第III部: カスタマイズと拡張

- 第IV部: Oracle Adaptive Access Managerの統合

- 第V部: カスタム開発

- 第VI部: ライフサイクル管理

- 第VII部: トラブルシューティングのヒント/FAQ

- 第VIII部: 用語集

Oracle Adaptive Access ManagerとOracle Identity ManagerおよびOracle Access Management Access Managerとの統合については、このマニュアルでは扱いません。その概念と手順の詳細は、『Oracle Fusion Middleware Oracle Identity Management Suite統合ガイド』を参照してください。

第I部

ネイティブ統合

第I部の次の各章には、Oracle Adaptive Access Managerの統合に使用するAPIに関する情報が含まれています。

- 第2章「Oracle Adaptive Access Managerのネイティブ統合」

- 第3章「ネイティブな.NETアプリケーションの統合」

- 第4章「OAAMとJavaアプリケーションとのネイティブ統合」

- 第5章「エンティティAPIを使用したエンティティの作成、更新および検索」

2 Oracle Adaptive Access Managerのネイティブ統合

Oracle Adaptive Access Managerをアプリケーションとネイティブ統合することで、高パフォーマンスなカスタマイズ性の高いセキュリティを実現できます。ネイティブ統合では、保護されるアプリケーション内に、プロセス内のOAAMが組み込まれます。アプリケーションでは、Oracle Adaptive Access Manager APIを直接起動して、リスクとチャレンジのフローにアクセスします。

この章では、サーバーが公開しているAPIを使用してOracle Adaptive Access Managerをクライアント・アプリケーションに統合する際のガイドラインを示しています。この開発者ガイドの他に、Javadocツールによって生成されるAPIドキュメントが使用可能です。このドキュメントは、HTMLとして提供され、Oracle Fusion Middleware Java API Reference for Oracle Adaptive Access Managerとして、HTML形式でIdentity Managementドキュメンテーション・ライブラリからダウンロードすることもできます。

この章では、次の内容を説明します。

- 第2.1項「OAAMネイティブ統合について」

- 第2.2項「スタート・ガイド」

- 第2.3項「仮想認証デバイス、ナレッジ・ベース認証、およびワンタイム・パスワードの統合」

2.1 OAAMネイティブ統合について

Oracle Adaptive Access Managerによって提供されるAPIで、デバイスのフィンガープリント処理、認証およびトランザクション・ログの収集、セキュリティ・ルールの実行、事前登録済の質問に対する正しい回答をユーザーに求めるチャレンジ、ワンタイム・パスワードの指定をユーザーに求めるチャレンジ、仮想認証デバイス(KeyPad、TextPad、またはQuestionPad)の生成を行えます。

2.1.1 ネイティブ統合について

OAAMネイティブ統合では、ログイン・プロセスの様々な段階でOAAM APIコールを組み込むようにクライアント・アプリケーションをカスタマイズします。ネイティブ統合では、クライアント・アプリケーションからOracle Adaptive Access Managerが直接起動されますが、認証およびチャレンジのフローはアプリケーションによって管理されます。

ネイティブAPIのオプションは、次のとおりです。

- Javaまたは.NETアプリケーションのSOAPサービス・ラッパーAPI

- Javaアプリケーション専用のIn-Proc(静的リンク・ライブラリ)

2.1.2 SOAPサービス・ラッパーAPIの統合

図2-1に、SOAPサービス・ラッパーAPI統合のシナリオを示します。このシナリオでは、アプリケーションはOAAMネイティブ・クライアントAPI (SOAPサービス・ラッパーAPI)を使用してOracle Adaptive Access Managerと通信します。アプリケーションはまた、Webサービスを介してOAAMと通信することもできます。

図2-1 SOAPサービス・ラッパーAPIの統合のシナリオ

SOAPサービス・ラッパーAPIでは、SOAPオブジェクトを作成してSOAPコールを起動したり、SOAPのWeb Service Definition Language (WSDL)やその他のWebサービス詳細をアプリケーション・コードから抽象化できます。このAPIのライブラリは、Java、.NETおよびC++で提供されています。この統合では、クライアント・ライブラリへの軽量クライアント・ライブラリ(JARまたはDLLファイル)の追加が必要になります。

2.1.3 In-Proc統合

図2-2に、In-Proc統合のシナリオを示します。このシナリオで関与するのはローカルAPIコールのみであるため、リモート・サーバーのリスク・エンジン・コール(SOAPコール)はありません。

図2-2 ローカルAPIコールを使用したIn-Proc統合のシナリオ

この統合では、アプリケーションにOracle Adaptive Access Managerの処理エンジンが埋め込まれるため、基礎となるデータベースを処理に直接活用することが可能になります。このシナリオでは、アプリケーションにサーバーのJARファイルと構成されたプロパティを適宜含める必要があります。

注意:

In-Proc統合は、OAAMが存在するWebLogicコンテナ上でのみ機能します。

2.1.4 SOAPサービス・ラッパーAPIとIn-Procメソッドの比較

ルール・エンジンと通信する場合、すべてのJARファイルをアプリケーション・サーバーにローカルで静的に組み込むかどうか、配布済ルール・エンジン(通常は、ルールを管理するホスト上にあります)に対してSOAPコールを行うかどうかを決定する必要があります。

SOAPコールを直接行うのではなく、SOAPサーバー・ラッパーAPIを使用することをお薦めします。この理由は、次のとおりです。

- SOAPオブジェクトはクライアント・ライブラリによって構成されているため、SOAPコールに関連する詳細はクライアント・アプリケーションから抽象化されます。

- SOAP APIのシグネチャを変更しても、クライアント・コードへの変更は生じません。

- このAPIでは、HTTPリクエストおよびHTTPセッション・オブジェクトからパラメータを直接抽出するための、より高いレベルのユーティリティ・メソッドが提供されています。

- フィンガープリント・データをエンコードおよびデコードするメソッドが提供されています。

In-Procのパフォーマンスが若干優れているとしても、これがすべてのJavaクライアントに適しているとはかぎりません。Oracle Adaptive Access ManagerがJ2EEまたはアプリケーションに組み込まれた独自のアプリケーションをクライアント側で開発する場合は、In-Procの使用をお薦めします。

In-Proc統合には、次のような利点があります。

- アプリケーションではSOAPコールを行わないため、TCP/IP接続を作成したり削除する必要がなくなります。

- ネットワークの待機時間が生じません。

- ロード・バランサを必要としません。

2.1.5 非ネイティブ統合: SOAPサービス

クライアント・アプリケーションへのOAAMクライアントのJARファイルまたはDLLファイルの組込みを望まない場合、SOAPサービスの直接的な使用をお薦めします。ただし、適応厳密認証機能を使用するには、ネイティブJavaまたは.NET統合を使用する必要があります。

OAAM SOAPサービスは、次の5つの主要モジュールで構成されています。

- VCryptCommonには、共通APIが含まれています。

- VCryptTrackerには、認証ログとトランザクション・ログのフィンガープリント処理および収集に対応するAPIが含まれています。

- VCryptAuthには、オーセンティケータおよびKBAモジュールへのアクセスに対応するAPIが含まれています。

- VCryptRulesEngineには、ルールの実行に対応するAPIが含まれています。

- VCryptCCには、カスタマ・ケア関連のリクエストの起動に対応するAPIが含まれています。

2.2 スタート・ガイド

この項では、OAAMサンプル・アプリケーションの設定方法について説明します。OAAMサンプル・アプリケーションは、ユーザーがOAAM APIに慣れることを目的としたデモンストレーション用アプリケーションです。これは、API使用方法の基本的な要素のみを提供しているため、本番コードとしての使用を対象としていません。ネイティブ統合を実装している場合は、OAAMサンプル・アプリケーションを参照として使用して、アプリケーションを開発できます。これらのデプロイメント用に開発されたカスタム・アプリケーションに対する直接サポートはありませんが、Oracleサポート・サービスでは、製品に関する問題、たとえば提供されているAPIの使用時に発生した問題などの解決を支援できます。

2.2.1 OAAMサンプル・アプリケーションのダウンロード

Java API統合の例を示す最新OAAMサンプル・アプリケーションは、Oracle Technology Networkの次のURLからダウンロードできます。

http://www.oracle.com/technetwork/index.html

注意:

このOAAMサンプル・アプリケーションは、タスク・プロセッサ・フレームワーク用のものとは異なります。どちらかのOAAMサンプル・アプリケーションを使用してください。ただし、一緒にはデプロイできません。

タスク・プロセッサの統合の詳細は、第21章「タスク・プロセッサの統合」を参照してください。

2.2.2 ネイティブSOAPベースのOAAMサンプル・アプリケーションの設定

この項では、ネイティブSOAPベースのOAAMサンプル・アプリケーションの設定方法について説明します。

2.2.2.1 前提条件

SOAPベースのOAAMサンプル・アプリケーションを設定する前に、次が必要です:

- Oracle Adaptive Access Managerのインストール、設定および実行

- Oracle Adaptive Access ManagerのSOAPサービスを有効にして、OAAMサンプル・アプリケーションのデプロイ先のホストからアクセス可能にする

- Oracle Adaptive Access Managerが使用するデータベース・ホスト、ユーザー名およびパスワードの詳細

- 次のURLにあるOracle Technology NetworkからダウンロードされたOAAMサンプル・アプリケーションと関連ファイル:
http://www.oracle.com/technetwork/index.html

- 最新のwebserviceclient+ssl.jarファイル。
webserviceclient+ssl.jarというランタイムJARファイルには、SSLのランタイム実装が含まれています。サンプル・アプリケーションをWebLogicコンテナにデプロイしない場合は、Oracle WebLogic Serverインストールからこのファイルを取得して、自分のクライアント・アプリケーション開発コンピュータにコピーします。

2.2.2.2 OAAMサンプル・アプリケーションのインストールおよび構成

SOAPベースのOAAMサンプル・アプリケーションを設定するには、次の手順を実行します。

1. oaam_sampleディレクトリを作成します。

2. oaam_sample_soap.zipファイルをoaam_sampleディレクトリに抽出します。

3. customer application deployment/WEB-INF/classesディレクトリで、oaam_custom.propertiesファイルを次のように編集します。

- vcrypt.tracker.soap.urlプロパティを設定します。

vcrypt.tracker.soap.url=http://host-name:port/oaam_server/services

この設定によって、アプリケーションが通信するWebサービスの場所が指定されます。このURLへのアクセスは、OAAM Webサービス・グループのユーザーに許可されています。

- SOAPクラスvcrypt.common.util.vcryptsoap.impl.classnameプロパティを設定します。
使用可能なオプションは、次のとおりです。

com.bharosa.vcrypt.common.impl.VCryptSOAPGenericImpl

この設定によって、OAAMサービスと交換するSOAPメッセージを作成するときにアプリケーションがどのライブラリを使用するかが指定されます。

- bharosa.image.dirlistを、OAAMイメージが格納されている絶対ディレクトリ・パスに設定します。

4. プロパティ・エディタを使用して、次のプロパティを設定します。

vcrypt.tracker.impl.classname=
com.bharosa.vcrypt.tracker.impl.VCryptTrackerSOAPImpl
vcrypt.user.image.dirlist.property.name=bharosa.image.dirlist
bharosa.config.impl.classname=com.bharosa.common.util.BharosaConfigPropsImpl
bharosa.config.load.impl.classname=
com.bharosa.common.util.BharosaConfigLoadPropsImpl
vcrypt.tracker.soap.useSOAPServer=true
vcrypt.soap.disable=false
vcrypt.soap.auth.keystoreFile=system_soap.keystore

SOAP認証が有効になっていない場合は、次のプロパティを設定します。

vcrypt.soap.auth=false

SOAP認証が有効になっている場合は、次のプロパティを設定します。

vcrypt.soap.auth=true
vcrypt.soap.auth.keystorePassword=Java-keystore-password
vcrypt.soap.auth.aliasPassword=Keystore-alias-password
vcrypt.soap.auth.username=SOAP-User-name

OAAM管理コンソールを使用したプロパティの設定方法は、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

5. OAAMサーバーが実行されているのと同じWebLogic Serverドメイン上にOAAMサンプル・アプリケーションをインストールする場合は、暗号化鍵関連のbharosa.cipher.encryption.algorithm.enumというプロパティをコメント・アウトしてください。
WebLogic Server以外またはIdentity Access Management WebLogic Server以外のドメインにデプロイする場合は、system_db.keystoreおよびsystem_config.keystoreの各キーストアを作成して、次のプロパティの値を設定する必要があります。

bharosa.cipher.encryption.algorithm.enum.DESede_config.keystorePassword
bharosa.cipher.encryption.algorithm.enum.DESede_config.aliasPassword

6. oaam_custom.propertiesファイルの変更がピックアップされるようにOAAMサンプル・アプリケーションを更新します。Oracle WebLogic管理コンソールに移動して、「デプロイメント」→「デプロイメントのサマリー」を選択します。「次へ」をクリックしてOAAMサンプル・アプリケーションを表示し、「更新」ボタンをクリックします。「終了」をクリックします。

7. 管理対象サーバーを起動します。

8. OAAM SOAPサービスへのアクセスが許可されるようにOAAM Webサービスのセキュリティを変更します。デフォルトでは、Oracle Web Services Manager (OWSM)によって保護されています。手順は次のとおりです。

1. Identity ManagementドメインのOracle Enterprise Manager Fusion Middleware Controlに、次のURLを使用してログインします。

http://weblogic-admin-hostname:port/em

2. 左ペインで「WebLogicドメイン」およびその下にあるOAAMドメインを開いて、oaam_server_server1を見つけます。

3. oaam_server_server1を右クリックして、「Webサービス」メニュー・オプションを選択します。

4. 「ポリシーのアタッチ」をクリックします。

5. 次ページでOAAM Webサービスに関連する行をすべて選択し、「次へ」ボタンをクリックします。

6. SOAP認証を有効にするには、行oracle/wss_http_token_service_policyを選択して「次へ」ボタンをクリックします。
SOAP認証を無効にするには、行oracle/no_authentication_service_policyおよびoracle/no_authorization_service_policyを選択して、「次へ」ボタンをクリックします。

7. 次のページで「アタッチ」ボタンをクリックします。

8. 必要に応じて、OAAMサーバーを再起動します。

9. Oracle WebLogic管理コンソールに移動します。「ロックして編集」をクリックして「デプロイメント」ノードを選択します。「デプロイメントのサマリー」ページで、OAAMサンプル・アプリケーションを検索して選択します。「起動」→「すべてのリクエストを処理」をクリックします。「はい」をクリックして確認します。

10. OAAM Adminアプリケーションにログインし、Oracle Adaptive Access Manager管理コンソールを使用してOAAMスナップショットoaam_base_snapshot.zipファイルをシステムにインポートします。スナップショットには、Oracle Adaptive Access Managerが必要とするポリシー、チャレンジ質問、依存コンポーネントおよび構成が含まれています。
OAAMスナップショットのインポートの詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

11. Sample_Transaction_Defs.zipファイルからトランザクション定義をインポートします。

12. Sample_Txn_Models.zipファイルからトランザクション・ポリシーをインポートします。

13. 次のURLに移動します。

http://host-name:port/oaam_sample

OAAMサンプル・アプリケーションのログイン・ページが表示されます。

14. ユーザー名を入力し、次ページにパスワードを入力します。登録プロセスを経た後で、OAAMサンプル・トランザクションへのリンクが表示されます。

注意:

最初のログイン時のパスワードはtestである必要があります。このパスワードはすぐに変更してください。

2.2.3 ネイティブIn-ProcベースのOAAMサンプル・アプリケーションの設定

この項では、ネイティブIn-ProcベースのOAAMサンプル・アプリケーションの設定方法について説明します。

2.2.3.1 前提条件

ネイティブIn-ProcベースのOAAMサンプル・アプリケーションを設定するには、事前に次の処理を行っておく必要があります。

- OAAM Adminをインストール、構成および実行する

- Oracle Adaptive Access ManagerのSOAPサービスを有効にして、OAAMサンプル・アプリケーションのデプロイ先のホストからアクセス可能にする

- Oracle Adaptive Access Managerが使用するデータベース・ホスト、ユーザー名およびパスワードの詳細を入手する

- 次のURLにあるOracle Technology NetworkからOAAMサンプル・アプリケーションと関連ファイルをダウンロードする:
http://www.oracle.com/technetwork/index.html

2.2.3.2 インストールおよび構成

ネイティブIn-ProcベースのOAAMサンプル・アプリケーションを設定するには、次の手順を実行します。

1. oaam_sampleディレクトリを作成します。

2. oaam_sample_inproc.zipファイルをoaam_sampleディレクトリに抽出します。

3. WebLogic Serverを起動します。

4. 次の場所のOracle WebLogic管理コンソールに移動します。

http://oaam_host:port/console

5. OAAM共有ライブラリ$MW_HOME\Oracle_IDM1\oaam\oaam_libs\war\oaam_native_lib.warを共有ライブラリとしてデプロイします。

1. 「制御」タブの「デプロイメントのサマリー」にある「IAMDomain」(左側のペイン)で、「デプロイメント」をクリックします。

2. 「インストール」ボタンをクリックします。このパスで$MW_HOME\Oracle_IDM1\oaam\oaam_libs\warを指定し、oaam_native_lib.warを選択します。「次へ」をクリックします。

3. 「このデプロイメントをライブラリとしてインストールする」オプションを選択します。「次へ」をクリックします。

4. 「デプロイ・ターゲットの選択」ページで、サーバーのリストから管理対象サーバーを選択し、「次へ」をクリックします。共有ライブラリの名前はoracle.oaam.libsです。
管理対象サーバーがOAAMサーバーの場合、OAAMデータソースを作成する必要はありません。そうでない場合は、jdbc/OAAM_SERVER_DB_DSというJNDI名でデータソースを作成して、OAAMデータベース・スキーマの接続詳細を指定します。

5. 「終了」をクリックします。

6. OAAM共有ライブラリのデプロイ先である管理対象サーバーに、OAAMサンプル・アプリケーションをアプリケーションとしてデプロイします。

1. 「制御」タブの「デプロイメントのサマリー」にある「IAMDomain」(左側のペイン)で、「デプロイメント」をクリックします。

2. 「インストール」ボタンをクリックします。パスで、OAAMサンプル・アプリケーションの場所を指定します。「次へ」をクリックします。

3. 「このデプロイメントをアプリケーションとしてインストールする」オプションを選択します。「次へ」をクリックします。

4. 「デプロイ・ターゲットの選択」ページで、サーバーのリストから管理対象サーバーを選択し、「次へ」をクリックします。

5. 「終了」をクリックします。

7. 「チェンジ・センター」の「変更のアクティブ化」をクリックします。

8. デプロイメント・ディスクリプタ・ファイルで、OAAM共有ライブラリoracle.oaam.libsへの参照を設定します。
Oracle Adaptive Access Managerの共有ライブラリをWebアプリケーションで使用するには、WebLogicデプロイメント記述子ファイルweblogic.xmlに次のエントリを追加して、その共有ライブラリを参照する必要があります。

<library-ref>
<library-name>oracle.oaam.libs</library-name>
</library-ref>

Oracle Adaptive Access Managerの共有ライブラリをエンタープライズ・アプリケーションで使用するには、WebLogicデプロイメント記述子ファイルweblogic-application.xmlに次のエントリを追加して、その共有ライブラリを参照する必要があります。

<library-ref>
<library-name>oracle.oaam.libs</library-name>
</library-ref>

9. 管理対象サーバーを起動します。

10. Oracle WebLogic管理コンソールに移動します。「ロックして編集」をクリックして「デプロイメント」ノードを選択します。「デプロイメントのサマリー」ページで、OAAMサンプル・アプリケーションを検索して選択します。「起動」→「すべてのリクエストを処理」をクリックします。「はい」をクリックして確認します。

11. OAAM Adminアプリケーションにログインし、Oracle Adaptive Access Manager管理コンソールを使用してOAAMスナップショットoaam_base_snapshot.zipファイルをシステムにインポートします。スナップショットには、Oracle Adaptive Access Managerが必要とするポリシー、チャレンジ質問、依存コンポーネントおよび構成が含まれています。
OAAMスナップショットのインポートの詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

12. 次のURLに移動します。

http://managed_server:port/oaam_sample

OAAMサンプル・アプリケーションのログイン・ページが表示されます。

13. 次のページで、ユーザー名とパスワードを入力します。登録プロセスを経た後で、OAAMサンプル・トランザクションへのリンクが表示されます。

注意:

最初のログイン時のパスワードはtestである必要があります。このパスワードはすぐに変更してください。

2.3 仮想認証デバイス、ナレッジ・ベース認証、およびワンタイム・パスワードの統合

認証フローは、セキュリティ制約に従ってリソースへのアクセスを要求する個人または他のエンティティのIDを検証するために使用されるプロセスです。マルチファクタ認証とは、様々なファクタを同時に使用して個人または他のエンティティを認証するシステムです。

次の統合フローの例では、仮想認証デバイス、ナレッジ・ベース認証およびワンタイム・パスワードが統合されています。

仮想認証デバイスは、認証資格証明の入力と送信のプロセスにおいて、エンド・ユーザー情報の保護に使用されるオーセンティケータ・インタフェースで、エンド・ユーザーは、有効なアプリケーションに対して認証していることを確認できます。OAAMには、非常にセキュアな仮想認証デバイス一式が、ユーザーの選択に応じてデプロイできるサンプルとして組み込まれています。これらのサンプルの変更は、カスタム開発と見なされます。デプロイメントでローカライゼーションがサポートされている場合は、デプロイメント・チームが、グローバル化された仮想認証デバイスのイメージ・ファイルを登録フローを含めて開発する必要があります。

ナレッジベース認証(KBA)は、登録済チャレンジ質問に基づいてインフラストラクチャを提供するセカンダリ認証方式です。これにより、エンドユーザーは、質問を選択して、必要に応じてシステムが後でチャレンジするきに必要な回答を提供できます。セキュリティ管理には、次のものがあります。

- チャレンジ質問および回答の登録を管理する登録ロジック

- チャレンジのレスポンス・プロセスで適切な回答をインテリジェントに検出する回答ロジック

- 登録時にユーザーから提供された回答の検証

Oracle Adaptive Access Managerでのプロパティの設定方法については、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』のナレッジ・ベース認証の管理に関する項を参照してください。

ワンタイム・パスワードはリスク・ベースのチャレンジ・ソリューションであり、構成済のアウト・オブ・バンド・チャネルを経由してエンドユーザーに送信されるサーバー生成のワンタイム・パスワードから構成されます。　サポートされるOTP配信チャネルには、ショート・メッセージ・サービス(SMS)、電子メール、インスタント・メッセージング(IM)などがあります。OTPは、KBAチャレンジを補完するために使用することも、KBAのかわりに使用することもできます。

詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』のOTP Anywhereの設定に関する項を参照してください。

図2-3では、3つのソリューション(仮想認証デバイス、KBAおよびOTP)を使用した認証フローの例を説明しています。ここに示すフローは例であり、他の認証フローも考えられます。

チェックポイントとルーの詳細は、以降の各項で説明します。

- ユーザー名のページ(c1)

- デバイスのフィンガープリントのフロー(r2)

- 認証前ルールの実行(r1)

- 仮想認証デバイスのルールの実行(r3)

- 仮想認証デバイスの入力のデコード(p3)

- ユーザーとパスワードの検証(c2)

- 認証後ルールの実行(r4)

- ユーザーの登録のチェック(p5)

- 登録必須ルールの実行(r5)

- 登録フローの入力(p6)

- チャレンジのルールの実行(r6)

- 認証ルールの実行(r7)

- ユーザーへのチャレンジ(p7)

- チャレンジに対する回答のチェック(c4)

- ロックアウト・ページ(c6)

- ランディングまたはスプラッシュ・ページ(c5)

図2-3 仮想認証デバイス、ナレッジ・ベース認証およびOTPのシナリオ

2.3.1 ユーザー名ページ(c1)

アプリケーションでカスタム・ログイン・ページを使用する場合は、ログイン・ページを2つのページに分割する必要があります。ユーザー名の送信を要求するページが表示されます。ユーザーがこの最初のページにログインID(ユーザー名)を入力すると、このユーザー名がHTTPセッションに格納されます。ユーザー名ページに続いて、フラッシュCookieとセキュアCookieを取得し、ユーザー・デバイスのフィンガープリントを処理するための一時ページが表示されます。図2-4に、ユーザー名ページの例を示します。

図2-4 ユーザー名ページ

シングル・ログイン・ページを使用するようにOAAMが構成されている場合、仮想認証デバイスはフローで使用されません。チャレンジSMS、登録済のイメージおよびキャプション、チャレンジ電子メール、およびチャレンジ質問の各ルールでOAAM HTMLパッドを使用するようにOAAM AuthenticationPadポリシーが構成されているか、OAAM拡張共有ライブラリを使用してOAAM HTML Padを使用するようにOAAMサーバーが構成されています。シングル・ログイン・ページの詳細は、第8.5項「シングル・ログイン・ページの有効化」を参照してください。

2.3.2 デバイスのフィンガープリントのフロー(r2)

デバイスのフィンガープリント処理では、ブラウザ・タイプ、ブラウザ・ヘッダー、オペレーティング・システム・タイプ、ロケールなどのデバイスに関する情報が収集されます。フィンガープリント・データは、デバイスについてログイン・プロセス中に収集されるデータを表します。このデータは、ユーザーがシステムへのログインに使用するデバイスの識別に必要です。フィンガープリント処理プロセスでは、ユーザー固有のフィンガープリントが生成されます。フィンガープリント詳細は、デバイスの識別、それがセキュアであるかどうかの確認および認証またはトランザクションのリスク・レベルの特定に役立ちます。表2-1に、デバイスのフィンガープリント処理に使われるAPIを示します。

表2-1 デバイスのフィンガープリント処理API

モジュール

API

説明

サーバー

VCryptTracker::updateLog()

フィンガープリントを作成するAPIは、次のとおりです。

- VCryptServletUtil.getBrowserFingerPrint(userAgent, language, country, variant);

- VCryptServletUtil.getFlashFingerPrint(client, fpStr);

updateLog()の詳細は、第4.5.32項「updateLog」を参照してください。

Oracle Adaptive Access Managerのサンプル

handleJump.jsp

handleJump.jsp:

1. クライアントのタイムゾーンを設定します。

2. セキュアCookieを設定します。

3. ブラウザのフィンガープリントを設定します。

4. ステータスを保留中に設定します。

5. 認証前ルールをコールします。処理続行をユーザーに許可する場合はALLOWが、ユーザーの処理続行を停止する場合はBLOCKまたはERRORが返されます。

6. セッション・データbharosaSessionを格納します。

7. パスワード・ページpassword.jpsを表示します。

Oracle Adaptive Access Managerのサンプル

handleFlash.jsp

handleFlash.jsp sets the Flash cookie if the browser is Flash-enabled.

デバイス識別のCookie

Oracle Adaptive Access Managerでは、2つのタイプのCookieを使用してデバイス識別を実行します。

1つはブラウザCookie(セキュアなCookieとも呼ばれます)であり、もう1つはFlash Cookie(デジタルCookieとも呼ばれます)です。

ブラウザCookie値は、ブラウザのユーザー・エージェント文字列を使用して作成されます。Flash Cookie値は、OAAMのFlash動画データを使用して作成されます。

次のサンプル・コードは、ブラウザCookieとフラッシュCookieを使用したデバイスのフィンガープリント処理方法を示しています。詳細は、handleFlash.jspのコードを参照してください。

//Get Browse/Secure cookie
String secureCookie = getCookie(request, "bharosa");
Locale locale = request.getLocale();
String browserFp = VCryptServletUtil.getBrowserFingerPrint(request.getHeader("user-agent"),
locale.getLanguage(),
locale.getCountry(), locale.getVariant());

String client = request.getParameter("client");
String fpStr = request.getParameter("fp");
String flashFp = bharosaHelper.constructFlashFingerPrint( client, fpStr );

//Get the flash cookie
String flashCookie = request.getParameter("v");
CookieSet cookieSet = bharosaHelper.fingerPrintFlash(bharosaSession, bharosaSession.getRemoteIPAddr(), request.getRemoteHost(),
BharosaEnumAuthStatus.PENDING, secureCookie, browserFp, flashCookie, flashFp);

2.3.3 認証前ルールの実行(r1)

また、認証前ルールはユーザーが認証される前に実行されます。認証前チェックポイントによって返される共通の値は、次のとおりです。

- ALLOW: ユーザーに続行を許可します。

- BLOCK: ユーザーを続行からブロックします。

表2-2に、認証前に使用するAPIを示します。

表2-2 認証前ルールの参照API

モジュール

API

説明

サーバー

VCryptRulesEngine::processRules()

メソッドの詳細は、第4.5.24項「processRules」を参照してください。

Oracle Adaptive Access Managerのサンプル

handleJump.jsp

handleJump.jsp:

1. 認証前ルールを起動します。

2. パスワード・ページpassword.jspに進む場合はALLOWを返し、エラーを通知する場合はBLOCKまたはERRORを返します。

3. Stores bharosaSession

BharosaHelper

BharosaHelper::runPreAuthRules()

2.3.4 仮想認証デバイスのルールの実行(r3)

Authentipadチェックポイントによって、使用する仮想認証デバイスが判別されます。ユーザーがイメージまたはフレーズを登録していない場合は、汎用TextPadがルールによって割り当てられます。ユーザーが登録している場合は、パーソナライズされたTextPadまたはKeyPadのいずれかがルールによって割り当てられます。仮想認証デバイスによって返される共通の値は、次のとおりです。

- 汎用TextPad: デフォルトの汎用TextPadを使用します。

- TextPad: パーソナライズされたTextPadを使用します。

- KeyPad: パーソナライズされたKeyPadを使用します。

パーソナライズされたTextpadは、キーボードを使用してパスワードまたはPINを入力するためのデバイスです。このデータ入力方法は、フィッシングからの防御に役立ちます。TextPadは、大規模デプロイメントのすべてのユーザーに対してデフォルトとしてデプロイできます。その後、各ユーザーは必要に応じて別のデバイスにアップグレードできます。ユーザーが登録した個人イメージおよびフレーズは、ユーザーが有効なWebサイトにログインするたびに表示され、ユーザーとサーバーとの間の共有シークレットとして機能します。

Keypadは、入力用のキーボードを使用してパスワード、クレジットカード番号などを入力するためのデバイスです。KeyPadによって、トロイの木馬やキーロギングからの保護が提供されます。

表2-3に、仮想認証デバイスのルールを実行するAPIを示します。

表2-3 仮想認証デバイスのルールのAPI

モジュール

API

説明

サーバー

VCryptRulesEngine::processRules()

メソッドの詳細は、第4.5.24項「processRules」を参照してください。

Oracle Adaptive Access Managerのサンプル

password.jsp

password.jsp:

1. ユーザーの仮想認証デバイスのタイプを識別するルールを起動します。

2. 仮想認証デバイスを作成し、それに名前を付けて、初期のすべての背景フレームを設定します。

3. 構成済のkbimage.jspを起動します。

4. ページhandlePassword.jspに進みます。

BharosaHelper

BharosaHelper::getAuthentiPad()

2.3.5 汎用TextPadの生成(p1)

ユーザーがイメージおよびフレームをまだOAAMに登録していない場合は、図2-5に示すように、一般的な、パーソナライズされていないTextPadが表示されます。

このデバイスには特定のイメージまたはフレーズはありませんが、ログイン・プロンプトの正当性の証明に役立つタイムスタンプが表示されます。

図2-5 一般的な、パーソナライズされていないTextPad

表2-4に、汎用TextPadの生成に使用するAPIを示します。

表2-4 汎用TextPad APIの生成

モジュール

API

説明

サーバー

VCryptAuth::getUserByLoginId()

VCryptAuthのインスタンスを取得するには、VCryptAuthUtil.getVCryptAuthInstance()をコールします。

メソッドの詳細は、第4.5.18項「getUserByLoginId」を参照してください。

Oracle Adaptive Access Managerのサンプル

Password.jsp

Password.jsp

- 使用する仮想認証デバイスのタイプを識別するルールを起動します。デフォルトはKeyPadです。

- 仮想認証デバイスを作成し、それに名前を付けて、初期のすべての背景フレームを設定します。

- 構成済のkbimage.jspを起動します。

- ページhandlePassword.jspに進みます。

BharosaHelper

BharosaHelper:: createPersonalizedAuthentiPad ()

BharosaHelper::createAuthentiPad()

クライアント

AuthentiPad::getHTML()

2.3.6 パーソナライズされたTextPadまたはKeyPadの生成(p2)

ユーザーがフレーズとイメージをOAAMに登録している場合は、ユーザーに対してパーソナライズされたTextPadが使用されます。図2-6と図2-7に、パーソナライズされたテキストおよび生成される重要な仮想認証デバイスを示します。

表2-5に、パーソナライズされたTextPadまたはKeyPadの生成に使用するAPIを示します。

表2-5 パーソナライズされたTextPadまたはKeyPadのAPIの生成

モジュール

API

説明

サーバー

VCryptAuth::getUserByLoginId()

メソッドの詳細は、第4.5.18項「getUserByLoginId」を参照してください。

Oracle Adaptive Access Managerのサンプル

password.jsp

password.jsp

- 使用する仮想認証デバイスのタイプを識別するルールを起動します。デフォルトはKeyPadです。

- 仮想認証デバイスを作成し、それに名前を付けて、初期のすべての背景フレームを設定します。

- ページhandlePassword.jspに進みます。

- 構成済のkbimage.jspを起動します。

BharosaHelper

BharosaHelper:: createPersonalizedAuthentiPad ()

BharosaHelper::createAuthentiPad()

クライアント

AuthentiPad::getHTML()

2.3.7 TextPadおよびKeyPadの表示(s2およびs3)

TextPadおよびKeyPadを表示するHTMLコードの例を、パスワード・ページに埋め込む必要があります。このHTMLではJavaScriptを使用してTextPadまたはKeyPadがレンダリングされます。また、TextPadまたはKeyPadイメージを取得するための、サーバーへのHTTPリクエストを実行する<img>タグが含まれています。

表2-6に、TextPadおよびKeyPadの表示に使用するAPIを示します。

表2-6 TextPadおよびKeyPad APIの表示

モジュール

API

説明

サーバー

VCryptAuth::getUserByLoginId()

Oracle Adaptive Access Managerのサンプル

password.jsp

password.jsp

- 使用する仮想認証デバイスのタイプを識別するルールを起動します。デフォルトはKeyPadです。

- 仮想認証デバイスを作成し、それに名前を付けて、初期のすべての背景フレームを設定します。

- 構成済のkbimage.jspを起動します。

- ページhandlePassword.jspに進みます。

Oracle Adaptive Access Managerのサンプル

kbimage.jsp

仮想認証デバイスを出力します。

BharosaHelper

BharosaHelper:: createPersonalizedAuthentiPad ()

BharosaHelper::createAuthentiPad()

BharosaHelper::imageToStream()

クライアント

AuthentiPad::getHTML()

KeyPadUtil::encryptImageToStream()

図2-6に、パーソナライズされたTextPadを示します。

図2-6 パーソナライズされたTextPad

図2-7に、パーソナライズされたKeyPadを示します。

図2-7 パーソナライズされたKeyPad

イメージとフレーズが、ユーザーのローカル・タイムゾーンにおける現在のタイムスタンプとともにデバイスに埋め込まれています。

2.3.8 仮想認証デバイスの入力のデコード(p3)

この段階では、ユーザーが指定したデータが、選択した仮想認証デバイスによってデコードされます。デコードされた値はRAWテキスト・フォーマットで出力されます。デコードされた値は、HTTPセッションに保存しておくことをお薦めします。仮想認証デバイスのオブジェクトはシリアライズされ、データベースまたはファイルシステムに格納されます。仮想認証デバイスは、システムが入力のデコードに使用するため、セッション中に格納されます。これは、PinPadやKeyPadのように、ユーザー入力がクリアテキストではない仮想認証デバイスで必要とされます。整合性を確保するために、この処理はすべての仮想認証デバイスで実行されます。仮想認証デバイスは、相互に交換できるように設計されているからです。

表2-7に、ユーザー入力のデコードに使用するAPIを示します。

表2-7 仮想認証デバイスの入力APIのデコード

モジュール

API

説明

Oracle Adaptive Access Managerのサンプル

handlePassword.jsp

handlePassword.jsp

- パスワードを取得します。

- パスワードをデコードします。

- ユーザーを検証します。

BharosaHelper

BharosaHelper::decodePadInput()

仮想認証デバイスのオブジェクトをHTTPセッションから削除します。

クライアント

KeyPadUtil::decodeKeyPadCode

2.3.9 ユーザーとパスワードの検証(c2)

この段階は、クライアントがローカルAPIを起動してユーザーを認証し、認証結果がOAAMサーバーに渡されるという、クライアントの既存のプロセスを表しています。使用するAPIについては、表2-8で詳述します。

表2-8 ユーザーとパスワード検証のAPI

モジュール

API

説明

Oracle Adaptive Access Managerのサンプル

handlePassword.jsp

handlePassword.jsp

- パスワードを取得します。

- パスワードをデコードします。

- ステータスをSUCCESSに更新します(ユーザーが有効な場合)。または、INVALID、ERRORまたはBAD PASSWORDに更新します(ユーザーが無効な場合)。

- 認証後ルールを実行して、次の値のいずれかを返します。

- REGISTER_USER_OPTIONAL

- REGISTER_QUESTIONS

- REGISTER_USER

- CHALLENGE

2.3.10 認証ステータスの更新(p4)

ユーザーのパスワード検証後に、表2-9に説明するAPIを使用してステータスが更新されます。

表2-9 認証ステータス更新のAPI

モジュール

API

説明

サーバー

VCryptTracker::updateAuthStatus()

メソッドの詳細は、第4.5.31項「updateAuthStatus」を参照してください。

Oracle Adaptive Access Managerのサンプル

handlePassword.jsp

handlePassword.jsp

- パスワードを取得します。

- パスワードをデコードします。

- ユーザーを検証します。

- registerImageandPhraseが表示されるか、登録ユーザーにチャレンジします。

BharosaHelper

BharosaHelper::updateStatus()

2.3.11 パスワードのステータス(c3)

パスワード認証ステータスに応じて、再試行ページが表示されるか、認証後のページに進みます。

2.3.12 認証後ルールの実行(r4)

これらのルールは、ユーザー・パスワードの認証後に実行されます。認証後によって返される共通のアクションは、次のとおりです。

- ALLOW

- BLOCK

- CHALLENGE

認証後の結果がALLOWの場合、ユーザーを登録する必要があるかどうかが判別され、ユーザーが登録フローに送られます。認証後の結果がBLOCKの場合、ユーザーはブロックされ、アクセスを試みたWebアプリケーションにアクセスできなくなります。認証後の結果がCHALLENGEであり、ユーザーが1つ以上のチャレンジ・メカニズムにすでに登録されている場合、ユーザーはチャレンジ・フローに送られます。

認証後に使用されるAPIを表2-10に示します。

表2-10 認証後ルールの参照API

モジュール

API

説明

サーバー

VCryptRulesEngine::processRules()

メソッドの詳細は、第4.5.24項「processRules」を参照してください。

Oracle Adaptive Access Managerのサンプル

handlePassword.jsp

次の値を返すBharosaHelper::runPostAuthRulesをコールします。

- ALLOW

- BLOCK

- CHALLENGE

ALLOWの場合、BharosaHelper::runRegistrationRulesは次の値を返します。

- ALLOW

- REGISTER_QUESTIONS

- REGISTER_USER_INFO

- REGISTER_USER

- SYSTEM_ERROR

CHALLENGEの場合:

forward_challengePage

BharosaHelper

BharosaHelper::runPostAuthRules()

2.3.13 ユーザーの登録の確認(p5)

登録確認ルールが実行されます。ユーザーが未登録の場合は、登録するよう指示されます。

2.3.14 登録必須ルールの実行(r5)

ビジネスおよびセキュリティ要件によって、登録が必須か、または任意であるかが指定されます。登録ルールによって返される値は、次のとおりです。

- Register: ユーザー登録を必要とします。

- Registration Optional: ユーザー登録は任意です。

- Skip Registration: このセッションの登録をスキップします。

表2-11に、登録ルールの実行に使用されるAPIを示します。

表2-11 登録必須ルールの参照API

モジュール

API

説明

サーバー

VCryptRulesEngine::processRules()

メソッドの詳細は、第4.5.24項「processRules」を参照してください。

Oracle Adaptive Access Managerのサンプル

password.jsp

password.jsp

- 使用する仮想認証デバイスのタイプを識別するルールを起動します。デフォルトはKeyPadです。

- 仮想認証デバイスを作成し、それに名前を付けて、初期のすべての背景フレームを設定します。

- 構成済のkbimage.jspを起動します。

- ページhandlePassword.jspに進みます。

BharosaHelper

BharosaHelper::getAuthentiPad()

2.3.15 登録フローに入る(p6)

登録とは、アカウントを新規に開く場合など、ユーザーに情報を求めるイベントからなる登録プロセスのことです。登録フローにより、ユーザーは質問、イメージ、フレーズおよびOTP(電子メール、電話など)の登録を許可されます。登録が成功すると、KBAとOTPをセカンダリ認証ファクタとして使用してユーザーにチャレンジできます。

表2-12では、登録フローのモジュールとAPIについて説明しています。

表2-12 登録フロー

モジュール

API

説明

サーバー

VCryptRulesEngine::processRules()

メソッドの詳細は、第4.5.24項「processRules」を参照してください。

Oracle Adaptive Access Managerのサンプル

registerImagePhrase.jsp

registerImagePhrase.jsp

- 新規イメージとキャプションをユーザーに割り当てます。

- 新規イメージとキャプションをユーザーに割り当てます。

- ページhandleRegisterImagePhrase.jspに進みます。

registerQuestions.jsp

registerQuestions.jsp

- ユーザーの質問選択セットを取得します。

- 質問選択のユーザー・インタフェースと回答用の入力を表示します。

- ページhandleRegisterQuestions.jspに進みます。

registerContactInfo.jsp

registerContactInfo.jsp

- OTP登録情報用の入力をユーザーに提示します。

- ページhandleRegisterContactInfo.jspに進みます。

BharosaHelper

BharosaHelper::getAuthentiPad()

BharosaHelper::createSampleAuthentiPad

BharosaHelper::assignRandomImageAndCaption

BharosaHelper::saveNewImageAndOrCaption

BharosaHelper::getQuestions

BharosaHelper::isDeviceRegistered

BharosaHelper::setContactInfo

2.3.16 チャレンジ・ルールの実行(r6)

チャレンジ・ルールは、ユーザーに表示するチャレンジのタイプを判別するために起動されます。チャレンジ・ルールによって返される値は、次のとおりです。

- ChallengeQuestion: ユーザーに質問でチャレンジします。

- ChallengeSMS: ユーザーにSMSを通してOTPでチャレンジします。

- ChallengeEmail: ユーザーに電子メールを通してOTPでチャレンジします。

- BLOCK: ユーザーをブロックします。

表2-13に、チャレンジ・ルールの実行に使用されるAPIを示します。

表2-13 チャレンジ・ルール実行のAPI

モジュール

API

説明

サーバー

VCryptRulesEngine::processRules()

メソッドの詳細は、第4.5.24項「processRules」を参照してください。

Oracle Adaptive Access Managerのサンプル

handleChallenge.jsp

handleChallenge.jspはBharosaHelper::validateAnswerをコールします。

このメソッドがBharosaEnumChallengeResult.SUCCESSを返した場合、ステータスはSUCCESSに更新され、ユーザーは続行できるようになります。BharosaEnumChallengeResult.WRONG_ANSWERが返された場合は、次のステップを判別するためにチャレンジ・ルールが再実行されます。

BharosaHelper

BharosaHelper::validateAnswer()

2.3.17 認証ルールの実行(r7)

BharosaHelper::getAuthentiPadは、認証デバイスの作成に使用します。このメソッドは認証デバイスのルールをコールして、使用するデバイスを判別します。

ユーザーが質問でチャレンジされる場合、このルールはQuestionPadを割り当てます。ユーザーがOTPでチャレンジされる場合、このルールはTextPadを割り当てます。

2.3.18 ユーザーにチャレンジする(p7)

ユーザーは、必要に応じて、ナレッジ・ベース認証(KBA)またはOTP(ワンタイム・パスワード)のいずれかでチャレンジされます。

KBAは既存のユーザーID/パスワード認証の拡張であり、ユーザーが質問でチャレンジされるチャレンジ/レスポンス・プロセスを使用してアプリケーションのセキュリティを保証します。ユーザーは、リクエストしたサインオン、トランザクション、サービスなどの処理を続行するためには、質問に正しく回答する必要があります。

OTPも既存のユーザーID/パスワード認証の拡張であり、特別のセキュリティ・レイヤーを追加してアプリケーションを保護します。OTPはユーザーIDとパスワードの検証後に生成され、アプリケーションで必要と見なされた場合に電子メールまたは携帯電話を通してユーザーに配布されます。その後、ユーザーはこのOTPを使用してアプリケーションにサインインします。

表2-14に、登録済の質問でユーザーにチャレンジするAPIを示します。

表2-14 ユーザーにチャレンジするAPI

モジュール

API

説明

サーバー

VCryptAuth::getSecretQuestion()

VCryptTracker::generateOTP()

Oracle Adaptive Access Managerのサンプル

Challenge.jsp

使用するチャレンジのタイプを判別します。BharosaHelper::runChallengeRules

返されたチャレンジ・タイプがKBA (ChallengeQuestion)である場合は、VCryptAuth:getUserQuestionでユーザーの質問を取得してください。

チャレンジ・タイプがOTP (ChallengeSMS、ChallengeEmailなど)の場合は、OTPコードの生成、格納、送信を行ってください。

- BharosaHelper::generateOTP

- BharosaHelper::sendCode

認証パッド・ルールを使用して、ユーザーに表示するauthentipadを判別します。第2.3.4項「仮想認証デバイスのルールの実行(r3)」を参照してください。

回答をhandleChallenge.jpsに送信します。

handleChallenge.jspはユーザー入力を収集し、チャレンジに対するにユーザー回答の検証に使用されるBharosaHelper::validateAnswerをコールします(質問チャレンジと同様)。

BharosaHelper

BharosaHelper:: createPersonalizedAuthentiPad ()

BharosaHelper::createAuthentiPad()

BharosaHelper::generateOTP

BharosaHelper::sendCode

BharosaHelper::getUserQuestion

クライアント

AuthentiPad::getHTML()

2.3.19 チャレンジに対する回答の確認(c4)

この段階では、チャレンジに対するユーザーの入力を検証します。

- KBAの場合、Oracle Adaptive Access Managerサーバーがコールされて、ユーザーが指定した回答が登録済の返答と一致するかどうかを判別します。

- OTPの場合、ユーザーの入力値と、生成されてユーザーに送信されたOTPの入力値が比較されます。

表2-15に、チャレンジの検証に使用されるAPIを示します。

表2-15 チャレンジに対する回答の検証

モジュール

API

説明

サーバー

VCryptAuth::authenticateQuestion()

VCryptRulesEngine::processRules()

VCryptTracker::updateAuthStatus()

メソッドの詳細は、第4.5.24項「processRules」および第4.5.31項「updateAuthStatus」を参照してください。

Oracle Adaptive Access Managerのサンプル

handleChallenge.jsp

BharosaHelper::validateAnswerを呼び出します。

このメソッドがBharosaEnumChallengeResult.SUCCESSを返した場合、ステータスはSUCCESSに更新され、ユーザーは続行できるようになります。BharosaEnumChallengeResult.WRONG_ANSWERが返された場合は、次のステップを判別するためにチャレンジ・ルールが再実行されます。

BharosaHelper

BharosaHelper:: validateAnswer()

検証中のチャレンジのタイプがKBA (ChallengeQuestion)の場合、VCryptAuth::authenticateQuestionがコールされ、ユーザーの入力が、提示された質問の登録済回答と照合して検証されます。

検証中のチャレンジのタイプがOTP (ChallengeSMS、ChallengeEmailなど)の場合、ユーザーの入力が、OTPコードの生成時に格納された値と比較されます。回答が正しい場合は、BharosaHelper::resetOTPCounterがコールされて、OTPチャレンジのカウンタがリセットされます。回答が正しくない場合は、OTPチャレンジのカウンタが増分されます(BharosaHelper::incrementOTPCounter)。

メソッドによって、BharosaEnumAuthStatus.SUCCESSまたはBharosaEnumAuthStatus.WRONG_ANSWERのいずれかのBharosaEnumAuthStatusが返されます。

2.3.20 ロックアウト・ページ(c6)

ロックアウト・ページは、認証後ルールでBLOCKが返されたときにユーザーがリダイレクトされるページです。

2.3.21 ランディングまたはスプラッシュ・ページ(c5)

このページはログインの成功後、つまり、認証後ルールでALLOWが返されたときにユーザーがリダイレクトされるページです。

3 ネイティブ.NETアプリケーションの統合

ASP.NETアプリケーションは、Oracle Adaptive Access Managerによって提供される.NET APIを使用してOracle Adaptive Access Managerと統合し、仮想認証デバイス、KBAおよびOAAMリスク・エンジンなどの様々なOAAM機能を追加できます。

この章では、OAAM .NET APIを使用してASP .NETアプリケーションを統合する方法について説明します。また、各種のOAAM機能を基本的なWebアプリケーションに統合する方法を示すOAAMサンプル・アプリケーションについても説明します。

この章では、次の内容を説明します。

- 第3.1項「概要」

- 第3.2項「Oracle Adaptive Access Managerの.NET SDK」

- 第3.3項「構成プロパティ」

- 第3.4項「Oracle Adaptive Access ManagerのAPIの使用方法」

- 第3.5項「統合の参照用としてのOAAMサンプル・アプリケーション」

3.1 概要

ASP.NETは、プログラマが動的なWebサイト、WebアプリケーションおよびWebサービスを構築できるWebアプリケーション・フレームワークです。OAAMには、OAAM .NET開発キット(SDK)が用意されています。OAAM .NET SDKは、ASP.NETアプリケーションをOAAMと統合するために使用します。その中のOAAM .NET APIは、OAAM .NETライブラリ、OAAMサンプル.NETアプリケーション、OAAMフラッシュ・ムービー・ページ(OAAMがデバイス識別でフィンガープリントの収集に使用する)、および.NETのネイティブ統合に必要なその他のファイルによって公開されています。任意のASP.NET言語で作成されているASP.NETアプリケーションでは、OAAM .NET APIを使用してOracle Adaptive Access Managerをコールできます。

OAAM .NET APIは、Simple Object Access Protocol (SOAP)を使用してOAAMサーバーと通信します。SOAPは、コンピュータ・ネットワーク内のWebサービスの実装において構造化された情報を交換するためのプロトコル仕様です。

3.2 Oracle Adaptive Access Managerの.NET SDK

.NET API統合の例を示す最新OAAMサンプル・ファイルは、Oracle Technology Networkの次のURLからダウンロードできます。

http://www.oracle.com/technetwork/index.html

OAAM .NET SDKは、$ORACLE_HOME/oaam/oaam_libs/dotNet/のoaam_native_dot_net.zipにパッケージ化されています。

OAAM機能を有効化するサンプル.NETアプリケーションでは、SDKパッケージ内のOAAM .NET APIの統合が必要です。開発者は、アーカイブのコンテンツをWebアプリケーションのルート・ディレクトリに抽出する必要があります。

OAAM .NETライブラリは、抽出されたSDKパッケージの/binディレクトリにあります。

3.3 構成プロパティ

Oracle Adaptive Access Managerの.NET SDKには、OAAM .NET APIで使用される構成の値を指定するプロパティ・ファイルが含まれています。開発者は、これらのプロパティを変更してアプリケーション固有の値を指定したり、新規の値を追加することができます。

3.3.1 APIのプロパティの使用方法

OAAM .NET APIはプロパティを使用して、仮想認証デバイスのイメージの場所など、実行時に構成可能な値を読み込みます。仮想認証デバイスはユーザー入力のコントロールであり、仮想キーボードおよびパーソナライズを提供します。プロパティは起動時にファイルのリストから読み込まれてキャッシュされ、プロパティ・ファイルの1つが更新されたときには必ず更新されます。

プロパティ・ファイルがOAAM .NET APIによってロードされる順序は、次のとおりです。

1. lookup.propertiesファイルが存在する場合は、このファイルが最初にロードされます。

2. properties.filelistプロパティがlookup.propertiesで定義されている場合、そのプロパティにリストされるすべてのファイルが(リスト順に)キューに追加されます。

3. bharosa_lookup.propertiesファイルがロードされます(存在する場合)。

4. properties.filelistプロパティがbharosa_lookup.propertiesで定義されている場合、そのプロパティにリストされるすべてのファイルが(リスト順に)キューに追加されます。

5. キューにあるすべてのファイルがロードされます。

6. ロードされたプロパティ・ファイルのいずれかが変更されると、プロパティがリロードされます。

lookup.propertiesなどのプロパティ・ファイルは、次のディレクトリ内で、表3-1に示した順序で検索されます。ファイルの検索は、指定されたファイルが最初に見つかった時点で終了します(または、ファイルが見つからない場合にも終了します)。

表3-1 .NETプロパティ・ファイル

ディレクトリ

例

<ApplicationDirectory>/

c:/Inetpub/wwwroot/MyApp/

<CallingAssemblyDirectory>/

c:/Windows/System32/

<CurrentAssemblyDirectory>/

c:/Inetpub/wwwroot/MyApp/bin/

<CurrentAssemblyDirectory>/../

c:/Inetpub/wwwroot/MyApp/

<CurrentDirectory>/

c:/Windows/System32/

<ApplicationDirectory>/bharosa_properties/

c:/Inetpub/wwwroot/MyApp/bharosa_properties/

<CallingAssemblyDirectory>/bharosa_properties/

c:/Windows/System32/bharosa_properties/

<CurrentAssemblyDirectory>/bharosa_properties/

c:/Inetpub/wwwroot/MyApp/bin/bharosa_properties/

<CurrentAssemblyDirectory>/../bharosa_properties/

c:/Inetpub/wwwroot/MyApp/bharosa_properties/

<CurrentDirectory>/bharosa_properties/

c:/Windows/System32/bharosa_properties/

3.3.2 プロパティ値の暗号化

プロパティ・ファイルで指定されたプロパティ値は、OAAM .NET SDKに組み込まれているコマンドライン・ユーティリティBharosaUtils.exeを使用して暗号化できます。BharosaUtils.exeは、OAAM .NET SDKパッケージの抽出後に/binディレクトリに格納されます。

値の暗号化および復号化には、暗号化キー(ユーザーが任意に選択)が必要です。このキーは、プロパティbharosa.cipher.client.key(これは、アプリケーション・プロパティ・ファイルの1つに設定する必要があります)を通してOAAM .NET APIで使用可能になります。

BharosaUtil.exeは、ユーザーに暗号化キーと値の入力を求めます。その後、暗号化された値がコンソールに出力されます。次のユーティリティの実行例は、文字列の暗号化方法を示しています。

C:\> BharosaUtil.exe -enc
Enter key (min 14 characters len): your-key
Enter key again: your-key
Enter text to be encrypted: string-to-encrypt
Enter text to be encrypted again: string-to-encrypt
vCCKC19d14a39hQSKSirXSiWfgbaVG5SKIg==

3.3.3 ユーザー定義の列挙を使用した要素の定義

Visual Studio 2005では、.NETフレームワークで定義された列挙が使用できます。ユーザー定義列挙は、アイテムのコレクションです。それぞれのアイテムには整数が割り当てられ、複数の属性が含まれている場合もあります。ユーザー定義列挙は、プロパティ・ファイルで定義されます。列挙名、列挙のアイテム名、アイテム属性の名前は、次のルールに準拠する必要があります。

- 列挙の名前に接尾辞.enumを付けること。

- アイテム名に列挙名と同じ接頭辞を付けること。

- アイテムの属性名にアイテム名と同じ接頭辞を付けること。

ユーザー定義列挙の例は、次のとおりです。

#Example of a user-defined enumeration
auth.status.enum=Enumeration to describe authentication status

#first item and its attributes
auth.status.enum.success=0
auth.status.enum.success.name=Success
auth.status.enum.success.description=Success
auth.status.enum.success.success=true

#second item and its attributes
auth.status.enum.invalid_user=1
auth.status.enum.invalid_user.name=Invalid user
auth.status.enum.invalid_user.description=Invalid User

#third item and its attributes
auth.status.enum.wrong_password=2
auth.status.enum.wrong_password.name=Wrong password
auth.status.enum.wrong_password.description=Wrong password

#fourth item and its attributes
auth.status.enum.wrong_pin=3
auth.status.enum.wrong_pin.name=Wrong pin
auth.status.enum.wrong_pin.description=Wrong Pin

#fifth item and its attributes
auth.status.enum.session_expired=4
auth.status.enum.session_expired.name=Session expired
auth.status.enum.session_expired.description=Session expired

前述のユーザー定義列挙のアプリケーション・コードでの使用例は、次のとおりです。

UserDefEnumFactory factory = UserDefEnumFactory.getInstance();
UserDefEnum statusEnum = factory.getEnum("auth.status.enum");
int statusSuccess       = statusEnum.getElementValue("success");
int statusWrongPassword = statusEnum.getElementValue("wrong_password");

3.4 Oracle Adaptive Access ManagerのAPIの使用方法

この項では、OAAM APIを使用して共通のOAAMシナリオをサポートする方法について説明します。詳細は、OAAMサンプル・アプリケーションも参照してください。

3.4.1 ユーザーの詳細

Oracle Adaptive Access Managerはユーザーの詳細をデータベースに格納しており、この情報を使用して次のタスクを実行します。

- ユーザーに対して実行するリスク・ルールの判別

- ユーザー固有の仮想認証デバイスの属性の検索

- チャレンジ質問の提示

- チャレンジ質問に対する回答の検証

クライアント・アプリケーションは、実行時にOracle Adaptive Access Managerデータベースにユーザーの詳細を移入します。

たとえば、ユーザーがログインしたときに、クライアント・アプリケーションで、まずユーザー・レコードが存在するかどうかを判別する必要があります。レコードが見つからない場合は、適切なAPIをコールしてユーザー・レコードを作成し、ユーザー・ステータスを設定する必要があります。

次の例で、ユーザー・レコードを作成するコールについて説明します。

string loginId = "testuser";  // loginId of the user logging in

// set the proxy to access the SOAP server that communicates with the
// OAAM SOAP Server
IBharosaProxy proxy = BharosaClientFactory.getProxyInstance();

// find the user record in OAAM
VCryptAuthUser user = proxy.getUserByLoginId(loginId);

// if user record does not exist, create one
if(user == null || StringUtil.IsEmpty(user.LoginId))
{
string customerId  = loginId;
string userGroupId = "PremiumCustomer";
string password    = "_"; // this value is not used for now

user = new VCryptAuthUser(loginId, customerId,
userGroupId, password);
user = proxy.createUser(user);
//createUser API calls OAAM Server to create a user in database. New user will be
//returned.

// set the status of the new user to Invalid; once the user is
// authenticated, set the status to PendingActivation; after the
// user succssfully completes registration, set the status to Valid
proxy.setUserStatus(user.CustomerId, (int)UserStatus.Invalid);
}

// save the user record in the session for later reference
AppSessionData sessionData = AppSessionData.GetInstance(Session);

sessionData.CurrentUser = user;

詳細は、第3.5.2項「ASP.NETアプリケーション」に示すOAAMサンプル・アプリケーションを参照してください。

3.4.2 ユーザー・ログインとトランザクション

Oracle Adaptive Access Managerには、ユーザー・ログイン情報、ユーザー・ログイン・ステータス、およびデバイスと場所情報を判別するその他のユーザー・セッション属性を取得するAPIが用意されています。また、Oracle Adaptive Access Managerにはトランザクション詳細を収集するAPIも用意されています。

次に、いくつかのAPIを示します。

- handletrackerRequest(): デバイスのフィンガープリント処理に必要なシグネチャを作成します。

- updateLog(): ユーザー・ノード・ログを更新し、必要に応じてCookieSetも作成します。

- createTransaction(): OAAMサーバーでのトランザクションのデータ・エントリを作成します。

- updateTransaction(): 指定されたトランザクションを更新します。

- updateTransactionStatus(): OAAMサーバーでトランザクションのステータスを更新します。

- markDeviceSafe(): 必要に応じてデバイスを安全であるとマークします。

- isDeviceMarkedSafe(): デバイスが安全とマークされているかどうかを確認します。

次のコード・サンプルでは、このupdateLog() APIの使用方法を説明します。

// record a user login attempt in OAAM
string   requestId      = sessionData.RequestId;
string   remoteIPAddr   = Request.UserHostAddress;
string   remoteHost     = Request.UserHostName;
bool     isFlashRequest = Request.Params["client"].Equals("vfc");
string   secureCookie   = (Request.Cookies["vsc"] != null)
? Request.Cookies["vsc"].Value : null;
string   digitalCookie  = isFlashRequest
? Request.Params["v"] : null;
object[] browserFpInfo = HttpUtil.GetBrowserFingerPrint();
object[] flashFpInfo   = HttpUtil.GetFlashFingerPrint();

int browserFingerPrintType =
browserFpInfo == null ? 0 : (int) browserFpInfo [0];
string browserFingerPrint =
browserFpInfo == null ? "" : (string) browserFpInfo [1];
int flashFingerPrintType =
flashFpInfo == null ? 0 : (int) flashFpInfo[0];
string flashFingerPrint =
flashFpInfo == null ? "" : (string) flashFpInfo[1];

// if user name and password have been validated by now, set the status
// to the appropriate value, such as success, wrong_password, or invalid_user
int status = statusEnum.getElementValue("success");

// if user name and password have not yet been validated, set the status to
// pending; after validation is done call updateLog to update status
int status = statusEnum.getElementValue("pending");

// Call updateLog to record the user login attempt
CookieSet cs = proxy.updateLog(requestId, remoteIPAddr, remoteHost,
secureCookie, digitalCookie, user.CustomerGroupId,
user.CustomerId, user.LoginId, false,
status, ClientTypeEnum.Normal,
"1.0", browserFingerPrintType, browserFingerPrint,
flashFingerPrintType, flashFingerPrint);

// Update secure cookie in the browser with the new value from OAAM
if (cs != null)
{
HttpUtil.UpdateSecureCookie(Response, cs);
}

updateLog() APIをコールすると、ユーザー情報がブラウザ/フラッシュのフィンガープリント情報とともに、SOAPコールを通してOAAMサーバーに送信されます。送信されたフィンガープリント情報がOAAMサーバーに格納された値と一致する場合、OAAMサーバーは新規のフィンガープリントCookieを返します。ユーザー情報が取得されていない場合は、OAAMサンプル.NETアプリケーションで使用したように、handleTrackerRequest() APIを使用してデバイス情報が収集されます。

3.4.3 ルール・エンジン

ルール・エンジンは、ポリシーの実施に使用されるOracle Adaptive Access Managerのコンポーネントです。ルール・エンジンは、コール中のコンテキストに基づいてポリシーを評価し、評価結果を出力します。ポリシーは管理者が構成します。ポリシー構成の詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

次のコード・サンプルでは、ユーザーに権限を付与した後でルール・エンジンを起動し、ルール評価結果を処理するAPIの使用方法を説明します。

AppSessionData  sessionData = AppSessionData.GetInstance(Session);
IBharosaProxy      proxy    = BharosaClientFactory.getProxyInstance();
UserDefEnumFactory factory  = UserDefEnumFactory.getInstance();
UserDefEnum profileTypeEnum = factory.getEnum("profile.type.enum");

string             requestId    = sessionData.RequestId;
BharosaStringList  profileTypes = new BharosaStringList();
BharosaStringTable contextList  = new BharosaStringTable();

int postAuthType = profileTypeEnum.getElementValue("postauth");

profileTypes.Add(postAuthType.ToString());

// Run postauth rules
VCryptRulesResult res = proxy.processRules(requestId,
profileTypes, contextList);

// process the rule result
if (StringUtil.EqualsIgnoreCase(res.Result, "Allow"))
{
// Allow the user login
}
else if (StringUtil.EqualsIgnoreCase(res.Result, "Block"))
{
// Block the user login
}
else if (res.Result.StartsWith("Challenge"))
{
// Take the user through challenge question flow
}
else if (res.Result.StartsWith("RegisterUser"))
{
// Take the user through registration flow
}

3.4.3.1 デバイスID

ルール・エンジンは、ルール結果を配信するのみでなく、デバイスID(このログイン・セッションで使用されたデバイスを示すOracle Adaptive Access Manager内部の識別子)を返すことができます。

次のサンプル・コードでは、デバイスIDの取得方法を説明します。

VCryptRulesResult rulesResult = proxy.processRules ...);

If (!rulesResult.Response.IsSuccess) {
BharosaTrace.Error("Error running rules " + rulesResult.Response.ErrorMessage);
}
Long deviceId = rulesResult.DeviceId;

重要:

ここに示すコードは、次のことを前提としています。

- Oracle Adaptive Access Manager 10.1.4.5またはそれ以降を使用している。

- Oracle Adaptive Access Managerでプロパティbharosa.tracker.send.deviceIdをtrueに設定している。

bharosa.tracker.send.deviceId=true

3.4.3.2 一括トランザクションの作成と更新

次のコールで説明するように、IBharosaProxy.createTransactions()メソッドを使用して一括トランザクションを作成できます。

VCrypResponse[] createTransactions(TransactionCreateRequestData[]
transactionCreateRequestData);

次のコールで説明するように、IBharosaProxy.updateTransactions()メソッドを使用して一括トランザクションを更新できます。

VCrypResponse[] updateTransactions(TransactionUpdateRequestData[]
transactionUpdateRequestData);

3.4.4 チャレンジ質問でのユーザーの検証

Oracle Adaptive Access Managerでは、リスクが高いシナリオまたは疑わしいシナリオを実行する際に、事前登録済の質問でユーザーにチャレンジして、ユーザー回答を事前登録済の回答と比較できます。

通常、ユーザーは指定されたセットの中から質問を選択し、その質問の回答を指定するように要求されます。これらはすべて登録されます。ユーザーは、このような質問の1つでチャレンジされたときに、正しい回答、すなわち登録済の回答と一致するものを提示する必要があります。

次のコードの例では、質問と回答を登録し、ユーザーにチャレンジするコールについて説明します。

//  Retrieve a question-pickset, containing groups of questions from
//  which the user would pick one question from each group for
//  registration
VCryptQuestionList[] groups = proxy.getSignOnQuestions(
user.CustomerId);

// See the OAAM sample application in Integration Example Using the Sample
// Applications
// for details on displaying the questions in the UI and processing the user input
// Assume that the q's and a's are in the question object

// Register the questions and answers with OAAM
VCryptResponse response = proxy.addQuestions(
user.CustomerId, questions);

// Retrive the question to challenge the user
VCryptQuestion secretQuestion = proxy.getSecretQuestion(
user.CustomerId);

// Create QuestionPad authenticator to display the question text.
// See the sample application Integration Example Using the Sample Applications;
// Assume that the user entered an answer stored in the string answer

// Validate the user entered answer
VCryptAuthResult res = proxy.authenticateQuestion(customerId, answer);

bool isValid = (res != null && res.ResultCode == 0);

詳細は、第3.5.2項「ASP.NETアプリケーション」に示すOAAMサンプル・アプリケーションを参照してください。

3.4.5 チャレンジ失敗カウンタのリセット

Oracle Adaptive Access Managerでは、ユーザーに提示された質問に対する不適切な回答の数が失敗カウンタに記録されます。Oracle Adaptive Access Managerは、失敗カウンタを使用してロックを強制します。このAPIには、指定されたユーザー、またはユーザーと質問の組合せに対して失敗カウンタをリセットするメソッド、resetChallengeFailureCounters()が組み込まれています。

コールで質問ID(たとえば、questionId != BharosaGlobals.LongNull)が指定されている場合は、その質問に関連する失敗カウンタのみがリセットされます。質問IDが指定されていない場合は、ユーザーのすべての登録済質問に対する失敗カウンタがリセットされます。

次のサンプル・コードでは、失敗カウンタをリセットするコールについて説明します。

VCryptResponse resetChallengeFailureCounters(String requestId,
String customerId, long questionId);

3.4.6 仮想認証デバイス

この項では、ASP.NETアプリケーションでの仮想認証デバイスの作成と使用について、以降の各項に分けて説明します。

- 仮想認証デバイスの作成

- 仮想認証デバイスのWebページへの埋込み

- 仮想認証デバイスでのユーザー入力の検証

3.4.6.1 仮想認証デバイスの作成

仮想認証デバイスを作成するには、次のサンプル・コードで説明するように、メソッドBharosaClient.getAuthentiPad()を使用します。

IBharosaClient client = BharosaClientFactory.getClientInstance();

String padName = "passwordPad";

if (! IsPostBack)
{
AuthentiPadType padType     = AuthentiPadType.TYPE_ALPHANUMERICPAD;
String          bgFile      = proxy.getImage(user.CustomerId);
String          captionText = proxy.getCaption(user.CustomerId);
String          frameFile   = BharosaConfig.get(
"bharosa.authentipad.alphanumeric.frame.file",
"alphanumpad_bg/kp_v2_frame_nologo.png");

AuthentiPad authPad = client.getAuthentiPad(padType, padName,
frameFile, bgFile,
captionText, false,
true, true);

// save the authenticator object in sessData: it will be needed
// in GetImage.aspx.cs to generate the authenticator image, and
// while decoding the user input
sessionData[padName] = authPad;
}

3.4.6.2 仮想認証デバイスのWebページへの埋込み

前項で作成した仮想認証デバイスを正しく表示するには、.ASPXファイルと分離コード・ファイルを両方とも更新する必要があります。

これらのファイルは、次のように更新します。

1. JavaScript bharosa_web/js/bharosa_pad.jsをASPXファイルにインクルードします。

2. 仮想認証デバイスを表示するASPXファイルにラベルを作成します。

<asp:Label ID="authenticator" runat="server"></asp:Label>

3. 仮想認証デバイス・オブジェクトのcode-behindファイルでHTMLを生成し、次のようにラベルに割り当てます。

this.authenticator.Text = client.getAuthentiPadHTML(authPad,false, false);

3.4.6.3 仮想認証デバイスでのユーザー入力の検証

ユーザーが仮想認証デバイスに指定した入力は、padNameというHTTPパラメータとDataFieldでアプリケーションにポストされます。この入力は、次のサンプル・コードで説明するように、仮想認証デバイスを使用してデコードする必要があります。

if (IsPostBack)
{
AuthentiPad authPad       = sessionData[padName];
String      encodedPasswd = Request.Params[padName + "DataField"];
String      passwd        = authPad.decodeInput(encodedPasswd);

// continue to validate the password
}

3.4.7 Oracle Adaptive Access Manager SOAPサーバーへの資格証明の指定

Oracle Adaptive Access Manager SOAPサーバーにアクセスするための資格証明は、次のいずれかの方法で指定できます。

- 次の設定をアプリケーションのweb.configファイルに追加する。

<appSettings>
<add key="BharosaSOAPUser"     value="soapUser"/>
<add key="BharosaSOAPPassword" value="soapUserPassword"/>
<add key="BharosaSOAPDomain"   value="soapUserDomain"/>
</appSettings>

- 次のプロパティをアプリケーションのプロパティ・ファイルの1つに追加する。

BharosaSOAPUser=soapUser
BharosaSOAPPassword=soapUserPassword
BharosaSOAPDomain=soapUserDomain

注意:

この方法でSOAP資格証明を指定することにより、値(通常は、パスワード値)としてクリアテキストまたは暗号化文字列のいずれかを使用できます。

3.4.8 トレース・メッセージ

Oracle Adaptive Access Managerの.NET APIでは、web.configの診断スイッチを使用して、様々なレベルのトレース・メッセージを印刷できます。トレース・メッセージは、適切なリスナーを構成することによってファイルに保存できるようになります。

次のweb.configファイル・サンプルは、スイッチの構成とトレース・メッセージをファイルに書き込むリスナーを示しています。

<system.diagnostics>
<switches>
<add name="debug" value="0"/>
<add name="info" value="0"/>
<add name="soap" value="0"/>
<add name="perf" value="0"/>
<add name="warning" value="1"/>
<add name="error" value="1"/>
<add name="traceTimestamp" value="1"/>
<add name="traceThreadId" value="1"/>
</switches>
<trace autoflush="true" indentsize="2">
<listeners>
<add name="BharosaTraceListener"
type="System.Diagnostics.TextWriterTraceListener, System,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"
initializeData="BharosaTrace.log"/>
</listeners>
</trace>
</system.diagnostics>

3.4.9 X.509 SSL証明書構成の.Net APIサポート

SOAPを使用してOAAMサーバーをコールするとき、.Net APIはX.509 SSL証明書構成をサポートします。SSL認証処理(または双方向SSL)でX.509証明書を必要とする環境にOAAMサーバーがデプロイされている場合、次のAPIを使用してOAAM .NET SOAPクライアントに証明書を追加/削除します。

.NET 2.0の場合、Bharosa.VCrypt.ClientIBharosaProxyインタフェースには次のAPIがあります。

- void AddClientCertificate()

- void AddClientCertificate(X509Certificate clientCert)

- void AddClientCertificate(string certFilePath, string password)

- void RemoveClientCertificate(X509Certificate clientCert)

双方向SSLが必要な場合、OAAMサーバーへのSOAPコールを行うときに、X.509 SSL証明書の追加および削除を有効にするためのプロパティを次に示します。構成に従って、SOAPユーザー/パスワードおよびグループを設定する必要があります。

<add key="BharosaSOAPURL"
value="https:{OAAM SOAP SERVICE URL}"/>
<add key="BharosaSOAPUser"     value="ruleAdmin1"/>
<add key="BharosaSOAPPassword" value="welcome1"/>
<add key="BharosaSOAPDomain"   value="OAAM_Webservices_Group"/>
<add key="BharosaSOAPTrustAllServerCert"   value="true"/>
<add key="BharosaSOAPClientCertFilePath"
value="path/to/the/client/certificate/file"/>
<add key="BharosaSOAPClientCertFilePassword"
value="{password to open client certificate file}"/>

<add key="BharosaSOAPTrustAllServerCert" value="true"/>は、.NET SOAPクライアントによってサーバー側のすべてのSSL証明書がSSL認証処理で許容されるため、デバッグ/開発の目的でのみ使用してください。本番環境でこのプロパティは使用しないでください。

3.5 統合の参照用としてのOAAMサンプル・アプリケーション

SDKには、アプリケーションの統合方法を示すOAAMサンプル・アプリケーションが含まれています。この項では、各OAAMアプリケーションのコンテンツとフローの詳細について説明します。

3.5.1 サンプル・パッケージのダウンロード

.NET API統合の例を示す最新OAAMサンプル・パッケージは、Oracle Technology Networkの次のURLからダウンロードできます。

http://www.oracle.com/technetwork/index.html

OAAMサンプル・アプリケーションは、ユーザーがOAAM APIに慣れることを目的としたデモンストレーション用アプリケーションです。これは、APIの使用方法を示す基本的な要素を提供するのみで、本番環境での使用を目的としたコードではありません。.NET統合を実装している場合は、OAAMサンプル・アプリケーションを参照として使用して、アプリケーションを開発できます。これらのデプロイメント用に開発されたカスタム・アプリケーションに対する直接サポートはありませんが、Oracleサポート・サービスでは、製品に関する問題、たとえば提供されているAPIの使用時に発生した問題などの解決を支援できます。

3.5.2 ASP.NETアプリケーション

ASP.NETベースのアプリケーションへのOAAM 11gの各種機能の統合を示すために、このサンプル・パッケージには次の4つのASP.NETアプリケーションが組み込まれています。

表3-2 ASP.NETアプリケーション

アプリケーション名

説明

SampleWebApp

これは、OAAM統合を使用しない基本的なASP.NETアプリケーションです。このアプリケーションは、仮想認証デバイス、KBAなどの各種OAAM機能を統合するために加えた段階的な変更を容易に確認できるように提供されています。

SampleWebAppTracker

このアプリケーションは、Oracle Adaptive Access Managerリスク・エンジンのSampleWebAppへの統合を示します。

SampleWebAppAuthTracker

このアプリケーションは、Oracle Adaptive Access Managerリスク・エンジンと仮想認証デバイスのSampleWebAppへの統合を示します。

SampleKBATracker

このアプリケーションは、Oracle Adaptive Access Managerリスク・エンジンとKBAのSampleWebAppへの統合を示します。

3.5.3 OAAMサンプル・アプリケーションの詳細

この項では、4つのアプリケーションを詳述します。

3.5.3.1 SampleWebApp

このアプリケーションには、OAAM統合前のWebアプリケーションを構成する次のページが含まれています。

1. LoginPage.aspx

- 単純なHTMLフォームを使用して、ユーザー名とパスワードを収集します。

- ログインおよびパスワード情報を検証します。

- 検証結果に応じて、ユーザーはSuccess.aspxにリダイレクトされるか、該当するエラー・メッセージを示すLoginPage.aspxにリダイレクトされます。

2. Success.aspx

- ログイン成功のメッセージを、ログアウトのリンクとともに表示します。

3. LogoutPage.aspx

- ユーザー・セッションをログアウトして、ログイン・ページにリダイレクトします。

3.5.3.2 SampleWebAppTracker

このアプリケーションには、Oracle Adaptive Access Managerリスク・エンジンと前述のOAAMサンプル・アプリケーションとの統合を構成する次のページが含まれています。Oracle Adaptive Access Managerリスク・エンジンは、入力されたユーザーID、OAAM埋込みフラッシュ・ムービーにより収集されたデバイスのフィンガープリント、IP情報など、様々な種類のユーザー情報をOAAMサーバーで収集する際に役立ちます。統合されたWebアプリケーションでは、必須チェックポイントで適切なSOAP APIをコールすることもできます。OAAMサーバーでは、OAAM管理コンソールを使用して定義した認証ルールに従って、事前定義済の認証ルールが、収集された情報に対して実行されます。保護されたWebアプリケーションが対応するアクションを必要に応じて実行できるように、認証結果が返されます。

このアプリケーションでは、SDKパッケージoaam_native_dot_net.zipのOAAM .NET APIとの統合が必要です。アーカイブのコンテンツをWebアプリケーションのルート・ディレクトリに抽出する必要があります。

1. LoginPage.aspx

- 単純なHTMLフォームを使用してユーザー名とパスワードを収集します。

- ログインとパスワードをセッションに保存します。

- ユーザーをLoginJumpPage.aspxリダイレクトして、ユーザー・デバイスのフラッシュ・フィンガープリントを収集します。

2. LoginJumpPage.aspx

- AppUtil.InitUser() (AppUtilはSDKパッケージに含まれています)をコールして、ユーザーをOAAMからロードします。ユーザーが見つからない場合は、ユーザー・レコードが新規に作成されます。BharosaClientFactory.getProxyInstance()をコールすることによって、OAAMはIBharosaProxyインタフェースへの参照を取得します。このインタフェースは、.NETアプリケーション統合のための複数のOAAM .NET SOAP APIを公開します。AppUtil.InitUser()では次のAPIがコールされます: getUserByLoginId()、getUser()、createUser()、setUserStatus()、getUserStatus()およびsetPin()。

- フラッシュ・オブジェクトbharosa_web/flash/bharosa.swfをブラウザにロードするHTMLを返します。このフラッシュ・オブジェクトは、CookieManager.aspx (SDKパッケージに含まれています)をフラッシュ・フィンガープリントの詳細とともにコールします。CookieManager.aspxはフィンガープリントをOAAMに記録し、それに対してフラッシュCookieをユーザーのデバイスに設定します。

- しばらくしてから(フラッシュCookieをOAAMから取得する時間が必要です)、ブラウザをLoginHandlerPage.aspxにリダイレクトします。

3. LoginHandlerPage.aspx

- AppUtil.InitTracker()をコールして、ユーザー・ログインの試みをOAAMに記録します。

- ログインおよびパスワード情報を検証します。

- AppUtil.UpdateAuthStatus()をコールして、パスワード検証ステータス(成功/不正ユーザー/不正パスワード/無効なユーザーなど)でOAAMを更新します。

- パスワード検証が成功した場合は、AppUtil.RunPostAuthRules()をコールして認証後ルールを実行します。

- 認証後ルールでブロックが返された場合は、この情報でOAAMを更新した後にユーザー・ログインをブロックします。

- 検証結果またはルール結果(あるいはその両方)に応じて、ユーザーをSuccess.aspxにリダイレクトするか、適切なエラー・メッセージとともにLoginPage.aspxにリダイレクトします。

4. 成功ページ

- ログイン成功のメッセージを、ログアウトのリンクとともに表示します。

5. ログアウト・ページ

- ユーザー・セッションをログアウトして、ログイン・ページにリダイレクトします。

3.5.3.3 SampleWebAppAuthTracker

このアプリケーションには、Oracle Adaptive Access Managerリスク・エンジンや仮想認証デバイスの前述のOAAMサンプル・アプリケーションとの統合を構成する次のページが含まれています。このアプリケーションでは、OAAMにより指定されたオーセンティケータを使用してパスワードが収集されます。

オーセンティケータ機能とは、資格証明の収集に使用するOAAM仮想認証デバイスのことです。このOAAM .NET APIをコールして認証前ルールを実行すると、ユーザーは、OAAM仮想認証デバイスが表示される前にブロックされることがあります。Authentipadルールを実行することにより、OAAM仮想認証デバイスがユーザーに対して選択/作成され、パスワード・ページでレンダリングされます。

このアプリケーションでは、SDKパッケージoaam_native_dot_net.zipのOAAM .NET APIとの統合が必要です。アーカイブのコンテンツをWebアプリケーションのルート・ディレクトリに抽出する必要があります。

1. LoginPage.aspx

- 単純なHTMLフォームを使用してユーザー名を収集します。

- ログインをセッションに保存します。

- ユーザーをLoginJumpPage.aspxリダイレクトして、ユーザー・デバイスのフラッシュ・フィンガープリントを収集します。

2. LoginJumpPage.aspx

- AppUtil.InitUser()(AppUtilはSDKパッケージに含まれています)をコールして、ユーザーをOAAMからロードします。ユーザーが見つからない場合は、ユーザー・レコードが新規に作成されます。

- フラッシュ・オブジェクトbharosa_web/flash/bharosa.swfをブラウザにロードするHTMLを返します。このフラッシュ・オブジェクトは、CookieManager.aspx (SDKパッケージに含まれています)をフラッシュ・フィンガープリントの詳細とともにコールします。CookieManager.aspxはフィンガープリントをOAAMに記録し、それに対してフラッシュCookieをユーザーのデバイスに設定します。

- しばらくしてから(フラッシュCookieをOAAMから取得する時間が必要です)、ブラウザをLoginHandlerPage.aspxにリダイレクトします。

3. LoginHandlerPage.aspx

- AppUtil.InitTracker()をコールして、ユーザー・ログインの試みをOAAMに記録します。

- ユーザーをPasswordPage.aspxにリダイレクトし、OAAMオーセンティケータを使用してパスワードを収集します。

4. PasswordPage.aspx
ロード時に、次の処理を行います。

1. セッション認証ステータスをOAAMでPendingに設定します。

2. AppUtil.RunPreAuthRules()をコールして、認証前ルールを実行します。

3. 認証前ルールでblockが返された場合は、この情報でOAAMを更新した後にユーザー・ログインをブロックします。

4. 認証前ルールでallowが返された場合は、AppUtil.RunAuthentiPadRules()をコールすることにより、別のルール・セットを実行してこのユーザーに対して使用するオーセンティケータを判別します。

5. AppUtil.CreateAuthentiPad()をコールすることによって適切なオーセンティケータを作成し、AppUtil.getAuthentiPadHTML()を使用してオーセンティケータをHTMLにレンダリングします。オーセンティケータHTMLは、GetImage.aspx (SDKパッケージに含まれています)をコールすることにより、オーセンティケータ・イメージをフェッチします。

6. イメージ生成およびパスワード・デコード時に、オーセンティケータ・オブジェクトをセッションに格納して後で使用できるようにします。

PostBackで、次のように処理します。

1. セッションに格納されたオーセンティケータ・オブジェクトを使用して、パスワードをデコードします。

2. ログインおよびパスワード情報を検証します。

3. AppUtil.UpdateAuthStatus()をコールすることにより、OAAMをパスワード検証ステータス(成功/不正ユーザー/不正パスワード/無効になったユーザーなど)で更新します。

4. パスワード検証が成功した場合は、AppUtil.RunPostAuthRules()をコールして認証後ルールを実行します。

5. 認証後ルールでブロックが返された場合は、この情報でOAAMを更新した後にユーザー・ログインをブロックします。

6. 検証結果またはルール結果(あるいはその両方)に応じて、ユーザーをSuccess.aspxにリダイレクトするか、適切なエラー・メッセージとともにLoginPage.aspxにリダイレクトします。

5. 成功ページ

- ログイン成功のメッセージを、ログアウトのリンクとともに表示します。

6. ログアウト・ページ

- ユーザー・セッションをログアウトして、ログイン・ページにリダイレクトします。

3.5.3.4 SampleKBATracker

このアプリケーションには、OAAMオーセンティケータ、リスク・エンジン、KBAおよびKBA(ナレッジ・ベース認証)と前述のOAAMサンプル・アプリケーションとの統合を構成する次のページが含まれています。このアプリケーションは、パスワードおよびOAAMで指定したKBAオーセンティケータを使用する認証メカニズムを示しています。OAAM KBAには、ユーザーがチャレンジ質問を登録した後、その質問を使用して、ある時点でユーザーにチャレンジする機能があります。たとえば、認証後ルールの結果に基づいて、統合されたWebアプリケーションが登録済の質問/回答のペアを使用してユーザーにチャレンジするよう決定することもできます。

このアプリケーションでは、SDKパッケージoaam_native_dot_net.zipのOAAM .NET APIとの統合が必要です。アーカイブのコンテンツをWebアプリケーションのルート・ディレクトリに抽出する必要があります。

1. LoginPage.aspx

- 単純なHTMLフォームを使用してユーザー名を収集します。

- ログインをセッションに保存します。

- ユーザーをLoginJumpPage.aspxリダイレクトして、ユーザー・デバイスのフラッシュ・フィンガープリントを収集します。

2. LoginJumpPage.aspx

- AppUtil.InitUser()(AppUtilはSDKパッケージに含まれています)をコールして、ユーザーをOAAMからロードします。ユーザーが見つからない場合は、ユーザー・レコードが新規に作成されます。

- フラッシュ・オブジェクトbharosa_web/flash/bharosa.swfをブラウザにロードするHTMLを返します。このフラッシュ・オブジェクトは、CookieManager.aspx (SDKパッケージに含まれています)をフラッシュ・フィンガープリントの詳細とともにコールします。CookieManager.aspxはフィンガープリントをOAAMに記録し、それに対してフラッシュCookieをユーザーのデバイスに設定します。

- しばらくしてから(フラッシュCookieをOAAMから取得する時間が必要です)、ブラウザをLoginHandlerPage.aspxにリダイレクトします。

3. LoginHandlerPage.aspx

- AppUtil.InitTracker()をコールして、ユーザー・ログインの試みをOAAMに記録します。

- ユーザーをPasswordPage.aspxにリダイレクトし、OAAMオーセンティケータを使用してパスワードを収集します。

4. PasswordPage.aspx
ロード時に、次の処理を行います。

1. セッション認証ステータスをOAAMでPendingに設定します。

2. AppUtil.RunPreAuthRules()をコールして、認証前ルールを実行します。

3. 認証前ルールでblockが返された場合は、この情報でOAAMを更新した後にユーザー・ログインをブロックします。

4. 認証前ルールでallowが返された場合は、AppUtil.RunAuthentiPadRules()をコールすることにより、別のルール・セットを実行してこのユーザーに対して使用するオーセンティケータを判別します。

5. AppUtil.CreateAuthentiPad()をコールすることによって適切なオーセンティケータを作成し、AppUtil.getAuthentiPadHTML()を使用してオーセンティケータをHTMLにレンダリングします。オーセンティケータHTMLは、GetImage.aspx (SDKパッケージに含まれています)をコールすることにより、オーセンティケータ・イメージをフェッチします。

6. イメージ生成およびパスワード・デコード時に、オーセンティケータ・オブジェクトをセッションに格納して後で使用できるようにします。

PostBackで、次のように処理します。

1. セッションに格納されたオーセンティケータ・オブジェクトを使用して、パスワードをデコードします。

2. ログインおよびパスワード情報を検証します。

3. AppUtil.UpdateAuthStatus()をコールすることにより、OAAMをパスワード検証ステータス(成功/不正ユーザー/不正パスワード/無効になったユーザーなど)で更新します。

4. パスワード検証が失敗した場合、ユーザーは適切なエラー・メッセージとともにLoginPage.aspxにリダイレクトされます。

5. パスワード検証が成功した場合は、AppUtil.RunPostAuthRules()をコールして認証後ルールを実行します。

6. 認証後ルールの結果に基づくアクションに応じて、異なるフローがユーザーに対して表示されます。

認証後のアクション

ターゲットURL

Block

LoginPage.aspx

Allow

Success.aspx

ChallengeUser

ChallengeUser.aspx

RegisterQuestions

RegisterQuestionsPage.aspx

RegisterUser

PersonalizationPage.aspx

RegisterUserOptional

PersonalizationPage.aspx

5. PersonalizationPage.aspx

- ユーザーのセキュリティ・プロファイル作成の手順を説明するデバイス・パーソナライズが紹介されます。

- 認証後ルールによってRegistrationOptionalが返された場合、ユーザーは、「スキップ」をクリックして登録プロセスをスキップし、Success.aspxページに直接進むことができます。

- 登録がオプションでない場合、ユーザーは「続行」をクリックしてRegisterImagePhrase.aspxページに進み、登録する必要があります。

6. RegisterImagePhrase.aspx

- ランダムに生成されたバックグラウンド・イメージ、キャプション、および認証中に使用したセキュリティ・デバイスのタイプのカスタマイズをユーザーに対して許可します。

- 新規のバックグラウンド・イメージとキャプションは、AppUtil.AssignNewImageAndCaption()をコールして割り当てられます。

- ユーザーが選択したセキュリティ・デバイスは、AppUtil.SetAuthMode()をコールして割り当てられます。

7. RegisterQuestionsPage.aspx

- 質問セットが表示されます。ユーザーはこの中から質問を選択し、質問ごとの正しい回答を登録できます。

- 質問セットをフェッチするには、proxy.getSignOnQuestions()をコールします。

8. ChallengeUser.aspx

- ユーザーがすでに登録した質問の1つと一緒にQuestionPadを表示することにより、ユーザーにチャレンジします。

- proxy.authenticateQuestion()のコールによって回答が検証され、AppUtil.UpdateAuthStatus()をコールしてその結果がOAAMで更新されます。

- 回答が間違っている場合はAppUtil.RunChallengeUserRules()がコールされ、その結果に基づいてユーザーは回答の再入力を許可されるか、OAAMのブロック・ステータスの更新後にブロック・ページにリダイレクトされます。

- ユーザーが質問に正しく回答するまでの試行回数は、OAAMのルール管理者が設定します。

- 質問に正しく回答できた場合は、Success.aspxページに進みます。

9. 成功ページ

- ログイン成功のメッセージを、ログアウトのリンクとともに表示します。

10. ログアウト・ページ

- ユーザー・セッションをログアウトして、ログイン・ページにリダイレクトします。

3.5.4 環境の設定

各アプリケーションのソース・コードは、アプリケーション専用のディレクトリに格納されています。アプリケーション別のVisual Studio Solutionファイルは、ルート・ディレクトリにあります。4つのアプリケーションは、Visual Studio 2005を使用して実行することも、Windows Server 2003でMicrosoft Internet Information Server (IIS) 6.0を使用してデプロイすることもできます。SampleWebAppsを使用してロードし、Visual Studioを使用してすべてのアプリケーションを同時に表示できます。

この項では、OAAMサンプル・アプリケーションを正しく実行できるように環境を設定する方法について説明します。次の項目がすべて適用された後でこれらのOAAMサンプル・アプリケーションを実行すると、様々なシナリオでどのようにOAAM 11gと統合されるかを確認できるようになります。

3.5.4.1 web.configファイルの変更

OAAMサーバーにアクセスするためのSOAP URLが、各ユーザーのデプロイメント構成に応じてアプリケーションのweb.configファイルに正しく設定されていることを確認してください。次に例を示します。

<appSettings>
<add key="BharosaSOAPURL"
value="http://localhost:14300/oaam_server/services"/>
</appSettings>
<appSettings>

3.5.4.2 イメージのプロパティの設定

OAAMサンプル・アプリケーションをOAAM 11gに統合するために、bharosa_app.propertiesのbharosa.image.dirlistを、oaam_imagesディレクトリが存在しているパスに設定します。oaam_imagesディレクトリは${ORACLE_HOME}/oaam/にあります。oaam_imagesディレクトリには、OAAMが仮想認証デバイスの生成に使用するイメージが含まれています。

ディレクトリ名は変更できますが、その場合はパスも適宜変更する必要があります。たとえば、前述のパスから取得したファイルがすべてoaam_imagesというディレクトリに格納されていて、このディレクトリがWebアプリケーションのrootディレクトリの下にある場合、パスは${Application_HOME}/oaam_images/になります。

lookup.propertiesが/bharosa_properties/ディレクトリに作成/格納されていることを確認してください。これによって、読み込む必要のあるプロパティ・ファイルがすべて示されます。プロパティは次から入手できます。

${ORACLE_HOME}/oaam/apps/oaam_native/overrides/conf/bharosa_properties

bharosa.authentipad.image.urlプロパティを検索し、コメント・アウトしてください。

3.5.4.3 アプリケーションの実行

WebアプリケーションのテストのためにMicrosoft Visual Studio 2005にアクセスできる開発者の場合、前の変更をすべて行った後で、ソリューションを構築してデバッグしてください。

これらのアプリケーションのデプロイメントについては、次のガイドラインに従ってください。

- Windows Server 2003システムを使用する必要があります。

- アプリケーション・サーバーをインストールするには、「コントロール パネル」→「プログラムの追加と削除」→「Windowsコンポーネントの追加/削除」を使用します。Microsoft Internet Information Server (IIS)およびASP.NETを有効にする必要があります。

- コマンド・ウィンドウでinetmgrを実行することにより、Internet Information Services (IIS) Managerを使用してWebサイトを新規作成します。

- WebサイトのプロパティのASP.NETタブをクリックして、ASP.NETバージョンがバージョン2.0に設定されていることを確認します。

- Internet Information Services (IIS) Managerで、ASP.NETバージョン2.0が「許可」に設定されていることを確認します。ASP.NETバージョン2.0の拡張子がない場合は、新しいWebサービスの拡張子を手動で追加してください。C:\WINDOWS\Microsoft.NET\Frameworkに移動します。ASP.NETバージョン2.0がインストールされている場合、ここにv2.0.50727というディレクトリ、または類似した名前のディレクトリがあります。v2.0.50727/aspnet_isapi.dllを新規Webサービスの拡張子として追加します。

- Webアプリケーションのページを開く際にC:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NETファイルへのアクセスで問題が発生した場合は、「IIS マネージャ」→「ローカル コンピュータ」→「アプリケーション プール」で「プロパティ」→「ID」を開き、「定義済み」オプションの右にある「ローカル システム」を選択してください。

3.5.5 例: トランザクション・ロギングとルール処理の有効化

次のページでは、ASP.NETサンプル・アプリケーションを使用してOAAM管理でトランザクション・ロギングとルール処理を有効化する方法について説明します。

前提条件:

- Sample_Transaction_Defs.zipのトランザクション定義をOracle管理で使用可能にします。OAAM管理を使用して、トランザクション定義をインポートします。

- models.zipで定義されたトランザクション・ポリシーをOAAM管理で使用可能にします。

- 次のプロパティが、OAAM管理および.NETクライアント側のbharosa_app.propertiesに存在している必要があります。
トランザクション・ステータスの列挙

tracker.transaction.status.enum=Enum for transaction status
tracker.transaction.status.enum.success=0
tracker.transaction.status.enum.success.name=Success
tracker.transaction.status.enum.success.description=Success
tracker.transaction.status.enum.block=1
tracker.transaction.status.enum.block.name=Block
tracker.transaction.status.enum.block.description=Block
tracker.transaction.status.enum.reject=2
tracker.transaction.status.enum.reject.name=Reject
tracker.transaction.status.enum.reject.description=Reject
tracker.transaction.status.enum.pending=3
tracker.transaction.status.enum.pending.name=Pending
tracker.transaction.status.enum.pending.description=Pending

チェックポイントの列挙

profile.type.enum.pretransaction=70
profile.type.enum.pretransaction.name=PreTransaction
profile.type.enum.pretransaction.description=Pre Transaction
profile.type.enum.pretransaction.ruleTypes=user,device,location,in_session
profile.type.enum.pretransaction.listTypes=vtusers
profile.type.enum.pretransaction.finalactionrule=process_results.rule
profile.type.enum.pretransaction.isPreAuth=false

profile.type.enum.posttransaction=80
profile.type.enum.posttransaction.name=PostTransaction
profile.type.enum.posttransaction.description=Post Transaction
profile.type.enum.posttransaction.ruleTypes=user,device,location,in_session
profile.type.enum.posttransaction.listTypes=vtusers
profile.type.enum.posttransaction.finalactionrule=process_results.rule
profile.type.enum.posttransaction.isPreAuth=false

トランザクション・ページの管理オプション

- プロパティ・ファイルbharosa_common.propertiesで定義されたトランザクション列挙に基づき、トランザクション・タイプ選択メニューを動的に生成します。

- トランザクション・タイプの選択時に、プロパティ・ファイルで定義されたフィールド定義に基づいて、トランザクション・フィールドを動的にレンダリングします。

- 送信中の現在のフォームに応じて、AppUtil.createTransaction()をコールしてトランザクションを作成するか、AppUtil.updateTransaction()をコールしてトランザクションを更新します。
AppUtil.RunPreTransactionRules()またはAppUtil.RunPostTransactionRules()をコールして、トランザクション前およびトランザクション後のルールを実行します。ブラウザは、その結果に応じて、次の適切なページにリダイレクトされます。

3.5.6 OAAM .NET API

この項に示すAPIの詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager Java APIリファレンス』を参照してください。

注意:

isElementInList()、getListElements()およびupdateList()の各APIは、アラート・グループ・リストでの更新/アクションをサポートしていません。

表3-3に、OAAMで使用可能な.NET APIを示します。

表3-3 OAAM .NET API

API

説明

handleTrackerRequest()

handleTrackerRequest()は、デバイスのフィンガープリント処理に必要なシグネチャを作成します。このメソッドは、入力としてrequestTimeを取り込みます。

handleTransactionLog()

handleTransactionLog()は、デバイスのフィンガープリント処理に必要なシグネチャを作成します。

createTransactions()

createTransactions()は、OAAMトランザクションを一括作成します。また、作成リクエストごとにレスポンス・オブジェクトを返します。

updateTransactions()

updateTransactions()は、トランザクションを一括更新します。更新でエラーが生じた場合でも、次のトランザクションを続行して、リクエストごとにレスポンスを返します。

updateLog()

updateLog()はユーザー・ノード・ログを更新し、必要に応じてCookieSetも作成します。

updateTransactionStatus()

updateTransactionStatus()は、トランザクションのステータスを更新します。

updateAuthStatus()

updateAuthStatus()は、リクエストの認証ステータスを更新します。この機能が正しく動作するには、すべてのパラメータに有効な値が設定されている必要があります。

markDeviceSafe()

markDeviceSafe()は、ユーザー・デバイスが安全であるとマークします。

getUser()

getUser()は、カスタマおよびグループに関して、パスワードとPINを含まないユーザー詳細を返します。ユーザーが有効でない場合、オブジェクトのすべての値はNULLになります。予期しないエラーが発生すると、NULLが返されます。

getUserByLoginId()

getUserByLoginId()は、カスタマおよびグループに関して、パスワードとPINを含まないユーザー詳細を返します。ユーザーが有効でない場合、オブジェクトのすべての値はNULLになります。予期しないエラーが発生すると、NULLが返されます。

createUser()

createUser()は、認証データベースにユーザーを作成します。ユーザーがNULLの場合、NULLが返されます。

setUser()

setUser()は、認証データベースのユーザーを更新します。ユーザーがNULLであるか、ユーザーのcustomerId属性が無効の場合、NULLが返されます。

setPin()

setPin()は、ユーザーに新規のPINを設定します。操作が成功または失敗であるかを返します。

setPassword()

setPassword()は、ユーザーに新規のパスワードを設定します。操作が成功または失敗であるかを返します。

setCaption()

setCaption()は、ユーザーに新規のキャプションを設定します。キャプションがNULLの場合は、デフォルト・ロケールを持つキャプションが設定されます。

setImageAndCaption()

setImageAndCaption()は、ユーザーのイメージとキャプションを設定します。キャプションがNULLの場合は、デフォルト・ロケールとデフォルト・テキストを持つキャプションが設定されます。

setUserAuthMode()

setUserAuthMode()は、ユーザーに認証モードを設定します。認証モードとしてフル・キーパッドなどが設定できます。

setGroupUserAuthMode()

setGroupUserAuthMode()は、バッチ更新を使用して認証モードを設定します。初期バッチの保存後に後続バッチで失敗が発生する場合があるため、システムが前の認証モードのまま残される保証はありません。

getImage()

getImage()は、ユーザーのイメージ・パスを取得します。

getCaption()

getCaption()は、ユーザーのキャプションを取得します。

getImageAndCaption()

getImageAndCaption() は、ユーザーのイメージ・パスとキャプションを取得します。

getLocalizedCaption()

getLocalizedCaption()は、ユーザーのローカライズされたキャプションを取得します。

getUserAuthMode()

getUserAuthMode()は、ユーザーの認証モードを取得します。

getUserStatus()

getUserStatus() は、ユーザーのステータスを取得します。

getSignOnQuestions()

getSignOnQuestions()は、ユーザーに使用可能なすべての機密質問を取得します。これは、問い合せる質問が含まれている2次元配列オブジェクトを返します。1次元はユーザーに表示する(構成可能な)質問選択セットの数を表し、2次元は各選択セットの質問数を表します。

getAllMappedSignOnQuestions()

getAllMappedSignOnQuestions()は、ユーザーの質問を取得します。

setUser()

setUser()は、認証データベースのユーザーを更新し、ユーザーがNULLであるか、ユーザーのcustomerId属性が無効の場合にNULLを返します。

addQuestions()

addQuestions()は、カスタマへの質問を追加します。これは、必要な質問の数と同数の質問を求めます。このメソッドをコールすると、既存の質問はすべて削除されます。成功はすべての質問が追加されたことを示し、失敗は質問がまったく追加されなかったことを示します。

deleteQuestion()

deleteQuestionは、指定されたユーザーの質問を削除します。

getSecretQuestion()

getSecretQuestion()は、ユーザーの機密質問を取得します。問い合せる質問が含まれているオブジェクトを返します。

moveToNextSecretQuestion()

moveToNextSecretQuestion()は、ユーザーに対する現在の機密質問から次の質問へ移動します。問い合せる質問が含まれているオブジェクトを返し、エラーの場合はNULLを返します。

authenticateQuestion()

authenticateQuestion() は、質問/回答を認証します。認証試行の記述結果を返します。

authenticateQuestionForCSR()

authenticateQuestionForCSR()は、カスタマ・ケアに関する質問/回答を認証するメソッドです。認証試行の記述結果を返します。

processRules()

processRules()はルールを実行して、ルール結果を返します。VCryptRulesResult の属性'response'は、成功を返します。デフォルトでは、セッションなしのVCryptResponseが設定されています。属性alertIdListは、実行されたルールに関連するアラートがない場合はNULLです。プロパティvcrypt.tracker.rule.process.autoTransactionLog.disableがfalseに設定されている場合は、transactionLogId属性が設定されます。

createList()

createList()は、指定されたリスト・タイプの新規リストを作成します。

updateList()

updateList()は、指定されたリストを新規の要素で更新します。リスト名は既存の名前である必要があります。elementsToAddでは、重複する要素と無効な要素は無視されます。elementsToRemoveでは、存在しない要素と無効な要素は無視されます。アラート・グループ・リストの更新はサポートされていません。

getLists()

getLists()は、グループ・タイプが指定されたときにグループのリストを取得します。

isElementInList()

isElementInList()は、指定された要素がリストにあるかどうかを確認します。アラート・グループ・リスト内の要素の確認はサポートされていません。

getFinalAuthStatus()

getFinalAuthStatus()は、ユーザーIDが指定されている場合、ユーザーの最終認証ステータスを返します。このメソッドで遡れる日数は30日までです。

setTemporaryAllow()

setTemporaryAllow()は、ユーザーに対する一時許可を設定します。

getActionCount()

getActionCount()は、指定されたactionEnumIdのアクション件数を取得します。使用可能なアクション列挙については、構成を確認してください。プロパティ[rule.action.enum.<actionName>.incrementCacheCounter]をtrueに設定して、<actionName>に対応するアクションのカウンタを増分する必要があります。これが設定されていなかったり、falseに設定されている場合、このメソッドはキャッシュ内の値を正常に返しますが、この値は正確なアクション件数を反映していない可能性があります。

CancelAllTemporaryAllows()

CancelAllTemporaryAllows()は、ユーザーに対する未使用の一時許可をすべて取り消します。

getRulesData()

getRulesData()は、指定されたセッションIDに対して実行されたすべてのルールを返し、トリガーされたルールの基本情報を提供します。完全な階層情報は提供されません。ルール実行データは非同期に永続化されているため、即時に使用できない場合があります。

getRulesDataForLastSession()

getRulesDataForLastSession()は、過去のセッションに関して、指定されたcustomerIdで実行されたすべてのルールを返し、トリガーされたルールの基本情報を提供します。完全な階層情報は提供されません。ルール実行データは非同期に永続化されているため、即時に使用できない場合があります。

resetUser()

resetUser()は、ユーザーに設定されているすべてのプロファイルをリセットします。これには、ユーザーに対して選択された(または割り当てられた)登録、質問、イメージおよびフレーズが含まれます。

processPatternAnalysis()

processPatternAnalysis()は、自動学習用にパターン・データ処理をトリガーします。このメソッドでは、自動学習パターンの分析以外のアクティビティは実行されません。

getList()

getList()は、グループ・タイプが指定されているグループのリストを取得します。

ClearSafeDeviceList()

ClearSafeDeviceList()は、このリクエストに関連するユーザーの安全なデバイス・リストを消去します。

resetChallengeFailureCounters()

resetChallengeFailureCounters()は、チャレンジ失敗カウンタをリセットします。

generateOTP()

generateOTP()はOTPを生成します。それはOTPコードを返します。

getOTPCode()

getOTPCode()は、指定されたリクエスト識別子のOTPコードを取得するためにn回コールできます。指定されたリクエスト識別子のOTPコードが存在しない場合は、OTPコードが新規に生成されます。指定されたリクエスト識別子のOTPコードが存在し、overwriteIfexistsがtrueの場合は、OTPコードが新規に生成されます。OTPコードが存在し、そのOTPコードが失効していない場合、有効期限を更新することによって同じOTPコードが返されます。それ以外の場合は、新規のOTPコードが返されます。OTPコードは、VCryptObjectResponseオブジェクトから、次のプロパティString otpCode = (String) vcryptResponseObj.getObject();として取得できます。

validateOTPCode()

validateOTPCode()は、指定されたリクエスト識別子とチャレンジ・タイプのOTPコードを検証します。このメソッドは、指定されたリクエスト識別子のOTPコードを検証するためにn回コールできます。OTPコードが存在し、まだ失効しておらず、指定されたOTPコードが既存のOTPコードと一致する場合は、OTP_CODE_MATCHED値を持つレスポンスが返されます。OTPコードが存在し、まだ失効しておらず、指定されたOTPコードが既存のOTPコードと一致しない場合は、OTP_CODE_NOT_MATCHED値を持つレスポンスが返されます。OTPコードが存在し、失効している場合は、OTP_CODE_EXPIRED値を持つレスポンスが返されます。OTPコードが存在しない場合は、OTP_CODE_DOESNOT_EXISTSが返されます。OTP検証結果をVCryptObjectResponseオブジェクトから取得するには、「TrackerAPIUtil.OTPValidationResult otpCode = (TrackerAPIUtil.OTPValidationResult) vcryptResponseObj.getObject();」と指定します。

resetChallengeCounter()

resetChallengeCounter()は、チャレンジ・カウンタをリセットします。

incrementChallengeCounter()

incrementChallengeCounter()は、チャレンジ・カウンタを増分します。

createOrUpdateEntities()

createOrUpdateEntities()は、エンティティを作成または更新します。

void AddClientCertificate()

web.configに設定されており、X.509証明書を取得してSOAPクライアントに追加する場合、BharosaSOAPClientCertFilePathおよびBharosaSOAPClientCertFilePasswodプロパティを読み取ります。

SOAPを使用してOAAMサーバーをコールするとき、X.509 SSL証明書構成をサポートします。

void AddClientCertificate(X509Certificate clientCert)

指定されたX.509証明書をSOAPクライアントに追加します。

SOAPを使用してOAAMサーバーをコールするとき、X.509 SSL証明書構成をサポートします。

void AddClientCertificate(string certFilePath, string password)

指定されたパスワードを使用して指定されたファイル・パスから証明書を取得し、SOAPクライアントにその証明書を追加します。

SOAPを使用してOAAMサーバーをコールするとき、X.509 SSL証明書構成をサポートします。

void RemoveClientCertificate(X509

Certificate clientCert)

指定された証明書が.NET framework配下にある場合、その証明書をSOAPクライアントから削除します。

SOAPを使用してOAAMサーバーをコールするとき、X.509 SSL証明書構成をサポートします。

4 OAAMとJavaアプリケーションとのネイティブ統合

Oracle Adaptive Access Manager Java APIを使用して、JavaアプリケーションをOracle Adaptive Access Manager Serverに統合できます。この統合は、Java 1.4またはそれ以降で作成されたアプリケーションでサポートされています。

この章では、次の内容を説明します。

- 第4.1項「Oracle Adaptive Access Managerの共有ライブラリについて」

- 第4.2項「OAAM Java In-Proc統合」

- 第4.3項「OAAM SOAP統合」

- 第4.4項「VCryptResponseについて」

- 第4.5項「Oracle Adaptive Access Manager API」

4.1 Oracle Adaptive Access Managerの共有ライブラリについて

Oracle Adaptive Access Managerの共有ライブラリは、Oracle Adaptive Access Managerとの統合に対応するJava SDKです。これは、統合されたアプリケーションがデプロイされるOracle WebLogic Serverインスタンスにデプロイし、ターゲットとする必要があります。Oracle WebLogic Serverインスタンスが、OAAMがデプロイされているのと同じWebLogic Serverドメインの一部であることを確認してください。

4.1.1 統合プロセスの概要

統合プロセスの高レベルの手順は次のとおりです。

1. Weblogic Webアプリケーション(WAR)またはエンタープライズ・アプリケーション(ear)を作成します。

2. OAAM SDK共有ライブラリ(oracle.oaam.libs)への参照をWebLogicデプロイメント記述子に追加します。

3. OAAM APIをコールするアプリケーションを実装します。

4. アプリケーションのJARファイルとその他のファイルを追加します。

5. アプリケーションをパッケージ化し、デプロイしてテストします。

4.1.2 WebアプリケーションでのOracle Adaptive Access Managerの共有ライブラリの使用

OAAM Webアプリケーションの共有ライブラリIAM_HOME/oaam/oaam_libs/war/oaam_native_lib.warをライブラリとしてデプロイします。

Oracle Adaptive Access Managerの共有ライブラリをWebアプリケーションで使用するには、WebLogicデプロイメント記述子ファイルweblogic.xmlに次のエントリを追加して、その共有ライブラリを参照する必要があります。

<library-ref>
<library-name>oracle.oaam.libs</library-name>
</library-ref>

4.1.3 エンタープライズ・アプリケーションでのOracle Adaptive Access Managerの共有ライブラリの使用

OAAMエンタープライズ・アプリケーションの共有ライブラリ IAM_HOME/oaam/oaam_libs/ear/oaam_native_lib.earをライブラリとしてデプロイします。

Oracle Adaptive Access Managerの共有ライブラリをエンタープライズ・アプリケーションで使用するには、WebLogicデプロイメント記述子ファイルweblogic-application.xmlに次のエントリを追加して、その共有ライブラリを参照する必要があります。

<library-ref>
<library-name>oracle.oaam.libs</library-name>
</library-ref>

4.1.4 Oracle Adaptive Access Managerのプロパティのカスタマイズ/拡張/オーバーライド

Oracle Adaptive Access Managerのプロパティをオーバーライドしたり、Oracle Adaptive Access Managerの列挙を拡張するには、これらのプロパティと列挙をoaam_custom.propertiesに追加して、そのファイルをネイティブWebアプリケーションのWEB-INF\classesディレクトリに配置します。

Oracle Adaptive Access Managerのプロパティのカスタマイズ、拡張またはオーバーライドの手順については、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。

4.2 OAAM Java In-Proc統合

この項では、In-Procメソッドを使用してOAAMを統合する方法について説明します。

1. OAAM共有ライブラリoracle.oaam.libsへの参照が設定済であることを確認してください。
Oracle Adaptive Access Managerの共有ライブラリをWebアプリケーションで使用するには、WebLogicデプロイメント記述子ファイルweblogic.xmlに次のエントリを追加して、その共有ライブラリを参照する必要があります。

<library-ref>
<library-name>oracle.oaam.libs</library-name>
</library-ref>

Oracle Adaptive Access Managerの共有ライブラリをエンタープライズ・アプリケーションで使用するには、WebLogicデプロイメント記述子ファイルweblogic-application.xmlに次のエントリを追加して、その共有ライブラリを参照する必要があります。

<library-ref>
<library-name>oracle.oaam.libs</library-name>
</library-ref>

2. Oracle Adaptive Access Managerのプロパティをオーバーライドしたり、Oracle Adaptive Access Managerの列挙を拡張するには、これらのプロパティと列挙をoaam_custom.propertiesに追加して、そのファイルをネイティブWebアプリケーションのWEB-INF\classesディレクトリに配置します。

3. jdbc/OAAM_SERVER_DB_DSというJNDI名のOAAMデータソースを設定して、それをOAAMデータベースにポイントします。

4.3 OAAM SOAP統合

この項では、SOAPメソッドを使用してOAAMを統合する方法について説明します。SOAPサービス・ラッパーAPIの統合では、アプリケーションはWebサービスを使用してOracle Adaptive Access Managerと通信します。

初期設定の状態のOAAMでは、WebサービスがURL/oaam_server/servicesに公開されています。OAAM 11g Release 2 (11.1.2.0.0)以降、OAAM Webサービスを保護するためのデフォルトのメカニズムでは、Oracle Web Services Manager (OWSM)ポリシーを使用します。この項では、認証(ユーザー名とパスワード・リクエストを使用するHTTP Basic認証)および認可(構成済のユーザー・グループにおけるユーザーのメンバーシップ)のOWSMポリシーの構成について説明します。認証では、渡されたユーザー資格証明が正しいかどうかがチェックされ、認可では、グループにおけるユーザーのメンバーシップ(WebLogic組込みユーザー・ストア内のユーザー/グループなど)に基づいて、リクエストされたリソースに対してユーザーがアクセスを許可されているかどうかがチェックされます。Oracle Web Services Manager (OWSM)ポリシーはOracle Enterprise Manager Fusion Middleware Controlを使用して、SOAP認証と認可を管理します。

4.3.1 Webサービスの認証

OAAM Webサービスは、Oracle Web Services Manager (OWSM)でポリシーoracle/wss_http_token_service_policyを使用することによって保護できます。wss_http_token_service_policyポリシーは認証を強制し、HTTPヘッダーの資格証明を使用してユーザーを認証します。SOAPリクエストは、構成済レルム(WebLogic組込みユーザー・ストアのユーザー)に対して認証(HTTP Basic認証)されます。

HTTP Basic認証を/oaam_server/servicesに設定するためにOracle Web Services Manager (OWSM)のポリシーをセットアップするには、次の手順を実行します。

1. URLhttp://weblogic-admin-hostname:port/emを使用して、Oracle Enterprise Manager Fusion Middleware Controlにログインします。

2. weblogic_domainでドメインを選択し、oaam_server_server1を選択して右クリックしてから「Webサービス」オプションを選択します。

3. 「ポリシーのアタッチ」をクリックします。

4. OAAM Webサービスに対応するすべての行を選択して、「次へ」ボタンをクリックします。

5. SOAP認証を有効にするには、次の手順を実行します。

1. 行oracle/wss_http_token_service_policyを選択します。

6. SOAP認証を無効にするには、次の手順を実行します。

1. 行oracle/no_authentication_service_policyおよびoracle/no_authorization_service_policyを選択します。

2. 「Next」ボタンをクリックします。
サーバーでSOAP Webサービス認証を無効にすると(デフォルトでは有効になっている)、クライアントでは、認証されていなくてもWebサービスを使用できます。

7. 次のページで「アタッチ」ボタンをクリックします。

8. 必要に応じてOAAMサーバーを再起動します。

4.3.2 ユーザーとグループの作成

この項で認証構成を実行すると、OAAM Webサービスは構成済レルムにあるすべての有効なユーザー名/パスワードからアクセスできるようになります。たとえば、認証に合格できるすべてのユーザー資格証明がOAAM Webサービスにアクセスできます。

ユーザー名とパスワードを使用して、SOAP認証が実装されます。このユーザー名とパスワードは、アプリケーション・サーバーにアクセスできるユーザーに関連付けられている必要があります。そのユーザーがWebサービス上で操作を実行する権限を持つようにするには、そのユーザーをOAAM Webサービスにアクセスできるグループに追加する必要があります。

Webサービスを保護するには、URL: /oaam_server/servicesにアクセス可能なグループに属する、有効な資格証明を持つユーザーを作成する必要があります。

WebLogicデプロイメントでは、このSOAPユーザーをWebLogicセキュリティ・レルム内で格納して管理できます。

OAAMクライアントは、次のoaam_custom.propertiesプロパティを使用してWebサービスを起動するときに、このユーザー名とパスワードを使用するように構成されています。

vcrypt.soap.auth.keystorePassword - Base64 encoded Password used to open the
system_soap.keystore
vcrypt.soap.auth.aliasPassword - Base64 encoded Password used to retrieve the key
stored in the keystore
vcrypt.soap.auth.username - Username of the SOAP user
vcrypt.soap.auth.keystoreFile -
Filename of the keystore (should be system_soap.keystore)

ユーザーとグループを作成するには、次の手順を実行します。

1. WebLogicコンソールを使用して、構成済レルム内にグループを作成します。たとえば、OAAM_WebServices_Groupというグループを作成します。

図4-1 ユーザー・グループの作成

2. ユーザーを作成して、ステップ1で作成したグループとユーザーを関連付けます。

図4-2 ユーザーの作成およびユーザーとグループの関連付け

3. グループ・メンバーシップに対してユーザーを更新します。

図4-3 ユーザーのグループ・メンバーシップの構成

4.3.3 Webサービス認可の構成

Oracle Web Services Manager (OWSM)ポリシーoracle/binding_authorization_permitall_policyを使用すると、OAAM Webサービスの認可を構成できます。binding_authorization_permitall_policyポリシーでは、SOAPバインド・レベルで認証されたユーザーに基づいて、リクエストに対して簡単な権限ベースの認可が実行されます。このポリシーにより、ユーザーが操作の実行権限を確実に持つようになります。このポリシーは、ユーザーが作成されている認証ポリシーの後に続ける必要があり、Webサービス・エンドポイントに添付できます。

1. URLを使用して、Oracle Enterprise Manager Fusion Middleware Controlにログインします。

http://weblogic-admin-hostname:port/em

2. WebLogicドメインを展開します。

3. OAAMサーバー、Webサービス、およびポリシーをホストしているドメインを右クリックします。

4. oracle/binding_authorization_permitall_policyを選択します。

5. 「編集」をクリックして、「設定」タブをクリックします。

6. 「認証設定」から「選択したロール」を選択します。

7. 「追加」(プラス記号)をクリックして、グループ(ステップ2で作成済)を「追加対象として選択したロール」リストに移動し、「OK」をクリックします。

図4-4 追加したユーザー・ロール

8. 「保存」をクリックしてポリシーを保存します。

図4-5 追加したロールと保存したポリシー

9. 前述のポリシー構成が予想どおりに動作することを確認するには、プロパティactive.protocolをremoteに設定します。OAAMサーバーをホストするドメインに移動して、「Webサービス」、「プラットフォーム・ポリシー構成」、および「ポリシー・アクセッサ・プロパティ」を右クリックすると、プロパティのこの値をオンにできます。

10. 認可ポリシーをWebサービス・エンドポイントに添付します。
注意: OAAMサーバーによってEnterprise Manager上に公開されているWebサービス・エンドポイントのリストを取得するには、Fusion Middleware Controlの「Identity and Access」に移動します。OAAMを展開してから、oaam_serverを展開し、「Webサービス」を右クリックします。

1. URLを使用して、Oracle Enterprise Manager Fusion Middleware Controlにログインします。

http://weblogic-admin-hostname:port/em

2. weblogic_domainでドメインを選択し、oaam_server_server1を選択して右クリックしてから「Webサービス」オプションを選択します。

3. 「ポリシーのアタッチ」をクリックします。

4. OAAM Webサービスに対応するすべての行を選択して、「次へ」ボタンをクリックします。

5. 行oracle/binding_authorization_permitall_policyを選択します。

6. 「Next」ボタンをクリックします。

7. 次のページで「アタッチ」ボタンをクリックします。

8. 必要に応じてOAAMサーバーを再起動します。

4.3.4 SOAPユーザー・パスワードを保護するクライアント側のキーストアの設定

Webサービス/SOAPクライアントは、OAAM Webサービスとの正常な通信のために、ユーザー名とパスワードを送信する必要があります。

ネイティブ・クライアントWebサービスのセキュリティを設定するには:

1. $ORACLE_HOME/oaam/cliディレクトリで、ファイル(soap_key.fileなど)を作成し、それにHTTP認証ユーザー・パスワードを入力します。(OAAM Webサービス・グループのロール/グループに追加されたユーザーのパスワード)。

2. sample.config_3des_input.propertiesをsoap_3des_input.propertiesにコピーします。

cp sample.config_3des_input.properties soap_3des_input.properties

3. soap_3des_input.propertiesをキーストア・パスワード、別名パスワードおよびパスワード・ファイルで更新します。

#This is the password for opening the keystore.
keystorepasswd=

#This is the password reading alias (key) in the keystore. For example, #Welcome1
keystorealiaspasswd=

#File containing from key. Please note, keys in AES could be binary.
#Also note algorithms like 3DES require minimum 24 characters in the key
#keyFile=soap_key.file
keyFile=

keystorefilename=system_soap.keystore
keystorealias=vcrypt.soap.call.passwd

4. ORACLE_MW_HOMEおよびJAVA_HOMEとソースsetCliEnv.shを設定します。

5. キーストアを生成します。

- Unix/Linuxの場合は、次を実行します。

$JAVA_EXE -Djava.security.policy=conf/jmx.policy -classpath
$CLSPTH com.bharosa.vcrypt.common.util.KeyStoreUtil
updateOrCreateKeyStore readFromFile=soap_3des_input.properties

- Windowsの場合は、次を実行します。

genkeystore.cmd soap_3des_input.properties

KeyStoreコマンドが成功した場合は、次のような出力が表示されます。

updateOrCreateKeyStore done!
Keystore file:system_soap.keystore,algorithm=DESede
KeyStore Password=ZG92ZTEyMzQ=
Alias Password=ZG92ZTEyMw==

6. キーストア・パスワードと画面に出力された別名パスワードを書き留めます。これらをoaam_custom.propertiesに追加する必要があります。

7. 次のプロパティをエンコードされたパスワード(手順5)および認証ユーザー名とともにoaam_custom.propertiesに追加します。
OAAMクライアントは、次のoaam_custom.propertiesプロパティを使用してWebサービスを起動するときに、このユーザー名とパスワードを使用するように構成されています。

vcrypt.soap.auth.keystorePassword - Base64 encoded keystore password used to open the system_soap.keystore
vcrypt.soap.auth.aliasPassword - Base64 encoded password to the alias used to retrieve the key stored in the keystore
vcrypt.soap.auth.username - Username of the SOAP user configured for accessing the SOAP services
vcrypt.soap.auth.keystoreFile - Filename of the keystore (should be system_soap.keystore)

8. system_soap.keystoreファイルをソース・コード管理システムに保存します。このファイルを処理する際には、十分なセキュリティ対策を施してください。ファイルには重要なパスワード情報が含まれています。権限のある人員のみにこのファイルへの読取りアクセスが与えられていることを確認してください。このファイルを失うと、Oracle Adaptive Access Managerは暗号化されたデータのリカバリができなくなります。

9. system_soap.keystoreをapplication/WEB-INF/classes(ネイティブ・クライアント・デプロイメントのクラスパス)にコピーします。

10. soap_key.fileファイルとsoap_3des_input.propertiesファイルを両方とも削除します。

4.3.5 SOAP関連プロパティのoaam_custom.propertiesへの設定

次のプロパティを、ネイティブ・アプリケーションのoaam_custom.propertiesに設定します。

vcrypt.common.util.vcryptsoap.impl.classname=
com.bharosa.vcrypt.common.impl.VCryptSOAPGenericImpl
vcrypt.tracker.impl.classname=
com.bharosa.vcrypt.tracker.impl.VCryptTrackerSOAPImpl
vcrypt.user.image.dirlist.property.name=bharosa.image.dirlist
bharosa.config.impl.classname=com.bharosa.common.util.BharosaConfigPropsImpl
bharosa.config.load.impl.classname=
com.bharosa.common.util.BharosaConfigLoadPropsImpl
vcrypt.tracker.soap.useSOAPServer=true
vcrypt.soap.disable=false
vcrypt.soap.auth.keystoreFile=system_soap.keystore

# Environment specific values need to be replaced below this line
vcrypt.tracker.soap.url=http://host-name:port/oaam_server/services
bharosa.image.dirlist=absolute_folder_path_where_oaam_images_are_available

# If SOAP Authentication is enabled, then the following have to be set
# otherwise just set the property vcrypt.soap.auth=false
vcrypt.soap.auth=true
vcrypt.soap.auth.keystorePassword=Java_keystore_password
vcrypt.soap.auth.aliasPassword=Keystore_alias_password
vcrypt.soap.auth.username=SOAP_User_name

4.4 VCryptResponseについて

VCryptResponseには、処理のステータスに関する情報が含まれています。処理のステータスが成功(isSuccess)であった場合に役立つ情報が含まれています。エラーが発生した場合は、エラー・コードも含まれます。また、その他のペイロード情報が拡張データ・マップの形式で含まれていることもあります。統合の要件に応じて、VCryptResponseのこれらの機能が使用できます。

4.5 Oracle Adaptive Access Manager API

Oracle Adaptive Access Managerには、次の処理を行うAPIが用意されています。

- クライアント・アプリケーションからの情報を収集および追跡する。

- デバイスおよび場所情報を判別するために、ユーザー・ログイン情報、ユーザー・ログイン・ステータス、およびユーザー・セッションの各種属性を取得する。

- トランザクション詳細を収集する。

すべての認証シナリオと標準フローの詳細は、第2章「Oracle Adaptive Access Managerのネイティブ統合」を参照してください。

注意:

isElementInList()、getListElements()、およびupdateList()の各APIは、「アラート・グループ」リストの更新/アクションをサポートしていません。

4.5.1 addQuestion

addQuestionは、指定されたユーザーの新規の質問を追加します。

public boolean addQuestion(java.lang.String loginId, java.lang.String
questionText, java.lang.String answerText)

表4-1 addQuestion

パラメータ

説明

loginId

ユーザーがログインするために使用するID。

questionText

新規に追加される質問。このユーザーに同じ質問がすでに設定されている場合は、オーバーライドします。操作が成功したか、または失敗したかを返します。

answerText

質問に対する回答。

4.5.2 authenticatePassword

authenticatePasswordは、パスワードを認証します。

public VCryptAuthResult authenticatePassword(java.lang.String loginId,
java.lang.String password, int authSessionType, int clientType, java.lang.String
clientVersion, java.lang.String ipAddress, int fingerPrintType, java.lang.String
fingerPrint)

VCryptAuthResultオブジェクトを返します。

表4-2 authenticatePassword

パラメータ

説明

loginId

ユーザーがログインするために使用するID。

password

新規に設定するパスワード。

clientType

認証に使用されたクライアント・タイプを示す列挙値。

clientVersion

クライアントのバージョン(オプション)。

authSessionType

認証の理由。

ipAddress

ユーザー・デバイスのIPアドレス。

fingerPrintType

フィンガープリント処理のタイプ。

fingerPrint

指紋

4.5.3 authenticateQuestion

authenticateQuestionは、質問または回答を認証します。

public VCryptAuthResult authenticateQuestion(java.lang.String loginId,
java.lang.Long authSessionId, java.lang.String answer, java.lang.String ipAddress,
int fingerPrintType, java.lang.String fingerPrint)

認証試行の結果を記述したVCryptAuthResultを返します。

表4-3 authenticateQuestion

パラメータ

説明

loginId

回答を認証するためにユーザーが使用するID。

authSessionId

認証セッションのID。

answer

ユーザーにより指定された回答。

ipAddress

ユーザー・デバイスのIPアドレス。

fingerPrintType

フィンガープリント処理のタイプ。

fingerPrint

指紋

4.5.4 cancelAllTemporaryAllows

cancelAllTemporaryAllowsは、カスタマIDに設定されている一時許可をすべて取り消します。

public VCryptResponse cancelAllTemporatyAllows(String customerId);

表4-4 cancelAllTemporaryAllowsのパラメータ

パラメータ

説明

customerId

カスタマID。

4.5.5 clearSafeDeviceList

clearSafeDeviceListは、リクエストに関連付けられているユーザーのユーザー安全デバイス・リストを消去します。

public VCryptBooleanResponse clearSafeDeviceList(String requestId);

表4-5 clearSafeDeviceListのパラメータ

パラメータ

説明

requestId

ログイン・セッションのID。ログイン・セッションに関して、Bharosa APIのすべてのコールに同じIDを割り当てる必要があります。

4.5.6 createOAAMSession

デプロイメントでトランザクションのみがサポートされ、ユースケースのログイン・タイプがサポートされていない場合は、トランザクションAPIをコールする前に、次のcreateOAAMSessionAPIを使用してOAAMセッションを作成する必要があります。

セッションを作成する場合は、createOAAMSessionリクエストで値を指定し、その後でAPIをコールします。

createOAAMSession(String requestId, Date requestTime, OAAMUserData user,
OAAMIPData ip,

List<OAAMDeviceFingerprintData> cookieList, OAAMSessionData sessionData)

表4-6 createOAAMSessionのパラメータ

パラメータ

説明

requestId

requestIdはユーザー・セッションを識別します(必須)。

requestTime

requestTimeはリクエストの時間です。nullにできます。nullにした場合、サーバーでは現在時間が使用されます。

user

ユーザーはOAAMのユーザーです。

ip

ユーザー・セッションのIPアドレス。

cookieList

セッションに格納されているCookieのリスト。

sessionData

セッションからのデータ。

4.5.7 createOrUpdateEntities

createOrUpdateEntities APIを使用すると、次のタスクを実行できます。

- エンティティを作成および更新する。

- エンティティ更新時に属性値を置換およびマージする。

public VCryptObjectResponse<VCryptObjectResponse<EntityHeader>[]>
createOrUpdateEntities(EntityData[] entityRequestData,boolean isReplaceEntity, int
commitBatchSize, String requestId);

表4-7 エンティティの作成または更新API

パラメータ

説明

entityRequestData

EntityDataオブジェクトの配列です。EntityDataオブジェクトには、1つのエンティティの作成に必要な情報が含まれています。EntityData.javaの詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager Java APIリファレンス』を参照してください。

isReplaceEntity

エンティティの更新時に属性の置換またはマージを判別するためのフラグ。デフォルト値: FALSE(マージを指定)。

commitBatchSize

同時にコミットする必要のあるエンティティの数を判別します。デフォルトおよび最小値は1です。

requestId

セッションを識別する値。この値はクライアントによって送信されます。クライアントでこの値が設定されていない場合は、ダミーの数値が生成されます。

VCryptObjectResponse:

SUCCESS: APIの実行に成功し(データベース・エラーまたは接続エラーがない)、少なくとも1つのエンティティが作成されます。

response.getObject()は、個別エンティティのVCryptObjectResponseが含まれている配列オブジェクトを返します。各レスポンス・オブジェクトには、SUCCESS時のEntityHeaderオブジェクトが含まれています。response.isSuccess()に対する問合せ。(SUCCESSの場合はtrue、ERRORの場合はfalse)。

エンティティが作成されなかった場合は、ERRORになります。

response.getObject()は、VCryptObjectResponseが含まれているオブジェクトを返します。各レスポンス・オブジェクトには、ERROR時のエラー・メッセージが含まれています。

4.5.8 createTransaction

createTransactionは、トランザクションを新規に作成します。

public VCryptResponse createTransaction(
TransactionCreateRequestData trxUpdData =
new TransactionCreateRequestData(sessionId,
requestTime,
transactionDefKey,
externalTransactionId,
trxStatus, trxDataMap,
analyzePatterns);
response =
VCryptTrackerUtil.getVCryptTrackerInstance().createTransaction(trxUpdData);

TransactionResponse transResponse = response.getTransactionResponse();
Long transId = null;
if (transResponse != null){
transId = transResponse.getTransactionId();
}

表4-8 createTransactionのパラメータと戻り値

パラメータ

説明

TransactionCreateRequestData

トランザクションを作成するオブジェクト。検証に失敗した場合、例外BharosaExceptionをスローします。

このオブジェクトの構造は次のとおりです。

- sessionIDはユーザー・セッションを識別します(必須)。

- requestTimeはリクエストの時間です。NULLにできます。NULLにした場合、サーバーでは現在時間が使用されます。

- transactionDefKeyはトランザクション定義のキーです。トランザクション定義の作成に使用します(必須)。

- externalTransactionIdは、アプリケーション・トランザクションを対応するOAAMトランザクションに関連付けるために使用します。トランザクションの更新にも使用できます。

- trxStatusはトランザクション・ステータスで、NULLにできます。対応する列挙名はtracker.transaction.status.enumです。

- trxDataMapは、キーと値のペアのマップです。このマップのキーは、トランザクション定義の関連ソース・データの内部IDと完全に一致する必要があります。値は、常にjavaのString値になります。値がDate値の場合は、書式yyyy-MM-dd'T'HH:mm:ss.SSSzで表示する必要があります。

- analyzePatterns: パターン処理を実行するかどうかを示すブール値です。値がtrueとして渡された場合、resultStatusの値がsuccessであれば、トランザクションに対してパターン処理が実行されます。

VCryptResponse

レスポンス・オブジェクト。isSuccess()を確認した後で、メソッドgetTransactionResponse()を使用してトランザクションIDを取得してください。

4.5.9 createUser

createUserは、認証データベースにユーザーを作成します。

public VCryptAuthUser createUser (VCryptAuthUser user)

表4-9 createUser

パラメータ

説明

ユーザー

認証済ユーザー。新規に作成された認証済ユーザーを返します。

4.5.10 deleteQuestion

deleteQuestionは、指定されたユーザーの質問を削除します。

public boolean deleteQuestion(java.lang.String loginId, java.lang.String question)

表4-10 deleteQuestion

パラメータ

説明

loginId

ユーザー・ログインID。

question

削除対象の質問。操作が成功したか、または失敗したかを返します。

4.5.11 getActionCount

getActionCountは、指定されたactionEnumIdのアクション数を構成済のアクション列挙から取得します。

public VCryptIntResponse getActionCount(String requestId, Sting customerId,
Integer actionEnumId);

表4-11 getActionCountのパラメータ

パラメータ

説明

requestId

リクエストID(エラーが発生したときにクライアントのリクエストをロギングおよびトレースするために使用)。

customerId

カスタマID。

actionEnumId

actionEnumを識別する整数(必須)。対応する列挙名はrule.action.enumです。

注意:

このAPIを使用するには、対応するアクションincrementCacheCounterプロパティをtrueに設定する必要があります。

4.5.12 getCaption

getCaptionは、ユーザーのキャプションを取得します。

public java.lang.String getCaption(java.lang.String loginId)

表4-12 getCaption

パラメータ

説明

loginId

ユーザーのログインID。キャプション文字列を返します。

4.5.13 getFinalAuthStatus

getFinalAuthStatusは、ユーザーの最終認証ステータスを返します。30日より古いステータスは使用できません。

public VCryptIntResponse getFinalAuthStatus(String requestId, String userId);

表4-13 getFinalAuthStatusのパラメータ

パラメータ

説明

requestId

リクエストID(エラーが発生したときにクライアントのリクエストをロギングおよびトレースするために使用)。

userId

ユーザーを一意に識別するID。NULLにできません。

4.5.14 getImage

getImageは、ユーザーのimagePathを取得します。

public java.lang.String getImage(java.lang.String loginId)

表4-14 getImage

パラメータ

説明

loginId

ユーザーのログインID。イメージへのパスを返します。

4.5.15 getRulesData

getRulesDataは、指定されたセッションIDに対して実行されたすべてのルールを返し、トリガーされたルールに関する情報を提供します。

public VCryptSessionRuleData getRulesData(String requestId);

表4-15 getRulesDataのパラメータ

パラメータ

説明

requestId

リクエストID(エラーが発生したときにクライアントのリクエストをロギングおよびトレースするために使用)。

4.5.16 getSecretQuestion

getSecretQuestionは、ユーザーの機密質問を取得します。

public VCryptQuestion getSecretQuestion(java.lang.String loginId)

表4-16 getSecretQuestion

パラメータ

説明

loginId

認証するユーザーのログインID。問い合せる質問が含まれているオブジェクトを返します。

4.5.17 getSignOnQuestions

getSignOnQuestionsは、ユーザーに使用可能なすべての機密質問を取得します。

public VCryptQuestion getSignOnQuestions(java.lang.String loginId)

表4-17 getSignOnQuestions

パラメータ

説明

loginId

認証するユーザーのログインID。問い合せる質問が含まれている2次元配列オブジェクトを返します。1次元はユーザーに表示する(構成可能な)質問セットの数を表し、2次元は各質問セットの質問数を表します。

4.5.18 getUserByLoginId

getUserByLoginIdは、指定されたカスタマおよびグループに対して、パスワードおよびPINを含まないユーザー詳細を返します。

public VCryptAuthUser getUserByLoginId(String loginId, String groupName);

表4-18 getUserByLoginId

パラメータ

説明

loginId

ユーザーがログインするために使用するID。

groupName

グループ名。

4.5.19 handleTrackerRequest

handleTrackerRequestは、フィンガープリント詳細を取得してデバイスを識別します。指定されたリクエスト時間のフィンガープリント詳細を取得できる場合もあり、過去のリクエスト時間にも対応できます。

public CookieSet handleTrackerRequest(String requestId,
String remoteIPAddr,
String remoteHost,
String secureCookie,
int secureClientType,
String secureClientVersion,
String digitalCookie,
int digitalClientType,
String digitalClientVersion,
int fingerPrintType,
String fingerPrint,
int fingerPrintType2,
String fingerPrint2);

public CookieSet handleTrackerRequest(String requestId,
Date requestTime,
String remoteIPAddr,
String remoteHost,
String secureCookie,
int secureClientType,
String secureClientVersion,
String digitalSigCookie,
int digitalClientType,
String digitalClientVersion,
int fingerPrintType,
String fingerPrint,
int fingerPrintType2,
String fingerPrint2);

返されたオブジェクトには、そのコンテンツにアクセスするファンクションがあります。これらを次に示します。

public String getFlashCookie()
public String getSecureCookie()
public String getRequestId()
public VCryptResponse getVCryptResponse()

表4-19 handleTrackerRequestのパラメータ

パラメータ

説明

requestId

ログイン・セッションID。これは、ログイン・セッションのすべてのAPIコールに必要なIDです。

remoteIPAddr

リクエスト発生元のIPで、HTTPリクエストから抽出されます。

remoteHost

リクエスト発生元のマシンのホスト名(オプション)。

secureCookie

セキュアなCookie。ブラウザから受信した場合のみ渡されます。

secureClientType

認証に使用されるクライアントのタイプを識別する列挙値。対応する列挙名はauth.client.type.enumです。

secureClientVersion

クライアントのバージョン(オプション)。

digitalCookie

デジタル署名Cookie。フラッシュCookieも使用できます。ブラウザにより送信された場合のみ渡されます。

digitalClientType

使用されたフラッシュ・クライアントのタイプを指定するデジタル・クライアントのタイプ。指定されていない場合は、値0を使用します。

digitalClientVersion

デジタル・クライアントのバージョン。フラッシュ・クライアントのバージョンも使用できます。

fingerPrintType

有効値のリストについては、OAAM列挙vcrypt.fingerprint.type.enumを参照してください。現在、列挙には次の値が設定されています。

- browser=1

- flash=2

fingerPrintTypeの値として1(ブラウザ用)を使用することをお薦めします。このパラメータは、ブラウザのフィンガープリント・タイプに対応しているためです。

fingerPrint

フィンガープリント。ブラウザの特性を記述している場合は、ヘッダーがこの文字列に解析されます。これはブラウザ・ヘッダー情報を表します。

fingerPrintType2

同じリクエストに複数のフィンガープリントがある場合に使用します。これはプロパティ・ファイルに定義されています(オプション)。

fingerPrint2

2番目のフィンガープリント値(オプション)。

requestTime

リクエストが行われた時間。

4.5.20 handleTransactionLog

handleTransactionLogは、トランザクション詳細を取得します。

注意:

10.1.4.5.1では非推奨。かわりに、メソッドcreateTransactionを使用してください。

public VCryptResponse handleTransactionLog(String requestId, Map[] contextMap);

public VCryptResponse handleTransactionLog(String requestId, Date requestTime,
Map[] contextMap);

public VCryptResponse handleTransactionLog(String requestId, Date
requestTime,Integer status, Map[] contextMap);

表4-20 handleTransactionLogのパラメータ

パラメータ

説明

requestId

ログイン・セッションID。これは、ログイン・セッションのすべてのAPIコールに必要なIDです。

requestTime

リクエストが行われた時間。

contextMap

contextMapsの配列。1回のコールで複数のトランザクションを作成できます。配列のコンテキスト・マップごとにtransactionTypeキーがあると想定しています。

status

トランザクションのステータス。

4.5.21 IsDeviceMarkedSafe

IsDeviceMarkedSafeは、リクエストに関連付けられているユーザー・デバイスが安全かどうかを示す値を返します。

public VCryptBooleanResponse IsDeviceMarkedSafe(String requestId);

表4-21 IsDeviceMarkedSafeのパラメータ

パラメータ

説明

requestId

ログイン・セッションID。これは、ログイン・セッションのすべてのAPIコールに必要なIDです。

4.5.22 markDeviceSafe

markDeviceSafeは、ユーザー・デバイスが安全であるとマークします。

public boolean markDeviceSafe(String requestId, boolean isSafe);

表4-22 markDeviceSafeのパラメータ

パラメータ

説明

requestId

ログイン・セッションID。これは、ログイン・セッションのすべてのAPIコールに必要なIDです。

isSafe

このユーザー・デバイスが安全かどうかを示します。

4.5.23 processPatternAnalysis

processPatternAnalysis は、データ・パターン処理をトリガーします。

public VCryptResponse processPatternAnalysis(String requestId,
long transactionId,
int status,
String transactionType);

表4-23 processPatternAnalysisのパラメータ

パラメータ

説明

requestId

ログイン・セッションID。これは、ログイン・セッションのすべてのAPIコールに必要なIDです。

transactionId

トランザクションの識別子。認証タイプのデータの場合、NULLを渡すことができます。トランザクション・データのパターン処理の場合、このパラメータは必須です。

status

ユーザー定義列挙auth.status.enumの値。ステータスの値が列挙のSuccess値に対応する値である場合は、パターン分析が実行されます。そうでない場合は、実行されません。

transactionType

トランザクションのタイプを示します。認証トランザクションの場合は、authである必要があります。その他のトランザクション・タイプの値(bill_paymentなど)はカスタマイズできます。

4.5.24 processRules

ルール・エンジンはOAAMの一部であり、チェックポイントでポリシーを実施します。OAAMには、コール側のコンテキストに応じて結果を返す、ポリシーを評価するAPIが組み込まれています。

processRules は、渡されたチェックポイントのポリシー・セットを処理します。

VCryptRulesResult ruleResult =
VCryptTrackerUtil.getVCryptRulesEngineInstance().processRules(
sessionId,
transId,
externalTransactionId,
requestTime,
runtimeList,
contextDataMap);

processRulesはルール・エンジンに関連するメソッドをコールし、メソッドVCryptTrackerUtil.getVCryptRulesEngineInstance()をコールすることによってルール・エンジンのインスタンスを取得します。

表4-24 processRulesのパラメータ

パラメータ

説明

sessionId

ログイン・セッションID。これは、ログイン・セッションのすべてのAPIコールに必要なIDです。

transId

トランザクション・セッションID。これは、トランザクション・セッションのすべてのAPIコールに必要なIDです。

externalTransactionId

externalTransactionIdは、アプリケーション・トランザクションを対応するOAAMトランザクションに関連付けるために使用します。トランザクションの更新にも使用できます。

requestTime

リクエストが行われた時間。

runtimeTypes

評価されるチェックポイントのリスト。このリストのチェックポイントが個別に評価されます。runtimeTypesは、Integer型のシングルトン・リストです。

たとえば、トランザクション前チェックポイントを実行するには、次のリストを作成します。

List PRE_TRANSACTION_RUNTIME_LIST = Collections.singletonList(new Integer(1));

contextDataMap

コンテキスト・データを識別するキーと値のペアのリスト。このAPIのcontextDataMapは、ルール処理に必要な追加パラメータをすべて提供します。たとえば、セッション中にIPが変更されたかどうかを検証するために、Process Rules APIのcontextDataMapにIPを指定すると、OAAMでは新規IPを、作成/更新トランザクション中に使用された元のIPと比較できます。

processRules()メソッドでの複数チェックポイントの実行に関する情報

1. チェックポイント評価の順序は、リスト内の順序に基づいています。OAAMルール・エンジンはチェックポイント・リストを反復して、一度に1つずつチェックポイントを評価します。

2. 各チェックポイントの評価結果は、キーとしてCheckPointId、値としてVCryptRulesResultとともに、ResultMapに格納されます。

3. さらに、ResultMapはVCryptRulesResultに設定されます。

4. VCryptRulesResultが、processRules()メソッドの結果として返されます。

5. チェックポイントの実行が失敗した場合、ResultMapの対応するVCryptRulesResultがその情報を取得しますが、他のチェックポイントの実行は影響を受けません。ただし、システム障害の場合は、processRules()自体の結果にエラーの詳細が表示されます。

コール元が各チェックポイントの実行結果をフェッチしようとする前に、processRules()メソッドの結果の成功ステータスをテストすることをお薦めします。

デバイスIDの取得

ルール・エンジンは、ルールの結果だけでなく、ユーザー・セッションと同等の内部識別子であるデバイスIDを返すことができます。

次のコード・サンプルで、デバイスIDの取得方法を説明します。

VCryptRulesResult rulesResult = new
VCryptRulesEngineImpl().processRules(<params..>);

If (!rulesResult.getVCryptResponse().isSuccess()) {

Logger.error("Error running rules " +
rulesResult.getVCryptResponse().getErrorMessage());

}

Long deviceId = rulesResult.getDeviceId();

デバイスIDを取得する際に、次の点を確認してください。

- Oracle Adaptive Access Managerのバージョンが10.1.4.5またはそれ以上である。

- プロパティbharosa.tracker.send.devideIdがtrueに設定されていて、デバイスIDが取得可能である。

bharosa.tracker.send.deviceId=true

有効なチェックポイント

有効なチェックポイントのリストは、OAAMの列挙profile.type.enumを参照してください。たとえば、profile.type.enum.preauth=1は、認証前チェックポイントが数値1によって指定されていることを示しています。

場所とデバイスのデータ

プロパティbharosa.tracker.sendLocationData=trueを設定した状態で、processRules APIをコールしたときに、場所(都市名、州名、国名)とデバイスのデータが返されます。

VCryptRulesResult rulesResult = processRules(/*params*/);
VCryptResponse response = rulesResult.getVCryptResponse();
If (response.isSuccess()) {

String ipAddress = response.getExtendedMap
(VCryptResponse.DATA_REMOTE_IP_ADDRESS) ;
String deviceId= response.getExtendedMap(VCryptResponse.DATA_DEVICE_ID) ;

// if interested in city, state, country
String city = response.getExtendedMap(VCryptResponse.DATA_CITY_NAME) ;
String state = response.getExtendedMap(VCryptResponse.DATA_STATE_NAME ;
String country = response.getExtendedMap(VCryptResponse.DATA_COUNTRY_NAME) ;
}

4.5.25 resetUser

resetUserは、登録、質問、イメージ、フレーズを含め、カスタマに設定されたすべてのプロファイルをリセットします。

public VCryptResponse resetUser(String customerId);

表4-25 resetUserのパラメータ

パラメータ

説明

customerId

カスタマID。

4.5.26 searchEntityByKey

searchEntityByKey APIを使用すると、キー属性に基づいてエンティティを検索できます。

public VCryptObjectResponse<EntityHeader>
searchEntityByKey(EntityData entityData);

表4-26 searchEntityByKey

パラメータ

説明

entityData

IDスキームに基づいて検索されるエンティティの主キー属性のキーと値が含まれている、entityNameおよびentityDataMapを持つEntityDataオブジェクト。

VCryptObjectResponse

SUCCESS時のエンティティ・オブジェクトであるEntityHeaderオブジェクト、またはERROR時のerrorメッセージが含まれています。

4.5.27 setCaption

setCaptionは、指定されたユーザーのキャプションを新規に設定します。

public boolean setCaption(java.lang.String loginId, java.lang.String caption)

表4-27 setCaption

パラメータ

説明

loginId

ユーザーのログインID。

caption

新規に設定するキャプション。操作が成功したか、または失敗したかを返します。

4.5.28 setImage

setImageは、ユーザーのイメージを新規に設定します。

public boolean setImage(java.lang.String loginId, java.lang.String imagePath)

操作が成功したか、または失敗したかを返します。

表4-28 setImage

パラメータ

説明

loginId

ユーザーのログインID。

imagePath

イメージ・ファイルへのパス。

4.5.29 setPassword

setPasswordは、指定されたユーザーのパスワードを新規に設定します。

public boolean setPassword(java.lang.String loginId, java.lang.String password,
int passwordStatus)

操作が成功したか、または失敗したかを返します。

表4-29 setPassword

パラメータ

説明

loginId

ユーザーのログインID。

password

新規に設定するパスワード。

passwordStatus

パスワードのステータス

4.5.30 setTemporaryAllow

setTemporaryAllowは、ユーザーに一時許可を設定します。一時許可によって、最終ルール・アクションをオーバーライドできます。

public VCryptResponse setTemporaryAllow(String customerId, int tempAllowType,
Date expirationDate);

表4-30 setTemporaryAllowのパラメータ

パラメータ

説明

customerId

カスタマID。

tempAllowType

一時許可のタイプ。このタイプのユーザー定義列挙はcustomercare.case.tempallow.level.enumです。

expirationDate

tempAllowTypeがusersetの場合は有効期限。それ以外の場合はNULLまたは空。

4.5.31 updateAuthStatus

updateAuthStatusはユーザー認証ステータスを更新し、必要に応じてパターン・データ処理をトリガーします。このメソッドは、ユーザー認証ステータスに変更が生じた場合にコールする必要があります。updateAuthStatusをコールする前に、アプリケーションで必ずupdateLogをコールしてください。

認証ステータス値のリストは、ユーザー定義列挙auth.status.enumで指定されます。アプリケーションでの必要に応じて、この列挙にアイテムを追加したり、この列挙からアイテムを削除したりできますが、この列挙の値のみを認証ステータスの識別に使用できます。

次のシナリオでは、ユーザー・ログイン(認証)ステータスの更新を処理する別の方法について説明します。

- ログイン・ステータスをupdateLogコールに渡します。このシナリオでは、updateAuthStatusへのコールはまったく行われません。

- ログイン・ステータスを設定する前にユーザーにログインを許可します。このシナリオでは、最初にupdateLogコールでステータスpendingを渡し、次にログイン・データを処理し、さらにupdateAuthStatusコールで適切なステータスを渡します。

- アプリケーション・フローにユーザーへのチャレンジが含まれている場合は、まずステータスをpendingに設定し、その後で、回答に応じてステータスをsuccessまたはwrong_answerにリセットします。

- 通常、ルール・エンジンの起動後にupdateAuthStatusをコールする必要はありません。これは、エンジンに、ルール実行の一環として認証ステータスの設定が含まれているためです。

public VCryptResponse updateAuthStatus(String requestID,
int resultStatus,
int clientType,
String clientVersion);

public VCryptResponse updateAuthStatus(String requestID,
Date requestTime,
int resultStatus,
int clientType,
String clientVersion);

public VCryptResponse updateAuthStatus(String requestID,
int resultStatus,
int clientType,
String clientVersion,
boolean analyzePatterns);

public VCryptResponse updateAuthStatus(String requestID,
Date requestTime,
int resultStatus,
int clientType,
String clientVersion
boolean analyzePatterns);

表4-31 updateAuthStatusのパラメータ

パラメータ

説明

requestId

ログイン・セッションID。これは、ログイン・セッションのすべてのAPIコールに必要なIDです。

requestTime

リクエストが行われた時間。

resultStatus

ユーザー定義列挙auth.status.enumの値。

clientType

認証に使用されたクライアント・タイプを示す列挙値。

clientVersion

クライアントのバージョン(オプション)。

analyzePatterns

パターン処理を実行するかどうかを示すブール値です。値がtrueとして渡されると、resultStatusの値がsuccessの場合に、トランザクションに対してパターン処理が実行されます。

4.5.32 updateLog

updateLogはユーザー・ログを更新し、必要に応じてCookieSetを作成します。

public CookieSet updateLog(String requestId,
String remoteIPAddr,
String remoteHost,
String secureCookie,
String digitalCookie,
String groupId,
String userId,
String loginId,
boolean isSecure,
int result,
int clientType,
String clientVersion,
int fingerPrintType,
String fingerPrint,
int digFingerPrintType,
String digFingerPrint);

public CookieSet updateLog(String requestId,
Date requestTime,
String remoteIPAddr,
String remoteHost,
String secureCookie,
String digitalCookie,
String groupId,
String userId,
String loginId,
boolean isSecure,
int result,
int clientType,
String clientVersion,
int fingerPrintType,
String fingerPrint,
int fingerPrintType2,
String fingerPrint2);

表4-32 updateLogのパラメータ

パラメータ

説明

requestId

ログイン・セッションID。これは、ログイン・セッションのすべてのAPIコールに必要なIDです。

remoteIPAddr

リクエスト発生元のIPで、HTTPリクエストから抽出されます。

remoteHost

リクエスト発生元のホスト名(オプション)。

secureCookie

セキュアなCookie。ブラウザから受信した場合のみ渡されます。

digitalCookie

デジタル署名Cookie。フラッシュCookieも使用できます。ブラウザにより送信された場合のみ渡されます。

groupId

このユーザーが属するグループのID。

userId

ユーザーID。これはユーザーの主IDキーです。無効なユーザーの場合はNULLになります。

loginId

ユーザーがログインのために使用するID(必須)。

isSecure

このノードがセキュアで登録可能であるかどうかを示すブール値。また、セキュアなデバイス(登録済デバイス)からログインが行われていることも示します。デバイスの概念がない場合は、falseに設定されます。

result

ユーザー定義列挙auth.status.enumの値。

clientType

認証に使用されたクライアント・タイプを示す列挙値。対応する列挙名はauth.client.type.enumです。

clientVersion

クライアントのバージョン(オプション)。

fingerPrintType

有効値のリストについては、OAAM列挙vcrypt.fingerprint.type.enumを参照してください。現在、列挙には次の値が設定されています。

- browser=1

- flash=2

fingerPrintTypeの値として1(ブラウザ用)を使用することをお薦めします。このパラメータは、ブラウザのフィンガープリント・タイプに対応しているためです。

fingerPrint

フィンガープリント。ブラウザの特性を記述している場合は、ヘッダーがこの文字列に解析されます。これはブラウザ・ヘッダー情報を表します。

digFingerPrintType

有効値のリストについては、OAAMの列挙vcrypt.fingerprint.type.enumを参照してください。現在、列挙には次の値が設定されています。

- browser=1

- flash=2

digFingerPrintTypeの値として2(フラッシュ用)を使用することをお薦めします。このパラメータはフラッシュのフィンガープリント・タイプに対応しているためです。

digFingerPrint

デジタル・フィンガープリント。

requestTime

リクエストが行われた時間。

fingerPrintType2

同じリクエストに複数のフィンガープリントがある場合に使用します。プロパティ・ファイルに定義されています(オプション)。

fingerPrint2

2番目のフィンガープリント値(オプション)。

4.5.33 updateTransaction

updateTransactionは、以前に作成されたトランザクションを更新します。

TransactionUpdateRequestData trxUpdData =
new TransactionUpdateRequestData(sessionId,
requestTime,
transactionId,
new Integer(trxStatus),
trxDataMap,
Boolean.TRUE);
response =
VCryptTrackerUtil.getVCryptTrackerInstance().updateTransaction(trxUpdData);

表4-33 updateTransactionのパラメータと戻り値

パラメータ

説明

TransactionUpdateRequestData

トランザクションを更新するオブジェクト。更新されるトランザクションのハンドルは、createTransactionメソッドによって返されたトランザクションID、またはcreateTransactionメソッドに渡された外部トランザクションIDのいずれかです。検証に失敗した場合は、例外BharosaExceptionが発生します。

このオブジェクトの構造は次のとおりです。

- sessionIdは、ユーザー・セッションを識別します(必須)。

- requestTimeはリクエストの時間です。NULLにできます。NULLにした場合、サーバーでは現在時間が使用されます。

- transactionIdは、createTransactionに対する以前のコールによって返されたIDです。

- trxStatusは、トランザクションのステータスです。指定可能な値は次のとおりです。

- success=1

- block=2

- reject=3

- wrong_answer=4

- pending=99

- trxDataMapは、キーと値のペアのマップです。このマップのキーは、トランザクション定義の関連するソース・データの内部IDと完全に一致する必要があります。値は、常にJavaのString値になります。値がDate値の場合は、書式yyyy-MM-dd'T'HH:mm:ss.SSSzで表示する必要があります。

VCryptTrackerInstance

レスポンス・オブジェクト。メソッドgetVCryptTrackerInstance()でトランザクションIDを取得する前に、isSuccess()を必ず確認してください。

4.5.34 updateTransactionStatus

updateTransactionStatusはトランザクション・ステータスを更新し、必要に応じてデータ・パターン処理をトリガーします。

注意:

10.1.4.5.1では非推奨。かわりに、メソッドupdateTransactionを使用してください。

public VCryptResponse updateTransactionStatus(String requestId,
long transactionId, int status);

public VCryptResponse updateTransactionStatus(String requestId, Date requestTime,
long transactionId, int status);

public VCryptResponse updateTransactionStatus(String requestId, long
transactionId, int status, Map[] contextMap);

public VCryptResponse updateTransactionStatus(String requestId, Date requestTime,
long transactionId, int status, Map[] contextMap);

public VCryptResponse updateTransactionStatus(String requestId, long
transactionId, int status, boolean analyzePatterns);

public VCryptResponse updateTransactionStatus(String requestId, Date requestTime,
long transactionId, int status, Map[] contextMap, boolean analyzePatterns);

表4-34 updateTransactionStatusのパラメータ

パラメータ

説明

requestId

ログイン・セッションID。これは、ログイン・セッションのすべてのAPIコールに必要なIDです。

requestTime

リクエストが行われた時間。

contextMap

contextMapsの配列。1回のコールで複数のトランザクションを作成できます。配列のコンテキスト・マップごとにtransactionTypeキーがあると想定しています。

Status

トランザクションのステータス。

transactionId

更新するステータスを持つトランザクションのID。NULLの場合は、指定されたセッションで最後のトランザクションを使用します。

analyzePatterns

パターン処理を実行するかどうかを示すブール値です。値としてtrueを渡すと、resultStatus値がsuccessの場合に、トランザクションに対してパターン処理が実行されます。

5 エンティティAPIを使用したエンティティの作成、更新および検索

エンティティは、トランザクションのインスタンスとして関連付けることができるデータ構造です。ユーザーが正常にログインした後に実行するすべてのプロセスをトランザクションと呼ぶことができます。Oracle Adaptive Access Managerでは、不正および誤用を防ぐために、トランザクションに関連するリスクをリアルタイムで評価できます。

この章では、アプリケーションでエンティティAPIを使用してエンティティの作成、更新および検索を実行する方法について説明します。この付録の内容は、次のとおりです。

- 第5.1項「エンティティAPIについて」

- 第5.2項 エンティティとマッピング属性の作成

- 第5.3項「データ・ストレージ」

- 第5.4項「一般的なエンティティのシナリオ」

5.1 エンティティAPIについて

OAAMには、不正検出を促進するエンティティとエンティティ関係をアプリケーションで管理するための2つのエンティティAPIが用意されています。

5.1.1 エンティティ・タスク

エンティティAPIは、アプリケーションでデータベース内のエンティティに対する作成、更新、置換および検索の各操作を実行することを可能にします。エンティティAPIによって、次の操作が実行できます。

- OAAMデータベース・スキーマでエンティティを作成および更新する。

- エンティティ属性を置換またはマージする。

- エンティティの検索

データベース内のクライアントのトランザクション・データに対して実行されるエンティティ・タスクは、次の情報を必要とします。

- エンティティ・キーは、OAAM管理でエンティティ定義を作成する際に管理者が指定するキーです。

- エンティティ・データは、クライアント・アプリケーションのユーザーが入力するデータです。

- リンクされたエンティティ関係名は、OAAM管理でエンティティ定義を作成する際に管理者が指定する名前です。リンクされたエンティティ関係名は、複雑なエンティティ・インスタンスでのみ必要です。

5.1.2 処理ステータス

VCryptObjectResponseには、処理のステータスに関する情報が含まれています。

エンティティの作成と更新APIの戻り型: VCryptObjectResponse:

結果

説明

SUCCESS

SUCCESS: APIの実行が成功し(データベース・エラーまたは接続エラーがありません)、少なくとも1つのエンティティが作成されます。

response.getObject()は、個別エンティティのVCryptObjectResponseが含まれている配列オブジェクトを返します。各レスポンス・オブジェクトには、SUCCESS時のEntityHeaderオブジェクトが含まれています。response.isSuccess()に対する問合せ。(SUCCESSの場合はtrue、ERRORの場合はfalse)。

ERROR

エンティティが作成されなかった場合は、ERRORになります。

response.getObject()は、VCryptObjectResponseが含まれているオブジェクトを返します。各レスポンス・オブジェクトには、ERROR時のエラー・メッセージが含まれています。

エンティティ検索APIの戻り型: VCryptObjectResponse

戻りオブジェクト

説明

VCryptObjectResponse

SUCCESS時のエンティティ・オブジェクトであるEntityHeaderオブジェクト、またはERROR時のエラー・メッセージが含まれています。

5.1.3 エンティティの作成または更新

createOrUpdateEntities APIを使用すると、次のタスクを実行できます。

- エンティティを作成および更新する。

- エンティティ更新時に属性値を置換およびマージする。

エンティティを作成すると、エンティティ・データ・マップから主キーの値を使用して一意のキーが生成されます。OAAMでは、このキーを使用して、エンティティがすでにデータベースに存在するかどうかが確認されます。エンティティが存在していない場合はエンティティが作成され、存在している場合は更新されます。エンティティの更新は、エンティティ・データ・マップで指定したデータに基づいて行われます。

entityIdを使用して既存エンティティの属性値を削除するには、次のようにentityDataMapを移入し、isReplaceEntity (createOrUpdateEntityにある)パラメータをtrueに設定します。

APIシグネチャ:

public VCryptObjectResponse<VCryptObjectResponse<EntityHeader>[]>
createOrUpdateEntities(EntityData[] entityRequestData,boolean
isReplaceEntity, int commitBatchSize, String requestId);

パラメータ:

パラメータ

説明

entityRequestData

EntityDataオブジェクトの配列。EntityDataオブジェクトには、1つのエンティティの作成に必要な情報が含まれています。EntityData.javaの詳細は、リリース11gの『Oracle Fusion Middleware Oracle Adaptive Access Manager Java APIリファレンス』を参照してください。

isReplaceEntity

エンティティの更新時に属性の置換またはマージを判別するためのフラグ。デフォルト値: FALSE(マージを指定)。

commitBatchSize

同時にコミットする必要のあるエンティティの数を判別します。デフォルトおよび最小値は1です。

requestId

セッションを識別する値。この値はクライアントによって送信されます。クライアントでこの値が設定されていない場合は、ダミーの数値が生成されます。

5.1.4 属性の置換またはマージ

属性の置換またはマージ: エンティティの更新時に、属性をマージするか、または置換するかを選択できます。この2つのモードの相違点は、エンティティ・データの属性に対してユーザーが値を渡す場合にのみ確認できます。mergeの場合、属性の値は変更されず、古い値が保持されます。replaceの場合、古い値のかわりに空の値が表示され、属性は空の値によって置換されます。デフォルトのオプションはmergeです。

5.1.5 キーによるエンティティの検索

searchEntityByKey APIを使用すると、キー属性に基づいてエンティティを検索できます。

APIシグネチャ:

public VCryptObjectResponse<EntityHeader>
searchEntityByKey(EntityData entityData);

パラメータ:

パラメータ

説明

entityData

IDスキームに基づいて検索されるエンティティの主キー属性のキーと値が含まれている、entityNameおよびentityDataMapを持つEntityDataオブジェクト。

5.2 エンティティとマッピング属性の作成

この項では、不正検出におけるエンティティ解決に使用されるマッピング属性について説明します。

5.2.1 エンティティ・データ・マップ

OAAMは、エンティティ・データ・マップを使用してエンティティを作成します。これには、属性名のキーと値のペアと、ユーザーが指定したその値が含まれています。たとえば、タイプCustomerのエンティティを作成する場合、次のようなデータ・マップが考えられます。

エンティティ・データ・マップ:

キー: 名

値: Mark

キー: 姓

値: Smith

キー: 電子メール

値: x@y.com

キー: shipping.addr_line1

値: #1, Lex Residence

キー: shipping.addr_line2

値: Redmond Street

キー: shipping.zip

値: 418001

キー: shipping.phone_number

値: 6035550100

5.2.2 複雑なエンティティ

複雑なエンティティには、他のエンティティが関係名によってリンクされています。たとえば、Customerは、後続の例に示す属性によって定義できます。その他のエンティティは、関係名によってリンクされています。

複雑なエンティティを作成するためのデータを受信するには、エンティティ・データ・マップのキーでドット規則を使用します。データ・マップのリンクされたエンティティの属性名の前に、関係名とドット(.)を1つ付ける必要があります。

例:

エンティティそのものをエンティティの属性にできます。そのような属性はリンクされたエンティティと呼ばれます。たとえば、Shipping addressはエンティティCustomerのリンクされたエンティティです。

Customer:     first name (Simple attribute)
last name (Simple attribute)
phone (Simple attribute)
email (Simple attribute)
shipping address:           addr_line1
:           addr_line2
:           city
:           state
:           country
:           mobile
:           zip
billing address :           addr_line1
:           addr_line2
:           city
:           state
:           country
:           mobile
:           zip

5.2.3 単純なエンティティの作成

単純なエンティティとは、その他のエンティティにリンクされていないエンティティのことです。エンティティ・インスタンスを作成すると、エンティティ関連データがデータベースに格納されます。

EntityDataオブジェクトは、次のパラメータを取ります。

エンティティ名: エンティティ名によって、作成されるエンティティのタイプが判別されます。たとえば、Customerがあります。このエンティティ・タイプの定義は、エンティティ作成用のデータベースにすでに存在します。

エンティティ・データ・マップ: エンティティ・データ・マップには、属性名のキーと値のペアと、ユーザーによって指定された値が含まれています。関連するエンティティを持たない単純なエンティティを作成するには、次のようにentityDataMapを移入します。

キー

値

キー: attributeName1

値: attributeValue1

キー: attributeName2

値: attributeValue2

キー: attributeName3

値: attributeValue3

たとえば、関連するエンティティを持たないCustomerエンティティを作成します。

コンテキスト・データ

値

キー: 名

値: Mark

キー: 姓

値: Smith

キー: 電子メール

値: x@y.com

キー: 携帯電話

値: 6035550100

単純なエンティティ・インスタンスを作成するには、次の手順を実行します。

1. エンティティ・データが含まれているマップを作成します。
マップのキーはエンティティの属性名(OAAM管理で指定したもの)、マップの値はユーザー入力値です。

後続の例では、Customerエンティティ・データのデータが表示され、ユーザー入力としてMark Smithという名前が表示されています。Customerエンティティには、属性としてfirst nameおよびlast nameが設定されています。

Map<String,String> entityDataMap = new HashMap<String,String>();
entityDataMap.put("first name","Mark");
entityDataMap.put("last name","Smith");

2. エンティティ・データ・マップとエンティティ・タイプをカプセル化しているEntityDataオブジェクトを作成します。たとえば、Customerがあります。

EntityData entityData= new EntityData("Customer",entityDataMap);

3. このAPIはEntityDataの配列のみを受け入れるため、配列を作成し、作成されたentitydataをその中に挿入します。

EntityData[] entityRequestData= new EntityData[1];
entityRequestData[0]= entityData;

4. 最後に、API trackerをコールします。これはVCryptTrackerインスタンスです。

response =
tracker.createOrUpdateEntities(entityRequestData, true,
commitBatchSize,requestId);

エンティティ・インスタンスを次の方法で作成しようとすると、エラーが発生します。

- 存在していないエンティティを使用した場合。

- エンティティ名としてNULLを使用した場合。

- 必須情報を指定しなかった場合。

- 必須情報としてNULL値を使用した場合。

- 一致しないエンティティのデータ型を使用した場合。

- エンティティ定義と比較してまったく異なるエンティティ・データを使用した場合。

5.2.4 既存エンティティの属性の更新

既存エンティティの属性を更新するには、createOrUpdateEntities APIを使用します。

entityId ($id$)

idは、データベースに格納されたエンティティIDの値です。エンティティのすべてのキー属性の値を渡す必要があります。これによって、データベース内のエンティティ・インスタンスが一意に識別されます。

entityId($id$)をcreateOrUpdateEntity APIのレスポンスから取得します。たとえば、次のようになります。

VCryptObjectResponse<EntityHeader>[] responseArray = response.getObject();
VCryptObjectResponse<EntityHeader> entityResponse = responseArray[0];

EntityHeader entityHeader = entityResponse.getObject();
Long entityId= entityHeader.getEntityId();

entityIdを使用して既存エンティティの属性を更新するには、entityDataMapを次のように移入します。

entityDataMap:

キー: $id$

値: EntityId

キー: attributeName1

値: attributeValue1

キー: attributeName2

値: attributeValue2

たとえば、Customerエンティティの電子メールIDを101というentityIdで更新します。

キー: $id$

値: 101

キー: 電子メール

値: a@b.com

エンティティ・インスタンスを更新するには、次の2つの方法があります。

たとえば、次のようになります。

Customer (101):     firstname            ->              Mark
lastname             ->              Smith
mobile               ->              0987654321
email                ->              x@y.com

前述の例では、エンティティID101を持つタイプCustomerのエンティティが使用されています。その電子メールをa@b.comに変更する場合、エンティティ・データを渡すための2つの方法があります。

最初の方法は、次のとおりです。

$id$                 ->              101
email                ->              a@b.com

2つ目の方法は、次のとおりです。

firstname            ->               Mark
lastname             ->               Smith
email                ->               a@b.com

5.2.5 既存エンティティの属性値の削除

entityIdを使用して既存エンティティの属性値を削除するには、次のようにentityDataMapを移入し、isReplaceEntity (createOrUpdateEntityにある)パラメータをtrueに設定します。

entityDataMap:

キー: $id$

値: EntityId

キー: attributeName1

値:

キー: attributeName2

値:

たとえば、entityIdとして101を持つCustomerエンティティの電子メールIDを削除します。

キー: $id$

値: 101

キー: 電子メール

5.2.6 最上位レベルのエンティティと関連エンティティの完全なデータを含む関連エンティティを持つエンティティの作成

最上位レベルのエンティティと関連エンティティの完全なデータを含む関連エンティティを持つエンティティを作成するには、次のフォーマットを使用します。

entityDataMap:

キー: attributeName1

値: attributeValue1

キー: attributeName2

値: attributeValue2

キー: attributeName3

値: attributeValue3

キー: relationshipName1.attributeName1

値: linkedEnt1AttributeValue1

キー: relationshipName1.attributeName2

値: linkedEnt1AttributeValue2

キー: relationshipName2.attributeName1

値: linkedEnt2AttributeValue1

出荷先は、Customerをaddressタイプの別のエンティティにリンクする関係名です。複雑なエンティティを作成するためのデータを受信するには、エンティティ・データ・マップのキーでドット規則を使用します。データ・マップのリンクされたエンティティの属性名の前に、関係名とドット(.)を1つ付ける必要があります。

例: 出荷先および請求先のrelationshipNamesを持つ、リンクされた住所エンティティが含まれているCustomerエンティティを作成します。

キー: 名

値: Mark

キー: 姓

値: Smith

キー: 電子メール

値: x@y.com

キー: shipping.addr_line1

値: #1, Lex Residence

キー: shipping.addr_line2

値: Redmond Street

キー: billing.addr_line1

値: #2, Lex Residence

5.2.7 最上位レベルのエンティティと関連エンティティの完全なデータを含む関連エンティティ(単一エンティティの複数のインスタンスを含む)を持つエンティティの作成

最上位レベルのエンティティと関連エンティティの完全なデータを含む関連エンティティ(単一の関係の複数のインスタンスを含む)を持つエンティティを作成するには、createOrUpdateEntities() APIを使用します。

entityDataMap:

キー: attributeName1

値: attributeValue1

キー: attributeName2

値: atributeValue2

キー: attributeName3

値: attributeValue3

キー: relationshipName1[index1].attributeName1

値: linkedEnt1AttributeValue1

キー: relationshipName1[index1].attributeName2

値: linkedEnt1AttributeValue2

キー: relationshipName1[index2].attributeName1

値: linkedEnt2AttributeValue1

キー: relationshipName1[index2].attributeName2

値: linkedEnt2AttributeValue2

キー: relationshipName2.attributeName1

値: linkedEnt3AttributeValue1

例: 出荷先および出荷先の2つのインスタンスが存在する請求先をrelationshipNamesに持つ、リンクされた住所エンティティが含まれているCustomerエンティティを作成します。

キー: 名

値: Mark

キー: 姓

値: Smith

キー: 電子メール

値: x@y.com

キー: shipping[0].addr_line1

値: #1, Lex Residence

キー: shipping[0].addr_line2

値: Redmond Street

キー: shipping[1].addr_line1

値: #3, Lex Residence

キー: shipping[1].addr_line2

値: Redwood Street

キー: billing.addr_line1

値: #2, Lex Residence

5.2.8 最上位レベルのエンティティと1つ以上の関連エンティティのエンティティIDによる完全なデータを含む関連エンティティを持つエンティティの作成

最上位レベルのエンティティと1つ以上の関連エンティティのエンティティIDによる完全なデータを含む関連エンティティを持つエンティティを作成するには、次のようにします。

entityDataMap:

キー: attributeName1

値: attributeValue1

キー: attributeName2

値: attributeValue2

キー: attributeName3

値: attributeValue3

キー: relationshipName1[index1].attributeName1

値: linkedEnt1AttributeValue1

キー: relationshipName1[index1].attributeName2

値: linkedEnt1AttributeValue2

キー: relationshipName1[index2].$id$

値: linkedEnt2EntityId

キー: relationshipName2.attributeName1

値: linkedEnt3AttributeValue1

例: shipping(出荷先)および出荷先の2つのインスタンスが存在するbilling(請求先)をrelationshipNamesに持つ、リンクされたaddress(住所)エンティティが含まれているCustomerを作成します。shipping addressエンティティの1つはすでに存在しており、102というentityIdを持っています。

キー: 名

値: Mark

キー: 姓

値: Smith

キー: 電子メール

値: x@y.com

キー: shipping[0].addr_line1

値: #1, Lex Residence

キー: shipping[0].addr_line2

値: Redmond Street

キー: shipping[1].$id$

値: 102

キー: billing.addr_line1

値: #2, Lex Residence

リンクされたエンティティ・インスタンスを次の方法で作成しようとすると、エラーが発生します。

- 存在しないリンクされたエンティティ名を使用した場合。

- 空のリンクされたエンティティ名を使用した場合。

- 必須のリンクされたエンティティ・データをすべて指定しなかった場合。

- 必須のリンクされたエンティティ・データにNULL値を指定した場合。

- 一致しないリンクされたエンティティ・データのデータ型を使用した場合。

- エンティティ定義と比較してまったく異なるリンクされたエンティティ・データを使用した場合。

- リンクされたエンティティのタイプが親と同じ場合。

リンクされたエンティティ(マルチレベル)のタイプが親と同じである複雑なエンティティ・インスタンスを作成した場合、そのエンティティ・インスタンスはエラー・ステータス付きで作成されます。このような定義は許可されていないため、エンティティ定義の不一致によってエラーが発生します。

5.2.9 関連エンティティのエンティティIDを持つエンティティの関連エンティティの更新

関連エンティティのエンティティIDを持つエンティティの関連エンティティを更新するには、次のようにします。

entityDataMap:

キー: attributeName1

値: attributeValue1

キー: attributeName2

値: attributeValue2

キー: relationshipName1.$id$

値: linkedEnt1EntityId

キー: relationshipName1.attributeName1

値: linkedEnt1AttributeValue1

注意: 親エンティティの属性のかわりに、親のentityIdを渡すこともできます。

例: カスタマMark Smithの請求先住所の都市をChicagoに更新します。この請求先住所は、103のentityIdですでに存在しています。

キー: 名

値: Mark

キー: 姓

値: Smith

キー: billing.$id$

値: 103

キー: billing.city

値: Chicago

5.2.10 リンクされたエンティティのリンク解除

1つ以上の関連エンティティを親エンティティからリンク解除できます。

Customer:          first name:: abc
: last name:: xyz
: mobile:: 6035550100
: email:: p@q.com
: shipping address:: (entity with id = 102)
: shipping address:: (entity with id = 105)
: billing address:: (entity with id = 103)

unLinkEntities: 削除対象の関係のmapIdのリスト。mapIdはLong型です。mapIdは、エンティティ・オブジェクト内のlinkedEntitiesとして返されるVTEntityOneMapオブジェクトのリストからフェッチできます。

unlinkEntities:

値(リスト形式)

102,105

103

エンティティ・インスタンスの更新中にunlinkEntitiesがnullと指定された場合、既存のエンティティ関係は変更されません。親エンティティに以前に関連付けられていた、更新操作に関するエンティティ関係はすべて存続します。ただし、更新中に新規の関係を(エンティティ・データ・マップを使用して)追加できます。

エンティティを次の方法でリンク解除しようとすると、エラーが発生します。

- 既存のエンティティ・インスタンスに対応していない必須属性を渡した場合。

- NULLまたは空のエンティティID値を渡した場合。

- 親エンティティIDを渡して、必須属性を削除した場合。

- 存在しないエンティティIDを渡した場合。

- 重複するエンティティIDを渡した場合。

サンプル・コード

public void testDeleteRelationships() throws Exception{
boolean isReplaceEntity = false;
int commitBatchSize=1;
String timeStamp = Long.toString(System.currentTimeMillis());
EntityData[] entityRequestData= new EntityData[1];
Map<String,String> entityDataMap = new HashMap<String,String>();
entityDataMap.put("first name","Mark"+timeStamp);
entityDataMap.put("last name","Smith"+timeStamp);
entityDataMap.put("email","x@y.com");
entityDataMap.put("mobile","6035550100");
EntityData entityData= new EntityData("customer",entityDataMap);
entityRequestData[0]= entityData;
String requestId= null;
VCryptObjectResponse<VCryptObjectResponse<EntityHeader>[]> response =
vCryptTracker.createOrUpdateEntities(entityRequestData, isReplaceEntity,
commitBatchSize,requestId);
assertTrue(response.isSuccess());
VCryptObjectResponse<EntityHeader>[] responseArray= response.getObject();
VCryptObjectResponse<EntityHeader> entityResponse= responseArray[0];
assertTrue(entityResponse.isSuccess());
EntityHeader entity = entityResponse.getObject();
Long customerEntityId= entity.getEntityId();

// creating an address
Map<String,String> entityDataMapAddress1 = new HashMap<String,String>();
entityDataMapAddress1.put("addr_line1","testHouse1b"+timeStamp);
entityDataMapAddress1.put("addr_line2","testStreet1b");
entityDataMapAddress1.put("addr_line3","testlane1b");
entityDataMapAddress1.put("city","city1");
entityDataMapAddress1.put("state","state1");
entityDataMapAddress1.put("country","country1");
entityDataMapAddress1.put("zip","333031");
entityDataMapAddress1.put("phone","6035550100");
EntityData entityDataAddress1= new
EntityData("address",entityDataMapAddress1);
entityRequestData[0]= entityDataAddress1;
VCryptObjectResponse<VCryptObjectResponse<EntityHeader>[]> responseAddress1 =
vCryptTracker.createOrUpdateEntities(entityRequestData, isReplaceEntity,
commitBatchSize,requestId);
assertTrue(responseAddress1.isSuccess());
VCryptObjectResponse<EntityHeader>[] responseArrayAddress1=
responseAddress1.getObject();
VCryptObjectResponse<EntityHeader> entityResponseAddress1=
responseArrayAddress1[0];
assertTrue(entityResponseAddress1.isSuccess());
EntityHeader entityAddress1 = entityResponseAddress1.getObject();
Long address1EntityId= entityAddress1.getEntityId();

// creating another address
Map<String,String> entityDataMapAddress2 = new HashMap<String,String>();
entityDataMapAddress2.put("addr_line1","testHouse2"+timeStamp);
entityDataMapAddress2.put("addr_line2","testStreet2");
entityDataMapAddress2.put("addr_line3","testlane2");
entityDataMapAddress2.put("city","city2");
entityDataMapAddress2.put("state","state2");
entityDataMapAddress2.put("country","country2");
entityDataMapAddress2.put("zip","333031");
entityDataMapAddress2.put("phone","6035550100");
EntityData entityDataAddress2= new
EntityData("address",entityDataMapAddress2);
entityRequestData[0]= entityDataAddress2;
VCryptObjectResponse<VCryptObjectResponse<EntityHeader>[]> responseAddress2 =
vCryptTracker.createOrUpdateEntities(entityRequestData, isReplaceEntity,
commitBatchSize,requestId);
assertTrue(responseAddress2.isSuccess());
VCryptObjectResponse<EntityHeader>[] responseArrayAddress2=
responseAddress2.getObject();
VCryptObjectResponse<EntityHeader> entityResponseAddress2=
responseArrayAddress2[0];
assertTrue(entityResponseAddress2.isSuccess());
EntityHeader entityAddress2 = entityResponseAddress2.getObject();
Long address2EntityId= entityAddress2.getEntityId();

// creating relationships between the customer and addresses
Map<String,String> entityDataMapRelation = new HashMap<String,String>();
entityDataMapRelation.put("$id$",customerEntityId.toString());
entityDataMapRelation.put("shipping.$id$",address1EntityId.toString());
entityDataMapRelation.put("billing[0].$id$",address1EntityId.toString());
entityDataMapRelation.put("billing[1].$id$",address2EntityId.toString());
EntityData entityDataRelation= new
EntityData("customer",entityDataMapRelation);
entityRequestData[0]= entityDataRelation;
VCryptObjectResponse<VCryptObjectResponse<EntityHeader>[]> responseRelation =
vCryptTracker.createOrUpdateEntities(entityRequestData, isReplaceEntity,
commitBatchSize,requestId);
assertTrue(responseRelation.isSuccess());
VCryptObjectResponse<EntityHeader>[] responseArrayRelation=
responseRelation.getObject();
VCryptObjectResponse<EntityHeader> entityResponseRelation=
responseArrayRelation[0];
assertTrue(entityResponseRelation.isSuccess());
EntityHeader entityRelation = entityResponseRelation.getObject();
Long relationEntityId= entityRelation.getEntityId();
assertEquals(customerEntityId,relationEntityId);
Map<String,List<Long>> linkedEntities = entityRelation.getLinkedEntities();
VCryptDataAccessMgr dataAccessMgr = null;
VCryptTrackerDataAccess mTrackerDataAccess = null;
try {
dataAccessMgr = new VCryptDataAccessMgr();
mTrackerDataAccess = dataAccessMgr.getVCryptTrackerDataAccess();
}catch(Exception e) {
logger.error("Error while creating TrackerEntityFactory instance", e);
}
List<VTEntityOneMap> relationships =
mTrackerDataAccess.getVTEntityOneMapByEntityId(customerEntityId,new
Integer(UserDefEnum.getElement(IBharosaConstants.OBJECT_TYPE_ENUM,
"VTEntityDef").getValue()));
assertEquals(relationships.size(),3);

// deleting all the relationships for the customer Entity
Map<String,List<Long>> unlinkEntities = linkedEntities;
Map<String,String> entityDataMapUnlink = new HashMap<String,String>();
entityDataMapUnlink.put("$id$",customerEntityId.toString());
EntityData entityDataUnlink= new
EntityData("customer",entityDataMapUnlink,linkedEntities);
entityRequestData[0]= entityDataUnlink;
VCryptObjectResponse<VCryptObjectResponse<EntityHeader>[]> responseDelRel =
vCryptTracker.createOrUpdateEntities(entityRequestData, isReplaceEntity,
commitBatchSize,requestId);
assertTrue(responseDelRel.isSuccess());
List<VTEntityOneMap> relationships1=
mTrackerDataAccess.getVTEntityOneMapByEntityId(customerEntityId,new
Integer(UserDefEnum.getElement(IBharosaConstants.OBJECT_TYPE_ENUM,
"VTEntityDef").getValue()));
assertEquals(relationships1.size(),0);
}

5.2.11 エンティティIDまたはキー・データに基づくエンティティの検索

Search APIを使用して、エンティティIDまたはキー・エンティティ属性の値に基づくエンティティの検索を行います。必須パラメータは、エンティティ名とエンティティ・データ・マップです。エンティティ名はエンティティ・タイプに対応し、エンティティ・データ・マップにはエンティティID、または属性名のキー/値のペアと検索対象のエンティティの値が含まれています。エンティティIDの場合、エンティティ・データ・マップは次のように指定されます。

entityDataMap:

キー

値

$id$

107

この例では、107が検索対象のエンティティのエンティティIDです。

APIコール

1. 検索対象のエンティティのエンティティ・データが含まれているマップを作成します。
マップのキーはエンティティの属性名(OAAM管理で指定したもの)、マップの値はユーザー入力値です。

後続の例では、Customerエンティティ・データのデータが表示され、ユーザー入力としてMark Smithという名前が表示されています。Customerエンティティには、属性としてfirst nameおよびlast nameが設定されています。

Map<String,String> entityDataMap = new HashMap<String,String>();
entityDataMap.put("first name","Mark");
entityDataMap.put("last name","Smith");

2. エンティティ・データ・マップとエンティティ・タイプをカプセル化しているEntityDataオブジェクトを作成します。たとえば、Customerがあります。

EntityData entityData= new EntityData("Customer",entityDataMap);

3. 最後に、API trackerをコールします。これはVCryptTrackerインスタンスです。

response =tracker.searchEntityByKey(entityData);

5.3 データ・ストレージ

トランザクション・インスタンスの作成中、トランザクション関連のエンティティの関係情報はデータベースに永続化されます。

5.3.1 データ・モデル

VT_USER_ENTITY1_MAPは、エンティティ関係に関する情報を格納します。次の表で、VT_USER_ENTITY1_MAPのそれぞれの属性の使用方法について説明します。

属性

説明

MAP_ID

表の主キーで、エンティティ関係のインスタンスを一意に識別します。

ENTITY_ID

親エンティティのエンティティID。

MAP_OBJ_ID

リンクされたエンティティのエンティティID。

DEF_MAP_ID

エンティティ関係の定義に対する一意の識別子。

5.3.2 メタデータ

VT_ENT_DEFS_MAPは、エンティティ関係の定義を格納します。次の表で、VT_ENT_DEFS_MAPのそれぞれの属性の使用方法について説明します。

属性

説明

MAP_ID。

表の主キーで、エンティティ関係の定義を一意に識別します。

ENTITY_DEF_ID_1

親エンティティ・タイプのエンティティ定義ID。

ENTITY_DEF_ID_2

リンクされたエンティティ・タイプのエンティティ定義ID。

5.3.3 レコードの失効

OAAMでは、期限切れのレコードは削除されません。期限切れの未使用レコードは、VT_ENTITY_ONE表とVT_ENTITY_ONE_PROFILE表に格納されます。

- VT_ENTITY_ONE表に格納されたエンティティ・インスタンスは、expiry timeという属性を持っています。エンティティ・インスタンス・オブジェクトの作成中、expiry timeは構成可能な値に設定されています。そのエンティティ・インスタンスに対して更新操作が発生すると、expiry timeが変更されます。現在時間がexpiry timeを超えたときには、対応するレコードも必ず失効します。

- エンティティ・インスタンスの属性値は、表VT_ENTITY_ONE_PROFILEに保存されます。プロファイル・データも、VT_ENTITY_ONE表のエンティティ・オブジェクトと同じ失効ロジックに従います。ただし、更新操作中に、新規のプロファイル・データを持つ新規レコードが表に追加され、前のレコードは期限切れになります。

5.3.4 トランザクションとエンティティのマッピング

エンティティがインスタンスとしてトランザクションに追加されると、OAAMでは、そのアソシエーションがVT_TRX_ENT_DEFS_MAPに格納されます。このエンティティは、他のエンティティにリンクされたエンティティ用に拡張できます。たとえば、エンティティCustomerにHome Addressというリレーション・タイプを持つ別のエンティティAddressとのアソシエーション/リンクがある場合、Customerエンティティがトランザクション定義に追加されると、OAAMでは、2つのレコードをVT_TRX_ENT_MAPに格納できます。1つはエンティティCustomerのレコード、もう1つはCustomerによって参照されるAddressのレコードです。内部/ネストされた/子エンティティCustomer.HomeAddressには、relation_typeとしてCustomer$HomeAddressを持つトランザクション定義の参照が設定されています。これは、TransactionとCustomerエンティティ間のrelation_type、dollar($)記号、およびCustomerエンティティとAddressエンティティ間のrelation_typeを連結して導出されます。

5.3.5 トランザクション作成/更新へのエンティティ関係の格納

トランザクション・インスタンスの作成中、トランザクション関連のエンティティの関係情報はデータベースに永続化されます。

トランザクション・データが作成されると、次の更新が発生します。

1. 最上位レベル/直接リンクされたエンティティが判別されます。

2. 最上位レベル/直接リンクされたエンティティごとに、次の手順が実行されます。

1. 表VT_ENT_DEFS_MAP(定義アソシエーション)およびVT_USER_ENTITY1_MAP(データ・アソシエーション)に問い合せることにより、このエンティティに関連付けられているネスト/連鎖エンティティを判別します。

2. ネスト/連鎖エンティティごとに、次の処理を行います。
VT_TRX_ENT_MAPで、トランザクション・アソシエーション・マップを検索します。

トランザクション定義IDとエンティティ定義IDを使用して、VT_TRX_ENT_MAPからマッピング情報を取得します。注意: このプロセスは、トランザクションに直接関連付けられるエンティティ・インスタンスと類似しています。

マッピング情報を使用して、エンティティ・データ(VT_ENTITY_ONE、VT_ENTITY_ONE_PROFILE)を作成/検索します。

エンティティID (VT_ENTITY_ONEから取得)および現在のトランザクションから取得したトランザクションIDを使用して、VT_ENT_TRX_MAPにレコードを作成します。

5.4 一般的なエンティティのシナリオ

次に、基本的な使用例を示します。

- エンティティ: プロバイダ(医師、看護婦など)、患者および住所。
管理者が不正シナリオを調査していて、プロバイダと患者が同じ住所で生活または仕事をしているかどうかを知る必要があるとします。この場合は、関係patient-address、provider-addressを作成し、対応するルールを設定する必要があります。

患者と医師が同じ場所で働いているまたは居住している場合、ビジネス・ルールが生成されます。このルールは、patient.worklocation = Physician.worklocationまたはpatient.residence = Physician.residenceの場合にtrueを返し、アラートを生成します。

- 医療レコード・アクセス・トランザクションには、直接関係する2つのエンティティのみが存在します。Provider IDとPatient IDです。このAPIをコールしてトランザクションを作成する際には、その他のデータは指定されません。ProvidersとPatientsは両方とも、様々なエンティティに関連しています。1つの例はhome addressで、これはaddressエンティティのインスタンスです。セッション詳細では、Provider IDとPatient IDが含まれている医療レコード・アクセス・トランザクションを示しています。

第II部

Universal Installation Option

第II部の構成は次のとおりです。

- 第6章「Oracle Adaptive Access Managerプロキシ」

6 Oracle Adaptive Access Managerプロキシ

Oracle Adaptive Access Manager Universal Installation Option (UIO)のリバース・プロキシ・デプロイメント・オプションでは、アプリケーション・コードを変更しなくても、Webアプリケーションにログイン・リスク・ベースのマルチファクタ認証を提供できます。プロキシの主な機能は、ユーザー・トラフィックをアプリケーションのログイン・フローからOracle Adaptive Access Managerのログイン・フローへリダイレクトすることです。UIOプロキシは、Apache Webサーバーに使用できます。この章では、Apache用のAdaptive Access ManagerプロキシをUIO Apacheプロキシと呼んでいます。

この章では、UIO Apacheプロキシの実装および使用について説明します。この章の内容は、次のとおりです。

- 第6.1項「概要」

- 第6.2項「UIO Apacheプロキシのインストール」

- 第6.3項「ルールとユーザー・グループの設定」

- 第6.4項「ポリシーの設定」

- 第6.5項「UIOプロキシの構成」

- 第6.6項「アプリケーション検出」

- 第6.7項「OAAMサンプル・アプリケーション」

- 第6.8項「UIO Apacheプロキシのアップグレード」

OAAMサーバーの構成方法と、UIOプロキシ・デプロイメント固有のクライアント向けマルチファクタ認証のWebアプリケーションの詳細は、第8章「OAAM Webアプリケーション・ページのカスタマイズ」を参照してください。

対象読者は、UIOプロキシを構成してWebアプリケーションにマルチファクタ認証を追加するインテグレータです。このドキュメントの内容を理解するには、HTTPリクエスト/レスポンスのパラダイムを理解する必要があります。

6.1 概要

この章の概要の項の内容は、次のとおりです。

- 重要な用語

- アーキテクチャ

- 参照

6.1.1 重要な用語

この項では、参考用に重要な用語が定義されています。

Universal Installation Option

Universal Installation Optionは、保護されたWebアプリケーションのコード変更を必要としないOracle Adaptive Access Managerの統合方針です。Universal Installation Optionでは、保護されたWebアプリケーションの前にUIOプロキシを配置します。

プロキシ

プロキシは、リクエストを他のサーバーに転送することでクライアントのリクエストに対応するサーバーです。この章では、Webプロトコル(主にHTTP)を処理するWebプロキシについて説明します。

転送プロキシ

転送プロキシは、クライアントとオリジン・サーバーとの間に位置する中間サーバーです。オリジン・サーバーからコンテンツを取得するために、クライアントはオリジン・サーバーをターゲットに指定するリクエストをプロキシに送信し、プロキシはオリジン・サーバーのコンテンツをリクエストして、それをクライアントに返します。クライアントは、転送プロキシを使用して他のサイトにアクセスできるように特別に構成されている必要があります。

リバース・プロキシ

リバース・プロキシは、クライアントには通常のWebサーバーのように表示されます。クライアント側での特別な構成は必要ありません。クライアントは、リバース・プロキシのネームスペース内のコンテンツに対して、通常のリクエストを作成します。リバース・プロキシは、それらのリクエストの送信先を決定し、リバース・プロキシ自体が送信元であるかのようにコンテンツを返します。

OAAMサーバー

OAAMサーバーは、Oracle Adaptive Access ManagerのWebアプリケーション・コンポーネントです。UIOプロキシは、UIOプロキシのXML構成の定義に従って、トラッキングおよび認証のためにクライアント・ブラウザをOAAMサーバーにリダイレクトします。

6.1.2 アーキテクチャ

次の図では、標準的なUIOプロキシのデプロイメントを示しています。

図6-1は、UIOプロキシをデプロイしてマルチファクタ認証を提供する前のWebアプリケーションを示しています。

図6-1 Oracle Adaptive Access UIOプロキシのデプロイメント前

図6-2は、UIOプロキシのデプロイ後に追加された様々なコンポーネントを示しています。

図6-2 UIOプロキシのデプロイメント後

Apache HTTP Serverを実行しているローカル・マシン。OAAMサンプル・アプリケーションは、会社のイントラネットのアプリケーション・サーバーで実行中です。OAAMのデプロイメントは、会社のイントラネットのOAAMサーバーで実行中です。

UIOプロキシは、クライアント(ブラウザ)とサーバー(Webアプリケーション)間のHTTPトラフィックをインターセプトし、適切なアクション(トラフィックのOAAMサーバーへのリダイレクトなど)を実行して、マルチファクタ認証と認可を提供します。次に、OAAMサーバーはOAAM管理と通信してリスクを評価し、適切なアクション(ログインの許可、ユーザーへのチャレンジ、ユーザーのブロックなど)を取ります。

6.1.3 参照

Apache HTTP Serverの詳細は、次のWebサイトで、Apache HTTP Server、バージョン2.2のドキュメントを参照してください。

http://httpd.apache.org/docs/2.2

6.2 UIO Apacheプロキシのインストール

UIO Apacheプロキシをインストールするには、UIO Apacheプロキシのインストール先である新規のApache Hypertext Transfer Protocol Daemon(httpd)をインストールする必要があります。このApache httpdでは、mod_proxyを使用します。これは、リバース・プロキシ(保護するバックエンド・アプリケーションのかわりのプロキシ)にプロキシ/ゲートウェイ/キャッシュを実装するモジュールです。

インストールの項では、WindowsおよびLinuxプラットフォーム向けのUIO Apacheプロキシのインストール方法について説明しています。

インストール手順

インストール手順は、次のとおりです。

- Apache httpdの要件が満たされていることを確認する。
第6.2.2項「Apache httpdのダウンロードまたはビルド」を参照してください。

- UIOプロキシのdllsおよびサポートされているdllsをApache固有のディレクトリにコピーする。
第6.2.3項「UIO Apacheプロキシとサポート・ファイルのApacheへのコピー」を参照してください。

- memcacheを構成する(Linuxのみ)。
第6.2.4項「Memcacheの構成(Linuxのみ)」を参照してください。

- UIOプロキシをアクティブにするためにhttpd.confを編集する。
第6.2.5項「httpd.confの構成」を参照してください。

この項では、mod_proxy_htmlをオプションでインストールする方法についても説明します。これは、プロキシを使用する際に、外部ユーザーがアクセスできるようにHTMLリンクをリライトする場合に必要です。

- アプリケーション構成のXMLファイルを使用してUIOプロキシの設定を変更する。
第6.2.6項「UIO Apacheプロキシの設定の変更」を参照してください。

インストール後の手順は、次のとおりです。

- ルールとユーザー・グループの設定
UIO Apacheプロキシ・プロセスの実行ユーザーを新規に作成する(Linuxのみ)。

- ポリシーの設定

インストール後

OAAM UIOプロキシのインストール手順を実行した後、次のApache構成の設定値が設定されます。

- UIOモジュール

- Apacheリバース・プロキシ・モジュール

- 仮想ホスト・エントリ

- OAAMのロケーション・マッピング、および個別にProxyPassおよびProxyPassReverseターゲットを指定したアプリケーション

- SSL証明書の場所(必要な場合)

6.2.1 開始する前に: WindowsおよびLinux向けUIOプロキシ・ファイル

参考までに、次の各表にUIOプロキシ・ファイルの概要を示します。

注意:

UIO Apacheプロキシのバイナリは、Windows向けとLinux向けでは異なります。UIOプロキシはC/C++で作成されているため、(Javaとは異なり)同じバイナリは別のプラットフォームでは動作しません。

ファイルは$ORACLE_HOME/oaam/oaam_proxyplatform_specific_fileに格納されています。

6.2.1.1 Windows

Windows UIOプロキシのバイナリ・ファイルを表6-1に示しします。

表6-1 Windowsバイナリ・ファイル

名前

説明

mod_uio.so

UIO Apacheプロキシ・モジュール

log4cxx.dll

Apache Log4cxxバイナリ

libxml2.dll

XML/HTMLパーサー

apr_memcache.dll

APR Memcacheクライアント・ライブラリ

Windows UIOプロキシのデータファイルを表6-2に示します。

表6-2 Windowsデータファイル

名前

説明

UIO_Settings.xml

UIO Apacheプロキシ設定のXMLファイル

UIO_log4j.xml

UIO ApacheプロキシのLog4j (log4cxx)構成XMLファイル

TestConfig.xml

UIO Apacheプロキシのサンプル・アプリケーション構成ファイル

UIO_Settings.rng

UIO_Settings.xmlに対するNG構文を解除します

UIO_Config.rng

アプリケーション構成XMLファイルに対するNG構文を解除します

6.2.1.2 Linux

Linux UIOプロキシのバイナリ・ファイルを表6-3に示します。

表6-3 Linuxバイナリ・ファイル

名前

説明

mod_uio.so

UIO Apacheプロキシ・モジュール

liblog4cxx.so.0.10.0.0

Apache Log4cxxバイナリ

libxml2.so.2.6.32

XML/HTMLパーサー

libapr_memcache.so.0.0.1

APR Memcacheクライアント・ライブラリ

Linux UIOプロキシのデータファイルを表6-4に示します。

表6-4 Linuxデータファイル

名前

説明

UIO_Settings.xml

UIO Apacheプロキシ設定のXMLファイル

UIO_log4j.xml

UIO ApacheプロキシのサンプルLog4j (log4cxx)構成XMLファイル

TestConfig.xml

UIO Apacheプロキシのサンプル・アプリケーション構成ファイル

UIO_Settings.rng

UIO_Settings.xmlに対するNG構文を解除します

UIO_Config.rng

アプリケーション構成XMLファイルに対するNG構文を解除します

6.2.2 Apache httpdのダウンロードまたはビルド

Apache httpdをダウンロードまたはビルドするためのインストール前手順は、プラットフォーム(WindowsまたはLinux)と、一定の要件が満たされているかどうかによって異なります。

6.2.2.1 Windows

Apache Webサイトから、Windows向けの最新のApache httpd (2.2.8)ビルドをダウンロードします。次の要件が満たされていることを確認します。

- Apache httpd (2.2.8)ビルドがバージョン2.2.8である。

- mod_proxyのサポートが有効になっている(標準インストールにmod_proxyが含まれている)。

- mod_sslのサポートが有効になっている。

6.2.2.2 Linux

Apache Webサイトの指示に従って、Apache httpdをビルドします。Apacheをビルドする際に、次の要件が満たされていることを確認します。

- Apache httpd (2.2.8)ビルドがバージョン2.2.8である。

- mod_soが有効になっている(モジュールを動的にロードする場合)。

- mod_proxyが有効になっている。

- mod_sslのサポートが有効になっている。

6.2.3 UIO Apacheプロキシとサポート・ファイルのApacheへのコピー

WindowsおよびLinuxの両方のプラットフォームで、UIO Apacheプロキシとサポート・ファイルをApache固有のディレクトリにコピーします。

6.2.3.1 Windows

表6-5には、次の情報が含まれます。

- インストール後にUIO Apacheプロキシ・ファイルをコピーする必要のあるディレクトリ

- UIO Apacheプロキシのライブラリ・ファイルと構成ファイルのツリー構造(これらのファイルをC:\Apache2.2にインストールした場合)

- UIO Apacheプロキシのバイナリ・ファイルの格納先ディレクトリを表6-5に示します。

表6-5 Windows UIOプロキシのバイナリ・ファイルのディレクトリ

ディレクトリ

ファイルの説明

C:\Apache2.2\modules\mod_uio.so

UIO Apacheプロキシ・モジュール

C:\Apache2.2\bin\log4cxx.dll

Apache Log4cxxバイナリ

C:\Apache2.2\bin\libxml2.dll

XML/HTMLパーサー

C:\Apache2.2\bin\apr_memcache.dll

APR Memcacheライブラリ。

表6-6に示すディレクトリに、データファイルを移動してください。

表6-6 Windows UIOプロキシのデータファイルのディレクトリ

ディレクトリ

ファイルの説明

C:\OAAMUIO\UIO_Settings.xml

UIO Apacheプロキシ設定のXMLファイル

C:\OAAMUIO\UIO_log4j.xml

UIO ApacheプロキシのLog4j (log4cxx)構成XMLファイル

C:\OAAMUIO\TestConfig.xml

UIO Apacheプロキシのアプリケーション構成ファイル(任意の数)

C:\OAAMUIO\UIO_Settings.rng

UIO_Settings.xmlに対するNG構文を解除します

C:\OAAMUIO\UIO_Config.rng

アプリケーション構成XMLファイルに対するNG構文を解除します

C:\OAAMUIO\logs\uio.log

UIO Apacheプロキシのログ

様々な構成ファイルの場所を変更するには、第6.2.5項「httpd.confの構成」を参照してください。

6.2.3.2 Linux

Apache httpdのインストール後、次の手順を実行します。

1. UIO Apacheプロキシのバイナリ・ファイルを、表6-7に示すディレクトリにコピーします(Apache httpdが/usr/local/apache2にインストールされているものとします)。

表6-7 Linux UIOプロキシのバイナリ・ファイルのディレクトリ

ディレクトリ

説明

/usr/local/apache2/modules/mod_uio.so

UIO Apacheプロキシ・モジュール

/usr/local/apache2/lib/liblog4cxx.so.0.10.0.0

Apache Log4cxxライブラリ

/usr/local/apache2/lib/libxml2.so.2.6.32

XML/HTMLパーサー

/usr/local/apache2/lib/libapr_memcache.so.0.0.1

APR Memcacheクライアント・ライブラリ

2. 次に、ライブラリへのソフト・リンクを次のように作成します。

cd /usr/local/apache2/lib
ln -s liblog4cxx.so.10.0.0 liblog4cxx.so.10
ln -s libxml2.so.2.6.32 libxml2.so.2
ln -s libapr_memcache.so.0.0.1 libapr_memcache.so.0

3. バイナリ・ファイルに実行可能な権限があることを確認します。

4. Apache httpdは通常、rootとして実行されるため、ポート80でリスニングする親プロセスが作成されます。また、httpd.confのUserディレクティブで指定したユーザーとして実行するハンドラ・プロセスも作成されます。
そのため、UIO Apacheプロキシのチェックポイント・ユーザーであるoaamuioというユーザーを作成してください。このユーザーは、プロキシの構成ファイルとログ・ファイルにアクセスできます。このユーザーのみがログ・ファイルにアクセスできることを確認してください。/home/oaamuioがこのユーザーのホーム・ディレクトリであると想定すると、ディレクトリ構造は表6-8のようになります。(UIO Apacheプロキシのデータファイルは、表6-8に示すディレクトリ構造に従う必要があります。)

表6-8 Linux UIOプロキシのデータファイルのディレクトリ

ディレクトリ

説明

/home/oaamuio/uio/UIO_Settings.xml

UIO Apacheプロキシ設定のXMLファイル

/home/oaamuio/uio/UIO_log4j.xml

UIO ApacheプロキシのLog4j (log4cxx)構成XMLファイル

/home/oaamuio/uio/TestConfig.xml

UIO Apacheプロキシのアプリケーション構成ファイル(任意の数)

/home/oaamuio/uio/UIO_Settings.rng

UIO_Settings.xmlに対するNG構文を解除します

/home/oaamuio/uio/UIO_Config.rng

アプリケーション構成XMLファイルに対するNG構文を解除します

/home/oaamuio/uio/logs/uio.log

UIO Apacheプロキシのログ

様々な構成ファイルの場所を変更するには、第6.2.5項「httpd.confの構成」を参照してください。

httpdの実行時ユーザーは、これらのファイルすべてにアクセスできる適切な権限を持っている必要があります。

6.2.4 Memcacheの構成(Linuxのみ)

これは、UIO ApacheプロキシのLinuxデプロイメントに必要な場合があるオプション構成です。

UIO Apacheプロキシは、ユーザーのセッション・レベル変数など、ユーザー用にローカル状態を維持するセッションを保持しています。

- Windowsでは、実行中のApache httpdサーバーに対して常に1つのプロセスが存在するため、このセッション情報はそのプロセスにとってローカルなものになります。

- Linuxでは、Apache httpdサーバーの複数のプロセスを実行できます。つまり、セッション情報は特定のプロセスに対してローカルに保持できず、一元管理する必要があります。この場合、memcachedを使用してセッション情報を格納できます。

次の説明では、memcachedを使用してUIO Apacheプロキシのセッション情報を保持するタイミングを特定しています。

Apache httpdにはいくつかのマルチプロセス・モジュール(MPM)が付属しています。これらのモジュールは、マシン上のネットワーク・ポートへのバインド、リクエストの受入れ、およびリクエストを処理するための子のディスパッチを行います。Linuxの場合: httpdは2つの異なるMPMで実行できます。つまり、prefork MPM(シングル・スレッド)またはworker MPM(マルチスレッド)を使用するhttpdが実行可能です。MPMはhttpdにビルドされており、ランタイム・オプションではありません。

Prefork MPM用にMemcachedを使用するようにUIO Apacheプロキシを構成する

prefork MPMを使用するhttpdでは、各リクエストがシングル・プロセスで処理されるシングル・スレッド・プロセスのプールが保持されます。この場合は、memcachedを使用するようにUIO Apacheプロキシを構成する必要があります。

Worker MPM用にシングル・プロセスを起動するようにApache httpdを構成する

worker MPMを使用するhttpdでは、すべてのプロセスで一度に複数のリクエストを処理できるマルチスレッド・プロセスのプールが保持されます。この場合は、memcachedを使用しないで、シングル・プロセスを起動するようにApache httpdを構成できます。ただし、デフォルト構成では複数のプロセスを起動するため、これを変更しないようにするには、memcachedを使用するようにUIO Apacheプロキシを構成する必要があります。次に、シングル・プロセスを起動するworker MPMの構成に使用できるhttpd.confの例を示します。

# Following forces worker MPM to run 1 process (make sure mod_cgid is
# not loaded, otherwise it starts one more httpd process).
# Basically ThreadLimit=MinSpareThreads=MaxSpareThreads=MaxClients=ThreadsPerChild
# and StartServers=1. Setting MaxRequestsPerChild to 0 ensures that the process is not
# bounced.

<IfModule mpm_worker_module>

ThreadLimit 150
StartServers 1
MinSpareThreads 150
MaxSpareThreads 150
MaxClients 150
ThreadsPerChild 150
MaxRequestsPerChild 0

</IfModule>

Windowsでは、httpd MPMは常に、シングル・プロセスを使用するマルチスレッド・モードになっています。

Linuxでは、(シングル・スレッドまたはマルチスレッドかどうかに関係なく)httpdが複数のプロセスを実行する場合は、UIO Apacheプロキシのセッション・データを共通ストア(データベースまたはキャッシュ)に保持しておき、複数のプロセスがセッション・データにアクセスできるようにする必要があります。UIOプロキシは、memcache(メモリー・ベースの高速キャッシュ)を使用してセッション・データを格納します。

起動時に、UIOプロキシでは、httpdがシングル・プロセスまたはマルチプロセスのどちらで実行されているかが自動検出されます。httpdが複数のプロセスで実行されている場合(つまり、Linuxでpreforkまたはworker MPMを使用している場合)、デフォルトの接続パラメータ(第6.2.6.1項「UIO_Settings.xml」で定義する)を使用してmemcacheデーモンへの接続を試みます。Windowsの場合、デフォルトでは、UIOプロキシはローカル・セッションを使用します。memcacheデーモンへの接続は実行しませんが、memcacheデーモンでセッション・データを保持するように構成できます(第6.2.6.1項「UIO_Settings.xml」で説明しています)。

UIO Apacheプロキシがmemcacheデーモンに接続するシナリオでは、memcacheをインストールします。

UIO Apacheプロキシがmemcacheデーモンに接続するシナリオでは、memcacheのWebサイトの手順に従ってmemcacheをシステムにインストールし、memcacheデーモンを実行した後でApache httpdを実行する必要があります。

次のWebサイトの手順に従って、memcacheをインストールします。

http://www.danga.com/memcached

Linuxディストリビューションのバイナリ・インストールがすでに存在している可能性があります。UIO Apacheプロキシは、memcacheのバージョン1.2.5でテスト済です。

6.2.5 httpd.confの構成

UIO Apacheプロキシをアクティブにするためにhttpd.confファイルを編集します。httpd.confファイルは、Apache HTTP Serverにより使用されるメインの構成ファイルです。

6.2.5.1 SSLを使用しない基本構成

サンプル・インストールでは、Apache httpdはc:\ProgramFiles\Apache2.2または/usr/local/apache2にインストールされています。

http.confが各自の環境で正しく設定されていることを確認するには、次の手順を実行します。

1. mod_proxyを有効にするために、次の行が非コメント化されていることを確認します。

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

2. 次の行をLoadModule行グループの終わりに追加して、UIO Apacheプロキシをアクティブにします。

LoadModule uio_module modules/mod_uio.so

3. UIO Apacheプロキシの設定値を持っているUIO_Settings.xmlファイルをポイントする行を追加します。

注意:

この設定は、UIO_Settings.xmlファイルの絶対パスです。

Windowsの場合(すべてのパスにフォワード・スラッシュを使用します)、

UioProxySettingsFile c:/OAAMUIO/UIO_Settings.xml

Linuxの場合、

UioProxySettingsFile /home/oaamuio/uio/UIO_Settings.xml

4. mod_proxyのフォワード・プロキシ機能は必要でないため、これを無効にします。

ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>

5. oaam_serverのリバース・プロキシでmod_proxy構成を有効にすると、ターゲット・アプリケーションがOAAMによって保護されます。

ProxyPass /oaam_server/
http://FQDN_oaam_server:oaam_server_port/oaam_server/
ProxyPassReverse /oaam_server/
http://FQDN_oaam_server:oaam_server_port/oaam_server/

ProxyPass /target_app/ http://FQDN_target_app:target_app_port//target_appl
ProxyPassReverse /target_app/ http://<QDN_target_app:target_app_port/target_app

6. UserおよびGroupのディレクティブを使用して、httpdのユーザー/グループをoaamuioに設定します。

手順4および5の実際の設定値はインストール固有であり、必要な設定値の例にすぎません。設定の詳細は、Apacheドキュメントに記載されています。

記載した変更を使用し、UIO_Settings.xmlを適切に設定することによって、OAAMサーバー(oaam_server)とターゲット・アプリケーションにアクセスして、フェーズ1シナリオが実行できるようになります。ターゲット・アプリケーションのURLは、次のとおりです。

http://apache-host:apache-port/target_application

この章ではこれまで、SSLを使用しないでプロキシの構成を行ってきました。

6.2.5.2 SSLによる構成

SSLの有効化については、Tomcat向けのApache WebサイトおよびApacheドキュメントを参照してください。

UIO Apacheプロキシでは、mod_sslをhttpdに含める必要があります。mod_sslをhttpdの一部にすることによって、OpenSSLライブラリがUIO Apacheプロキシにリンクされ、セッションIDを生成するようにUIO Apacheプロキシで正しく構成されます。mod_sslをロードしておくと、SSLを使用しない場合に構成を実行する必要がありません。

mod_proxy_htmlモジュール(オプション)

オプションとして、mod_proxy_html(http://apache.webthing.com/mod_proxy_html/)Apacheモジュールのインストールが必要になる場合があります。このモジュールは、保護されたアプリケーションに、自身に対するハードコード化されたURLリンクを持つWebページが含まれている場合にのみ必要です。アプリケーションに相対URLが含まれる場合、このモジュールは必要ありません。

Webサイトでは、このモジュールの実行サマリーが次のように説明されています。

mod_proxy_htmlは、プロキシを使用する際に、外部ユーザーがアクセスできるようにHTMLリンクをリライトする出力フィルタです。これは、HTTPヘッダーにおけるApacheのProxyPassReverseディレクティブと同じ目的を果たし、リバース・プロキシの重要なコンポーネントです。

たとえば、企業がアプリケーション・サーバー(社内ネットワークからのみ表示可能なappserver.example.comにある)とパブリックWebサーバー(www.example.comにある)を持っている場合、http://www.example.com/appserver/でアプリケーション・サーバーへのゲートウェイを提供する場合があります。アプリケーション・サーバーが自身にリンクするときは、これらのリンクをリライトしてゲートウェイ経由で動作できるようにする必要があります。mod_proxy_htmlは、<a href="http://appserver.example.com/foo/bar.html">foobar</a>を<a href="http://www.example.com/appserver/foo/bar.html">foobar</a>にリライトして、外部からアクセスできるようにします。

6.2.6 UIO Apacheプロキシの設定の変更

後続の例に応じて、UIO Apacheプロキシの設定を変更します。

6.2.6.1 UIO_Settings.xml

<UIO_ProxySettings xmlns="http://example.com/">

<!-- Log4jProperties location="/home/oaamuio/uio/UIO_log4j.xml"/ -->
<Log4jProperties location="f:/oaamuio/uio/UIO_log4j.xml"/>
<Memcache ipaddress="127.0.0.1" port="11211" maxconn="10"/>

<GlobalVariable name='one" value="value"/>

<ConfigFile location="/home/oaamuio/uio/TestConfig1.xml" enabled="true"/>
<ConfigFile location="/home/oaamuio/uio/TestConfig2.xml" enabled="false"/>

<ConfigFile location="f:/oaamuio/uio/TestConfig1.xml" enabled="false"/>

<Setting name="GarbageCollectorInterval_ms" value="60000"/>
<Setting name="MaxSessionInactiveInterval_sec" value="1200"/>
<Setting name="CachedConfigExpiry_sec" value="120"/>
<Setting name="SessionIdCookieName_str" value="SessionId"/>

<Setting name="SessionCookie_ExpiryInMinutes" value="0"/>
<Setting name="SessionCookie_IsHttpOnly" value="0"/>
<Setting name="SessionCookie_IsSecure" value="1"/>

<Setting name="Profiling" value="0"/>
<Setting name="IgnoreUrlMappings" value="0"/>
<Setting name="CaptureTraffic" value="0"/>

<!-- Enable AutoLoadConfig for Windows or Single-process Linux.
Do not use for Multiple-process Linux when in production.
-->
<Setting name="AutoLoadConfig" value="1"/>

<!-- Setting name="UseMemcache" value="1"/ -->

</UIO_ProxySettings>

Log4jProperties

UIO Apacheプロキシのロギング構成を定義するlog4j.xmlファイルの場所を設定します。この場所は絶対パスである必要があります。相対パスのServerRootは使用できません。Linuxの場合は、httpdプロセスがディレクトリにアクセス可能であることを確認する必要があります。

httpdをマルチプロセス・モードで使用する場合は、FileAppenderを使用しないでください。かわりにSocketAppenderを使用して、別のプロセスのログを記録します。log4jの場所の設定については、log4jドキュメントを参照してください。Log4jは、Javaで作成されたロギング・フレームワーク(API)です。

GlobalVariable

GlobalVariableは、アプリケーション構成で使用されるグローバル変数です。このような名前と値のペアをいくつでも設定できます。

ConfigFile

ConfigFileは、アプリケーション構成への絶対パスです。このような構成をいくつでも設定できます。Linuxでは、httpdプロセスにこれらのファイルへのアクセス権が与えられていることを確認する必要があります。アプリケーションの構成の詳細は、第6.5項「UIOプロキシの構成」を参照してください。

Memcache

Memcacheには、memcacheサーバーのIPアドレスとポートが割り当てられています。複数のmemcacheサーバーを実行している場合は、複数のMemcache要素を設定ファイルに含めることができます。1つのローカルmemcacheを実行している場合は、この要素を含める必要はありません。デフォルトでは、UIO Apacheプロキシは、IPアドレス127.0.0.1およびポート11211でmemcacheに接続しようとします。

設定

これらは、UIO Apacheプロキシの動作を制御するフラグです。各種設定を表6-9に示します。

表6-9 OAAM UIOプロキシの設定

フラグ

説明

MaxSessionInactiveInterval_sec

UIO Apacheプロキシは、そのプロキシを経由するユーザーごとのセッションを保持します。この設定では、ユーザーが非アクティブになった後でこのセッションの有効期間が設定されます。これは、秒単位で設定されます(デフォルトは30分)。

例: <Setting name="MaxSessionInactiveInterval_sec" value="1800"/>

GarbageCollectorInterval_ms

実行中セッションの有効期間スレッドの間隔(デフォルト=5分)

例: <Setting name="GarbageCollectorInterval_ms" value="300000"/>

FileWatcherInterval_ms

設定または構成ファイルが変更されたかどうかを確認する間隔(デフォルト=1分)

例: <Setting name="FileWatcherInterval_ms" value="60000"/>

(プロキシが必要に応じて構成を更新する場合でも、構成XMLファイルの変更後にはhttpdサーバーを再起動することをお薦めします。)

SessionIdCookieName_str

UIO Apacheプロキシでセッションの保持に使用されるCookieの名前(デフォルト= OAAM_UIOProxy_SessionId)

例: <Setting name="SessionIdCookieName_str" value="SessionId"/>

SessionCookie_DomainLevelCount

UIO ApacheプロキシのセッションCookieのドメイン・レベル。その他のCookieには影響しません。

例: <Setting name="SessionCookie_DomainLevelCount" value="2"/>

SessionCookie_ExpiryInMinutes

この設定値は、UIO ApacheプロキシのセッションCookieのSet-Cookieヘッダーの有効期限属性に含められる有効期間の計算に使用されます。デフォルトはゼロで、有効期限属性が追加されないことを意味します。

SessionCookie_IsHttpOnly

設定値が1の場合、UIO ApacheプロキシのセッションCookieはSet-CookieヘッダーでHTTP専用とマークされます。このCookieのみに影響します。デフォルトでは、CookieはHTTP専用とマークされません。

サポートされるブラウザでは、HttpOnly CookieはHTTP(またはHTTPS)リクエストを送信するときにのみ使用されますが、Cookieの値はクライアント側のスクリプトでは使用できないため、クロスサイト・スクリプティングを通してCookieが盗まれるというリスクは軽減されます。

SessionCookie_IsSecure

設定値が1の場合、UIO ApacheプロキシのセッションCookieはSet-Cookieヘッダーでセキュアとしてマークされます。その他のCookieには影響しません。デフォルトでは、Cookieはセキュアとしてマークされません。

セキュアなCookieは、ブラウザがHTTPSを通してサーバーにアクセスする場合にのみ使用されます。これによって、クライアントからサーバーへの送信時にCookieは常に暗号化され、傍受によるCookie盗難にさらされるリスクが低くなります。

IgnoreUrlMappings

アプリケーション構成XMLファイルを無視します。プロキシは、フロースルー・プロキシとして動作します。

例: <Setting name="IgnoreUrlMappings" value="0"/>値0ではこのモードが無効になり、値1ではトラフィック取得モードが有効になります。

値1ではプロキシがフロースルーとして動作するように設定され、値0では構成XMLインターセプタが有効になります。

CaptureTraffic

HTTPトラフィック(ログ・ファイルのヘッダーとコンテンツ)を取得します。このモードは、デバッグを目的としています。これはヘッダーとコンテンツをそのまま取得し、カスタマの個人データを含めることもできます。このモードの使用には注意を要します。これはデバッグ/テスト専用です。

例: <Setting name="CaptureTraffic" value="0"/>値1ではトラフィック取得が有効になり、値0では無効になります。

MaxReqBodyBytes

プロキシで処理可能な最大リクエスト・ボディ。この値を超えるリクエスト・ボディは切り捨てられます。この仕様は、サイズの大きなファイルをアップロードするPOSTがアプリケーションに含まれている場合に必要です。

例: <Setting name="MaxReqBodyBytes" value="10240"/>

UseMemcache

httpdがシングル・プロセス・モードで実行中であっても、memcacheを強制的に使用します。マルチプロセス・モードで実行中の場合は、何の影響もありません。起動時に適用されます。変更を適用する際には、httpdを再起動する必要があります。

例: <Setting name="UseMemcache" value="1"/>"値1では、シングル・プロセスhttpdに対するmemcacheの使用が有効になります。値0は無視されます。

CachedConfigExpiry_sec

複数のconfig XML構成がメモリーにロードされた場合、メモリー内の未使用のconfig XMLデータの有効期間。config XMLファイルが変更されて自動的にロードされたときに、メモリーに存在する未使用の構成データの有効期限が切れます。(デフォルト= 60分)。

例: <Setting name="CachedConfigExpiry_sec" value="3600"/>

AutoLoadConfig

ユーザーがconfig XMLファイルを変更したときの自動ロードを有効にするには、1に設定します。0に設定すると、この機能はオフになります。httpdのシングル・プロセス・モードを使用する際には、この機能を有効にできます。本番用のhttpdのマルチプロセス・モードに対してこの機能を有効にしないでください。個々のプロセスで異なるバージョンのconfig XMLファイルを使用している可能性があるためです。

例: <Setting name="AutoLoadConfig" value="1"/>値1では自動ロードが有効になり、値0では無効になります。

設定名

インターセプション・フェーズに従って各種操作の内部プロファイリングを有効にし、それをログにマイクロ秒単位で出力します。パフォーマンスに影響することがあるため、これは、本番以外の環境でデバッグおよびプロファイリングする場合にのみ必要です。ログは、INFOレベルとTRACEレベルで表示されます。

6.2.6.2 UIO_log4j.xml

実際のlog4jのフォーマット詳細は、log4jドキュメントを参照してください。Apache::log4cxxはC++を実装したlog4jフレームワークであり、XMLファイル・フォーマットはlog4cxxとlog4jに共通しています。

使用可能なUIO ApacheプロキシのLog4jロガーを表6-10に示します。

表6-10 UIO ApacheプロキシのLog4jロガー

ロガー

説明

config.reader

このロガーは、UIO_Config XMLファイルをロードする関連クラスが使用します。

settings.reader

このロガーは、UIO_Settings XMLファイルをロードするクラスが使用します。

config.datastore

このロガーは、UIO_Config XMLファイルをロードする関連クラスが使用します。

config

このロガーは、UIO_Config XMLファイルをロードする関連クラスが使用します。

config.reader.populator

このロガーは、UIO_Config XMLファイルをロードする関連クラスが使用します。

condition

このロガーは、UIO_Config.xmlに定義されているすべての条件が使用します。

filter

このロガーは、UIO_Config.xmlで定義されているすべてのフィルタが使用します。

action

このロガーは、UIO_Config.xmlで定義されているすべてのアクションが使用します。

interceptor

このロガーは、UIO_Config.xmlで定義されているすべてのアクションが使用します。

requestcontext

HTTPリクエスト処理は、このロガーを使用するクラスによって実行されます。

プロキシ

HTTPリクエスト処理は、このロガーを使用するクラスによって実行されます。

htmlpage

HTMLページ関連処理は、このロガーを使用するクラスによって実行されます。

httpreqimpl

HTTPリクエスト処理は、このロガーを使用するクラスによって実行されます。

container

HTTPリクエスト処理は、このロガーを使用するクラスによって実行されます。

sessions

このロガーは、UIOプロキシのセッション管理関連クラスが使用します。

http

CaptureTrafficの設定がオンになっているときにすべてのHTTPトラフィックのログに使用されるロガー。

distsessions

このロガーは、UIOプロキシのセッション管理関連クラスが使用します。

注意:

ロガー・ドキュメントはログを詳述したもので、デプロイメント・エンジニアがログをよりよく理解できるように用意されています。通常、デバッグ・シナリオの場合はログ・レベルをDEBUGにして、ロガーによるフィルタリングは行わないようにします。

6.2.6.3 アプリケーション構成XML

これらのXMLファイルは、UIO_Settings.xmlファイルのConfigFile要素に定義されているアプリケーション構成ファイルです。

6.3 ルールとユーザー・グループの設定

ルールとユーザー・グループの設定の詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

6.4 ポリシーの設定

UIOプロキシのポリシーを設定するには、そのまま使用できるポリシーをインポートします。ポリシーのインポートの詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

6.5 UIOプロキシの構成

プロキシは、クライアント・ブラウザとWebアプリケーション間のすべてのHTTPトラフィックをインターセプトし、構成ファイルに指定されたアクションを実行します。UIO Apacheプロキシは、プロキシ・ディストリビューションのUIO_Config.rngファイルにあるXMLのNG定義解除を使用します。

6.5.1 UIOプロキシ構成ファイルの要素

次の各項では、プロキシ構成ファイルの各種要素について説明します。

6.5.1.1 インターセプタのコンポーネント

インターセプタは、プロキシ構成で最も重要な要素です。プロキシ構成ファイルのオーサリングでは、主にインターセプタの定義が行われます。

インターセプタには、リクエスト・インターセプタとレスポンス・インターセプタという2つのタイプがあります。名前が示すように、リクエスト・インターセプタはプロキシがクライアント・ブラウザからHTTPリクエストを受信するときに使用され、レスポンス・インターセプタはプロキシがサーバー(Webアプリケーション・サーバーまたはOAAMサーバーなど)からHTTPレスポンスを受信するときに使用されます。

インターセプタには4つのコンポーネントがあり、それらはすべてオプションです。

1. URLリスト: インターセプタのURLリストに現在のリクエストURLが含まれているか、URLリストが空の場合、インターセプタが評価されます。URLは完全に一致する必要があります。正規表現はサポートされていません。リクエスト・インターセプタの場合、これは、たとえばクライアントからサーバーへの送信途上で、HTTPリクエストのリクエスト部分でリクエスト・インターセプタが実行されるURLのセットです。　　レスポンス・インターセプタの場合、HTTPリクエストのURLです。レスポンス・インターセプタは、たとえばサーバーからクライアントへのレスポンスの取得時に、HTTPリクエストのレスポンス部分で実行されます。URLに問合せパラメータが含まれている場合は、そのURLをリストに入れないでください。条件を使用して問合せパラメータを確認できます。

2. 条件リスト: 条件はリクエスト/レスポンスのコンテンツを調べることができます。たとえば、HTTPヘッダー/パラメータ/Cookieなどの有無を確認したり、ヘッダー/パラメータ/Cookieに特定の値があるかどうかをテストすることができます。インターセプタに定義されているフィルタとアクションは、指定された条件がすべて満たされているか、条件が指定されていない場合のみ実行されます。

3. フィルタ・リスト: フィルタは、リクエスト/レスポンスのコンテンツを変更したり、プロキシ内の状態情報を変更する可能性のあるアクションを実行します。たとえば、フィルタでHTTPヘッダーを追加/削除したり、HTTPヘッダー/パラメータ/Cookieの値をプロキシ変数に保存することができます。

4. アクション: フィルタの実行後、インターセプタはアクションが指定されている場合に、そのアクションを実行します。アクションとして、次のいずれかが実行できます。

1. クライアントを別のURLにリダイレクトする。

2. 保存されたレスポンスをクライアントに送信する。

3. サーバーでHTTP取得を実行する。

4. サーバーでHTTPポストを実行する。

5. 保存されたリクエストをサーバーに送信する。

表6-11 インターセプタのコンポーネント

インターセプタ

属性

説明

RequestInterceptor

id, desc, post-exec-action, isGlobal, enabled

RequestInterceptorは、リクエスト・フェーズで実行されるインターセプタを定義します。id、descriptionが割り当てられています。オプションとしてpost-exec-actionが割り当てられますが、これは値としてcontinue、stop-intercept、stop-phase-interceptを取ります。デフォルトはcontinueです。オプションとしてisGlobalが割り当てられ、これは値としてtrueまたはfalseを取ります。デフォルトはfalseです。また、enabled属性も割り当てられます。これもオプションであり、デフォルトはtrueです。

ResponseInterceptor

id, desc, post-exec-action, isGlobal, enabled

ResponseInterceptorは、HTTPリクエストのレスポンス・フェーズで実行されるインターセプタを定義します。この要素の属性は、RequestInterceptorの要素に類似しています。この要素には、ゼロまたは複数のRequestUrl要素、ゼロまたは複数の条件要素、ゼロまたは複数のフィルタ要素、ゼロまたは1個のターゲット要素が含まれています。RequestUrl要素には1つのURL要素があり、それに対してインターセプタが実行されます。URlは完全に一致する必要があります。URLに対する正規表現またはパターンはサポートされていません。RequestUrl要素のかわりに、同様の意味を持つResponseUrl要素があります。その他すべては、RequestInterceptorに類似しています。

6.5.1.2 条件

条件は、HTTPリクエスト/レスポンス、またはプロキシに保存された状態情報(変数)を調べるためにプロキシで使用します。各条件は、trueまたはfalseに評価されます。条件は、1つの条件がfalseに評価されるか、すべての条件が評価されるまで、構成ファイルでのリスト順で評価されます。表6-12に、インターセプタに定義可能な条件を示します。

表6-12 インターセプタに定義される条件

条件名

属性

説明

HeaderPresent

enabled, name

指定されたヘッダーがリクエスト/レスポンスに存在するかどうかを確認します。ヘッダー名の最後にコロン(:)を付けてください。

例:

<HeaderPresent name="userid:"/>

ParamPresent

enabled, name

指定されたパラメータがリクエストに存在するかどうかを確認します。

例:

<ParamPresent name="loginID"/>

QueryParamPresent

enabled, name

指定された問合せパラメータがURLに存在するかどうかを確認します。

例:

<QueryParamPresent name="TraceID"/>

VariablePresent

enabled, name

指定されたプロキシ変数が設定されているかどうかを確認します。

例:

<VariablePresent name="$userid"/>

RequestCookiePresent

enabled, name

指定されたCookieがリクエストに存在するかどうかを確認します。

例:

<RequestCookiePresent name="SESSIONID"/>

ResponseCookiePresent

enabled, name

指定されたCookieがレスポンスに存在するかどうかを確認します。

例:

<ResponseCookiePresent name="MCWUSER"/>

HeaderValue

enabled, name, value, mode, ignore-case

指定されたリクエスト/レスポンスのヘッダー値が指定された値と一致するかどうかを確認します。ヘッダー名の最後にコロン(:)を付けてください。

例:

<HeaderValue name="Rules-Result:"

value="allow"/>

ParamValue

enabled, name, value, mode, ignore-case

指定されたリクエストのパラメータ値が指定された値と一致するかどうかを確認します。

例:

<ParamValue name="cancel" value="Cancel"/>

QueryParamValue

enabled, name, value, mode, ignore-case

指定されたURLの問合せパラメータ値が指定された値と一致するかどうかを確認します。

例:

<QueryParamValue name="requestID"

value="Logout"/>

VariableValue

enabled, name, value, mode, ignore-case

指定されたプロキシ変数の値が指定された値と一致するかどうかを確認します。

例:

<VariableValue name="%REQUEST_METHOD"

value="post"/>

RequestCookieValue

enabled, name, value, mode, ignore-case

指定されたリクエストのCookie値が指定された値と一致するかどうかを確認します。

例:

<RequestCookieValue name="CurrentPage"

value="/onlineserv/"

mode="begins-with"

ignore-case="true"/>

ResponseCookieValue

enabled, name, value, mode, ignore-case

指定されたレスポンスのCookie値が指定された値と一致するかどうかを確認します。

例:

<ResponseCookieValue name="CurrentPage"

value="/onlineserv/"

mode="begins-with"

ignore-case="true"/>

HttpStatus

enabled, status

レスポンスのステータス・コードが指定された値と一致するかどうかを確認します。

例:

<HttpStatus status="302"/>

HtmlElementPresent

enabled, name,

attrib-name1, attrib-value1,

attrib-name2, attrib-value2,

…

attrib-name9, attrib-value9,

指定された条件に一致させるHTML要素の有無を確認します。

<name attrib-name1="attrib-value1" attrib-name2="attrib-value2" …/>

例:

<HtmlElementPresent name="form"

attrib-name1="name"

attrib-value1="signon"/>

PageContainsText

enabled, text

レスポンスに指定されたテキストが含まれているかどうかを確認します。

例:

<PageContainsText text="You have entered an

invalid Login Id"/>

NotVariableValue

enabled, name, value, mode, ignore-case

指定されたプロキシの変数値が指定された値に一致しないかどうかを確認します。

例:

<NotVariableValue name="$Login-Status"

value="In-Session"/>

And

enabled

すべての子条件がtrueに評価された場合のみ、trueに評価されます。

例:

<And>

<PageContainsText text=

"Your password must be"/>

<PageContainsText text=

"Please reenter your password"/>

</And>

Or

enabled

子条件の1つがtrueに評価された場合のみ、trueに評価されます。

例:

<Or>

<ParamValue name="register"

value="Continue"/>

<ParamValue name="cancel"

value="Cancel"/>

</Or>

Not

enabled

子条件の結果を逆にします。

例:

<Not>

<HttpStatus status="200"/>

</Not>

属性idはオプションであり、トレース・メッセージでのみ使用します。値が指定されていない場合は、条件名(HeaderPresentなど)が使用されます。

属性enabledはオプションであり、デフォルト値はtrueです。この属性を使用して、条件をenable/disable(有効化/無効化)できます。この属性の値は、グローバル変数の値に設定できます。その場合、条件はグローバル変数の値に応じて有効化または無効化されます。

属性valueは、プロキシ変数の名前に設定できます。その場合、プロキシはチェックポイントで変数を評価し、その値を条件に使用します。

属性modeは、begins-with、ends-with、containsのいずれかに設定できます。

属性ignore-caseは、true、falseのいずれかに設定できます。

6.5.1.3 フィルタ

フィルタは、HTTPリクエスト/レスポンスのコンテンツを変更したり、プロキシに保存された状態情報(変数)を変更するためにプロキシで使用されます。フィルタは、構成ファイルでのリスト順に従って実行されます。表6-13に、インターセプタに定義可能なフィルタを示します。

表6-13 インターセプトに定義されるフィルタ

フィルタ名

属性

説明

AddHeader

enabled, name, value

指定されたヘッダーを、指定された値とともにリクエスト/レスポンスに追加します。ヘッダー名の最後にコロン(:)を付けてください。

例:

<AddHeader name="userid:" value="$userid"/>

SaveHeader

enabled, name, variable

指定されたリクエスト/レスポンスのヘッダー値を、指定されたプロキシ変数に保存します。ヘッダー名の最後にコロン(:)を付けてください。

例:

<SaveHeader name="userid:" variable="$userid"/>

RemoveHeader

enabled, name

指定されたヘッダーをリクエスト/レスポンスから削除します。ヘッダー名の最後にコロン(:)を付けてください。

例:

<RemoveHeader name="InternalHeader:"/>

AddParam

enabled, name, value

指定された名前と値を持つリクエスト・パラメータを追加します。

例:

<AddParam name="loginID" value="$userid"/>

SaveParam

enabled, name, variable

指定されたリクエストのパラメータ値を、指定されたプロキシ変数に保存します。

例:

<SaveParam name="loginID" variable="$userid"/>

AddRequestCookie

enabled, name, value

指定されたCookieを、指定された値とともにリクエストに追加します。

例:

<AddRequestCookie name="JSESSIONID"

value="$JSESSIONID"/>

SaveRequestCookie

enabled, name

指定されたリクエストのCookie値を、指定されたプロキシ変数に保存します。

AddResponseCookie

enabled, name

指定されたCookieを、指定された値とともにレスポンスに追加します。

例:

<AddResponseCookie name="JSESSIONID"

value="$JSESSIONID"/>

SaveResponseCookie

enabled, name

指定されたレスポンスのCookie値を、指定されたプロキシ変数に保存します。

例:

<SaveResponseCookie name="JSESSIONID"

variable="$JSESSIONID"/>

SaveHiddenFields

enabled, form, variable, save-submit-fields

指定されたプロキシ変数にフォーム名が指定されている場合、非表示の送信フィールドの値がすべて指定されたフォームで保存されます。送信フィールドを保存しない場合は、save-submit-fields属性をfalseに設定します。

例:

<SaveHiddenFields form="pageForm"

variable="%lg_HiddenParams"/>

AddHiddenFieldsParams

enabled, variable

変数に保存された非表示フィールドごとにリクエスト・パラメータを追加します。

例:

<AddHiddenFieldsParams

variable="%lg_HiddenParams"/>

SetVariable

enabled, name, value

指定された名前を持つプロキシ変数を指定された値に設定します。

例:

<SetVariable name="$Login-Status"

value="In-Session"/>

UnsetVariable

enabled, name

指定された名前を持つプロキシ変数を削除します。

例:

<UnsetVariable name="$Login-Status"/>

ClearSession

enabled, name

現行セッションのセッション変数をすべて削除します。

例:

<ClearSession/>

SaveQueryParam

enabled, name, variable

指定された問合せパラメータを、指定されたプロキシ変数に保存します。

例:

<SaveQueryParam name=

"search" variable="$search"/>

SaveRequest

enabled, variable

リクエストのコンテンツ全体を、指定されたプロキシ変数に保存します。ヘッダーとボディが存在する場合は、すべてのヘッダーとボディも対象になります。

例:

<SaveRequest variable="$billPayRequest"/>

SaveResponse

enabled, variable

レスポンスのコンテンツ全体を、指定されたプロキシ変数に保存します。ヘッダーとボディが存在する場合は、すべてのヘッダーとボディも対象になります。

例:

<SaveResponse variable="$BillPay-Response"/>

ReplaceText

enabled, find, replace

find属性に指定されたテキストをreplace属性に指定した値で置換することにより、レスポンスを更新します。

例:

<ReplaceText find="string-to-find"

replace="string-to-replace"/>

ProcessString

enabled, source, find, action, count, search-str, start-tag, end-tag, ignore-case, replace, encoding

このフィルタを使用して、文字列(リクエスト、レスポンスのコンテンツなど)から部分文字列を抽出し、それをプロキシ変数に保存できます。また、このフィルタを使用して文字列を動的にフォーマット化することもできます。find属性には、stringおよびsub-stringという2つの値があります。これは、string全体またはsub-stringに適用するfindモードを定義します。sub-stringは、start-tagとend-tagによって定義されます。findの値がsub-stringの場合は、start-tag値とend-tag値のみが使用されます。それ以外の場合、これらの値は無視されます。action属性には、extract、replace、およびevalの3つの値があります。'extract'の値は、start-tagとend-tagで囲まれたコンテンツが変数にコピーされることを意味します。replaceの値は、findおよびreplace操作の実行に使用します。evalは、行内の変数をfindおよびevaluateするために使用します。属性のエンコーディングはオプションです。結果の文字列をbase64でエンコードする必要がある場合は、base64の値を取ることができます。この属性は、UIO Apacheプロキシのみでサポートされています。このフィルタの使用方法は、第6.5.1.4項「フィルタの例: ProcessString」の例を参照してください。

FormatString

enabled, variable, format-str, encoder, param-0, param-1, …, param-n

このフィルタにはsprintf() Cライブラリ・ファンクションに類似した機能があり、フォーマット化された文字列を変数に格納できます。オプションとして、変数に格納された文字列はbase64形式でエンコードできます。HTTP Basic認証ヘッダーの作成にこのフィルタを使用する方法は、第6.5.1.6項「フィルタの例: FormatString」の例を参照してください。

FormatStringは、UIO Apacheプロキシではサポートされていません。ProcessStringによって必要な機能がすべて提供されるためです。

6.5.1.4 フィルタの例: ProcessString

指定されたstart-tagとend-tagの間の部分文字列をソース文字列内で検索し、見つかったsub-stringを抽出して、抽出したsub-stringを指定の変数に保存します。'extract'のアクションにより、最初に一致するstart-tagとend-tagのペアが抽出されます。

<ProcessString source="%RESPONSE_CONTENT"
find="sub-string"
start-tag="var traceID = '" end-tag="';"
action="extract"
variable="$TRACE_ID"/>

指定されたsearch-stringをソース文字列内で検索し、それを置換文字列で置換して、更新された文字列を指定の変数に保存します。複数の一致が存在する場合は、カウント属性を使用して動作を指定することもできます。属性'count'は、値としてall、onceまたはnumberを取ることができます。

<ProcessString
source="/bfb/accounts/accounts.asp?TraceID=$TRACE_ID"
find="string" search-str="$TRACE_ID"
action="replace"
replace="$TRACE_ID"
variable="%POST_URL"/>

指定されたstart-tagとend-tagの間のsub-stringをソース文字列内で検索し、それを(開始タグと終了タグも含めて)検出されたsub stringの評価済の値に置換し、更新された文字列を指定の変数に保存します。複数の一致が存在する場合は、カウント属性を使用して動作を指定できます。この属性は、値として'all'、'once'またはnumberを取ることができます。

<ProcessString
source="/cgi-bin/mcw055.cgi?TRANEXIT[$UrlSuffix]"
find="sub-string" start-tag="[" end-tag="]"
action="eval"
variable="%LogoffUrl"/>

属性ignore-caseをtrueまたはfalseとして指定し、前述のすべての例に適用できます。したがって、検索操作では大/小文字を区別する場合としない場合があります。オプションとして、エンコーディング属性を指定できます。指定すると、結果の文字列が変数に保存される前にエンコードされます。この属性が取れる値はbase64のみです。この属性を指定しない場合、結果の文字列はそのまま保存されます。

エンコーディング属性は、UIO Apacheプロキシのみでサポートされています。On

6.5.1.5 OAAM変更パスワードでURLにエンコードされた特殊文字用のProcessStringのエンコード/デコードのスキーム

OAAM UIOプロキシを使用してOAAM変更パスワードをコールするときに、パスワード値に特殊文字が含まれている場合、これらの文字はOAAMに渡される際にURLにエンコードされます。

ProcessStringフィルタ用に4つのエンコード/デコードのスキームが用意されているため、UIOプロキシはURLエンコードまたはOAAMサーバーが使用するものと同じエンコード・スキームを使用できます。

ProcessStringのエンコード/デコードのスキーム

OAAM UIOプロキシのProcessStringフィルタで使用できるエンコード/デコードのスキームは次のとおりです。

表6-14 ProcessStringのエンコード/デコードのスキーム

エンコード/デコードのスキーム

詳細

asadecode:

OAAMサーバーでエンコードされた文字列をデコードします。

asaencode

OAAMサーバーが使用するものと同じスキーマを使用して、文字列値をエンコードします。

urldecode

URLにエンコードされた文字列値をデコードします。

urlencode

特定の文字列についてURLエンコードを実行します。

例

11g OAAMサーバーは、自身にポストれた資格証明に対してUTF8エンコードを実行します。oaam_server/changePassword.do,のレスポンス・ヘッダー、newPasswordのヘッダーとconfirmPasswordのヘッダーがエンコードされます。この場合、保護されたアプリケーションで、エンコードされたこのような資格証明が許可されないときには、たとえば、次のインターセプタを使用することで、これらの資格証明のエンコード済の値をデコードしてUIOプロキシ変数に保存できます。その後、UIOプロキシはこれらの変数で処理を実行し、たとえば、保護されたアプリケーションにこれらの値をポストします。

インターセプタの例

<ResponseInterceptor id="EncodingDecodingSchemes"

desc="ProcessString eval with encoding/decoding tags" enabled="true">

<ResponseUrl url="/oaam_server/changePassword.do"/>

<Conditions>

<VariableValue name="%REQUEST_METHOD" value="POST"/>

<HeaderPresent name="password:"/>

<HeaderPresent name="newpassword:"/>

<HeaderPresent name="confirmpassword:"/>

</Conditions>

<Filters>

<SaveHeader name="newpassword:" variable="%newpassword"/>

<ProcessString source="[%newpassword]" variable="%newpassword1"

action="eval" find="sub-string" encoding="asadecode"/>

<AddHeader name="newpasswordASADecoded:" value="%newpassword1"/>

<ProcessString source="[%newpassword1]" variable="%newpassword2"

action="eval" find="sub-string" encoding="asaencode"/>

<AddHeader name="newpasswordASAEncoded:" value="%newpassword2"/>

<ProcessString source="[%newpassword1]" variable="%newpassword3"

action="eval" find="sub-string" encoding="urlencode"/>

<AddHeader name="newpasswordUrlEncoded:" value="%newpassword3"/>

<ProcessString source="[%newpassword3]" variable="%newpassword4"

action="eval" find="sub-string" encoding="urldecode"/>

<AddHeader name="newpasswordURLDecoded:" value="%newpassword4"/>

</Filters>

</ResponseInterceptor>

6.5.1.6 フィルタの例: FormatString

次に、変数%useridおよび%passwordのユーザー名とパスワードを使用した、変数$AuthHeaderValueへのHTTP Basic認証のレスポンス・ヘッダーの作成方法の例を示します。

<FormatString variable="%UsernamePassword"
format-str="{0}:{1}"
param-0="%userid"
param-1="%password"
encoder="Base64"/>

<FormatString variable="$AuthHeaderValue"
format-str="Basic {0}"
param-0="%UsernamePassword"/>

6.5.1.7 アクション

インターセプタは、オプションとして、すべてのフィルタの実行後に次のアクションのいずれかを実行できます。アクション実行後に、さらにインターセプタが試行されることはありません。

redirect-client

プロキシでは、別のURLをロードするためにクライアントをリダイレクトする必要が生じることがあります。そのような場合、アクションとしてredirect-clientを使用します。プロキシは、302 HTTPレスポンスを送信して、指定したURLをロードするようクライアントに要求します。これは、次の2つの属性を取ります。urlにはユーザーのリダイレクト先であるURLが含まれており、display-urlはオプションです。

display-url属性がインターセプタに指定された場合、プロキシはHTTP 302レスポンスをブラウザに送信し、display-url属性に指定されたURLをロードします。プロキシは、このリクエストを受信すると、サーバー上でHTTP-GETを実行し、url属性で指定されたURLを取得します。

send-to-client

サーバーからのレスポンスをプロキシに保存し、他のHTTPリクエストをいくつか実行した後でクライアントに送信する必要が生じることがあります。そのような場合、アクションとしてsend-to-clientを使用します。プロキシは、指定された変数のコンテンツをクライアントに送信します。これは、次の2つの属性を取ります。htmlには、ユーザーに返送する保存済コンテンツのある変数が含まれており、display-urlはオプションの属性です。

display-url属性がインターセプタに指定された場合、プロキシはHTTP 302レスポンスをブラウザに送信し、display-url属性に指定されたURLをロードします。プロキシは、このリクエストを受信すると、インターセプタで指定されたレスポンスを送信します。

get-server

プロキシがサーバーからURLを取得する必要が生じることがあります。そのような場合、アクションとしてget-serverを使用します。プロキシは、指定されたURLのHTTP-GETリクエストをサーバーに送信します。これは、次の2つの属性を取ります。urlは取得の実行対象となるURLであり、display-urlはオプションです。

display-url属性がインターセプタで指定されたり、このアクションがレスポンス・インターセプタで指定された場合、プロキシはHTTP 302レスポンスをブラウザに送信します。プロキシは、このリクエストを受信すると、サーバー上でHTTP-GETを実行して、url属性で指定されているURLを取得します。

post-server

プロキシがサーバーのURLにpostする必要が生じることがあります。そのような場合、アクションとしてpost-serverを使用します。プロキシは、指定されたURLのHTTP-POSTリクエストをサーバーに送信します。これは、次の2つの属性を取ります。urlにはポストの送信先のURLが含まれており、display-urlはオプションです。

display-url属性がインターセプタで指定されたり、このアクションがレスポンス・インターセプタで指定された場合、プロキシはHTTP 302レスポンスをブラウザに送信します。プロキシは、このリクエストを受信すると、url属性で指定されているURLのサーバーに対してHTTP-POSTを実行します。

send-to-server

クライアントからのリクエストをプロキシに保存し、他のいくつかのHTTPリクエストを実行した後でそれをサーバーに送信する必要が生じることがあります。そのような場合、アクションとしてsend-to-serverを使用します。プロキシは、指定された変数のコンテンツをサーバーに送信します。これは、次の2つの属性を取ります。htmlには保存済コンテンツのある変数が含まれており、display-urlはオプションの属性です。

display-url属性がインターセプタで指定された場合、プロキシはHTTP 302リダイレクト・レスポンスをブラウザに送信します。これによって、ブラウザはdisplay-urlをリクエストし、プロキシは保存されたリクエストをサーバーに送信します。このアクションをレスポンス・インターセプタで使用する場合は、display-urlが必須です。これを指定しないと、アクションは失敗します。

6.5.1.8 変数

プロキシ変数は、文字列データをプロキシのメモリーに格納できます。変数は、条件、フィルタおよびアクションで使用できます。たとえば、SaveHeaderフィルタを使用して、特定のヘッダーの値を、指定されたプロキシ変数に保存できます。この変数値は、後で使用できます(たとえば、パラメータをリクエストに追加するために)。また、変数を条件で使用して、インターセプタを実行できるかどうかを判別することもできます。

プロキシ変数は、その寿命に応じて3つのタイプがあります。変数のタイプは、変数名の最初の文字、%、$、@のいずれかによって判別されます。

すべての変数タイプは、SetVariable、SaveHeader、SaveParam、SaveResponseなどのフィルタを使用して設定できます。

すべての変数タイプは、UnsetVariableフィルタで設定解除/削除できます。すべてのセッション変数を削除するには、ClearSessionフィルタを使用します。

リクエスト変数

リクエスト変数: これらの変数名は%で始まります。これらの変数は現在のリクエストに関連付けられており、現在のリクエストの完了時に削除されます。リクエスト変数は、リクエスト全体で値を必要としない場合に使用します。

セッション変数

セッション変数: これらの変数名は$で始まります。これらの変数は現在のプロキシ・セッションに関連付けられており、プロキシ・セッションのクリーンアップ時に削除されます。セッション変数は、クライアントのリクエスト全体にわたって値を保持する必要がある場合に使用します。

グローバル変数

グローバル変数: これらの変数名は@で始まります。これらの変数は現在のプロキシ構成に関連付けられており、プロキシ構成のアンロード時に削除されます。グローバル変数は、リクエスト全体およびクライアント全体にわたって値を保持する必要のある場合に使用します。

グローバル変数は、プロキシ構成のロード時に構成ファイルでSetGlobalを使用して設定できます。

事前定義済変数

UIOプロキシでは、次の事前定義済リクエスト変数をサポートしています。

表6-15 UIOプロキシによりサポートされる事前定義済変数

変数名

説明

%RESPONSE_CONTENT

この変数には、現在のリクエストに対するWebサーバーからのレスポンス全体のコンテンツが含まれています。UIO Apacheプロキシでは、%RESPONSE_CONTENTの使用は非推奨になりました。かわりに、SaveResponse、SaveHeader、SaveResponseCookieおよびReplaceTextの各フィルタを使用してください。

%REQUEST_CONTENT

この変数には、クライアントのリクエスト全体のコンテンツが含まれています。UIO Apacheプロキシでは、%REQUEST_CONTENTの使用は非推奨になりました。かわりに、SaveRequest、SaveHeaderおよびSaveRequestCookieの各フィルタが使用できます。

%QUERY_STRING

この変数には、現在のリクエストURLの?で始まる問合せ文字列が含まれています。

%REQUEST_METHOD

リクエストのHTTPメソッドの動詞(GET、POSTなど)。

%REMOTE_HOST

クライアントまたはクライアントのエージェントのホスト名。(UIO Apacheプロキシの場合は、Apacheディレクティブ'HostnameLookups On'を使用してホスト名の検索を有効にする必要があります。)

%REMOTE_ADDR

クライアントまたはクライアント・エージェントのIPアドレス。

%HTTP_HOST

HTTPホスト・ヘッダーのコンテンツ。

%URL

現在のリクエストのURL。

6.5.1.9 アプリケーション

単一のプロキシ・インストールを使用して、1つ以上のWebサーバーで実行している複数のWebアプリケーションに対してマルチファクタ認証を提供できます。UIOプロキシ構成では、アプリケーションは、1つのWebアプリケーションに対して定義されたインターセプタをグループ化したものです。

リクエストおよびレスポンス・インターセプタは、プロキシ構成ファイルのアプリケーションの外部で定義できます。これらのインターセプタはグローバル・インターセプタと呼ばれ、アプリケーション内で定義されているインターセプタの前に評価および実行されます。

6.5.2 インターセプション・プロセス

HTTPメッセージは、クライアントからサーバーへのリクエストとサーバーからクライアントへのレスポンスで構成されます。HTTPはトランザクション指向です。クライアントからサーバーへのリクエストには、サーバーからクライアントへのレスポンスが1つ割り当てられます。リクエストにはいくつかのヘッダーがあり、その後にオプションとしてリクエスト・ボディが続きます。同様に、レスポンスにもいくつかのヘッダーと、オプションとしてボディが1つあります。プロキシはクライアントとターゲット・アプリケーションの中間に存在するため、構成XMLを使用してHTTPリクエストのリクエスト・ヘッダーとボディ、レスポンス・ヘッダーとボディを変更できます。レスポンスとして、通常の200 OKレスポンス、リダイレクト・レスポンス302、またはその他のどのHTTPステータス・レスポンスも使用できます。いずれの場合でも、レスポンスはそのリクエストに対応しており、同じリクエストのレスポンス・インターセプタをトリガーします。たとえば、リクエストがURL /doLogin.doに対するもので、そのレスポンスが/loginPage.jspという場所でのredirect (302)である場合、すべてのリクエストおよびレスポンス・インターセプタがURL /doLogin.doに対してトリガーされます。次のHTTPリクエストは/loginPage.jspにあるHTTP GETであり、これによって/loginPage.jspに対するすべてのリクエストおよびレスポンス・インターセプタがトリガーされます。

リクエストを受信すると、プロキシはURLに対して定義されたリクエスト・インターセプタを、構成ファイルでの定義順に評価します。同様に、Webサーバーからレスポンスを受信すると、プロキシはHTTPリクエストのURLに対して定義されたレスポンス・インターセプタを、構成ファイルでの定義順に評価します。

インターセプタの条件がtrueに評価されると、そのインターセプタが実行されます。たとえば、フィルタとアクションが実行されます。インターセプタの実行後、次の条件が満たされている場合にのみ、後続のインターセプタの実行が続行されます。

- 現在のインターセプタに対して指定されたアクションがない。

- 現在のインターセプタのpost-exec-action属性がcontinueである。

post-exec-action属性は、アクションを定義していないインターセプタに対して指定するようにしてください。グローバル・インターセプタ(アプリケーションの外部で定義されたインターセプタなど)の場合、post-exec-action属性のデフォルト値はcontinueです。リクエスト・インターセプタのpost-exec-actionのstop-phase-intercept値によってリクエストのインターセプションが停止しますが、stop-interceptがそのリクエストに対するインターセプションを完全に停止している間はレスポンスのインターセプションが続行されます。グローバル以外のインターセプタについては、アクションが指定されていない場合のデフォルト値はcontinueであり、アクションが指定されている場合のデフォルト値はstop-phase-interceptになります。

前述したように、プロキシ構成には複数のアプリケーションを含めることができます。URLに対して評価するインターセプタのリストを検索している間は、次のインターセプタのみが検討されます。

- アプリケーションの外部で定義されているグローバル・インターセプタ

- 現在のセッションに関連付けられたアプリケーションで定義されているインターセプタ

各セッションに関連付けられるアプリケーションは、最大で1つです。プロキシがURLに対するインターセプタをアプリケーションで見つけたときに、現在のセッションに関連付けられたアプリケーションが(まだ)存在していない場合は、そのアプリケーションが現在のセッションに関連付けられます。

現在のセッションにすでにアプリケーションが関連付けられており、URLに対するインターセプタがそのアプリケーションに見つからない場合、プロキシは他のアプリケーションでインターセプタを検索します。URLに対するインターセプタが別のアプリケーションで見つかった場合は、セッションが新規作成され、リクエストはその新しいセッションに関連付けられます。

6.5.3 Oracle Adaptive Access Managerサーバー・インタフェースへのリダイレクションの構成

UIOプロキシは、たとえばOAAMサーバーを使用してパスワードを収集したり、リスク・ルールを実行するために、適切なタイミングでユーザーをOAAMサーバー・ページにリダイレクトします。HTTPプロコルは、HTTPヘッダーを使用して、UIOプロキシとOAAMサーバー間でデータをやり取りします。表6-16に、プロキシ構成で参照されるOAAMサーバー・ページと、データの受渡しに使用するHTTPヘッダーの詳細を示します。また、指定された条件でプロキシが実行すると予想されるアクションも示します。

表6-16 OAAMサーバー・インタフェース

URL

条件

アクション

OAAMサーバー・ページへのリクエスト

リクエスト受信時

ヘッダー「BharosaAppId」を設定します。OAAMサーバーは、このヘッダー値を使用して適切なカスタマイズ(UI、ルール、要素)を選択します。

loginPage.jspまたはlogin.do

アプリケーション・ログイン・ページへのリクエスト受信時

このURLにリダイレクトして、アプリケーションのログイン・ページのかわりにOracle Adaptive Access Managerのログイン・ページを使用します。

password.do

レスポンスにはヘッダーのユーザーIDとパスワードが含まれます(アプリケーションによっては、さらに多くが含まれる場合もあります)。

レスポンス・ヘッダーからの資格証明を保存し、アプリケーションにポストします。

&の付いたURLをターゲット・アクションに投入してXMLパーサーでエラーが生じないようにするには、これをエスケープして、&ampを使用します。

login.do

フェーズ1のみ:

ユーザーにより入力された資格証明の検証後。

このURLにリダイレクトしてOracle Adaptive Access Managerでステータスを更新し、適切なリスク・ルールを実行します。

login.do

フェーズ1のみ:

リクエスト受信時。

useridヘッダーを、ユーザーが入力したユーザーIDに設定します。

Login-Statusヘッダーを、success、wrong_password、invalid_user、user_disabled、system_errorのいずれかに設定します。

OAAM ServerPhaseヘッダーをoneに設定します。

?は、ターゲット・アクションで指定されたURLに受け入れられます。ターゲット・アクションのURLでは、?と、その後に任意のパラメータを入力できます。

Login-Statusの設定値:

- successに設定すると、OAAMでユーザーのセッション・ステータスがsuccessに更新されて、認証後ルールが実行されます。

- wrong_password、invalid_user、user_disabled、system_errorに設定すると、OAAMでのセッション・ステータスが、渡されたステータスに更新されて、適切なエラー・メッセージを示すログイン・ページが表示されます。

updateLoginStatus.do

フェーズ2のみ:

ユーザーにより入力された資格証明の検証後。

このURLにリダイレクトしてOracle Adaptive Access Managerでステータスを更新し、適切なリスク・ルールを実行します。

updateLoginStatus.do

フェーズ2のみ:

リクエスト受信時

Login-Statusヘッダーをsuccess、wrong_password、invalid_user、user_disabled、system_errorのいずれかに設定します。

Login-Statusの設定値:

- successに設定すると、Oracle Adaptive Access Managerでのユーザーのセッション・ステータスがsuccessに更新されて、認証後ルールが実行されます。

- wrong_password、invalid_user、user_disabled、system_errorに設定すると、Oracle Adaptive Access Managerでのセッション・ステータスが、渡されたステータスに更新されて、適切なエラー・メッセージを示すログイン・ページが表示されます。

updateLoginStatus.do

challengeUser.do

registerQuestions.do

userPreferencesDone.do

レスポンス・ヘッダー

Rules-Resultには値allowが設定されています。

Oracle Adaptive Access Managerのルールは、ログインを許可するように評価しました。この時点以降、プロキシで、保護されたアプリケーションURLへのアクセスを許可できます。

registerQuestions.do

レスポンス・ヘッダー

Rules-Resultには値blockが設定されています。

アプリケーションがログイン資格証明を受け入れなかったか、Oracle Adaptive Access Managerのルールでログインをブロックするように評価されました。ログインが成功した場合、プロキシでアプリケーションのセッションをログオフする必要があります。それによって、Login Blockedメッセージがブラウザに送信されます。

changePassword.do

レスポンスにはpassword、newpasswordおよびconfirmpasswordというヘッダーが含まれています。

レスポンス・ヘッダーからのパスワードを保存して、アプリケーションにポストします。

loginFail.do

Login Blockedメッセージなどのエラー・メッセージをOAAMサーバー・ページに表示します。

適切なaction問合せパラメータを使用して、このURLにリダイレクトします(例: loginFail.do?action=block)。

通常、ブロック状況下では、レスポンス・ヘッダーを通してプロキシに制御が渡ることはありません。かわりに、問合せパラメータactionがエラー・コードblockに設定されたURLが表示されます。これにより、このページが表示された理由を伝えるOAAMサーバー・ログイン・ページが表示されます。

/error.do?action=block

または、次のURLを使用して同じ結果を得ることもできます。

/loginFail.do?action=block

/loginPage.jsp?action=block

logout.do

アプリケーション・セッションのログアウト完了時

このURLにリダイレクトして、OAAMサーバー・セッションをログアウトします。

logout.do

レスポンス受信時

アプリケーション・ログアウトURLにリダイレクトして、アプリケーション・セッションがまだオフになっていない場合にそれをログオフします。

resetPassword.do

レスポンスには、ヘッダーnewpasswordおよびconfirmpasswordが含まれています。

レスポンス・ヘッダーからのパスワードを保存して、アプリケーションにポストします。

getUserInput.do

レスポンスには、ヘッダーBH_UserInputが含まれています。

ユーザー入力を保存して、適切なアクションを実行します(アプリケーションへのポストなど)。

changeUserId.do

リクエスト受信時

newUserIdヘッダーを追加します。

changeUserId.do

レスポンス受信時

適切なアプリケーション・ページにリダイレクトするか、保存されたアプリケーション・レスポンスを返送します。

updateForgotPasswordStatus.do

フェーズ2のみ:

ユーザーにより入力されたforgot- password-credentialsの検証後。

このURLにリダイレクトしてOracle Adaptive Access Managerでステータスを更新し、適切なリスク・ルールを実行します。

updateForgotPasswordStatus.do

フェーズ2のみ:

リクエスト受信時

BH_FP-Statusヘッダーをsuccess、wrong_password、invalid_user、user_disabled、system_errorのいずれかに設定します。

updateForgotPasswordStatus.do

challengeForgotPasswordUser.do

レスポンス・ヘッダー

BH_FP-Rules-Resultには値allowが設定されています。

Oracle Adaptive Access Managerルールは、forgot-passwordフローを許可するように評価しました。プロキシでは、アプリケーションに応じてパスワードをリセットするか、ユーザー・ログインを許可するために、forgot-passwordフローの続行を許可できます。

updateForgotPasswordStatus.do

challengeForgotPasswordUser.do

レスポンス・ヘッダー

BH_FP-Rules-Resultには値blockが設定されています。

アプリケーションがforgot-password資格証明を受け入れなかったか、Oracle Adaptive Access Managerルールがforgot-passwordフローをブロックするように評価しました。Login Blockedメッセージがブラウザに送信されます。

OAAMサーバー・ページへのリクエスト

プロキシがプロパティ値をOAAMサーバーから取得する必要がある場合。

リクエスト受信時

BH_PropKeysリクエスト・ヘッダーをプロパティ名の(カンマ区切り)リストに設定する必要があります。

OAAMサーバーは、複数のレスポンス・ヘッダーの値をプロパティごとに1つずつ返します。返されるレスポンス・ヘッダー名のフォーマットはBH_Property-<name>となります。

6.6 アプリケーション検出

アプリケーション検出では、設定の中から2つのフラグが使用されます。1つのフラグは、構成XMLを無視してリバース・プロキシ専用として動作するようプロキシに指示します。もう1つのフラグは、すべてのHTTPトラフィックを取得してそれをログに出力するようプロキシに指示します。最初のフラグは、HTTPトラフィックの取得とその分析のためにアプリケーション検出で使用します。2番目のフラグは、構成XML自体のデバッグに対応するために構成XMLのデプロイメント・フェーズ期間中ずっと維持されます。

アプリケーション検出とは、プロキシ構成を作成し、UIOプロキシを使用してマルチファクタ認証を追加するために既存のWebアプリケーションを調査するプロセスのことです。プロキシを使用してアプリケーションへのログインが何回か試みられ、ログインを試みるたびにHTTPトラフィックが取得されます。その後、取得したHTTPトラフィックを分析してプロキシ構成を作成します。UIOプロキシは、すべてのHTTPトラフィックをファイルにダンプするように設定する必要があります。さらに、アプリケーションへのログインをプロキシを通して何回か試みる必要があります。その後、取得したHTTPトラフィックを分析してプロキシ構成を作成します。

6.6.1 アプリケーション情報

アプリケーション検出プロセスでは、ユーザーが使用している本番アプリケーションではなく、カスタマのテスト環境のWebアプリケーションを使用することをお薦めします。テスト環境が使用できない場合は、ライブ・アプリケーションを使用できます。

アプリケーション検出プロセスでは、次の情報をクライアントから取得する必要があります。

1. アプリケーションにログインするためのURL。

2. テスト・ユーザー・アカウントの資格証明(forgot passwordシナリオに必要なデータも含む)。検出とテストが中断されないために、できるだけ多くのテスト・アカウント(少なくとも5つのアカウント)を取得してください。検出プロセス中にアカウントが無効になる場合がありますが、これは無効なログインの試みが複数回行われたためです。

3. テスト・アカウントを有効化/テストするための連絡先(電話、電子メール)。

6.6.2 UIO Apacheプロキシの設定

アプリケーション検出では、プロキシを使用してHTTPトラフィックを取得する必要があります。

表6-17に、この操作モードを有効化する設定(UIO_Settings.xml内にあります)を示します。

表6-17 HTTP取得の設定

設定

値

IgnoreUrlMappings

1

CaptureTraffic

1

IgnoreUrlMappingsの設定は、プロキシを介したHTTPトラフィックのURLインターセプションを無効にするために使用します。

CaptureTrafficの設定では、情報のログ・レベルに設定されているロガー名HTTPを使用してHTTPトラフィックが取得されます。

HTTPトラフィックの取得は、シナリオごとに(ログイン試行の成功、不正パスワード、不正ユーザー名、無効になったユーザーなど)ファイル別にしておくと便利です。ログ・ファイル名の設定は、シナリオを開始する前に適切なファイル名に更新してください。

アプリケーション検出の実行後に、表6-18に示すようにプロキシ設定を行って、デフォルトのUIO Apacheプロキシの動作をリストアする必要があります。

表6-18 デフォルトのプロキシ動作をリストアする設定

設定

値

IgnoreUrlMappings

0

CaptureTraffic

0

6.6.3 シナリオ

検出プロセスで、次のシナリオに関する情報を収集します。

HTTPトラフィックで特定のURLと条件を検索するインターセプタを、TestConfig.xmlファイルに作成する必要があります。プロキシはHTTPトラフィックをリスニングして、TestConfig.xmlファイルのURLと一致するURLを確認したときに、URL一致のあるインターセプタを評価し、そのインターセプタの条件ブロックを評価します。一致した場合、UIOプロキシはフィルタ・ブロックと条件ブロックを実行します。

ログイン

1. ログイン・プロセスを開始するURL。

2. ログイン・フォームを含むURL。

3. 資格証明の送信に使用する入力フィールドの名前(ユーザー名、パスワードなど)。

4. ログイン・フォームの資格証明の送信先のURL。

5. ログイン成功の識別。この情報を得るには、HTTPトラフィック・ダンプを精査する必要があります。ログイン成功に対するアプリケーションの応答として、次のいくつかの方法があります。

1. 資格証明送信レスポンスに特定のCookieを設定する。

2. 特定のURL(アカウント・サマリー、ようこそページなど)にリダイレクトする。

3. 特定のテキストで応答する。

6. 失敗の場合に、理由を添えて失敗ログインを識別する。これは、資格証明送信リクエストに対するレスポンスで特定のテキストを検索することによって得られることがよくあります。

ログアウト

1. ログアウト・プロセスを開始するURL。

2. ログアウト・プロセスを終了するURL。通常、ログアウトは、ログアウト開始URLに対するレスポンスを受信したときに終了します。

パスワード変更

1. パスワード変更プロセスを開始するURL。

2. パスワード変更フォームが含まれているURL。

3. パスワード変更リクエストの送信に使用する入力フィールドの名前(パスワード、新規パスワード、パスワードの確認など)。

4. パスワード変更フォームのパスワード送信先のURL。

5. パスワード変更リクエストのステータス(成否)を識別します。これは、レスポンスで特定のテキストを検索することによって得られることがよくあります。

パスワードのリセット

パスワード変更と同じプロセスです。

ログインIDの変更

1. login-id変更がアプリケーションにポストされる際のURL。

2. パスワード変更リクエストの送信に使用する入力フィールドの名前(new-loginなど)。

3. login-id変更リクエストのステータス(success/failure)を識別します。login-id変更リクエストが成功したときに、OAAMサーバーでchangeUserId.doページを呼び出して、Oracle Adaptive Access Managerデータベースでlogin-idを更新する必要があります。

パスワード忘れ

アプリケーションが提供するForgot-passwordオプションを確認して、理解を深める必要があります。多くのアプリケーションではユーザー識別の代替方法(アカウント番号/PIN、SSN/PIN、質問/回答など)が求められます。アプリケーションの中には、複数のオプションを提供するものもあります。アプリケーションの中には、代替の資格証明を正しく入力した後でパスワードをリセットできるものや、メール/電子メールによって新規パスワードをユーザーに送信するもの、カスタマ・ケアを呼び出す必要のあるものがあります。サポートされるシナリオごとに、次のデータを取得する必要があります。

1. forgot-passwordプロセスを開始するURL。

2. forgot-passwordフォームが含まれているURL。

3. forgot-passwordリクエストを送信するための入力フィールド名とURL。

4. forgot-passwordリクエストのステータス(成否)を識別します。

6.7 OAAMサンプル・アプリケーション

この項では、マルチファクタ認証をBigBank Webアプリケーションに追加するプロキシ構成を示しています。BigBank Webアプリケーションは、ログイン・フローを示しているOAAMサンプル・アプリケーションです。この例では、UIOプロキシとアプリケーションのログイン・フローとの統合を示します。

Apacheプロキシで使用する場合

<?xml version="1.0" encoding="utf-8"?>
<BharosaProxyConfig xmlns="http://example.com/">

<RequestInterceptor id="AddAppIdToOAAMServerRequests-BigBank"
desc="Add BharosaAppId header to each request to
oaam_server"
post-exec-action="continue">
<Conditions>
<VariableValue name="%URL"
value="/oaam_server/"
mode="begins-with"
ignore-case="true"/>
</Conditions>

<Filters>
<AddHeader name="BharosaAppId:" value="BigBank"/>
</Filters>
</RequestInterceptor>

<SetGlobal name="@Phase1Enabled" value="false"/>
<SetGlobal name="@Phase2Only"    value="true"/>

<Application id="BigBank">

<!-- In phase one, you use BigBank's login form to collect username and
password -->
<!-- In phase two, you use oaam_server login forms to collect username and
password -->

<!-- Disable this interceptor after phase one is retired -->
<RequestInterceptor id="Phase1BigBankLoginPostRequest"
desc="get the loginid from the post parameters"
post-exec-action="continue" enabled="@Phase1Enabled">
<RequestUrl url="/bigbank/login.do"/>

<Conditions>
<VariableValue name="%REQUEST_METHOD" value="POST"/>
</Conditions>

<Filters>
<ClearSession/>
<SetVariable name="$WebUIOPhase" value="one"/>
<SaveParam   name="userid"       variable="$userid"/>
</Filters>
</RequestInterceptor>

<!-- Enable this interceptor after phase one is retired -->
<RequestInterceptor id="Phase2RedirectBigBankLoginPageRequest"
desc="Redirect BigBank login page requests to login page"
enabled="@Phase2Only">
<RequestUrl url="/bigbank"/>
<RequestUrl url="/bigbank/"/>
<RequestUrl url="/bigbank/loginPage.jsp"/>

<Target action="redirect-client" url="/oaam_server/login.do"/>
</RequestInterceptor>

<RequestInterceptor id="Phase2BharosaLoginPageRequest"
desc="Phase-2 loginid post request"
post-exec-action="continue">
<RequestUrl url="/oaam_server/login.do"/>

<Conditions>
<VariableValue name="%REQUEST_METHOD" value="POST"/>
<ParamPresent  name="userid"/>
<Not>
<ParamPresent name="password"/>
</Not>
</Conditions>

<Filters>
<ClearSession/>
<SetVariable name="$WebUIOPhase" value="two"/>
</Filters>
</RequestInterceptor>

<ResponseInterceptor id="Phase2PasswordPageResponse"
desc="Save the userid, decoded password from
Password Page response">
<ResponseUrl url="/oaam_server/password.do"/>

<Conditions>
<HeaderPresent name="userid:"/>
<HeaderPresent name="password:"/>
</Conditions>

<Filters>
<SaveHeader name="userid:"   variable="$userid"/>
<SaveHeader name="password:" variable="$password"/>
</Filters>

<Target action="redirect-client"
url="/bigbank/loginPage.jsp"
display-url="/bigbank/GetLoginPage"/>
</ResponseInterceptor>

<ResponseInterceptor id="GetBigBankLoginPageResponse"
desc="Save values of all hidden fields;
then post login crdentials">
<ResponseUrl url="/bigbank/GetLoginPage"/>

<Filters>
<SaveHiddenFields variable="%LoginPageHiddenParams"/>

<AddHiddenFieldsParams variable="%LoginPageHiddenParams"/>
<AddParam              name="userid"   value="$userid"/>
<AddParam              name="password" value="$password"/>
</Filters>

<Target action="post-server" url="/bigbank/login.do"/>
</ResponseInterceptor>

<ResponseInterceptor id="InvalidLoginResponse"
desc="Invalid login response from BigBank">
<ResponseUrl url="/bigbank/login.do"/>

<Conditions>
<PageContainsText text="You have entered an invalid Login Id"/>
</Conditions>

<Filters>
<SetVariable  name="$Login-Credentials-Status" value="invalid_user"/>
<SetVariable  name="$Login-Continue-Url"       value="%URL"/>
<SaveResponse variable="$Submit-Credentials-Response"/>
</Filters>

<Target action="redirect-client" url="/oaam_server/UpdateLoginStatusPage"/>
</ResponseInterceptor>

<ResponseInterceptor id="WrongPasswordResponse"
desc="Invalid login response from BigBank">
<ResponseUrl url="/bigbank/login.do"/>

<Conditions>
<PageContainsText text="We do not recognize your password"/>
</Conditions>

<Filters>
<SetVariable name="$Login-Credentials-Status" value="wrong_password"/>
<SetVariable name="$Login-Continue-Url"       value="%URL"/>
<SaveResponse variable="$Submit-Credentials-Response"/>
</Filters>

<Target action="redirect-client" url="/oaam_server/UpdateLoginStatusPage"/>
</ResponseInterceptor>

<ResponseInterceptor id="LoginSuccessResponse"
desc="Login success response from BigBank">
<ResponseUrl url="/bigbank/activity.do"/>
<!-- ResponseUrl url="/bigbank/login.do"/ -->

<Conditions>
<NotVariableValue name="$Login-Status" value="In-Session"/>
<PageContainsText text="/bigbank/images/success.gif"/>
</Conditions>

<Filters>
<SetVariable name="$Login-Credentials-Status" value="success"/>
<SetVariable name="$Login-Continue-Url"       value="%URL"/>
<SaveResponse variable="$Submit-Credentials-Response"/>
<AddHeader name="Login-Status:" value="$Login-Credentials-Status"/>
</Filters>

<!-- Target action="redirect-client" url=
"/oaam_server/UpdateLoginStatusPage"/ -->
<Target action="get-server" url="/oaam_server/updateLoginStatus.do"/>
</ResponseInterceptor>

<RequestInterceptor id="Phase1UpdateLoginStatusPageRequest"
desc="Update OAAM Server with the login status">
<RequestUrl url="/oaam_server/UpdateLoginStatusPage"/>

<Conditions>
<VariableValue name="$WebUIOPhase" value="one"/>
</Conditions>

<Filters>
<AddHeader name="WebUIOPhase:"  value="$WebUIOPhase"/>
<AddHeader name="userid:"       value="$userid"/>
<AddHeader name="Login-Status:" value="$Login-Credentials-Status"/>
</Filters>

<!-- Any interceptors for /bigbank/login.do
will not run because we are doing get-server. -->
<Target action="get-server" url="/oaam_server/login.do"/>
</RequestInterceptor>

<RequestInterceptor id="Phase2UpdateLoginStatusPageRequest"
desc="Update OAAM Server with the login status">
<!--post-exec-action="continue" -->
<RequestUrl url="/oaam_server/UpdateLoginStatusPage"/>

<Filters>
<AddHeader name="Login-Status:" value="$Login-Credentials-Status"/>
</Filters>

<Target action="get-server" url="/oaam_server/updateLoginStatus.do"/>
</RequestInterceptor>

<ResponseInterceptor id="AllowLoginResponse"
desc="Tracker returned 'allow' - continue with login">
<ResponseUrl url="/oaam_server/UpdateLoginStatusPage"/>
<ResponseUrl url="/oaam_server/updateLoginStatus.do"/>
<ResponseUrl url="/oaam_server/challengeUser.do"/>
<ResponseUrl url="/oaam_server/registerQuestions.do"/>
<ResponseUrl url="/oaam_server/userPreferencesDone.do"/>

<Conditions>
<HeaderValue name="Rules-Result:" value="allow"/>
</Conditions>

<Filters>
<SetVariable name="$Login-Status" value="In-Session"/>
</Filters>

<Target action="send-to-client" html="$Submit-Credentials-Response"
display-url="$Login-Continue-Url"/>
</ResponseInterceptor>

<ResponseInterceptor id="Phase1FailLoginResponse" desc=
"BigBank failed the login">
<ResponseUrl url="/oaam_server/UpdateLoginStatusPage"/>
<ResponseUrl url="/oaam_server/updateLoginStatus.do"/>
<ResponseUrl url="/oaam_server/challengeUser.do"/>
<ResponseUrl url="/oaam_server/registerQuestions.do"/>
<ResponseUrl url="/oaam_server/userPreferencesDone.do"/>

<Conditions>
<VariableValue    name="$WebUIOPhase"              value="one"/>
<NotVariableValue name="$Login-Credentials-Status" value="success"/>
<HeaderValue      name="Rules-Result:"             value="block"/>
</Conditions>

<Filters>
<UnsetVariable name="$Login-Status"/>
</Filters>

<Target action="send-to-client" html="$Submit-Credentials-Response"
display-url="$Login-Continue-Url"/>
</ResponseInterceptor>

<ResponseInterceptor id="FailLoginResponse" desc="BigBank failed the login">
<ResponseUrl url="/oaam_server/UpdateLoginStatusPage"/>
<ResponseUrl url="/oaam_server/updateLoginStatus.do"/>
<ResponseUrl url="/oaam_server/challengeUser.do"/>
<ResponseUrl url="/oaam_server/registerQuestions.do"/>
<ResponseUrl url="/oaam_server/userPreferencesDone.do"/>

<Conditions>
<HeaderValue      name="Rules-Result:"             value="block"/>
<NotVariableValue name="$Login-Credentials-Status" value="success"/>
</Conditions>

<Filters>
<UnsetVariable name="$Login-Status"/>
</Filters>

<Target action="redirect-client" url=
"/oaam_server/loginPage.jsp?action=invalid_user"/>
</ResponseInterceptor>

<ResponseInterceptor id="BlockLoginResponse"
desc="BigBank passed login but tracker returned 'block' -
fail the login">
<ResponseUrl url="/oaam_server/UpdateLoginStatusPage"/>
<ResponseUrl url="/oaam_server/updateLoginStatus.do"/>
<ResponseUrl url="/oaam_server/challengeUser.do"/>
<ResponseUrl url="/oaam_server/registerQuestions.do"/>
<ResponseUrl url="/oaam_server/userPreferencesDone.do"/>

<Conditions>
<HeaderValue name="Rules-Result:" value="block"/>
</Conditions>

<Filters>
<UnsetVariable name="$Login-Status"/>
</Filters>

<!-- /bigbank/LoginBlockedPage is not a real page. The request will be
intercepted and redirected. -->
<Target action="redirect-client" url="/bigbank/LoginBlockedPage"/>
</ResponseInterceptor>

<RequestInterceptor id="LoginBlockedPageRequest"
desc="logoff the session in BigBank">
<RequestUrl url="/bigbank/LoginBlockedPage"/>

<Target action="get-server" url="/bigbank/logout.do"/>
</RequestInterceptor>

<ResponseInterceptor id="Phase1LoginBlockedPageResponse"
desc="BigBank approved login; but OAAM blocked the login"

post-exec-action="stop-intercept">
<ResponseUrl url="/bigbank/LoginBlockedPage"/>

<Conditions>
<VariableValue name="$WebUIOPhase" value="one"/>
</Conditions>

<Filters>
<ClearSession/>
</Filters>

<Target action="redirect-client" url=
"/oaam_server/loginFail.do?action=block"/>
</ResponseInterceptor>

<ResponseInterceptor id="Phase2LoginBlockedPageResponse"
desc="BigBank approved the login;
but OAAM blocked the login">
<ResponseUrl url="/bigbank/LoginBlockedPage"/>

<Filters>
<ClearSession/>
</Filters>

<Target action="redirect-client" url=
"/oaam_server/loginPage.jsp?action=block"/>
</ResponseInterceptor>

<ResponseInterceptor id="LogoutPageResponse"
desc="OAAM logout selected;
logoff the session in BigBank">
<ResponseUrl url="/oaam_server/logout.do"/>

<Target action="redirect-client" url="/bigbank/logout.do"/>
</ResponseInterceptor>

<ResponseInterceptor id="Phase1LogoffPageResponse"
desc="Logoff - clear OAAM proxy session"
post-exec-action="stop-intercept">
<ResponseUrl url="/bigbank/logout.do"/>

<Conditions>
<VariableValue name="$WebUIOPhase" value="one"/>
</Conditions>

<Filters>
<ClearSession/>
</Filters>
</ResponseInterceptor>

<ResponseInterceptor id="Phase2LogoffPageResponse"
desc="Logoff - clear OAAM proxy session">
<ResponseUrl url="/bigbank/logout.do"/>

<Filters>
<ClearSession/>
</Filters>

<!-- Target action="redirect-client" url="/oaam_server/loginPage.jsp"/ -->
</ResponseInterceptor>

</Application>
</BharosaProxyConfig>

6.7.1 インターセプタの説明

表6-19では、サンプル構成で定義されている各種インターセプタを説明しています。

表6-19 サンプル構成のインターセプタ

インターセプタID

タイプ

説明

AddAppIdTobharosauioRequests-BigBank

リクエスト

OAAMサーバーのすべてのリクエストのヘッダーを設定します。OAAMサーバーへのリクエストにより起動します。

Phase1BigBankLoginPostRequest

リクエスト

ポスト・パラメータのログインIDを取得し、フェーズ1を設定しユーザーIDを保存します。Phase oneが有効なときに、/bigbank/login.doのリクエストにより起動します。

Phase2RedirectBigBankLoginPageRequest

リクエスト

アプリケーションからのログイン・ページをOAAMサーバーにリダイレクトします。フェーズ2が有効になり、アプリケーション・ログイン・ページがリクエストされたときに起動します。

Phase2BharosaLoginPageRequest

リクエスト

フェーズ2を設定し、変数を保存します。OAAMサーバーのlogin.doへのリクエストにより起動します。

Phase2PasswordPageResponse

レスポンス

ヘッダーにID/パスワードを保存し、クライアントをBigBankログイン・ページにリダイレクトします。OAAMサーバーのpassword.doからのレスポンスにより起動します。

GetBigBankLoginPageResponse

レスポンス

非表示フィールドの値をすべて保存し、ログイン資格証明をBigBankにポストします。/bigbank/GetLoginPageからのレスポンスにより起動します。

InvalidLoginResponse

レスポンス

BigBankから無効なログイン・レスポンスを取得したときに実行するアクション。

WrongPasswordResponse

レスポンス

BigBankから不正パスワード・レスポンスを取得したときに実行するアクション。

LoginSuccessResponse

レスポンス

BigBankからログイン成功レスポンスを取得したときに実行するアクション。

Phase1UpdateLoginStatusPageRequest

リクエスト

フェーズ1を設定し、ヘッダーを追加します。BigBankからのログイン・レスポンス取得後にステータスを更新するという、OAAMサーバーへのリクエストにより起動します。

Phase2UpdateLoginStatusPageRequest

リクエスト

ヘッダーを追加し、OAAMサーバーをログイン・ステータスで更新します。oaam_server/updateLoginStatusPageのリクエストにより起動します。

AllowLoginResponse

レスポンス

変数を設定し、クライアントを次のページに送ってログインを続行します。OAAMサーバーからログイン成功レスポンスを受信したときに起動します。

Phase1FailLoginResponse

レスポンス

ログイン・ステータスを設定し、クライアントを次のページに送ります。BigBankがログインに失敗し、レスポンスがOAAMサーバーから返送されたときにフェーズ1で起動します。

FailLoginResponse

レスポンス

ログイン・ステータスを設定し、クライアントをOAAMログイン・ブロック・ページにリダイレクトします。BigBankがログインに失敗し、フェーズ1が有効になっていないときに起動します。

BlockLoginResponse

レスポンス

Blockステータスを設定し、クライアントをBigBankログイン・ブロック済ページにリダイレクトします。BigBankがログインに成功してもOAAMサーバーがblockを決定したときに起動します。

LoginBlockedPageRequest

リクエスト

クライアントをBigBankログアウト・ページにリダイレクトします。BigBankログイン・ブロック済ページへのリクエストにより起動します。

Phase1LoginBlockedPageResponse

レスポンス

セッションをクリアし、クライアントをOAAMログイン・ブロック済ページにリダイレクトした後でインターセプトを停止します。フェーズ1で使用され、BigBankログイン・ブロック済ページからのレスポンスにより起動します。

Phase2LoginBlockedPageResponse

レスポンス

セッションをクリアし、クライアントをOAAMログイン・ブロック済ページにリダイレクトします。フェーズ1が有効でないときに使用され、BigBankログイン・ブロック済ページからのレスポンスにより起動します。

LogoutPageResponse

レスポンス

クライアントをBigBankログアウト・ページにリダイレクトします。OAAMログアウト・ページからのレスポンスにより起動します。

Phase1LogoffPageResponse

レスポンス

BigBankログアウト・ページからレスポンスを取得したときにセッションをクリアします。フェーズ1が有効なときに使用します。

Phase2LogoffPageResponse

レスポンス

BigBankログアウト・ページからレスポンスを取得したときにセッションをクリアします。フェーズ2が有効なときに使用します。

6.7.2 UIOプロキシを使用しないBigBankのフロー

次に、ログインおよびログアウトにUIOプロキシを使用しない場合のBigBankアプリケーションのフローを示します。

6.7.2.1 ログイン

図6-3に、UIOプロキシを使用しないログインのフローを示します。

図6-3 UIOプロキシを使用しないログイン・フロー

6.7.2.2 ログアウト

図6-4に、UIOプロキシを使用しないログアウトのフローを示します。

図6-4 UIOプロキシを使用しないログアウト

6.7.3 UIOプロキシを使用してBigBankへのログインおよびログアウトを初めて行うユーザーのフロー

この項では、UIOプロキシを使用してBigBankアプリケーションに初めてログインするユーザーのフローを説明します。ログイン・フェーズ、登録フェーズ/登録スキップ・フェーズ、ログアウト・フェーズおよび逸脱フロー(ログインのブロック)を含む通常のフローについて説明しています。構成XMLで定義され、フローの各手順で使用されるインターセプタを示します。

注意: プロキシについては、インターセプタがリクエスト/レスポンスに一致する場合のメッセージのみが表示されます。クライアントとOracle Adaptive Access Manager/アプリケーションとの間でプロキシによって受け渡される通常のメッセージは、シナリオを単純化するために省略しています。

通常のフローは、ログイン、登録、登録スキップおよびログアウトという4つのフェーズで構成されます。

図6-5に、ログイン取得ページ(ログイン・フェーズ)のフローを示します。

図6-5 ログイン取得ページのフロー

1. クライアントは、アプリケーションのログイン・ページ(http://proxyhost:port/bigbank)をリクエストします。

2. プロキシはそのリクエストをインターセプトして、ヘッダーを設定します。次に、プロキシはクライアントをoaam_server/login.doにリダイレクトします。
リクエストは、AddAppIdTobharosauioRequests-BigBankおよびPhase2RedirectBigBankLoginPageRequestという2つのインターセプタによってインターセプトされます。

注意: AddAppIdTobharosauioRequests-BigBankは、HTTPヘッダーおよび変数を設定します。これによりOAAMサーバーに対するリクエストがすべてインターセプトされ、プロキシでは、このインターセプタの後に一致するものがないかどうかを確認するために、他のインターセプタの実行が試行されます。

Phase2RedirectBigBankLoginPageRequestは、クライアントをBigBankログイン・ページからoaam_server/login.doにリダイレクトします。

3. クライアントは、OAAMサーバー(http://proxyhost:port/oaam_server/login.do)でlogin.doを取得するようリクエストします。

4. OAAMサーバーは、クライアント・デバイスのフィンガープリントを処理するために、ジャンプ・ページにリダイレクトします。

5. OAAMサーバーは、クライアント・ブラウザからフィンガープリントを取得します。

6. OAAMサーバーは、図6-6に示すように、ログイン・ページでフィンガープリントを取得した後に応答します。

図6-6 ログイン・ページによるフィンガープリント取得後のOAAMサーバーの応答

7. クライアントは、ユーザー名をOAAMサーバー(http://proxyhost:port/oaam_server/login.do)にポストします。
AddAppIdTobharosauioRequests-BigBankインターセプタ以外に、リクエストはPhase2BharosaLoginPageRequestインターセプタによってプロキシでインターセプトされます。プロキシはWebUIOPhaseを2に設定します。

8. OAAMサーバーが応答します。

9. OAAMサーバーはフィンガープリントを取得します。

10. OAAMサーバーは、パスワード収集ページでフィンガープリントを取得した後に応答します。パスワード収集ページには、図6-7に示すように厳密な認証デバイスがあります。

図6-7 フィンガープリントとパスワードの収集

11. クライアントは、パスワードをOAAMサーバー(http://proxyhost:port/oaam_server/password.do)に送信します。

12. OAAMサーバーが応答します。
レスポンスは、Phase2PasswordPageResponseによってインターセプトされます。プロキシは、OAAMサーバーによってこれまでに収集されたログインIDとパスワードが含まれているヘッダーを保存し、クライアントを/bigbank/GetLoginPageにリダイレクトします。

13. プロキシは、クライアントをGetLoginPageにリダイレクトします。

14. クライアントは、GetLoginPage (http://proxyhost:port/bigbank/GetLoginPage)に対するリクエストをBigBankに送信します。

15. BigBankはレスポンスを返送します。
レスポンスは、プロキシでGetBigBankLoginPageResponseによってインターセプトされます。プロキシはパラメータを保存し、/bigbank/login.doに対してPost-serverアクションを実行します。これは、BigBankアプリケーションの通常の認証フローです。

16. プロキシはインターセプタをキューに入れて、クライアントをbigbank/login.doにリダイレクトします。

17. クライアントはlogin.do (http://proxyhost:port/bigbank/login.do)をリクエストします。

18. リクエストは、プロキシによってインターセプトされます。プロキシはキューに入れられたインターセプタ(GetBigBankLoginPageResponse)を実行して、リクエスト・メソッドをGETからPOSTに変更します。

19. BigBankが応答して、クライアントをactivity.doにリダイレクトします。これは、BigBankアプリケーションの通常の認証フローです。

20. クライアントはactivity.do (http://proxyhost:port/bigbank/activity.do)をリクエストします。

21. BigBankはログイン成功レスポンスを送信します。
レスポンスは、プロキシでLoginSuccessResponseによってインターセプトされます。プロキシはログイン・ステータスをsuccessに設定し、/oaam_server/updateLoginStatus.doに対してget serverアクションを実行します。

22. プロキシは、クライアントをupdateLoginStatus.doにリダイレクトします。

23. クライアントは、ステータス更新のリクエストをOAAMサーバーに送信します。
http://proxyhost:port/oaam_server/updateLoginStatus.do

24. OAAMサーバーは認証後チェックを実行して、その結果を返します。
レスポンスは、プロキシでAllowLoginResponseによってインターセプトされます。

25. プロキシは、send-to-clientアクションを実行します。display-url変数が設定されて、レスポンス受信後にクライアントがこのURLをリクエストできるようにします。

26. クライアントは、ユーザーが登録ページ(http://proxyhost:port/oaam_server/registerQuestions.do)を初めて取得するためのリクエストをOAAMサーバーに送信します。

27. レスポンス・ページには、ユーザー向けにスキップおよび登録という2つのオプションが表示されます。
図6-8に、クライアントが登録を選択する登録フローを示します。

図6-8 OAAMサーバーでユーザーが初めて質問/回答を登録するフロー

28. クライアントは、登録を選択します(http://proxyhost:port/oaam_server/registerQuestions.doへのPost)。

29. OAAMサーバーは、その手順を示す応答を返します。

30. クライアントは、手順ページ(http://proxyhost:port/oaam_server/registerQuestions.do)で「続行」をクリックします。

31. OAAMサーバーは、質問ページによって応答します。

32. クライアントは質問/回答を選択し、それをOAAMサーバー(http://proxyhost:port/oaam_server/registerQuestions.do)に送信します。

33. OAAMサーバーは情報を更新して応答します。

34. プロキシは、次のページへのsend-to-clientを実行します。
レスポンスは、プロキシでAllowLoginResponseインターセプタによってインターセプトされます。プロキシは、認証が成功した後で次のページを指定して、sends to Clientアクションを実行します。クライアントは次の手順でアプリケーション・ページにリダイレクトされます。

35. クライアントは、プロキシを通して次のページをリクエストします(http://proxyhost:port/bigbank/activity.do)。

36. アプリケーション・ページ(activity.do)が、プロキシを通してクライアントに返送されます。ここでログイン・プロセスが終了します。
図6-9にログアウト・フェーズを示します。

図6-9 ユーザーがBigBankをログアウトするフロー

37. クライアントは、「ログアウト」をクリックします(http://proxyhost:port/bigbank/logout.do)。

38. アプリケーションはレスポンスを返送して、クライアントをbigbank/loginPage.jspにリダイレクトします。
レスポンスは、セッション変数を消去するPhase2LogoffPageResponseによってインターセプトされます。

39. クライアントは、BigBankログイン・ページ(http://proxyhost:port/bigbank/loginPage.jsp)をリクエストします。

40. プロキシはそのリクエストをインターセプトし、クライアントをOAAMサーバーにリダイレクトします。

41. クライアントは、OAAMサーバーに対してlogin.do (http://proxyhost:port/oaam_server/login.do)をリクエストします。

42. OAAMサーバーは、クライアント・デバイスのフィンガープリントを処理するために、ジャンプ・ページにリダイレクトします。

43. OAAMサーバーは、クライアント・ブラウザをフィンガープリント処理します。

44. OAAMサーバーは、フィンガープリント処理後にログイン・ページで応答します。
図6-10に登録スキップ・フェーズを示します。このフェーズで、クライアントは質問の登録をスキップすることを選択します。このフェーズは、通常のフローでログイン・フェーズの後に発生します。

図6-10 ユーザーがOAAMサーバーで登録スキップを選択した後のフロー

45. クライアントは、登録(http://proxyhost:port/oaam_server/registerQuestions.doへのポスト)のスキップを選択します。

46. OAAMサーバーが応答します。

47. プロキシはレスポンスをインターセプトして、クライアントをリダイレクトします。
レスポンスは、AllowLoginResponseによってインターセプトされます。プロキシは、send-to-clientを使用してクライアントの次の手順を指定します。

48. クライアントは、プロキシにより指定されたページ(http://proxyhost:port/bigbank/activity.do)をリクエストします。

49. BigBankアプリケーションはレスポンスを返送します。
図6-11に、「逸脱フロー: ログインのブロック」を示します。これは、認証後チェックの後でクライアントをブロックするようにOAAMサーバーが決定したときに発生します。このフローは、通常のフローのログイン・フェーズにおける、手順15から19にかわるものです。

図6-11 逸脱フロー: OAAMサーバーによりブロックされたユーザー

50. OAAMサーバーは、認証後チェックの後でユーザーをブロックするよう決定します。
レスポンスは、BlockLoginResponseインターセプタによってインターセプトされます。このインターセプタは、クライアントをアプリケーションのブロック・ページ(/bigbank/BlockLoginPage)にリダイレクトします。

51. プロキシは、クライアントをBigBankのloginBlockPageにリダイレクトします。

52. クライアントは、BigBankのBlockLoginPage (http://proxyhost:port/bigbank/loginPage.jsp?action=block)をリクエストします。

53. リクエストは、プロキシでLoginBlockedPageRequestによってインターセプトされます。プロキシは、ログアウト・ページ(/bigbank/logout.do)に対するget-serverアクションを受け入れます。このアクションにより、BigBankでのセッションが終了します。

54. アプリケーションが応答します。
レスポンスは、Phase2LoginBlockedPageResponseによってインターセプトされます。プロキシはセッションをクリアして、クライアントをOAAMログイン・ブロック・ページにリダイレクトします。

55. プロキシは、クライアントをOAAMログイン・ブロック・ページにリダイレクトします。

56. クライアントは、OAAMサーバーからブロック・ページ(http://proxyhost:port/oaam_server/loginPage.jsp?action=block)をリクエストします。

57. OAAMサーバーは、ブロック済ページで応答します。

6.8 UIO Apacheプロキシのアップグレード

Oracle Adaptive Access Managerパッチには、Microsoft WindowsおよびLinux (rhel4)向けにUIO Apacheプロキシの更新が含まれている場合があります。この章の手順に従って、mod_uio.soと関連する.dlls (MS Windowsの場合)、および.so (Linuxの場合)ライブラリをこのパッチ・リリースの一環としてリリースされたものと置換してください。

6.8.1 UIO Apacheプロキシ・パッチのインストール手順

パッチのインストールは、UIOプロキシ・パッケージのインストールと類似しています。パッチには、変更済ファイルのみが含まれます。パッチによってファイルの一部またはすべてが上書きされるため、既存のファイルをすべてバックアップすることをお薦めします。

パッチには変更済ファイルのみが含まれるため、パッチ内のファイルが使用できない場合は、その手順をスキップしてください。各手順は、パッチ・インストーラで手動で実行する必要があります。

MS WindowsおよびLinuxで、次の手順を実行します。

1. 更新中のApacheインスタンスを停止します。

注意:

Apache httpdバージョン2.2.8を、mod_sslとともに使用していることを確認してください。

2. 既存のファイル、binary、rngおよび.xmlをバックアップします。

3. oaam_uioディレクトリにあるpatch_oaam_win_apache_uio.zip (Windowsの場合)またはpatch_oaam_rhel4_apache_uio.zip (Linuxの場合)を解凍します。

4. パッチからバイナリ・ファイルをコピーします(Linuxでは、必要に応じてソフト・リンクを.soファイルに設定する必要もあります)。

5. パッチからUIO_Settings.rngファイルとUIO_Config.rngファイルをコピーします。

6. 既存のUIO_Settings.xmlファイルおよびUIO_log4j.xmlファイルをパッチに定義されているファイルと比較して、設定が正しいことを検証します。このパッチに関する項を参照して、設定が正しいことを確認します。これは、構成XMLファイルにも該当します。

7. Apacheを起動して、健全性テストを実行します。

- Windowsの場合、

- バイナリ・ファイル: mod_uio.so、log4cxx.dll、libxml2.dll、apr_memcache.dll (apr_memcache.dllは10.1.4.5.bp1で導入済)

- 構成ファイル: UIO_Settings.rng、UIO_Config.rng、UIO_Settings.xml、UIO_log4j.xmlおよびアプリケーション構成XMLファイル

- Linuxの場合、

- バイナリ・ファイル: mod_uio.so、liblog4cxx.so.0.10.0.0、libxml2.so.2.6.32、libapr_memcache.so.0.0.1

- バイナリ構成ファイル: UIO_Settings.rng、UIO_Config.rng、UIO_Settings.xml、UIO_log4j.xmlおよびアプリケーション構成XMLファイル

6.8.2 パッチの失敗

パッチをインストールする前にバックアップしておいたファイルをリストアします。

第III部

カスタマイズと拡張

第III部では、カスタマイズと拡張について説明します。

次の章で構成されています。

- 第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」

- 第8章「OAAM Webアプリケーション・ページのカスタマイズ」

- 第9章「ユーザー・フローとレイアウトのカスタマイズ」

- 第10章「ローカライゼーションのプロパティ構成」

- 第11章「カスタム・フィンガープリント処理の設定」

- 第12章「ネイティブ統合でのフラッシュ・フィンガープリント処理」

- 第13章「デバイス識別の拡張」

- 第14章「デバイス登録の有効化」

7 OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ

共有ライブラリは、複数のアプリケーションが使用できるプログラミングとデータの集合です。共有ライブラリによって、共通プログラミングとリソースを共有することでアプリケーションがメモリーを効率的に使用できるようになります。

この章では、OAAM拡張共有ライブラリを使用してOracle Adaptive Access Managerをカスタマイズする方法について説明します。この項の内容は、次のとおりです。

- 第7.1項「列挙の編集によるOAAMのカスタマイズまたは拡張」

- 第7.2項「OAAM拡張共有ライブラリの使用によるカスタマイズの追加」

7.1 列挙の編集によるOAAMのカスタマイズまたは拡張

Oracle Adaptive Access Managerのプロパティをオーバーライドしたり、OAAM列挙を拡張したりするには、これらのプロパティと列挙をoaam_custom.propertiesに追加します。後でそのファイルをoaam_extensions/WEB-INF/classes/bharosa_propertiesフォルダに保存します。

ユーザー定義列挙は、アイテムのリストを表すプロパティの集合です。リスト内の各要素には、複数の異なる属性が含まれている場合があります。ユーザー定義列挙の定義はキーワード.enumで終わるプロパティで始まり、ユーザー定義列挙の使用を記述する値が続きます。

各要素定義は、列挙と同じプロパティ名に要素名が追加されたもので始まり、IDである一意の整数の値が続きます。要素の属性も同じパターンに従い、要素のプロパティ名で始まり、その後に属性名がその属性の適切な値とともに示されます。

OAAMサーバー実装のログイン画面に表示される、列挙定義資格証明の例を次に示します。

bharosa.uio.default.credentials.enum = Enum for Login Credentials
bharosa.uio.default.credentials.enum.companyid=0
bharosa.uio.default.credentials.enum.companyid.name=CompanyID
bharosa.uio.default.credentials.enum.companyid.description=Company ID
bharosa.uio.default.credentials.enum.companyid.inputname=comapanyid
bharosa.uio.default.credentials.enum.companyid.maxlength=24
bharosa.uio.default.credentials.enum.companyid.order=0
bharosa.uio.default.credentials.enum.username=1
bharosa.uio.default.credentials.enum.username.name=Username
bharosa.uio.default.credentials.enum.username.description=Username
bharosa.uio.default.credentials.enum.username.inputname=userid
bharosa.uio.default.credentials.enum.username.maxlength=18
bharosa.uio.default.credentials.enum.username.order=1

7.2 OAAM 拡張共有ライブラリの使用によるカスタマイズの追加

Oracle Adaptive Access Managerをカスタマイズするには、カスタムJARファイルとJSPファイル、および他のファイルをOAAM拡張共有ライブラリに追加して、プロパティ・ファイルを編集します。

OAAM拡張共有ライブラリ、oracle.oaam.extensions.warは、IAM_Home/oaam/oaam_extensions/genericにあります。これは、OAAMサーバーとOAAM管理サーバーの両方にデプロイされます。デフォルトでは、oracle.oaam.extensions.warに、OAAM拡張共有ライブラリの定義を保存したMANIFEST.MFが含まれています。

この項では、カスタマイズをOracle Adaptive Access Managerに追加する手順について説明します。

7.2.1 前提条件

プロパティbharosa.uio.proxy.mode.flagが適切に設定されていることを確認します。

bharosa.uio.proxy.mode.flagプロパティのデフォルトはfalseです。UIOプロキシ・デプロイメントを使用している場合は、プロパティをtrueに設定する必要があります。マルチテナントのカスタム・ブランドをOAAMプロキシで構成するには、プロパティbharosa.uio.proxy.mode.flagをtrueに設定する必要があります。

カスタマイズを追加しており、TAPスキームを使用してOracle Access Management Access Manager 11gとの統合も構成する場合は、プロパティをfalseに設定する必要があります。プロパティをtrueに設定すると、OAAMとAccess ManagerのTAPを使用した統合に失敗し、次のメッセージが表示されます。

Sorry, the identification you entered was not recognized.

7.2.2 ステップ1 OAAM拡張共有ライブラリの抽出

OAAM拡張共有ライブラリを抽出するには、次の手順を実行します。

1. oaam_extensionsという作業フォルダを作成します。
このフォルダは、インストール・フォルダ以外であればどこにでも作成できます。

2. oracle.oaam.extensions.warファイルを作業フォルダ内に抽出します。
oaam_extensionsフォルダに、次のサブフォルダが表示されます。

- META-INF

- WEB-INF

- WEB-INF\lib

- WEB-INF\classes

7.2.3 ステップ2 MANIFEST.MFファイルの作成

META-INFフォルダにMANIFEST.MFというファイルを作成し、そのファイルに次の行が含まれていることを確認します。

Extension-Name: oracle.oaam.extensions
Implementation-Version:99.9.9.9.9
Specification-Version:99.9.9.9.9

仕様バージョンと実装バージョンは、現在のファイルにあるバージョン以上である必要があります。たとえば、ファイルの実装バージョンが11.1.1.3.0の場合は、99.9.9.9.9に変更できます。バージョンが増分されない場合は、エラーがスローされます。

7.2.4 ステップ3 カスタムJavaクラスのコンパイル

JARファイルをORACLE_IDM_HOME\oaam\cli\libフォルダからビルド・クラス・パスに追加して、Oracle Adaptive Access Managerのクラスを拡張または実装するカスタムJavaクラスをコンパイルします。

7.2.5 ステップ4 カスタムJARおよびファイルの追加

カスタムJARおよびファイルを説明に従って追加します。

1. カスタムJARファイルをIAM_Home\oaam\oaam_extensions\generic\WEB-INF\libフォルダに追加します。

2. oaam_custom.propertiesに変更を加えて、oaam_extensions\WEB-INF\classes\bharosa_propertiesフォルダに保存します。

3. カスタムJSPファイルをoaam_extensionsに直接追加します。

7.2.6 ステップ5 OAAM拡張共有ライブラリの再パッケージ化

次のコマンドを使用して、OAAM拡張共有ライブラリ、oracle.oaam.extensions.warをoaam_extensionsの親フォルダから再パッケージ化します。

jar -cvfm oracle.oaam.extensions.war oaam_extensions/META-INF/MANIFEST.MF -C  oaam_extensions/ .

7.2.7 ステップ6 再パッケージ化したWARファイルにカスタムJARファイルが含まれているかどうかの確認

再パッケージ化したWARファイルにカスタムJARファイルが含まれていることを確認します。次のコマンドを使用して、その内容を表示します。

jar tvf oracle.oaam.extensions.war

7.2.8 ステップ7 すべての管理対象サーバーの停止

管理対象サーバーが稼働している場合はすべて停止します。

MW_HOME/user_projects/domains/domain_name/bin/stopManagedWeblogic.sh
oaam_admin_server1
MW_HOME/user_projects/domains/domain_name/bin/stopManagedWeblogic.sh
oaam_server_server1

7.2.9 ステップ8 WebLogic管理サーバーの起動

WebLogic管理サーバーを起動します。

MW_HOME/user_projects/domains/domain_name/bin/startWeblogic.sh

7.2.10 ステップ9 WebLogic管理コンソールへのログイン

Oracle Adaptive Access ManagerがデプロイされているWebLogic Serverを起動し、WebLogic管理コンソールにログインします。

http://hostname:port/console

7.2.11 ステップ10 新しいOAAM拡張共有ライブラリのデプロイ

oaam_server_server1およびoaam_admin_server1をターゲット・アプリケーションとする、新しいoracle.oaam.extensions.warファイルを、共有ライブラリとしてデプロイします。

1. 「ドメイン環境」→「デプロイメント」に移動して、コンソールをロックします。

2. 「インストール」ボタンをクリックします。

3. oracle.oaam.extensions.warファイルの場所を参照し、WARファイルの横のオプションをクリックして選択します。その後、「次へ」をクリックします。

4. 「このデプロイメントをライブラリとしてインストールする」が選択されていることを確認し、「次へ」をクリックします。

5. デプロイメントのターゲット、oaam_admin_server1およびoaam_server_server1を選択します。

6. 「次へ」を再度クリックしてこの次のページでデフォルトを受け入れ、「終了」をクリックします。

7. 「保存」ボタンをクリックしてから、「変更のアクティブ化」をクリックします。

8. OAAM管理とOAAM管理対象サーバーを起動します。

MW_HOME/user_projects/domains/domain_name/bin/startManagedWeblogic.sh
oaam_admin_server1
MW_HOME/user_projects/domains/domain_name/bin/startManagedWeblogic.sh
oaam_server_server1

7.2.12 ステップ11 機能のテスト

カスタム機能をテストして、oracle.oaam.extensions.warに追加したファイルをOracle Adaptive Access Managerアプリケーションが使用していることを確認します。

8 OAAM Webアプリケーション・ページのカスタマイズ

OAAM Server Webアプリケーション提供のユーザー・インタフェースは、カスタマのアプリケーションのルック・アンド・フィールを実現するために容易にカスタマイズできます。この章は、OAAMサーバーをインストールおよび構成して、1つ以上のWebアプリケーションの認証フローおよびユーザー登録フローをサポートするインテグレータを対象としています。

この章は、次の項で構成されています。

- 第8.1項「OAAM Webアプリケーション・ページのカスタマイズのヒント」

- 第8.2項「OAAMプロパティ」

- 第8.3項「複数のアプリケーションを対象としたOAAMサーバーのカスタマイズ」

- 第8.4項「OAAMサーバー・ページの外観のカスタマイズ」

- 第8.5項「シングル・ログイン・ページの有効化」

- 第8.6項「ユーザー・インタフェースのカスタマイズに関する質問/回答」

8.1 OAAM Webアプリケーション・ページのカスタマイズのヒント

Webユーザー・インタフェースのカスタマイズを計画する際は、次の点に留意してください。

- カスタマイズする際には、OAAMと一緒にインストールされているファイルを所定のディレクトリにコピーし、そこでファイルを変更する場合がよくあります。このディレクトリでファイルを変更することにより、ソフトウェアのアップグレード時に変更内容が上書きされることを防げます。

- Webアプリケーションの構成時には、oaam_custom.propertiesを使用します。ファイルの内容は、次のとおりです。

- クライアント構成済プロパティ(特定のデプロイメント用にカスタマイズされたプロパティ)

- UIOプロキシのシステム/デバイス構成これらのプロパティは、アプリケーション全体の構造上の変更に対応します。ここには、ヘッダー、フッター、CSSプロパティが含まれています。

デプロイされたアプリケーションでは、oaam_custom.propertiesファイルはweb-inf/classesディレクトリにあります。

注意:

11.1.2では、oaam_custom.propertiesファイルが以前のバージョンのbharosa_server.propertiesファイルのかわりになります。

- OAAMデプロイメントを特定の言語に適合させる場合は、client_resource_locale.propertiesを使用します。この場合のlocaleは、カスタム値(en、esなど)を使用する場合のロケール文字列です。アプリケーションが多言語に翻訳される際、ページのテキストをカスタマイズするためにclient_resource_locale.propertiesファイルが使用されます。ファイルの内容は、次のとおりです。

- サポートされるロケール別に構成可能なクライアント構成済プロパティ。localeは、カスタム値(en、esなど)を使用する場合のロケール文字列です。

- UIOプロキシのメッセージングおよびページ・コンテンツ構成。たとえば、ページ・タイトル、ページ下部のリンク、ページ・メッセージ、エラー・メッセージ、確認メッセージなどです。

注意:

client_resource_locale.propertiesファイルは、ヘッダーおよびフッター・ファイルのカスタマイズに使用されません。

管理者は、client_resource_locale.propertiesを作成し、ロケール固有のプロパティを組み込むようにアプリケーションをカスタマイズします。

Oracle Adaptive Access Managerのプロパティのカスタマイズ、拡張またはオーバーライドの手順については、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。

8.2 OAAMプロパティ

ユーザー定義列挙を使用して、OAAMの外観と動作を管理できます。ユーザー定義列挙は、アイテムのリストを表すプロパティの集合です。リスト内の各要素には、複数の異なる属性が含まれている場合があります。ユーザー定義列挙の定義はキーワード.enumで終わるプロパティで始まり、ユーザー定義列挙の使用を記述する値が続きます。各要素定義は、列挙と同じプロパティ名に要素名が追加されたもので始まり、IDである一意の整数の値が続きます。要素の属性も同じパターンに従い、要素のプロパティ名で始まり、その後に属性名がその属性の適切な値とともに示されます。

8.2.1 列挙の例

OAAMサーバー実装のログイン画面に表示される、列挙定義資格証明の例を次に示します。

bharosa.uio.default.credentials.enum = Enum for Login Credentials
bharosa.uio.default.credentials.enum.companyid=0
bharosa.uio.default.credentials.enum.companyid.name=CompanyID
bharosa.uio.default.credentials.enum.companyid.description=Company ID
bharosa.uio.default.credentials.enum.companyid.inputname=comapanyid
bharosa.uio.default.credentials.enum.companyid.maxlength=24
bharosa.uio.default.credentials.enum.companyid.order=0
bharosa.uio.default.credentials.enum.username=1
bharosa.uio.default.credentials.enum.username.name=Username
bharosa.uio.default.credentials.enum.username.description=Username
bharosa.uio.default.credentials.enum.username.inputname=userid
bharosa.uio.default.credentials.enum.username.maxlength=18
bharosa.uio.default.credentials.enum.username.order=1

このプロパティ・セットによって1つのユーザー定義列挙が定義されます。このユーザー定義列挙には2つの要素があり、それぞれ5つの属性を持っています。nameおよびdescription属性は、すべてのユーザー定義列挙の定義に必要です。その他の属性は、ユーザー定義列挙の個々の使用に応じて定義され使用されます。

8.2.2 既存のユーザー定義列挙のオーバーライド

既存のユーザー定義列挙のオーバーライドには、特殊なケースがいくつかあります。デフォルト・アプリケーションIDの既存の列挙要素の属性値は、他のプロパティと同様にオーバーライドできますが、1つのアプリケーションでappIdを使用して要素の属性値を変更するには、そのアプリケーションの列挙全体も適切なappIdを使用して作成する必要があります。

たとえば、第8.2項「OAAMプロパティ」で定義したユーザー定義列挙を使用していて、1つのアプリケーション(appId1)のみでCompany IDをProfile IDに変更する必要が生じた場合、列挙を次のように変更する必要があります。

bharosa.uio.appId1.credentials.enum = Enum for Login Credentials
bharosa.uio.appId1.credentials.enum.profileid=0
bharosa.uio.appId1.credentials.enum.profileid.name=ProfileID
bharosa.uio.appId1.credentials.enum.profileid.description=Profile ID
bharosa.uio.appId1.credentials.enum.profileid.inputname=profileid
bharosa.uio.appId1.credentials.enum.profileid.maxlength=20
bharosa.uio.appId1.credentials.enum.profileid.order=0
bharosa.uio.appId1.credentials.enum.username=1
bharosa.uio.appId1.credentials.enum.username.name=Username
bharosa.uio.appId1.credentials.enum.username.description=Username
bharosa.uio.appId1.credentials.enum.username.inputname=userid
bharosa.uio.appId1.credentials.enum.username.maxlength=18
bharosa.uio.appId1.credentials.enum.username.order=1

Oracle Adaptive Access Managerのプロパティまたは列挙のカスタマイズ、拡張またはオーバーライドの手順については、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。

8.2.3 要素の無効化

ユーザー定義列挙で定義済の要素を無効にするには、値がfalseのenabled属性を追加します。第8.2.2項「既存のユーザー定義列挙のオーバーライド」のappId1資格証明列挙を使用している場合は、次の行を追加して、アプリケーションで使用される要素からProfile IDを削除します。

bharosa.uio.appId1.credentials.enum.profileid.enabled=false

8.3 複数のアプリケーションを対象としたOAAMサーバーのカスタマイズ

マルチテナントとは、サーバーで単一のソフトウェア・インスタンスを実行して複数のクライアント組織にサービスを提供するという、ソフトウェア・アーキテクチャの原則の1つです。マルチテナント・アーキテクチャにおいては、各クライアント組織はインスタンスに対して個別にカスタマイズしたアプリケーションを使用している感覚で操作できます。

1つ以上のWebアプリケーションの認証フローおよびユーザー登録フローをサポートするように、OAAMサーバーを構成できます。OAAMサーバーの構成は、UIOプロキシのデプロイメント別になります。OAAM UIOプロキシでは、アプリケーション・コードを変更しなくても、Webアプリケーションにマルチファクタ認証を提供できます。

OAAMサーバー・プロキシは、クライアント(ブラウザ)とサーバー(Webアプリケーション)間のHTTPトラフィックをインターセプトして、OAAMサーバーへのリダイレクトやマルチファクタ認証と権限の提供などの適切なアクションを実行します。次に、OAAMサーバーはOAAM管理と通信してリスクを決定し、ログイン許可、ユーザーへのチャレンジ、ユーザーのブロックなど、適切なアクションを実行します。

図8-1 Universal Installationのデプロイメント

UIOプロキシは複数のアプリケーションの前に配置し、各アプリケーションでの使用に応じてカスタマイズできます。

各カスタマのデータの一意性を確保するために、クライアント・アプリケーションのアプリケーションIDが組織IDにマップされます。組織IDは、ユーザーが利用するテナント・アプリケーションを識別します。

OAAMサーバーの構成およびカスタマイズの初期手順は、次のとおりです。

1. 保護されている各アプリケーションのアプリケーションIDを決定します。

2. 保護されているアプリケーション別にデフォルトのユーザー・グループを割り当てます。

8.3.1 アプリケーションIDの決定

構成するアプリケーション数を決定し、各アプリケーションにアプリケーションIDを割り当てます。このアプリケーションIDは、プロキシの構成に使用したものと同じです(第6章「Oracle Adaptive Access Managerプロキシ」を参照)。多くの場合、アプリケーションは内部で特定の名前や略語で参照されるため、OAAMサーバーを構成するインテグレータはこの名前を使用する場合があります。たとえば、クライアントが卸売銀行業務アプリケーションと小売銀行業務アプリケーションという2つのアプリケーションを使用している場合、インテグレータはこの2つのアプリケーションに対してwholesaleおよびretailというアプリケーションIDの使用を選択することがあります。

このアプリケーションIDは、プロキシの構成に使用したものと同じです(第6章「Oracle Adaptive Access Managerプロキシ」を参照)。

プロキシは必要に応じてAppIdを、HTTPヘッダーを介してOAAMサーバーに送信します。このAppIdは、クライアントにページを表示する際に、使用された構成の判別に使用されます。OAAMサーバーは一連のプロパティによって構成されますが、これらのプロパティについては後述します。

プロパティにAppIdを含めると、マルチテナント・シナリオに対応する複数の構成が可能です。

次の例は、OAAMサーバーのプロパティを定義するためのAppIdの使用例です。

bharosa.uio.appId1.default.user.group=app1Group

太字のappId1は、アプリケーション固有の値を構成するためにAppIdをプロパティの中で使用する場所を示します。

8.3.2 デフォルト・ユーザー・グループの決定

各アプリケーションを構成して、一意のデフォルト・ユーザー・グループを含むようにできます。これは、各アプリケーションのユーザーがOracle Adaptive Access Managerデータベースで最初に作成されるときに、組織IDとしてユーザーに割り当てられるグループです。組織IDは、ユーザーがアプリケーションへのログインを試みるとき、およびユーザー・データがデータベースからロードされるときに使用されます。

プロパティ定義での組織IDの使用方法の例を次に示します。

bharosa.uio.appId1.default.user.group=app1Group
bharosa.uio.appId2.default.user.group=app2Group

この例では、2つの異なるアプリケーションに対して2つの組織IDが定義されます。AppIdがappId1であるアプリケーションに組織IDapp1Groupが、AppIdがappId2であるアプリケーションに組織IDapp2Groupが、それぞれ割り当てられています。

8.3.3 アプリケーション・プロパティの構成

OAAMサーバーのアプリケーションは、プロパティのグルーピングまたはセットで構成されます。OAAMサーバーのプロパティは、グローバル・レベルまたはアプリケーション固有のレベルで構成できます。

OAAMサーバーのプロパティ名の接頭辞はbharosa.uioです。プロパティ名の接頭辞の後にアプリケーションIDが続きます。設定がグローバルの場合は、defaultが続きます。

bharosa.uio.defaultで始まるプロパティの定義は、より具体的な値によってオーバーライドされないかぎり、すべてのアプリケーションIDに適用されます。

次の例では、appIdのかわりにdefaultを使用して、プロパティをグローバル・デフォルトとして指定しています。特定のアプリケーションが別の場所で指定されている場合を除き、このプロパティはOAAMサーバー・インストールのすべてのアプリケーションで使用されます。

bharosa.uio.default.header = /globalcustomHeader.jsp
bharosa.uio.default.footer = /globalcustomFooter.jsp

カスタム・ヘッダーとフッターへのパスのデフォルトのプロパティは次のとおりです。

bharosa.uio.default.header = path_to_custom_header.jsp
bharosa.uio.default.footer = path_to_custom_footer.jsp

アプリケーション・レベルのプロパティは、プロパティに定義されたアプリケーションが複数存在するときに、1つのアプリケーションにのみ影響を与えるプロパティです。

Oracle Adaptive Access ManagerおよびAccess Managerの統合では、AppIdはoamになります。これにより、OAAMはAccess Managerページと同じルック・アンド・フィールを保持した異なるヘッダーとフッターを表示できます。

Access Managementのカスタム・ヘッダーとフッターへのパスのプロパティは次のとおりです。

bharosa.uio.oam.header = path_to_custom_header.jsp
bharosa.uio.oam.footer = path_to_custom_footer.jsp

これら固有の接頭辞bharosa.uio.oamの値は、bharosa.uio.defaultとして定義されたデフォルト設定をオーバーライドします。

次の例では、app1はアプリケーション・レベルで定義されたヘッダーおよびフッター・ファイルを使用しています。app2はアプリケーション・レベルで定義されたフッター・ファイルを使用していますが、ヘッダー・ファイルはglobalまたはdefault定義です。

bharosa.uio.default.header = /globalcustomHeader.jsp
bharosa.uio.default.footer = /globalcustomFooter.jsp
bharosa.uio.app1.header = /app1customHeader.jsp
bharosa.uio.app1.footer = /app1customFooter.jsp
bharosa.uio.app2.footer = /app2customFooter.jsp

8.3.4 プロパティ拡張

プロパティは、アプリケーションごとに構成するのみでなく、複数のアプリケーションに共通するプロパティのセットとして構成できます。その後、そのセットを拡張してアプリケーション間で異なるパラメータをカスタマイズできます。

いずれも1つのフッターを使用し、ヘッダーがそれぞれ異なる3つのアプリケーションを構成しようとしている場合は、次のプロパティを含めることができます。

bharosa.uio.myAppGroup.footer = /myAppGroup/customFooter.jsp

bharosa.uio.appId1.extends=myAppGroup
bharosa.uio.appId1.header=/client/app1/customHeader.jsp

bharosa.uio.appId2.extends=myAppGroup
bharosa.uio.appId2.header==/client/app2/customHeader.jsp

bharosa.uio.appId3.extends=myAppGroup
bharosa.uio.appId3.header==/client/app3/customHeader.jsp

8.4 OAAMサーバー・ページの外観のカスタマイズ

この項では、OAAMサーバー・ページの外観をカスタマイズする方法について説明します。

ユーザー・インタフェース・ブランドは、いくつかの方法でカスタマイズされます。

- カスタム・ヘッダー/フッター・ファイル

- カスタムCSSファイル

- ページ・コンテンツおよびメッセージのカスタム・プロパティ

8.4.1 ヘッダーとフッターのカスタマイズ

保護されているアプリケーションに対して、カスタム・ヘッダーおよびフッター・ファイルを作成できます。ヘッダーおよびフッター・ファイルはJSPファイルであり、保護されているアプリケーションの外観のレプリケートに必要なすべてのHTMLコードまたはJSPコードを含めることができます。

1. oaam_extensionsという作業フォルダを作成します。(このフォルダは、インストール・フォルダ以外であればどこにでも作成できます。)

2. 次のディレクトリでoracle.oaam.extensions.warを見つけます。

IAM_Home/oaam/oaam_extensions/generic

3. oracle.oaam.extensions.war in the oaam_extensionsフォルダ内に抽出します。

4. oaam_extensionsフォルダに、次のサブフォルダを作成します。

/client/app1/
/client/app1/images/

5. client/app1/フォルダ内にcustomHeader.jspとcustomFooter.jspを作成します。
ヘッダー(customHeader.jsp)ファイルとフッター(customFooter.jsp)ファイルには、コンテンツHTMLのみ入っている必要があります。すべてのページ関連タグ(<html>、<head>、<body>など)は、すでにOAAMサーバーによって提供されています。

簡単な例として、appId1というアプリケーションのヘッダーおよびフッターとして使用するため、それぞれ1つのイメージを含むヘッダーとフッターが作成されます。

次のコードを、ヘッダー用にcustomHeader.jspにコピーします。

/client/app1/customHeader.jsp
<img src="client/app1/images/customHeader.jpg" alt="Welcome to App1"/>

次のコードを、フッター用にcustomFooter.jspにコピーします。

/client/app1/customFooter.jsp
<img src="client/app1/images/customFooter.jpg" alt="App1 Footer"/>

これらのファイルは、Webアプリケーション内の"/client/app1/"ディレクトリにデプロイされます。

6. 必要に応じて、関連付けられたファイルをclient/app1フォルダに追加します。
たとえば、customHeader.jspおよびcustomFooter.jspによって参照されるcustomHeader.jpgおよびcustomFooter.jpgイメージ・ファイルがあります。

/client/app1/images/customHeader.jpg
/client/app1/images/customFooter.jpg

7. oracle.oaam.extensions.warファイルのWEB-INF/classes/bharosa_propertiesディレクトリで、oaam_custom.propertiesファイルを開きます。

8. これらのヘッダー・ファイルとフッター・ファイルをアプリケーションに関連付けるには、次のプロパティをoaam_custom.propertiesに追加して、それをIAM_HOME\oaam\oaam_extensions/WEB-INF/classes/bharosa_propertiesに保存します。

bharosa.uio.appId1.header = /client/app1/customHeader.jsp
bharosa.uio.appId1.footer = /client/app1/customFooter.jsp

9. 次のコマンドを使用して、oaam_extensionsの親フォルダでoracle.oaam.extensions.warを再パッケージします。

jar -cvfm oracle.oaam.extensions.war oaam_extensions\
META-INF\MANIFEST.MF -C  oaam_extensions/ .

注意:

コマンド末尾にドットがあることに留意してください。

このコマンドにより、WARファイルがMANIFEST.MFファイルとともに再作成されます。新しいJSPファイル、参照イメージ、およびoaam_custom.propertiesに追加されたプロパティが新しいWARファイルに含まれます。

10. OAAM管理とOAAMサーバーの管理対象サーバーをシャットダウンします。

11. Oracle Adaptive Access ManagerがデプロイされているWebLogic Serverを起動し、WebLogic管理コンソールにログインします。

12. ドメイン環境→「デプロイメント」に移動して、コンソールをロックします。

13. 「インストール」ボタンをクリックします。

14. oracle.oaam.extensions.warファイルの場所を参照し、.warファイルの横のラジオ・ボタンをクリックして選択します。その後、「次へ」をクリックします。

15. 「このデプロイメントをライブラリとしてインストールする」が選択されていることを確認して、「次へ」をクリックします。

16. OAAM管理サーバーまたはOAAMサーバーをデプロイメントのターゲットとして選択します。

17. 「次へ」を再度クリックしてこの次のページでデフォルトを受け入れ、「終了」をクリックします。

18. 「保存」ボタンをクリックしてから、「変更のアクティブ化」をクリックします。

19. OAAM管理サーバーとOAAM管理対象サーバーを起動します。

8.4.2 コンテンツおよびメッセージのカスタマイズ

OAAMサーバー・ページのコンテンツおよびメッセージは、client_resource_locale.propertiesファイルにプロパティを追加することでカスタマイズできます。

ページ・タイトルやメッセージなどの一部のカスタマイズ可能なアイテムは、各ページで適用できます。一方、ログインがブロックされたメッセージなど、その他のアイテムは特定のページに固有のものです。

コンテンツとメッセージをカスタマイズする手順は次のとおりです。

1. oaam_extensionsという作業フォルダを作成します。(このフォルダは、インストール・フォルダ以外であればどこにでも作成できます。)

2. IAM_Home/oaam/oaam_extensions/genericディレクトリに格納されているoracle.oaam.extensions.warを見つけます。

3. oracle.oaam.extensions.warをoaam_extensionsフォルダ内で開きます。

4. client_resource_locale.propertiesをIAM_Home\oaam\oaam_extensions\generic\WEB-INF\classes内に作成します。

5. カスタマイズしたメッセージをこのファイルに追加します。
たとえば、appId1アプリケーションのログイン・ページでページ・タイトルを変更するには、次の行をclient_resource_locale.propertiesに追加します。

bharosa.uio.appId1.signon.page.title=Welcome to App1, please sign in.

たとえば、セキュリティ・ルールによりユーザーがブロックされたときに表示されるエラー・メッセージをカスタマイズするには、次の行をclient_resource_locale.propertiesに追加します。

bharosa.uio.appId1.login.user.blocked = You are not authorized to login. Please contact customer service at 1-888-555-1234.

6. 次のコマンドを使用して、oaam_extensionsの親フォルダでoracle.oaam.extensions.warを再パッケージします。

jar -cvfm oracle.oaam.extensions.war oaam_extensions\
META-INF\MANIFEST.MF -C  oaam_extensions/ .

7. すべての管理対象サーバーをシャットダウンします。

8. Oracle Adaptive Access ManagerがデプロイされているWebLogic Serverを起動して、Oracle WebLogic管理コンソールにログインします。

9. 「ドメイン環境」→「デプロイメント」に移動して、コンソールをロックします。

10. 「インストール」ボタンをクリックします。

11. oracle.oaam.extensions.warファイルの場所を参照し、WARファイルの横のオプションをクリックして選択します。その後、「次へ」をクリックします。

12. 「このデプロイメントをライブラリとしてインストールする」が選択されていることを確認して、「次へ」をクリックします。

13. OAAM管理サーバーまたはOAAMサーバーをデプロイメントのターゲットとして選択します。

14. 「次へ」を再度クリックしてこの次のページでデフォルトを受け入れ、「終了」をクリックします。

15. 「保存」ボタンをクリックしてから、「変更のアクティブ化」をクリックします。

16. OAAM管理サーバーとOAAM管理対象サーバーを起動します。

8.4.3 ユーザー・インタフェース・スタイルの変更

カスタムのCascading Style Sheet (CSS)を作成して、カスタム・ユーザー・インタフェースを作成できます。CSSファイルでは、背景、フォントの色とサイズなどを制御できます。デフォルトのCSSファイルであるoaam_uio.cssは、cssフォルダにあります。カスタムCSSファイルを使用して、このCSSファイルのスタイルをオーバーライドできます。アプリケーション用のファイル、またはグローバル・レベルにあるファイルを使用します。アプリケーション・プロパティの設定方法については、第8.3.3項「アプリケーション・プロパティの構成」を参照してください。

たとえば、デフォルトのボディ・スタイル定義のフォント・ファミリをオーバーライドするには、次の手順を実行します。

1. oaam_extensionsという作業フォルダを作成します。
このフォルダは、インストール・フォルダ以外であればどこにでも作成できます。

2. IAM_Home/oaam/oaam_extensions/genericディレクトリに格納されているoracle.oaam.extensions.warを見つけます。

3. oracle.oaam.extensions.warをoaam_extensionsフォルダ内で開きます。

4. client/app1/cssディレクトリを作成します。

5. app1.cssファイルを作成します。

6. 次のコードをapp1.cssファイルに追加します。

body{
background-color:#ffffff;
font-size:12px;
color:#000000;
font-family:arial,helvetica,sans-serif;
margin:0px 0px 0px 0px
}

7. Helveticaを、appId1アプリケーションに使用するプライマリ・フォント・ファミリに変更します。

8. このファイルを/client/app1/cssディレクトリに追加します。

9. oracle.oaam.extensions.warファイルのWEB-INF/classes/bharosa_propertiesディレクトリで、oaam_custom.propertiesファイルを開きます。

10. 新規作成したファイルを使用するには、次のプロパティをoaam_custom.propertiesに設定します。

bharosa.uio.appId1.custom.css=/client/app1/css/app1.css

11. 次のコマンドを使用して、oaam_extensionsの親フォルダでoracle.oaam.extensions.warを再パッケージします。

jar -cvfm oracle.oaam.extensions.war oaam_extensions\META-INF\MANIFEST.MF -C  oaam_extensions/ .

12. OAAM管理とOAAMサーバーの管理対象サーバーをシャットダウンします。

13. Oracle Adaptive Access ManagerがデプロイされているWebLogic Serverを起動して、Oracle WebLogic管理コンソールにログインします。

14. ドメイン環境→「デプロイメント」に移動して、コンソールをロックします。

15. 「インストール」ボタンをクリックします。

16. oracle.oaam.extensions.warファイルの場所を参照し、WARファイルの横のオプションをクリックして選択します。その後、「次へ」をクリックします。

17. 「このデプロイメントをライブラリとしてインストールする」が選択されていることを確認して、「次へ」をクリックします。

18. OAAM管理サーバーまたはOAAMサーバーをデプロイメントのターゲットとして選択します。

19. 「次へ」を再度クリックしてこの次のページでデフォルトを受け入れ、「終了」をクリックします。

20. 「保存」ボタンをクリックしてから、「変更のアクティブ化」をクリックします。

21. OAAM管理サーバーとOAAM管理対象サーバーを起動します。

OAAMサーバーのEARファイルにあるoaam_uio.cssで定義されたスタイルはすべて、必要に応じてこの方法でオーバーライドできます。

8.5 シングル・ログイン・ページの有効化

シングル・ログイン・ページを使用するには、次を実行する必要があります。

- パスワードの場所リンクが表示されないようにOAAMシングル・ログイン・ページを構成する。

- パスワードとユーザー名を許可するようにOAAMシングル・ログイン・ページを構成する。

- OAAMログイン・ページのパスワード・フィールドを有効化する。

- 仮想認証デバイスのかわりにOAAM HTMLパッドを使用するようにOAAMが構成されていることを確認する。

次の項で説明するプロパティは、oaam_custom.properties内で変更され、変更はOAAM拡張共有ライブラリの一部としてデプロイされます。

- 第8.5.1項「パスワードの場所リンクが表示されないようにOAAMシングル・ログイン・ページを構成」

- 第8.5.2項「パスワードとユーザー名を許可するようにOAAMシングル・ログイン・ページを構成」

- 第8.5.3項「OAAMシングル・ログイン・ページのパスワード・フィールドの有効化」

注意:

プロパティがoaam_custom.propertiesファイル内にない場合は追加する必要があります。

OAAM拡張共有ライブラリのデプロイ手順については、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。

8.5.1 パスワードの場所リンクが表示されないようにOAAMシングル・ログイン・ページを構成

次のプロパティをfalseに設定すると、パスワードの場所リンクは表示されなくなります。

bharosa.uio.default.signon.links.enum.wherepassword.enabled

8.5.2 パスワードとユーザー名を許可するようにOAAMシングル・ログイン・ページを構成

OAAMサーバーがOAAMログイン・ページからのユーザー名とパスワードの両方を許可するように構成するには、次をtrueに設定します。

bharosa.uio.default.login.auth.enabled

8.5.3 OAAMシングル・ログイン・ページのパスワード・フィールドの有効化

ログイン・ページのパスワード・フィールドを有効化するには、次をtrueに設定します。

bharosa.uio.default.credentials.enum.password.enabled

次に、OAAMサーバーを再起動します。

8.5.4 仮想認証デバイスのかわりにOAAM HTMLパッドを使用するようにOAAMが構成されているかどうかの確認

仮想認証デバイスがフローで使用されないようにOAAMを構成したことを確認してください。この項では、OAAM HTMLパッドを使用するようにOAAMを構成する2つの方法について説明します。

チャレンジSMS、登録済のイメージおよびキャプション、チャレンジ電子メール、およびチャレンジ質問の各ルールでOAAM HTMLパッドを使用するようにOAAM AuthenticationPadポリシーを構成

1. 管理者としてOAAM管理コンソールにログインします。

2. 「ポリシー」ノードをダブルクリックします。ポリシー検索ページが表示されます。

3. 「検索フィルタ」セクションで、チェックポイントとしてAuthentiPadを選択して、「検索」をクリックします。

4. 「検索結果」表で「OAAM AuthenticationPadポリシー」リンクをクリックして、「ポリシー詳細」ページを開きます。

5. ポリシー詳細ページで、「ルール」タブをクリックします。

6. 「チャレンジ質問」リンクをクリックして、「ルールの詳細」ページを開きます。

7. 「ルールの詳細」ページで、「結果」タブをクリックします。

8. 「アクション・グループ」リストで、「OAAM HTMLパッド」をこのルールでトリガーするアクションとして選択し、「適用」をクリックして、変更したルールの詳細を保存します。
確認ダイアログが表示されます。

9. 「OK」をクリックして、確認ダイアログを閉じます。

10. チャレンジSMS、登録済のイメージおよびキャプション、チャレンジ電子メールのルールについて、ステップ5から9を繰り返します。

11. 「ポリシー詳細」ページで「トリガー組合せ」タブをクリックします。

12. すべてのトリガー組合せのアクション・グループを「OAAM HTMLパッド」に変更し、編集後、「適用」をクリックします。
確認ダイアログが表示されます。

13. 「OK」をクリックして、確認ダイアログを閉じます。

OAAM HTMLパッドを使用するようにOAAMサーバーを構成

1. 第7.2項「OAAM拡張共有ライブラリの使用によるカスタマイズの追加」の手順に従って、拡張共有ライブラリを抽出します。

2. oaam_custom.propertiesに次の変更を行って、IAM_Home\oaam\oaam_extensions\WEB-INF\classes\bharosa_propertiesディレクトリに保存します。

bharosa.uio.default.use.authentipad.checkpoint=false
bharosa.uio.default.Password.authenticator.device=DeviceHTMLControl
bharosa.uio.default.Password.authenticator.device.upgraded=DeviceHTMLControl
bharosa.uio.default.ChallengeQuestion.authenticator.device=DeviceHTMLControl
bharosa.uio.default.RegisterQuestions.authenticator.device=DeviceHTMLControl
bharosa.uio.default.ChallengeSMS.authenticator.device=DeviceHTMLControl
bharosa.uio.default.ChallengeEmail.authenticator.device=DeviceHTMLControl

3. 第7.2.6項「ステップ5 OAAM拡張共有ライブラリの再パッケージ化」の手順に従って、拡張共有ライブラリ、oracle.oaam.extensions.warを再パッケージ化します。

4. 管理対象サーバーが稼働している場合はすべてシャットダウンします。

5. WebLogic管理サーバーを起動します。

6. Oracle Adaptive Access ManagerがデプロイされているWebLogic Serverを起動します。

7. 第7.2.11項「ステップ10 新しいOAAM拡張共有ライブラリのデプロイ」の手順に従って、OAAM拡張共有ライブラリを再デプロイします。

8.6 ユーザー・インタフェースのカスタマイズに関する質問/回答

ユーザー・インタフェースのカスタマイズに関するいくつかのトラブルシューティングのヒントを次に示します。

- 質問: 次のエントリを、OAAM拡張共有ライブラリにあるoaam_custom.propertiesに追加しました。

bharosa.uio.default.header = /customHeader.jsp
bharosa.uio.default.footer = /customFooter.jsp

OAAMサーバーでは、デフォルトのヘッダーとフッターは選択されますが、私が拡張ライブラリで指定したものは選択されません。

回答: カスタムのヘッダー/フッター・ファイルには、OAAMサーバーがWebアプリケーションから最初にプルしたときの一意の名前を割り当てておく必要があります。たとえば、customHeader.jspおよびcustomFooter.jspです。

- 質問: OAAMサーバーでは、OAAM拡張共有ライブラリのcssの変更がなぜ反映されないのでしょうか。
回答: プロパティbharosa.uio.default.custom.cssを、拡張ライブラリに追加されるcssファイルに設定する必要があります。このcssファイルは、ベース・アプリケーションにある既存のCSS定義(oaam_uio.cssによって定義されたもの)をオーバーライドできます。

たとえば、ユーザー名とパスワードのテキストおよびOTPパッドを画面中央に移動する場合は、bharosa.uio.default.custom.css = CSS_file_name_and_pathと設定し、カスタムCSSファイルをOAAM拡張共有ライブラリに追加する必要があります。

- 質問: struts_config_extension.xmlとtiles-def-extension.xmlは、カスタマイズでどのように動作しますか。
回答: OAAM拡張共有ライブラリでは、struts-config-extension.xmlおよびtiles-def-extension.xmlがWEB-INFフォルダに格納されています。これらに追加された値はいずれも、アプリケーション内でstruts-config.xmlおよびtiles-def.xmlによって定義されている値を拡張またはオーバーライドします。

たとえば、カスタマイズしたJSPファイル(customUserPreferences.jsp)をベース・ファイル(userPreferences.jsp)用に使用するには、次の行をtiles-def-extension.xmlに追加します。

<definition name="userPreferences" extends="bharosa.uio.baseLayout">
<put name="body" value="/customUserPreferences.jsp"/>
</definition>

- 質問: OAAMログイン・ページでユーザー名ラベルを変更する方法を教えてください。このページには次の内容が表示されます。
サインイン:

ユーザー名を入力します。

この後にラベル「ユーザー名」が続きます。

回答: このデータを含んでいるプロパティは、次のとおりです。

bharosa.uio.default.username.label=UserName
bharosa.uio.default.credentials.enum.username.name=UserName

OAAM拡張共有ライブラリを使用して、これらのカスタマイズを追加します。カスタマイズの詳細は、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。

拡張フォルダを作成したら、WEB-INF\classes内にclient_resource_en.propertiesファイルを作成して、そのファイルを共有ライブラリとしてOAAMサーバーにデプロイします。このoaam-extensions warをWebLogicにデプロイする前に、既存のoaam extensionsを必ず削除してください。

- 質問: ログイン・ページを完全に変更する方法を教えてください。
回答: oaam.uio.login.page=custom_login_pageと設定し、このファイルをOAAM拡張共有ライブラリに追加する必要があります。「ログイン」の結果をオーバーライドするには、OAAM拡張共有ライブラリに格納されているstruts-config-extension.xmlを更新する必要があります。oaamLoginPage.jspをカスタム・ファイル名に置き換えます。

<action path="/entry" type="com.bharosa.uio.actions.EntryAction">
<forward name="login" path="/oaamLoginPage.jsp" />
</action>

9 ユーザー・フローとレイアウトのカスタマイズ

OAAMでは、Struts/Tilesフレームワークを使用してアプリケーションに共通のルック・アンド・フィールを作成します。

この章は次の項で構成されています:

- 第9.1項「ユーザー・フローとレイアウト」

- 第9.2項「カスタム・ユーザー・フローとレイアウトの例」

- 第9.3項「Tile定義ファイル」

- 第9.4項「Struts構成ファイル」

9.1 ユーザー・フローとレイアウト

WEB-INFディレクトリにあるStruts構成ファイルstruts-config.xmlでは、すべてのナビゲーション・ルールがアクション定義の形式で定義されています。WEB-INFディレクトリにあるTilesレイアウト・ファイルtiles-def.xmlには、様々なページの定義が含まれています。

OAAMユーザー・インタフェース・フローとJava Server Pages (JSP)のレイアウトをカスタマイズするには、OAAMサーバーJSPとStrutsアクション・ターゲットをOAAM拡張共有ライブラリ(oracle.oaam.extensions.war)を使用してオーバーライドする必要があります。拡張共有ライブラリには、カスタマイズに使用する次の2つのファイルが含まれています。

- WEB-INF/struts-config-extension.xml

- WEB-INF/tiles-def-extension.xml

注意:

カスタマイズは、OAAM拡張共有ライブラリのみで行ってください。struts-config.xmlファイルとtiles-def.xmlファイルは変更しないでください。Strutsテンプレートの変更はお薦めしません。変更する場合は、テンプレートとoaamLoginPage.jspファイルの両方を変更する必要があります。

9.1.1 Strutsアクション

この項では、ユーザー・フローの駆動に使用するStrutsアクション定義について説明します。OAAMアクション・タイプ・クラスの概要も示しています。

9.1.1.1 アクション定義

アクション定義には通常、パス、タイプおよびパラメータの属性が含まれています。パスでは、URLが定義されます。多くの定義には、次に表示するページを示すフォワード要素が1つ以上含まれています。ログイン・ページの例を示します。

<action path="/login" type="com.bharosa.uio.actions.LoginAction">
<forward name="success" path="/updateLoginStatus.do" redirect="true"/>
<forward name="loginJump" path="/loginJumpPage.jsp" redirect="true"/>
<forward name="password" path="password"/>
<forward name="challenge" path="/challengeUser.do" redirect="true"/>
</action>

9.1.1.2 アクション・タイプ

ログイン・ページの例では、URLはhttp://server name/oaam_server/login.doです。login.doは、/loginのパス定義から取得されます。タイプ・パラメータは、アクションを実行するクラスを定義します。サンプル・ユーザー・ページでは、次のクラスが指定されています。

表9-1 アクション・タイプ・クラス

クラス名

説明

com.bharosa.uio.actions.LoginAction

ログイン・ステータスを更新し、必要に応じてユーザーにチャレンジします。

com.bharosa.uio.actions.LoginFailAction

OAAMサーバー・ページにエラー・メッセージを表示します。たとえば、ログイン・ブロック済メッセージが表示されることがあります。

com.bharosa.uio.actions.ActivityAction

OAAMサーバー・ページに確認メッセージを表示します。

com.bharosa.uio.actions.PasswordAction

パスワード・ステータスを更新します。

com.bharosa.uio.actions.UpdateAuthStatusAction

ユーザー認証ステータスを更新し、必要に応じてパターン・データ処理をトリガーします。

com.bharosa.uio.actions.ValidateTrxAction

トランザクションを検証します。

com.bharosa.uio.actions.FlashFingerprintAction

デバイスをフィンガープリント処理します。

com.bharosa.uio.actions.LogoutAction

ユーザー・セッションをログアウトして、ログイン・ページにリダイレクトします。

com.bharosa.uio.actions.SignOnAction

ユーザーをサイン・インします。

com.bharosa.uio.actions.RegisterQuestionsAction

質問セットが表示されます。ユーザーはこの中から質問を選択し、質問ごとの正しい回答を登録できます。

com.bharosa.uio.actions.ChangePasswordAction

パスワード変更リンクを表示します。

com.bharosa.uio.actions.ForgotPasswordAction

パスワードを忘れた場合のリンクを表示します。

com.bharosa.uio.actions.UserInputAction

入力フィールドを表示します。

com.bharosa.uio.actions.UserPreferencesDoneAction

ユーザーのプリファレンス登録終了メッセージを表示します。

com.bharosa.uio.actions.ChallengeUserAction

ユーザーがすでに登録した質問の1つとあわせて質問パッドを表示することにより、ユーザーにチャレンジします。

com.bharosa.uio.actions.ChangeUserNameAction

ユーザー名を変更します。

com.bharosa.uio.actions.MessageAction

ユーザーにメッセージを表示します。

com.bharosa.uio.actions.ExitAction

ユーザーをリソースから終了させます。

com.bharosa.uio.actions.ErrorAction

エラーが発生します。

9.1.2 ベース・レイアウト定義

ユーザー・インタフェース・ページは、StrutsアプリケーションでTilesを使用して作成されます。外部構成ファイル(/WEB-INF/tiles-def.xml)には、様々なページの定義が含まれています。

ベース・レイアウトbharosa.uio.baseLayoutは、様々な項を含めるように定義されています。ヘッダー部分はcustomHeader.jspページで、フッター部分はcustomFooter.jspページで、ボディ部分はコンテンツでそれぞれ占められています。次のコードは、ベース・レイアウトを示しています。

<definition name="bharosa.uio.baseLayout" path="/bharosaUIOBaseLayout.jsp">
<put name="header" value="/customHeader.jsp"/>
<put name="footer" value="/customFooter.jsp"/>
<put name="body" value="${body}"/>
</definition>

ユーザー・インタフェース・ページを作成するには、tiles-def-extension.xml構成ファイル内でベース・レイアウトに使用するJSPページを定義します。次の例では、baseLayout定義を拡張し、registerQuestionsHTML.jspというJSPを使用してコンテンツ・タイルをレンダリングしています。

<definition name="registerQuestionsHTML" extends="bharosa.uio.baseLayout">
<put name="body" value="/registerQuestionsHTML.jsp"/
</definition>

Tile定義は、別のTile定義を拡張できます。tiles-def.xmlファイルでは、ユーザー・フローの中でボディ部分のみが変更していることが確認できます。

9.1.3 StrutsとTilesを併用する方法

StrutsアプリケーションでTilesを使用するために、次の拡張定義をstruts-config.xmlファイルに追加しました。

<!-- tiles plug-in -->
<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-config"
value="/WEB-INF/tiles-def.xml,/WEB-INF/tiles-def-extension.xml"/>
<set-property property="definitions-debug" value="0"/>
<set-property property="definitions-parser-details" value="0"/>
<set-property property="definitions-parser-validate" value="true"/>
<set-property property="moduleAware" value="true"/>
</plug-in>

アクション・フォワード・エントリがstruts-config.xmlファイルにあります。アクションがTile定義baseLayoutに転送されると、Tile定義にベース・レイアウトJSPページが、対応するJSPページとともに表示されます。たとえば、次のようになります。

<action path="/updateForgotPasswordStatus" type="com.bharosa.uio.actions.UpdateAuthStatusAction" parameter="ForgotPassword">
<forward name="success" path="/resetPassword.do" redirect="true" />
<forward name="challenge" path="/challengeUserForgotPassword.do"
redirect="true"/>
<forward name="registerUser" path="/registerQuestions.do" redirect="true"/>
<forward name="registerQuestions" path="/registerQuestions.do"
redirect="true"/>
<forward name="registerQuestionsHTML" path="/registerQuestions.do"
redirect="true"/>
<forward name="registerUserInfo" path="/registerUserInfo.do"
redirect="true"/>
<forward name="signon" path="signon" redirect="true"/>
</action>

パス属性では、転送するTile定義の値を保持しています。パスの値が/registerQuestions.doの場合、ベース・レイアウトJSPページでは、tiles-def.xmlで指定したようにregisterQuestionsHTML.jspがボディとして表示されます。

<definition name="registerQuestionsHTML" extends="bharosa.uio.baseLayout">
<put name="body" value="/registerQuestionsHTML.jsp"/
</definition>

9.2 カスタム・ユーザー・フローとレイアウトの例

ユーザー・フローとグラフィカル・ユーザー・インタフェースのルック・アンド・フィールのカスタマイズ方法の例を、後続の項に示します。

9.2.1 ルック・アンド・フィールのカスタマイズ

グラフィカル・ユーザー・インタフェース(GUI)のルック・アンド・フィールをカスタマイズするには、カスタムJSPファイルをOAAM拡張共有ライブラリに追加し、定義をtiles-def-extension.xmlファイルに追加します。

次の例に、tiles-defs.xmlで定義したようにパスワード・ページの定義を示します。

<definition name="password" extends="bharosa.uio.baseLayout">
<put name="body" value="/password.jsp"/>
</definition>

実行時のパスワード・ページには、ユーザーが必須資格証明を入力する際に必要となるすべてのGUI要素が動的に表示されます。

次の定義がtiles-def-extensionファイルに追加されている場合は、OAAMサーバーがpasswordページの表示を試みるすべての場所で、新規のcustomPassword.jspが使用されます。次の例では、tiles-def-extension.xmlに追加できるカスタム・パスワード・ページの定義を示しています。

<definition name="password" extends="bharosa.uio.baseLayout">
<put name="body" value="/customPassword.jsp"/>
</definition>

9.2.2 ユーザー・ページ・フローとアクションのカスタマイズ

ユーザー・フローとアクションをカスタマイズするには、strutsアクション・クラスとstruts-config-extension.xmlファイルでのマッピングをオーバーライドします。

次の例に、struts-config.xmlに定義したように、loginアクションの定義を示します。

<action path="/login" type="com.bharosa.uio.actions.LoginAction">
<forward name="success" path="/updateLoginStatus.do" redirect="true"/>
<forward name="loginJump" path="/loginJumpPage.jsp" redirect="true"/>
<forward name="password" path="password"/>
<forward name="challenge" path="/challengeUser.do" redirect="true"/>
</action>

次の例では、struts-config-extension.xmlを使用したログイン・アクションのオーバーライドに使用できる値を示しています。

<action path="/login" type="com.bharosa.uio.actions.CustomLoginAction">
<forward name="success" path="/updateLoginStatus.do" redirect="true"/>
<forward name="loginJump" path="/customLoginJumpPage.jsp"  redirect="true"/>
<forward name="password" path="password"/>
<forward name="challenge" path="/customChallengeUser.do"   redirect="true"/>
</action>

9.3 Tile定義ファイル

この項では、tiles-def.xmlファイルを示しています。

<tiles-definitions>

<!-- ========================================================== -->
<!-- Master definition - Start                                  -->
<!-- ========================================================== -->
<!-- Main page layout used as a root for other page definitions -->

<definition name="bharosa.uio.baseLayout" path="/bharosaUIOBaseLayout.jsp">
<put name="header" value="/customHeader.jsp"/>
<put name="footer" value="/customFooter.jsp"/>
<put name="body" value="${body}"/>
</definition>

<definition name="bharosa.uio.messageLayout" path=
"/bharosaUIOMessageLayout.jsp">
<put name="body" value="${body}"/>
</definition>

<!-- login success -->

<definition name="loginSuccess" extends="bharosa.uio.baseLayout">
<put name="body" value="/loginSuccess.jsp"/>
</definition>

<!-- login fail -->
<definition name="loginFail" extends="bharosa.uio.baseLayout">
<put name="body" value="/loginFail.jsp"/>
</definition>

<!-- password entry -->
<definition name="password" extends="bharosa.uio.baseLayout">
<put name="body" value="/password.jsp"/>
</definition>

<!-- register questions -->
<definition name="registerInfo" extends="bharosa.uio.baseLayout">
<put name="body" value="/registerInfo.jsp"/>
</definition>

<definition name="registerAuthenticator" extends="bharosa.uio.baseLayout">
<put name="body" value="/registerAuthenticator.jsp"/>
</definition>

<definition name="registerQuestions" extends="bharosa.uio.baseLayout">
<put name="body" value="/registerQuestions.jsp"/>
</definition>

<definition name="registerQuestionsHTML" extends="bharosa.uio.baseLayout">
<put name="body" value="/registerQuestionsHTML.jsp"/>
</definition>

<definition name="registerUserInfo" extends="bharosa.uio.baseLayout">
<put name="body" value="/registerUserInfo.jsp"/>
</definition>

<definition name="userPreferences" extends="bharosa.uio.baseLayout">
<put name="body" value="/userPreferences.jsp"/>
</definition>

<definition name="registrationRequired" extends="bharosa.uio.baseLayout">
<put name="body" value="/registrationRequired.jsp"/>
</definition>

<definition name="changePassword" extends="bharosa.uio.baseLayout">
<put name="body" value="/changePassword.jsp"/>
</definition>

<definition name="forgotPassword" extends="bharosa.uio.baseLayout">
<put name="body" value="/forgotPassword.jsp"/>
</definition>

<definition name="userInput" extends="bharosa.uio.baseLayout">
<put name="body" value="/userInput.jsp"/>
</definition>

<!-- challenge User -->
<definition name="challengeUser" extends="bharosa.uio.baseLayout">
<put name="body" value="/challengeUser.jsp"/>
</definition>

<definition name="challengeUserForgotPassword" extends="bharosa.uio.baseLayout">
<put name="body" value="/challengeUser.jsp"/>
</definition>

<definition name="challengeWait" extends="bharosa.uio.baseLayout">
<put name="body" value="/challengeWait.jsp"/>
</definition>

<!-- qaExists -->
<definition name="qaExists" extends="bharosa.uio.baseLayout">
<put name="body" value="/qaExists.jsp"/>
</definition>

<!-- register qa done -->
<definition name="questRegistered" extends="bharosa.uio.baseLayout">
<put name="body" value="/registerQAdone.jsp"/>
</definition>

<!-- signon -->
<definition name="signon" extends="bharosa.uio.baseLayout">
<put name="body" value="/securityProfile.jsp"/>
</definition>

<!-- messages -->
<definition name="message" extends="bharosa.uio.messageLayout">
<put name="body" value="/message.jsp"/>
</definition>
</tiles-definitions>

9.4 Struts構成ファイル

この項では、struts-config.xmlファイルを示しています。

<struts-config>

<!-- ========== Global Forward Definitions ============================== -->

<global-forwards>
<forward name="session_expired" path="/error.do?action=session_expired"
redirect="true"/>
<forward name="emptyLoginId" path="/error.do?action=empty" redirect="true"/>
<forward name="fail" path="/error.do?action=fail" redirect="true"/>
<forward name="invalid_user" path="/error.do?action=invalid_user"
redirect="true"/>
<forward name="error" path="/error.do?action=error" redirect="true"/>
<forward name="block" path="/error.do?action=block" redirect="true"/>
<forward name="challenge_block" path="/error.do?action=block"
redirect="true"/>
<forward name="cookieDisabled" path="/error.do?action=cookieDisabled"
redirect="true"/>
<forward name="accessDenied" path="/error.do?action=accessDenied"
redirect="true"/>
<forward name="invalid_request" path="/error.do?action=accessDenied"
redirect="true"/>
<forward name="user_disabled" path="/error.do?action=disabled"
redirect="true"/>
<forward name="wrong_answer" path="/error.do?action=wrong_answer"
redirect="true"/>
<forward name="login" path="/error.do" redirect="true"/>
</global-forwards>

<!-- ========== Action Mapping Definitions ============================== -->
<action-mappings>

<!-- action mappings for login -->

<action path="/login" type="com.bharosa.uio.actions.LoginAction">
<forward name="success" path="/updateLoginStatus.do" redirect="true"/>
<forward name="loginJump" path="/loginJumpPage.jsp" redirect="true"/>
<forward name="password" path="password"/>
<forward name="passwordFT" path="password"/>
<forward name="challenge" path="/challengeUser.do" redirect="true"/>
</action>

<action path="/loginFail" type="com.bharosa.uio.actions.LoginFailAction">
<forward name="success" path="loginFail"/>
</action>

<action path="/activity" type="com.bharosa.uio.actions.ActivityAction">
<forward name="success" path="loginSuccess" redirect="true"/>
</action>

<!-- validate password -->

<action path="/password" type="com.bharosa.uio.actions.PasswordAction">
<forward name="success" path="/exit.do"/>
<forward name="invalid_user" path="/updateLoginStatus.do" />
<forward name="noproxy" path="/updateLoginStatus.do"/>
<forward name="resetPassword" path="/expiredPassword.do" redirect="true" />
</action>

<action path="/updateLoginStatus"
type="com.bharosa.uio.actions.UpdateAuthStatusAction">
<forward name="success" path="/exit.do"/>
<forward name="challenge" path="/challengeUser.do" redirect="true"/>
<forward name="registerUser" path="/registerQuestions.do" redirect="true"/>
<forward name="registerAuthenticator" path="/registerImage.do"
redirect="true"/>
<forward name="registerQuestions" path="/registerQuestions.do"
redirect="true"/>
<forward name="registerQuestionsHTML" path="/registerQuestions.do"
redirect="true"/>
<forward name="registerUserInfo" path="/registerUserInfo.do"
redirect="true"/>
<forward name="signon" path="signon" redirect="true"/>
</action>

<action path="/updateForgotPasswordStatus" type="com.bharosa.uio.actions.UpdateAuthStatusAction" parameter="ForgotPassword">
<forward name="success" path="/resetPassword.do" redirect="true" />
<forward name="challenge" path="/challengeUserForgotPassword.do"
redirect="true"/>
<forward name="registerUser" path="/registerQuestions.do" redirect="true"/>
<forward name="registerQuestions" path="/registerQuestions.do"
redirect="true"/>
<forward name="registerQuestionsHTML" path="/registerQuestions.do"
redirect="true"/>
<forward name="registerUserInfo" path="/registerUserInfo.do"
redirect="true"/>
<forward name="signon" path="signon" redirect="true"/>
</action>

<action path="/validateTrx"
type="com.bharosa.uio.actions.ValidateTrxAction">
<forward name="success" path="/exit.do"/>
<forward name="challenge" path="/challengeUserTrx.do" redirect="true"/>
</action>

<action path="/flashFingerprint"
type="com.bharosa.uio.actions.FlashFingerprintAction">
<forward name="success" path="/flashFingerprint.jsp"/>
</action>

<!-- action mappings for logout -->

<action path="/logout" type="com.bharosa.uio.actions.LogoutAction">
<forward name="success" path="/loginPage.jsp" />
</action>

<!-- action mappings for signon -->

<action path="/signon" type="com.bharosa.uio.actions.SignOnAction">
<forward name="securityProfile" path="/securityProfile.jsp"
redirect="true"/>
<forward name="securityDone" path="/activity.do" redirect="true"/>
</action>

<!-- action mappings for security QA -->

<action path="/registerQuestions"
type="com.bharosa.uio.actions.RegisterQuestionsAction">
<forward name="qaExists" path="qaExists" redirect="true"/>
<forward name="registerAuthenticator" path="registerAuthenticator"/>
<forward name="registerQuestions" path="registerQuestions"/>
<forward name="registerQuestionsHTML" path="registerQuestionsHTML"/>
<forward name="registerInfo" path="registerInfo"/>
<forward name="registerUserInfo" path="registerUserInfo"/>
<forward name="skip" path="/exit.do"/>
<forward name="success" path="/exit.do"/>
</action>

<action path="/registerImage"
type="com.bharosa.uio.actions.RegisterQuestionsAction" parameter="RegisterImage">
<forward name="registerAuthenticator" path="registerAuthenticator"/>
<forward name="success" path="/exit.do"/>
</action>

<action path="/registerUserInfo"
type="com.bharosa.uio.actions.RegisterQuestionsAction"
parameter="RegisterUserInfo">
<forward name="registerUserInfo" path="registerUserInfo"/>
<forward name="success" path="/exit.do"/>
</action>

<action path="/userPreferences"
type="com.bharosa.uio.actions.RegisterQuestionsAction"
parameter="UserPreferences">
<forward name="registerAuthenticator" path="userPreferences"/>
<forward name="registerInfo" path="userPreferences"/>
<forward name="registerQuestions" path="registerQuestions"/>
<forward name="registerQuestionsHTML" path="registerQuestionsHTML"/>
<forward name="registerUserInfo" path="registerUserInfo" />
<forward name="changePassword" path="/changePassword.do" />
<forward name="success" path="userPreferences"/>
<forward name="registrationRequired" path="registrationRequired"/>
<forward name="exit" path="/exit.do" />
</action>

<action path="/changePassword"
type="com.bharosa.uio.actions.ChangePasswordAction">
<forward name="changePassword" path="changePassword" />
<forward name="success" path="/userPreferences.do" redirect="true" />
<forward name="exit" path="/exit.do" />
</action>

<action path="/resetPassword"
type="com.bharosa.uio.actions.ChangePasswordAction" parameter="ResetPassword">
<forward name="changePassword" path="changePassword" />
<forward name="success" path="/exit.do" />
<forward name="updateStatus" path="/updateLoginStatus.do" redirect="true" />
</action>

<action path="/expiredPassword"
type="com.bharosa.uio.actions.ChangePasswordAction" parameter="ExpiredPassword">
<forward name="changePassword" path="changePassword" />
<forward name="success" path="/exit.do" />
<forward name="updateStatus" path="/updateLoginStatus.do" redirect="true" />
</action>

<action path="/forgotPassword"
type="com.bharosa.uio.actions.ForgotPasswordAction">
<forward name="forgotPassword" path="forgotPassword" />
<forward name="challenge" path="/challengeUserForgotPassword.do" />
<forward name="success" path="/exit.do" />
<forward name="noproxy" path="/updateForgotPasswordStatus.do" />
</action>

<action path="/getUserInput" type="com.bharosa.uio.actions.UserInputAction">
<forward name="showAuthenticator" path="userInput" />
<forward name="success" path="/exit.do" />
</action>

<action path="/userPreferencesDone"
type="com.bharosa.uio.actions.UserPreferencesDoneAction">
<forward name="success" path="/exit.do"/>
<forward name="exit" path="/exit.do" />
</action>
<!-- action mappings for challenge user -->

<action path="/challengeUser"
type="com.bharosa.uio.actions.ChallengeUserAction">
<forward name="success" path="/exit.do" />
<forward name="challenge" path="challengeUser"/>
<forward name="registerUser" path="/registerQuestions.do" redirect="true"/>
<forward name="registerAuthenticator" path="/registerImage.do"
redirect="true"/>
<forward name="registerQuestions" path="/registerQuestions.do"
redirect="true"/>
<forward name="registerQuestionsHTML" path="/registerQuestions.do"
redirect="true"/>
<forward name="registerUserInfo" path="/registerUserInfo.do"
redirect="true"/>
<forward name="wait" path="challengeWait"/>
</action>

<action path="/challengeUserTrx"
type="com.bharosa.uio.actions.ChallengeUserAction"
parameter="transaction">
<forward name="success" path="/exit.do" />
<forward name="challenge" path="challengeUser"/>
<forward name="registerUser" path="/registerQuestions.do" redirect="true"/>
<forward name="registerAuthenticator" path="/registerImage.do"
redirect="true"/>
<forward name="registerQuestions" path="/registerQuestions.do"
redirect="true"/>
<forward name="registerQuestionsHTML" path="/registerQuestions.do"
redirect="true"/>
<forward name="registerUserInfo" path="/registerUserInfo.do"
redirect="true"/>
<forward name="wait" path="challengeWait"/>
</action>

<action path="/challengeUserForgotPassword"
type="com.bharosa.uio.actions.ChallengeUserAction"
parameter="ForgotPassword">
<forward name="success" path="/resetPassword.do" redirect="true"/>
<forward name="forgotPassword" path="forgotPassword" />
<forward name="challenge" path="challengeUserForgotPassword"/>
<forward name="wait" path="challengeWait"/>
</action>

<action path="/changeUserId"
type="com.bharosa.uio.actions.ChangeUserNameAction">
<forward name="success" path="/exit.do" />
</action>

<!-- action mappings for message -->

<action path="/message" type="com.bharosa.uio.actions.MessageAction">
<forward name="success" path="message"/>
</action>

<action path="/exit" type="com.bharosa.uio.actions.ExitAction">
<forward name="success" path="/empty.jsp"/>
</action>

<action path="/error" type="com.bharosa.uio.actions.ErrorAction">
<forward name="login" path="/loginPage.jsp" redirect="true" />
</action>

</action-mappings>

<!--The Tiles Request Processor for processing all the Tile requests-->
<controller processorClass="org.apache.struts.tiles.TilesRequestProcessor"/>

<!-- message resources -->
<message-resources parameter="proxyweb" null="false"/>

<!-- tiles plug-in -->
<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-config" value=
"/WEB-INF/tiles-def.xml,/WEB-INF/tiles-def-extension.xml"/>
<set-property property="definitions-debug" value="0"/>
<set-property property="definitions-parser-details" value="0"/>
<set-property property="definitions-parser-validate" value="true"/>
<set-property property="moduleAware" value="true"/>
</plug-in>

</struts-config>

10 ローカライゼーションのプロパティ構成

この章は、次の項で構成されています。

- 第10.1項「ローカライゼーションの終了」

- 第10.2項「ローカライズされたプロパティのオーバーライド

- 第10.3項「Oracle Adaptive Access Managerの言語デフォルトの構成」

- 第10.4項「ロケールの略語と等価のカスタマイズ

10.1 ローカライゼーションの終了

ローカライゼーションを終了するフラグはありませんが、デプロイメントによりサポートされているロケールを取得するプロパティがあります。このプロパティを使用して、1つのロケールを有効にできます。

不要なロケールごとに、locale.enum.XXX.adminSupportedプロパティとlocale.enum.XXX.enabledプロパティをfalseに変更します。

10.2 ローカライズされたプロパティのオーバーライド

クライアント・リソース・オーバーライド・ファイルでローカライズされた文字列のカスタマイズを、次のように実行します。

1. client_resource_locale.propertiesを作成します。

2. プロパティbharosa.config.resourcebundle.clientoverrideをclient_resource_en.propertiesに追加します。OAAMサーバーでのこのプロパティのデフォルト値は、client_resourceです。
デフォルトでは、カスタムのローカライズ済文字列が追加されるファイルはclient_resource_locale.propertiesです。

たとえば、英語の場合、このファイルはclient_resource_en.propertiesとなります。

3. カスタマイズされたプロパティをclient_resource_en.propertiesに追加します。

4. WEB-INF/classesディレクトリ内にclient_resource_en.propertiesが含まれているOAAM拡張WARファイルを作成します。

10.3 Oracle Adaptive Access Managerの言語デフォルトの構成

言語デフォルトは、bharosa.locale. enumプロパティを使用してclient_resource_locale.propertiesファイル内に構成できます。Oracle Adaptive Access Managerのカスタマイズの手順については、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。

次に、bharosa.locale. enumの例を示します。

bharosa.locale.enum.german=2
bharosa.locale.enum.german.name=German
bharosa.locale.enum.german.description=German
bharosa.locale.enum.german.language=de
bharosa.locale.enum.german.country=
bharosa.locale.enum.german.adminSupported=true
bharosa.locale.enum.german.enabled=true

デフォルト・ロケールを有効化するには、次の手順を実行します。

1. サポートするロケールのbharosa.local.enum.locale.enabled propertiesプロパティを追加してtrueに設定します。

2. サポートしないロケールのbharosa.local.enum.locale.enabledプロパティを追加してfalseに設定します。

3. bharosa.default.locale propertyを追加して、ロケールのbharosa.locale.enum.localeと一致するように設定します。

注意:

サポートされるロケールは、列挙にリストされているロケールのみです。

10.3.1 例1

あるドイツの銀行がデフォルト言語としてドイツ語を設定し、ドイツ語のみをサポートすることを考えています。client_resource_de.propertiesを構成するには、次の手順を実行します。

1. ロケール列挙が存在しない場合は、それを作成します。

bharosa.locale.enum.german.enabled=true

2. ロケール列挙がすでに存在している場合は、それをtrueに設定します。

3. その他のbharosa.local.enum.locale.enabledプロパティが存在する場合は、それらをfalseに設定します。

bharosa.locale.enum.italian.enabled=false
bharosa.locale.enum.french.enabled=false
bharosa.locale.enum.portuguese_br.enabled=false
bharosa.locale.enum.spanish.enabled=false
bharosa.locale.enum.korean.enabled=false
bharosa.locale.enum.chinese_cn.enabled=false
bharosa.locale.enum.chinese_tw.enabled=false
bharosa.locale.enum.japanese.enabled=false
bharosa.locale.enum.arabic.enabled=false
bharosa.locale.enum.czech.enabled=false
bharosa.locale.enum.danish.enabled=false
bharosa.locale.enum.dutch.enabled=false
bharosa.locale.enum.finnish.enabled=false
bharosa.locale.enum.greek.enabled=false
bharosa.locale.enum.hebrew.enabled=false
bharosa.locale.enum.hungarian.enabled=false
bharosa.locale.enum.norwegian.enabled=false
bharosa.locale.enum.polish.enabled=false
bharosa.locale.enum.portuguese.enabled=false
bharosa.locale.enum.romanian.enabled=false
bharosa.locale.enum.russian.enabled=false
bharosa.locale.enum.slovak.enabled=false
bharosa.locale.enum.swedish.enabled=false
bharosa.locale.enum.thai.enabled=false
bharosa.locale.enum.turkish.enabled=false

4. ロケール列挙の値と一致するようにbharosa.default.locale propertyを設定します。
bharosa.locale.enum.german=2であるため、bharosa.default.localeプロパティを2に設定します。

このプロパティが存在しない場合は、作成してください。

10.3.2 例2

あるブラジルの銀行がブラジル・ポルトガル語をデフォルトとして設定しても、OAAMサーバーが翻訳されるその他のすべての言語を表示する必要があると考えています。この設定を構成するには次を実行してください。

1. ロケール列挙が存在しない場合は、それを作成します。

bharosa.locale.enum.pt_br.enabled=true

2. ロケール列挙がすでに存在している場合は、それをtrueに設定します。

3. プロパティ・エディタを使用して、その他のすべてのbharosa.local.enum.locale.enabledプロパティをfalseに設定します。

4. プロパティ・エディタを使用して、bharosa.default.localeプロパティをロケール列挙の値に設定します。
bharosa.locale.enum.pt_br=9の場合は、bharosa.default.locale propertyを9に設定します。

5. OAAMサーバーが翻訳されているすべての言語に対して、client_resource_locale.propertiesでbharosa.locale.enum.locale.enabledプロパティを設定し、それらがtrueに設定されていることを確認します。

bharosa.locale.enum.german.enabled=true
bharosa.locale.enum.italian.enabled=true
bharosa.locale.enum.french.enabled=true
bharosa.locale.enum.portuguese_br.enabled=true
bharosa.locale.enum.spanish.enabled=true
bharosa.locale.enum.korean.enabled=true
bharosa.locale.enum.chinese_cn.enabled=true
bharosa.locale.enum.chinese_tw.enabled=true
bharosa.locale.enum.japanese.enabled=true
bharosa.locale.enum.arabic.enabled=true
bharosa.locale.enum.czech.enabled=true
bharosa.locale.enum.danish.enabled=true
bharosa.locale.enum.dutch.enabled=true
bharosa.locale.enum.finnish.enabled=true
bharosa.locale.enum.greek.enabled=true
bharosa.locale.enum.hebrew.enabled=true
bharosa.locale.enum.hungarian.enabled=true
bharosa.locale.enum.norwegian.enabled=true
bharosa.locale.enum.polish.enabled=true
bharosa.locale.enum.portuguese.enabled=true
bharosa.locale.enum.romanian.enabled=true
bharosa.locale.enum.russian.enabled=true
bharosa.locale.enum.slovak.enabled=true
bharosa.locale.enum.swedish.enabled=true
bharosa.locale.enum.thai.enabled=true
bharosa.locale.enum.turkish.enabled=true

6. client_resource_locale.propertiesで、bharosa.default.locale propertyを9に設定します。

10.3.3 例3

あるフランスの銀行が、クライアントに表示されるデフォルト言語としてフランス語を設定し、フランス語、ドイツ語、英語およびイタリア語のみをサポートすることを考えています。フランス語のロケール列挙は、すでにclient_resource_fr.propertiesファイルに存在しています。

bharosa.locale.enum.french=5
bharosa.locale.enum.french.name=French
bharosa.locale.enum.french.description=French
bharosa.locale.enum.french.language=fr
bharosa.locale.enum.french.country=
bharosa.locale.enum.french.adminSupported=true
bharosa.locale.enum.french.enabled=true

アプリケーションを構成するには、次の手順を実行します。

1. client_resource_fr.propertiesで、ドイツ語、イタリア語および英語に対してbharosa.locale.enum.locale.enabledをtrueに設定します。

bharosa.locale.enum.german.enabled=true
bharosa.locale.enum.italian.enabled=true
bharosa.locale.enum.english.enabled=true

2. すべてのbharosa.local.enum.locale.enabledプロパティをfalseに設定します。

3. bharosa.default.localeプロパティをロケール列挙の値に設定します。
bharosa.locale.enum.french=5であるため、bharosa.default.localeプロパティを5に設定します。

10.3.4 例4

あるドイツの銀行がデフォルト言語として英語を設定し、その他のすべての言語をサポートすることを考えています。そうするには、client_resource_de.propertiesで次の手順を実行します。

1. ロケール列挙が存在しない場合は、それを作成します。

bharosa.locale.enum.english.enabled=true

2. ロケール列挙がすでに存在している場合は、それをtrueに設定します。

3. その他のbharosa.local.enum.locale.enabledプロパティが存在している場合は、それらをtrueに設定します。

bharosa.locale.enum.italian.enabled=true
bharosa.locale.enum.german.enabled=true
bharosa.locale.enum.french.enabled=true
bharosa.locale.enum.portuguese_br.enabled=true
bharosa.locale.enum.spanish.enabled=true
bharosa.locale.enum.korean.enabled=true
bharosa.locale.enum.chinese_cn.enabled=true
bharosa.locale.enum.chinese_tw.enabled=true
bharosa.locale.enum.japanese.enabled=true
bharosa.locale.enum.arabic.enabled=true
bharosa.locale.enum.czech.enabled=true
bharosa.locale.enum.danish.enabled=true
bharosa.locale.enum.dutch.enabled=true
bharosa.locale.enum.finnish.enabled=true
bharosa.locale.enum.greek.enabled=true
bharosa.locale.enum.hebrew.enabled=true
bharosa.locale.enum.hungarian.enabled=true
bharosa.locale.enum.norwegian.enabled=true
bharosa.locale.enum.polish.enabled=true
bharosa.locale.enum.portuguese.enabled=true
bharosa.locale.enum.romanian.enabled=true
bharosa.locale.enum.russian.enabled=true
bharosa.locale.enum.slovak.enabled=true
bharosa.locale.enum.swedish.enabled=true
bharosa.locale.enum.thai.enabled=true
bharosa.locale.enum.turkish.enabled=true

4. ロケール列挙の値と一致するようにbharosa.default.locale propertyを設定します。
bharosa.locale.enum.english=0であるため、bharosa.default.localeプロパティを0に設定します。

このプロパティが存在しない場合は、作成してください。

10.4 ロケールの略語と等価のカスタマイズ

Oracle Adaptive Access Managerは、ファジー・ロジックの概念をサポートします。ファジー・ロジックは、一般に略語として知られる事前構成済の単語等価セットに部分的に依存します。

Oracle Adaptive Access Managerの英語版には、数千個の英語の略語(および等価)が存在します。

その他のすべての言語では、インストーラは支給されている簡単な略語ファイルを拡張する必要があります。追加処理を行わないと、ファジー・ロジックの効果は減少します。

OAAMには、ロケール固有の略語ファイルが同梱されています。これらのファイルにはbharosa_auth_abbreviation_config_locale.propertiesという名前が付いており、localeはロケール文字列を表します。たとえば、スペイン語版のファイルはbharosa_auth_abbreviation_config_es.propertiesです。

このファイルは変更できません。省略形をカスタマイズするには、省略形の新規セットを使用して新規ファイルを作成する必要があります。このファイルは元のファイルより優先されるため、元のファイルのすべての省略形は無視されます。

1つのロケール(たとえば、日本語のみ)に対してローカライズするには、次の手順を実行します。

1. ロケール固有のファイルを、元のロケール別略語ファイルと同じ接頭辞を付けて作成します。たとえば、日本語の場合はAbbreviations_ja.propertiesとします。

2. このファイルをOAAM拡張共有ライブラリ(WEB-INF/classes)に追加します。

3. OAAMを使用して、プロパティbharosa.authenticator.AbbreviationFileNameの値を、拡張子フォルダにあるそのファイルの絶対パスWEB-INF/classes/Abbreviations_ja.propertiesに設定します。

複数のロケールに対してカスタマイズする場合は、次の手順を実行します。

1. それらのロケール固有のファイルを、元のロケール別略語ファイルと同じ接頭辞を付けて作成します。
次に例を示します。

スペイン語用/mydrive/IDM_ORACLE_HOME/oaam/conf/Abbreviations_es.properties

日本語用/mydrive/IDM_ORACLE_HOME/oaam/conf/Abbreviations_ja.properties

2. このファイルをOAAM拡張共有ライブラリ(WEB-INF/classes)に追加します。

3. OAAMを使用して、プロパティbharosa.authenticator.AbbreviationFileNameの値を、拡張子フォルダにあるそのファイルの絶対パスWEB-INF/classes/Abbreviations.propertiesに設定します。
エンド・ユーザーのブラウザのロケール設定によって実行時ロケールが決まるため、プロパティの値にロケール接頭辞は存在していません。

11 カスタム・フィンガープリント処理の設定

保護されたアプリケーションにアクセスする場合、Oracle Adaptive Access Managerではユーザーが使用するデバイスに関する情報が取得されます。この内容は、様々な手段で収集された多様なデータ・ポイントで構成されています。収集されたデータは、デバイスの一意のフィンガープリントにエンコードされます。

この章では、カスタム・デバイス・フィンガープリント処理の設定に必要な初期手順について説明します。

この章は次の項で構成されています:

- 第11.1項「即時利用可能なフィンガープリント・タイプ」

- 第11.2項「カスタム・フィンガープリント処理の設定」

11.1 即時利用可能なフィンガープリント・タイプ

即時利用可能なフィンガープリントには、次の2つのタイプがあります。

- フラッシュ

- アプレット

最も標準的なデプロイメントでは、デフォルトのOAAMフィンガープリント処理でクライアントの要件が満たされますが、カスタム・フィンガープリント処理を実行するようにOAAMを設定する必要が生じる場合もあります。カスタム・フィンガープリント処理の設定の詳細は、次の項を参照してください。

11.2 カスタム・フィンガープリント処理の設定

この章では、ユーザーが保護されているアプリケーションにアクセスするときに使用するデバイスの情報をOracle Adaptive Access Managerで取得できるように、フィンガープリント・タイプを作成する方法について説明します。フィンガープリント・タイプは、oaam_custom.propertiesに含まれています。即時利用可能ではないフィンガープリント・タイプが必要な場合は、デプロイメント時にこれらのタイプが組み込まれるようにoaam_custom.propertiesファイルを変更する必要があります。

1. oracle.oaam.extensions.warファイルのWEB-INF/classes/bharosa_propertiesディレクトリで、oaam_custom.propertiesファイルを開きます。

2. 取得するフィンガープリントの列挙を追加します。
フィンガープリント・タイプ列挙の例は、次のとおりです。

vcrypt.fingerprint.type.enum=Enum for fingerprint type
vcrypt.fingerprint.type.enum.browser=1
vcrypt.fingerprint.type.enum.browser.name=Browser
vcrypt.fingerprint.type.enum.browser.description=Browser
vcrypt.fingerprint.type.enum.browser.userAgent=userAgent
vcrypt.fingerprint.type.enum.browser.locallang=localLang
vcrypt.fingerprint.type.enum.browser.localcountry=localCountry
vcrypt.fingerprint.type.enum.browser.localvariant=localVariant
vcrypt.fingerprint.type.enum.browser.header_list=
locallang,localcountry,localvariant,userAgent
vcrypt.fingerprint.type.enum.browser.search_list=locallang,userAgent
vcrypt.fingerprint.type.enum.browser.result_list=locallang,userAgent
vcrypt.fingerprint.type.enum.browser.header_value_nv=t,true,f,false,en,English,
es,Spanish,de,German,it,Italian,ja,Japanese,fr,French,ko,Korean,
zh,Chinese,ar,Arabic,cs,Czech,da,Danish,nl,Dutch,fi,Finnish,el,Greek,
iw,Hebrew,hu,Hungarian,no,Norwegian,pl,Polish,pt,Portuguese,ro,Romanian,
ru,Russian,sk,Slovak,sv,Swedish,th,Thai,tr,Turkish,BR,Brazil

vcrypt.fingerprint.type.enum.flash=2
vcrypt.fingerprint.type.enum.flash.name=Flash
vcrypt.fingerprint.type.enum.flash.description=Flash
vcrypt.fingerprint.type.enum.flash.processor=
com.bharosa.uio.processor.device.FlashDeviceIdentificationProcessor
vcrypt.fingerprint.type.enum.flash.header_list=
avd,acc,a,ae,ev,ime,mp3,pr,sb,sp,sa,sv,tls,ve,deb,l,lfd,m,os,ar,pt,col,dp,r,v
vcrypt.fingerprint.type.enum.flash.search_list=deb,l,os,v
vcrypt.fingerprint.type.enum.flash.result_list=deb,l,os,v
vcrypt.fingerprint.type.enum.flash.header_name_nv=
avd,Audio/Video disabled by user,
acc,Has accessibility,a,Has audio,ae,Had audio encoder,ev,Embedded video,
ime, Has input method editor (IME) installed,mp3, Has MP3,
pr, Supports printer, sb, Supports screen broadcast applications,
sp, Supports playback on screen broadcast applications,
sa, Supports streaming audio, sv, Supports streaming video,
tls, Supports native SSL, ve, Contains video encoder,
deb, Debug version, l, Language, lfd, Is local file read disabled,
m, Manufacturer, os, Operating System, ar, Aspect ratio of screen,
pt, Player type, col, Is screen color,
dp, Dots-per-inch (DPI), r, Screen resolution, v, Flash version

#vcrypt.fingerprint.type.enum.flash.header_value_nv=t,true,f,false
vcrypt.fingerprint.type.enum.flash.header_value_nv=
t,true,f,false,en,English,es,Spanish,de,German,it,Italian,
ja,Japanese,fr,French,ko,Korean,zh,Chinese,ar,Arabic,
cs,Czech,da,Danish,nl,Dutch,fi,Finnish,el,Greek,
iw,Hebrew,hu,Hungarian,no,Norwegian,pl,Polish,pt,Portuguese,ro,Romanian,
ru,Russian,sk,Slovak,sv,Swedish,th,Thai,tr,Turkish,BR,Brazil

vcrypt.fingerprint.type.enum.flash.avd=Audio/Video disabled by user
vcrypt.fingerprint.type.enum.flash.acc=Has accessibility
vcrypt.fingerprint.type.enum.flash.a=Has audio
vcrypt.fingerprint.type.enum.flash.ae=Had audio encoder
vcrypt.fingerprint.type.enum.flash.ev=Embedded video
vcrypt.fingerprint.type.enum.flash.ime= Has input method editor (IME) installed
vcrypt.fingerprint.type.enum.flash.mp3= Has MP3
vcrypt.fingerprint.type.enum.flash.pr= Supports printer
vcrypt.fingerprint.type.enum.flash.sb= Supports screen broadcast applications
vcrypt.fingerprint.type.enum.flash.sp=
Supports playback on screen broadcast applications
vcrypt.fingerprint.type.enum.flash.sa= Supports streaming audio
vcrypt.fingerprint.type.enum.flash.sv= Supports streaming video
vcrypt.fingerprint.type.enum.flash.tls= Supports native SSL
vcrypt.fingerprint.type.enum.flash.ve= Contains video encoder
vcrypt.fingerprint.type.enum.flash.deb= Debug version
vcrypt.fingerprint.type.enum.flash.l= Language
vcrypt.fingerprint.type.enum.flash.lfd= Is local file read disabled
vcrypt.fingerprint.type.enum.flash.m= Manufacturer
vcrypt.fingerprint.type.enum.flash.os= Operating System
vcrypt.fingerprint.type.enum.flash.ar= Aspect ratio of screen
vcrypt.fingerprint.type.enum.flash.pt= Player type
vcrypt.fingerprint.type.enum.flash.col= Is screen color
vcrypt.fingerprint.type.enum.flash.dp= Dots-per-inch (DPI)
vcrypt.fingerprint.type.enum.flash.r= Screen resolution
vcrypt.fingerprint.type.enum.flash.v= Flash version

vcrypt.fingerprint.type.enum.monitordata=3
vcrypt.fingerprint.type.enum.monitordata.name=MonitorData
vcrypt.fingerprint.type.enum.monitordata.description=Monitor Data

vcrypt.fingerprint.type.enum.applet=999
vcrypt.fingerprint.type.enum.applet.name=Applet
vcrypt.fingerprint.type.enum.applet.description=Applet
vcrypt.fingerprint.type.enum.applet.processor=
com.bharosa.uio.processor.device.AppletDeviceIdentificationProcessor
vcrypt.fingerprint.type.enum.applet.header_list=
java.version,java.vendor,os.name,os.arch,os.version
vcrypt.fingerprint.type.enum.applet.header_name_nv=
java.version,Java Version,
java.vendor,Java Vendor Name,os.name,Operating System Name,
os.arch,Operating System Architecture,
os.version,Operating System Version

vcrypt.fingerprint.type.enum.applet.header_value_nv=t,true,f,false
vcrypt.fingerprint.type.enum.native_mobile=900
vcrypt.fingerprint.type.enum.native_mobile.name=Native Mobile
vcrypt.fingerprint.type.enum.native_mobile.description=
Native Mobile implementation using OIC
vcrypt.fingerprint.type.enum.native_mobile.processor=
com.bharosa.uio.processor.device.NativeMobileDeviceIdentificationProcessor
vcrypt.fingerprint.type.enum.native_mobile.header_list=
os.type,os.version,hw.imei,hw.mac_addr
vcrypt.fingerprint.type.enum.native_mobile.header_name_nv=
os.type,Operating System Type,os.version,Operating System Version,
hw.imei,Hardware IMEI Number,hw.mac_addr,Hardware Mac Address
vcrypt.fingerprint.type.enum.native_mobile.header_value_nv=t,true,f,false

3. プロパティbharosa.uio.default.device.identification.schemeを、取得する必要のあるフィンガープリントのタイプに設定します。
たとえば、デジタル・デバイスのフィンガープリント処理用のvcrypt.fingerprint.type.enum elementIdは、次のようになります。

bharosa.uio.default.device.identification.scheme=flash

12 ネイティブ統合でのフラッシュ・フィンガープリント処理

この章では、Oracle Adaptive Access Managerネイティブ統合内でのフラッシュ・フィンガープリント処理の詳細に焦点を当てています。

この章に記載したコード例はすべて、タスクの実行に必要なコールの概略を示したものです。したがって、完全な実装とは考えないでください。

注意:

この章では、読者がOracle Adaptive Access Managerのネイティブ統合とAPIに精通していることを前提としています。

この章は次の項で構成されています:

- 第12.1項「デバイスのフィンガープリント処理」

- 第12.2項「変数とパラメータの定義」

- 第12.3項「フラッシュ・フィンガープリント処理の実装」

- 第12.4項「ネイティブ統合を行うWebアプリケーションに組み込まれたフラッシュ・フィンガープリント処理」

12.1 デバイスのフィンガープリント処理

保護されたアプリケーションにアクセスする場合、Oracle Adaptive Access Managerではユーザーが使用するデバイスに関する情報が取得されます。この内容は、様々な手段で収集された多様なデータ・ポイントで構成されています。収集されたデータは、デバイスの一意のフィンガープリントにエンコードされます。

アクセス・リクエストでデバイスを使用する際は、Oracle Adaptive Access Managerでデバイスのフィンガープリントが精査されます。このフィンガープリントがその他の多様なデータとともに使用されることで、そのアクセス・リクエストに付随するリスクが判別されます。フィンガープリント・データの収集に使用するテクノロジとして、HTTPヘッダー、セキュアなCookie、共有フラッシュ・オブジェクトおよび動作プロファイリングがあります。

12.2 変数とパラメータの定義

表12-1に、フラッシュ・ムービーとアプリケーション間の相互作用におけるパラメータとレスポンス変数を示します。

表12-1 フラッシュ・ムービーのパラメータとレスポンス変数

パラメータ/レスポンス変数

使用方法

v

フラッシュ・ムービーからアプリケーションに送信されたHTTPリクエスト・パラメータとして使用します。これには、ユーザーが1回使用する生成済のCookie文字列が含まれています。また、この値はHTTPレスポンスで&v=<new value>としてフラッシュ・ムービーに返されます。

client

フラッシュ・ムービーからアプリケーションに送信されたHTTPリクエスト・パラメータとして使用します。これは、フィンガープリント処理を実行しているクライアントのタイプ(この場合はフラッシュ)を示しています。フラッシュ・ムービーからの予想値はvfcです。

fp

フラッシュ・ムービーからアプリケーションに送信されたHTTPリクエスト・パラメータとして使用します。この値には、フラッシュ・プレーヤがアクセスできるクライアント・マシンに関する情報が含まれています。

12.3 フラッシュ・フィンガープリント処理の実装

この項では、フラッシュ・フィンガープリント処理の様々な実装に関して説明します。

12.3.1 オプション1

オプション1は、ジャンプ・ページを使用してフィンガープリント処理に使用するフラッシュ・ムービーを組み込む標準的な実装です。オプション1では、フラッシュ・ムービーがユーザーの現在のフラッシュCookie値をサーバーに送信し、サーバーは1回のトランザクションで新しい値を使用して応答しています。

12.3.1.1 オプション1のフロー

図12-1に、オプション1のフローを示します。

図12-1 オプション1

1. ユーザーに対してユーザー名ページが表示されます。

2. ユーザーはユーザー名を送信します

1. アプリケーションはユーザーをロードします

2. アプリケーションはユーザーおよびHTTP情報を使用して、VCryptTracker.updateLogをコールします

3. ユーザーは、埋込みフラッシュ・ムービーが含まれているジャンプ・ページに送られます

1. フラッシュ・ムービーは、フラッシュ・フィンガープリント処理をトリガーするHTTPリクエストを作成します
i. サーバーはHTTPリクエストのパラメータvを取得して、セッションに格納します

ii. サーバーは、HTTPリクエストのパラメータclientを取得します

iii. サーバーは、HTTPリクエストのパラメータfpを取得します

iv. fpをVCryptServletUtil.getFlashFingerprint (client, fp)で解析します

v. ユーザー、HTTP Cookieおよびフラッシュ情報を使用してVCryptTracker.updateLogをコールします

vi. updateLogからCookieSetで返された新しいフラッシュCookieが、HTTPレスポンス("&v=" + cookieSet.getFlashCookie())でフラッシュ・ムービーに返されます

4. ユーザーは、ジャンプ・ページ待機期間後にパスワード・ページに送られます

1. 認証前ルールを実行します

5. ユーザーはパスワードを送信します

1. アプリケーションがパスワードを検証します

2. 認証後ルールを実行します

3. 認証結果を使用してVCryptTracker.updateAuthStatusをコールします

12.3.1.2 オプション1のコード例

この項では、オプション1のコード例を示しています。

public String flashFingerPrint(HttpServletRequest request) {
HttpSession session = request.getSession(true);
try {
String digitalCookie = request.getParameter("v");
String fpStr = request.getParameter("fp");
String client = request.getParameter("client");
String flashFingerprint =
VCryptServletUtil.getFlashFingerPrint(client, fpStr);
session.setAttribute("v", digitalCookie);
session.setAttribute("fp", flashFingerprint);

VCryptAuthUser clientUser = (VCryptAuthUser)
session.getAttribute("clientUser");

if (clientUser == null) {
// User not found in session
return "";
}

String loginId = clientUser.getLoginId();
String customerId = clientUser.getCustomerId();
String groupId = clientUser.getCustomerGroupId();
int clientType = UserDefEnum.getElementValue
(IBharosaConstants.ENUM_CLIENT_TYPE_ID, FLASH_CLIENT_ENUM);

cookieSet = updateLog(request, loginId, customerId, groupId,
clientType, authResult);

session.setAttrubute("cookieSet");
return cookieSet.getFlashCookie();
} catch (Exception e) {
// Handle fingerprinting error
}
return "";
} // flashFingerPrint

12.3.2 オプション2

オプション2は、ユーザー・エクスペリエンスからジャンプ・ページが削除された、より新しく、より合理的なユーザー・エクスペリエンスです。これを実行するために、フラッシュ・ムービーがユーザー名ページとパスワード・ページの両方に組み込まれています。

最初のムービー(ユーザー名ページ)は、フラッシュCookieとフィンガープリントの既存値の受入れに使用しますが、新規の値は設定されません。ユーザーがロードされてOAAMセッションが作成された後で2番目のムービー(パスワード・ページ)が表示され、セッションの新規の値がクライアント・マシンに設定されます。

12.3.2.1 オプション2のフロー

図12-2に、オプション2のフローを表示します。

図12-2 オプション2

1. ユーザーに対して、フラッシュ・ムービーを埋め込んだユーザー名ページが表示されます。

1. フラッシュ・ムービーは、フラッシュ・フィンガープリント処理をトリガーするHTTPリクエストを作成します
i. サーバーはHTTPリクエストのパラメータvを取得して、セッションに格納します

ii. サーバーは、HTTPリクエストのパラメータclientを取得します

iii. サーバーは、HTTPリクエストのパラメータfpを取得します

iv. fpをVCryptServletUtil.getFlashFingerprint(client, fp)で解析して、結果をユーザー・セッションに格納します

v. 取得された値vが、HTTPレスポンス("&v=" + cookieSet.getFlashCookie())でフラッシュ・ムービーに返されます

2. ユーザーはユーザー名を送信します

1. アプリケーションはユーザーをロードします

2. 認証前ルールを実行します

3. ユーザー、HTTP Cookie、およびフラッシュの値を使用してVCryptTracker.updateLogをコールします

3. ユーザーは、フラッシュ・ムービーが埋め込まれているパスワード・ページに送られます

1. フラッシュ・ムービーは、フラッシュ・フィンガープリント処理をトリガーするHTTPリクエストを作成します
i. サーバーはすでに、前のフラッシュ・リクエストから値を取得しています

ii. UpdateLogコールにより新規に生成された値がフラッシュ・ムービーに返されます

4. ユーザーはパスワードを送信します

1. アプリケーションがパスワードを検証します

2. 認証後ルールを実行します

3. 認証結果を使用してVCryptTracker.updateAuthStatusをコールします

12.3.2.2 オプション2のコード例

この項では、オプション2のコード例を示しています。

public String flashFingerPrint(HttpServletRequest request) {
HttpSession session = request.getSession(true);
try {
CookieSet cookieSet = (CookieSet)session.getAttribute("cookieSet");
if (cookieSet == null) {
String digitalCookie = request.getParameter("v");
String fpStr = request.getParameter("fp");
String client = request.getParameter("client");
String flashFingerprint =
VCryptServletUtil.getFlashFingerPrint(client, fpStr);
session.setAttribute("v", digitalCookie);
session.setAttribute("fp", flashFingerprint);
} else {
// finger printing already occurred, using previously
// generated cookie set
}
return cookieSet.getFlashCookie();
} catch (Exception e) {
// Handle fingerprinting error
}
return "";
} // flashFingerPrint

12.3.3 オプション3

オプション3はユーザー名とパスワードに1つのページを使用する実装であり(仮想認証デバイスは使用しません)、ジャンプ・ページを使用してフィンガープリント処理用にフラッシュ・ムービーを組み込みます。この場合は、フラッシュ・ムービーがユーザーの現在のフラッシュCookie値をサーバーに送信し、サーバーは1回のトランザクションで新しい値を使用して応答します。

12.3.3.1 オプション3のフロー

図12-3に、オプション3のフローを示します。

図12-3 オプション3のフロー

1. ユーザーに対して1つのユーザー名とパスワードのページが表示されます。

2. ユーザーはユーザー名とパスワードを送信します

1. アプリケーションはユーザーをロードします

2. アプリケーションがパスワードを検証します

3. ユーザー、認証結果、およびHTTP Cookieを使用してVCryptTracker.updateLogをコールします

3. ユーザーは、埋込みフラッシュ・ムービーが含まれているジャンプ・ページに送られます

1. フラッシュ・ムービーは、フラッシュ・フィンガープリント処理をトリガーするHTTPリクエストを作成します
i. サーバーはHTTPリクエストのパラメータvを取得して、セッションに格納します

ii. サーバーは、HTTPリクエストのパラメータclientを取得します

iii. サーバーは、HTTPリクエストのパラメータfpを取得します

iv. fpをVCryptServletUtil.getFlashFingerprint(client, fp)で解析します

v. ユーザー、HTTP Cookie、およびフラッシュ情報を使用してVCryptTracker.updateLogをコールします

vi. updateLogからCookieSetで返された新しいフラッシュCookieが、HTTPレスポンス("&v=" + cookieSet.getFlashCookie())でフラッシュ・ムービーに返されます

4. ユーザーは、ジャンプ・ページ待機期間後にアプリケーションで続行します

1. 認証後ルールを実行します

2. 認証結果を使用してVCryptTracker.updateAuthStatusをコールします

12.3.3.2 オプション3のコード例

この項では、オプション3のコード例を示しています。

public String flashFingerPrint(HttpServletRequest request) {
HttpSession session = request.getSession(true);
try {
String digitalCookie = request.getParameter("v");
String fpStr = request.getParameter("fp");
String client = request.getParameter("client");
String flashFingerprint =
VCryptServletUtil.getFlashFingerPrint(client, fpStr);
session.setAttribute("v", digitalCookie);
session.setAttribute("fp", flashFingerprint);

VCryptAuthUser clientUser =
(VCryptAuthUser) session.getAttribute("clientUser");

if (clientUser == null) {
// User not found in session
return "";
}

String loginId = clientUser.getLoginId();
String customerId = clientUser.getCustomerId();
String groupId = clientUser.getCustomerGroupId();
int clientType =
UserDefEnum.getElementValue(IBharosaConstants.ENUM_CLIENT_TYPE_ID,
FLASH_CLIENT_ENUM);

cookieSet = updateLog(request, loginId, customerId, groupId,
clientType, authResult);

session.setAttrubute("cookieSet");
return cookieSet.getFlashCookie();
} catch (Exception e) {
// Handle fingerprinting error
}
return "";
} // flashFingerPrint

12.3.3.3 共通の更新

実装では、updateLogコールを実行するために、次のようなメソッドが使用されます。

protected CookieSet updateLog(HttpServletRequest request,
String loginId, String userId, String groupId,
int clientType, int authStatus) throws
BharosaProxyException {
HttpSession session = request.getSession(tru);

String requestId = (String) session.getAttribute("requestId");
String remoteIPAddr = request.getRemoteAddress();
String remoteHost = request.getRemoteHost();

String secureCookie =
VCryptServletTrackerUtil.getSecureCookie(request);
String secureClientVersion = "1.0";

Object[] fingerPrintInfo =
VCryptServletUtil.getBrowserFingerPrint(request);
int fingerPrintType = fingerPrintInfo == null ? 0 :
((Integer)fingerPrintInfo[0]).intValue();
String fingerPrint = fingerPrintInfo == null ? "" :
(String)fingerPrintInfo[1];

int fingerPrintType2 = VCryptServletUtil.flashFPType.intValue();
String fingerPrint2 = (String) session.getAttribute("fp");
String digitalCookie = (String) session.getAttribute("v");

CookieSet cookieSet = (CookieSet)
session.getAttribute("cookieSet");

if (secureCookie == null && cookieSet != null) {
secureCookie = cookieSet.getSecureCookie();
}

if (digitalCookie == null && cookieSet != null) {
digitalCookie = cookieSet.getFlashCookie();
}

boolean isSecure = false;

VCryptTracker vTracker = VCryptTrackerUtil.getVCryptTrackerInstance();
cookieSet = vTracker.updateLog(requestId,
remoteIPAddr, remoteHost, secureCookie,
digitalCookie, groupId, userId, loginId,
isSecure, authStatus, clientType,
secureClientVersion, fingerPrintType,
fingerPrint, fingerPrintType2,
fingerPrint2);

return cookieSet;
}

12.4 ネイティブ統合を行うWebアプリケーションに組み込まれたフラッシュ・フィンガープリント処理

フラッシュ・フィンガープリント処理の実装手順は、次のとおりです。

ネイティブ統合のOAAMサンプル・アプリケーションでは、dcPurpというパラメータを使用してフラッシュ・ムービーをhandleFlash.jspにポストします。

dcPurpに使用可能な値は次の3つです。

- sample: これはhandleFlash.jspにポストします。

- native: これはdcにポストします。このdcは、フィンガープリントのポストを受け入れるためにJavaサーブレットとして構成されます。この目的では、OAAMクラスのCookieManager.javaを使用できます。

- uio: これはflashFingerprint.doにポストします。

- .net: これはCookieManager.aspxにポストします。

dcPurpに対して値が渡されない場合は、dcが使用されます。

次のサンプル・コードは参照用です。

<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
width="1" height="1" id="flash" align="middle">
<param name="allowScriptAccess" value="sameDomain"/>
<param name="movie" value="<%= redirect_flashSrc %>"/>
<param name="quality" value="low"/>
<param name="bgcolor" value="#ffffff"/>
<param name="FlashVars" value="dcPurp=sample"/>
<embed src="<%= redirect_flashSrc %>" quality="low"
bgcolor="#ffffff" FlashVars="dcPurp=sample" width="1" height="1"
name="flash" align="middle"
allowScriptAccess= "sameDomain"
type="application/x-shockwave-flash"/>
</object>

FlashVarsのキー/値ペアであるdcPurp=sampleは、フラッシュ・ムービーをhandleFlash.jspにポストする必要があることを示します。

13 デバイス識別の拡張

この章では、標準的なデプロイメントでのデバイス識別の拡張方法について説明します。内容は次のとおりです。

- 第13.1項「デバイス識別とは」

- 第13.2項「デバイス識別を拡張するタイミング」

13.1 デバイス識別とは

デバイスとは、ユーザーがある場所からのログインに使用するコンピュータ、PDA、携帯電話、キオスクなどです。デバイスIDは、ログイン・セッションに使用する内部Oracle Adaptive Access Manager識別子です。この項では、デバイスを識別し、それにデバイスIDを割り当てるプロセスについて説明します。

このプロセスは、次の3つのステージで構成されます。

- データの収集

- データの処理

- データの格納

13.1.1 データ収集

デバイス識別は、カスタマが使用するデバイスを認識するメカニズムです。フィンガープリント詳細は、デバイスの識別、それがセキュアであるかどうかの確認および認証またはトランザクションのリスク・レベルの特定に役立ちます。ログイン・プロセス中に、ブラウザ・タイプ、ブラウザ・ヘッダー、オペレーティング・システム・タイプ、ロケールなどのデータがデバイスのフィンガープリントから収集されます。

データには、セキュアおよびデジタルという2つのカテゴリがあります。これらの各カテゴリ内にはフィンガープリントとCookieが存在します。Oracle Adaptive Access Managerでは、2つのタイプのCookieを使用してデバイス識別を実行します。1つはセキュアなCookie (ブラウザCookieとも呼ばれます)であり、もう1つはデジタルCookie (Flash Cookieとも呼ばれます)です。

- セキュアなデータはユーザーのブラウザから収集されます。このデータには、ユーザー・エージェント文字列およびHTTP Cookie値が含まれます。ユーザー・エージェントはセキュアなフィンガープリントとして使用されます。HTTP Cookie値は1回かぎり使用される一意のCookieであり、ユーザーがログインするたびに設定されます。このCookie値はログイン時にユーザーのブラウザから取得されます。

- デジタル・データは、ユーザーのAdobe Flashのインストールから収集されます。このデータにはFlashシステム機能データの配列およびFlashローカル共有オブジェクト(LSO)が含まれます。Flash機能データは、Flashシステム機能を表すデジタル・フィンガープリントとして使用されます。LSOには1回かぎり使用される一意の値が含まれ、この値はユーザーがログインするたびに設定されます。この値は、ログイン時に実行するフラッシュ・オブジェクトを使用して取得されます。

データ収集フローの例は、次のとおりです。

1. ユーザーがユーザー名を入力します。

2. ログイン・ジャンプ・ページが表示されます。この2番目のログイン・ページは、フラッシュCookieとセキュアCookieを取得し、ユーザー・デバイスのフィンガープリントを処理するための一時ページです。

3. 認証前チェックポイント。認証前ルールは、ユーザーが認証される前に実行されます。認証前チェックポイントによって返される共通の値は、許可とブロックです。

4. AuthentiPadチェックポイント。このステージでは、使用する仮想認証デバイスを判別します。

5. パスワード・ページが表示されます。

13.1.2 データ処理

このデータを収集した後、OAAMサーバーでは、デバイスのフィンガープリント・データを処理し、このデバイスが既知のものかどうかを判断する必要があります。Oracle Adaptive Access Managerは、デバイスのフィンガープリントを開発するために1つの要素にのみ依存しているわけではありません。永続Cookieが無効になっている場合でも、Oracle Adaptive Access Managerでは他の情報を使用してデバイスが識別されます。たとえば、データ・ポイントが使用できない場合でも、システムでは他のオブジェクト(セキュアCookie、フラッシュCookie、HTTPヘッダー、Real Media、QuickTimeなど)を利用して厳密なセキュリティを実現しています。データ・ポイントの有無に基づいて、デバイスが新規か、または既存のものであるかが判別されます。

デバイスのフィンガープリント処理によってユーザー・セッションごとにフィンガープリントが生成されます。このフィンガープリントはデバイスごとに一意であり、アクセスするたびに別の一意のフィンガープリントに置換されます。

フィンガープリントのデータと一致するデバイスがOAAMデータベースに見つからない場合は、デバイスIDが生成されます。デバイス・フィンガープリントのデータに基づいて既存デバイスを検索するプロセスでは、回転するCookieの値とフィンガープリントが一致しているデバイスの検索が行われます。OAAMでは、フィンガープリント・データに異なる重みを付けています。重み付けを大別すると、フラッシュCookie、フラッシュ・フィンガープリント、セキュアCookie、セキュア・フィンガープリントに分けられます。基準に一致するデバイスが見つかった場合、新規デバイスIDは生成されません。

このプロセスは、デバイス識別チェックポイントでポリシーを作成することによって、拡張または変更できます。このチェックポイントをデバイスのフィンガープリント処理中に実行して、デバイス識別に影響する、処理対象の追加ルールでリスク評価を行うこともできます。デバイス識別のチェックポイント評価で計算されるリスク・スコアは、他のチェックポイントのポリシーで構成されたルールの事前条件で、デバイス・リスクの程度として使用されます。

デバイス・リスクの程度により、識別されるデバイスの確実性を指定します。これは、通常のルールの事前条件として標準です。たとえば、デバイスの程度が0の場合は完全一致であり、500の場合は類似デバイス、スコアが1000の場合は別のデバイスとなります。

13.1.3 データ・ストレージ

デバイスにIDが付与されると、新しい回転するCookieの値が生成および設定されます。セキュアCookieはHTTP Cookieとして設定され、デジタルCookieはフラッシュ・オブジェクトによってFlash LSOとして設定されます。デバイス識別プロセス中にユーザーのコンピュータに格納される値は、これらの2つの値のみとなります。

13.2 デバイス識別を拡張するタイミング

多くの標準的なデプロイメントでは、即時利用可能なデバイス識別によってクライアントの要件が満たされますが、そのプロセスを拡張して、追加情報をフィンガープリントに含める機能が必要になることがあります。即時利用可能なデバイス識別では、ブラウザとOAAMフラッシュ・ムービーからのデータを使用します。次に、デバイス識別の拡張が必要と思われる標準的なシナリオを示します。

- クライアント・サイドではFlashをサポートしていないため、OAAMフラッシュ・ムービーを使用してクライアントの詳細を取得できません。たとえば、iPhone、iPadなどがあります。

- ブラウザの内部で実行可能な非フラッシュ拡張を使用して、より厳密なデバイス識別データをクライアントから抽出する必要があります。

OAAMの11.1.1.5リリース以降、デバイス識別の拡張に使用でき、ネイティブ統合および非ネイティブ統合の両方で実装可能なフレームワークが用意されています。このフレームワークは、クライアント・サイドの拡張とOAAMサーバーのデバイス識別拡張に分割されています。

13.2.1 前提条件

Oracle Adaptive Access Managerでデバイス識別拡張タスクを実行する際の前提条件を、次のリストに示します。

- カスタム・デバイス識別拡張はJavaを使用して開発する必要があるため、Javaプログラミングの知識を有している必要があります。

- クライアント・デバイスに関して収集する情報と、その情報収集に使用するテクノロジを決定しておく必要があります。考慮の対象となる代表的なテクノロジは、アプレット、JavaScriptなどです。

- OAAM拡張共有ライブラリの開発とデプロイのプロセスについて理解しておく必要があります。OAAM拡張共有ライブラリの詳細は、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。

13.2.2 カスタム・デバイス識別拡張の開発

カスタム・デバイス識別拡張は、Oracle Adaptive Access Manager提供の即時利用可能なデバイス識別を拡張するソフトウェアです。

13.2.2.1 クライアント・サイド拡張の実装

クライアント・ブラウザで実行可能なクライアント・サイド拡張の実装では、適切なテクノロジを使用して拡張をコード化します。

クライアント・サイド拡張は、次の要件を満たす場合は任意のテクノロジで実装できます。

- Webページを変更しなくても、クライアント・サイドのブラウザで実行できます。これは非表示であり、ユーザー・コントロール・フローを変更することはありません。
クライアント・サイド拡張の実装に選択したテクノロジは、ユーザーのブラウザのコンテキストで実行する必要があります。標準的な選択肢として、Flash、JavaScript、Javaアプレットなどのテクノロジがあります。

- OAAMサーバーとの通信が可能であり、HTTPプロトコルを使用してデータをポストできます。
標準統合でHTTP POSTメソッドを使用している場合は、フィンガープリント・データと回転するCookieをOAAMサーバーに送信する必要があります。

- 特に重要: データのポスト中に既存のOAAMのHTTPセッションが使用できます。これは、デバイス識別が適切に機能するためには特に重要です。
フィンガープリント処理データをユーザーのログインと関連付けるために、サーバーに送信されるデータはユーザーのセッションのコンテキストで送信する必要があります。これを実行するには、有効なJSESSIONIDが存在している必要があります。

- 拡張によって収集されるデータ/値のリストによって、クライアント・デバイスが一意に識別されます。
一般に、ユーザーのデバイスで課せられるデータ制約を考慮すると、OAAMにより収集されるフィンガープリントはできるかぎり一意である必要があります。デバイス識別の拡張中は、ユーザーのデバイスを一意に識別する追加データを収集する最大の機会です。

- 拡張によってCookie等価を取得し、クライアント・コンピュータに格納できます。
1回かぎりのCookieの回転という概念は、デバイス・フィンガープリント処理プロセスの中核をなすものです。デバイス識別では、OAAMサーバーにより拡張に指定された値を格納および取得する機能をサポートしている必要があります。

- 拡張では、HTTPポストを使用して、OAAMサーバー上のflashFingerprint.do URLに次のパラメータを送信できます。
注意: この要件は、標準のOAAM実装を使用している場合にのみ該当します。

表13-1 flashFingerprint.do URLに対するパラメータ

パラメータの名前

説明

client

クライアント拡張の名前。拡張タイプを示す定数値。

fp

クライアント・サイドを識別するすべての名前と値のペアが含まれている連結文字列。名前と値のペアは&を使用して連結され、名前と値は=で区切られます。

例: os_nameとos_versionが拡張によって収集される場合、fp文字列の値はos_name=windows&os_version=7になります。

<as determined by the implementation>

クライアント拡張により格納/保持されるCookie等価値を送信します。

13.2.2.2 カスタム・デバイス識別拡張に関連するプロパティのOAAM拡張共有ライブラリへの追加

静的な値は、新規の拡張を認識できるようにOAAMサーバー内で定義する必要のあるプロパティに関連しています。

カスタム・フィンガープリント・タイプを作成するには、次の手順を実行します。

1. OAAM拡張共有ライブラリWARのoaam_custom.propertiesファイルを開きます。

2. 次のプロパティを、列挙要素としてvcrypt.fingerprint.type.enumに追加します。
注意: extension-nameを、拡張を表す文字列に置換します。flashとbrowserはOAAM製品ですでに使用されているため、これらの文字列は使用しないでください。

表13-2 vcrypt.fingerprint.type.enumの要素

プロパティ名

値の説明

vcrypt.fingerprint.type.enum.extension-name

100を超える整数値

vcrypt.fingerprint.type.enum. extension-name.name

拡張を表す名前

vcrypt.fingerprint.type.enum. extension-name.description

拡張の説明

vcrypt.fingerprint.type.enum. extension-name.processor

サーバー・サイドにデバイス識別ロジックを実装するプロセッサ・クラスの完全修飾されたJavaクラス名。このクラスの実装方法の詳細は、次の項を参照してください。

vcrypt.fingerprint.type.enum. extension-name.header_list

クライアント・サイドの拡張により収集されるデータのカンマ区切りリスト。

vcrypt.fingerprint.type.enum. extension-name.header_name_nv

データおよびデータの読取り可能な名前のカンマ区切りリスト。

vcrypt.fingerprint.type.enum. extension-name. header_value_nv

値と値の読取り可能な文字列とのマッピングのカンマ区切りリスト。

bharosa.uio.default.device.identification.scheme

extension-name

注意: OAAMでカスタム・デバイス認証を使用するために非常に重要です。

3. フィンガープリント・スキームをフィンガープリント・タイプの列挙要素ID/キーに設定します。
たとえば、次のようになります。

bharosa.uio.default.device.identification.scheme=flash

例

次のフラッシュ・フィンガープリント・タイプを例として示します。

vcrypt.fingerprint.type.enum.flash=2
vcrypt.fingerprint.type.enum.flash.name=Flash
vcrypt.fingerprint.type.enum.flash.description=Flash
vcrypt.fingerprint.type.enum.flash.processor=
com.bharosa.uio.processor.device.FlashDeviceIdentificationProcessor
vcrypt.fingerprint.type.enum.flash.header_list=
avd,acc,a,ae,ev,ime,mp3,pr,sb,sp,sa,sv,tls,ve,deb,l,lfd,m,os,ar,pt,col,dp,r,v
vcrypt.fingerprint.type.enum.flash.search_list=deb,l,os,v
vcrypt.fingerprint.type.enum.flash.result_list=deb,l,os,v
vcrypt.fingerprint.type.enum.flash.header_name_nv=
avd,Audio/Video disabled by user,acc,Has accessibility,
a,Has audio,ae,Had audio encoder,ev,Embedded video,
ime, Has input method editor (IME) installed,
mp3, Has MP3, pr, Supports printer,
sb, Supports screen broadcast applications,
sp, Supports playback on screen broadcast applications,
sa, Supports streaming audio,
sv, Supports streaming video, tls, Supports native SSL,
ve, Contains video encoder, deb, Debug version, l, Language, lfd,
Is local file read disabled, m, Manufacturer, os, Operating System,
ar, Aspect ratio of screen, pt, Player type, col, Is screen color,
dp, Dots-per-inch (DPI), r, Screen resolution, v, Flash version
#vcrypt.fingerprint.type.enum.flash.header_value_nv=t,true,f,false

vcrypt.fingerprint.type.enum.flash.header_value_nv=
t,true,f,false,en,English,es,Spanish,de,German,it,Italian,ja,Japanese,
fr,French,ko,Korean,zh,Chinese,ar,Arabic,cs,Czech,
da,Danish,nl,Dutch,fi,Finnish,el,Greek,iw,Hebrew,hu,Hungarian,
no,Norwegian,pl,Polish,pt,Portuguese,ro,Romanian,ru,Russian,
sk,Slovak,sv,Swedish,th,Thai,tr,Turkish,BR,Brazil

13.2.2.3 DeviceIdentification拡張クラスの拡張/実装

DeviceIdentification拡張クラス、com.bharosa.uio.processor.device.DeviceIdentificationProcessorBaseを拡張し、この項で説明するメソッドを実装します。サーバー・サイドの拡張により、必要なメソッドがすべて拡張されます。

13.2.2.3.1 getPlugInHTML

public String getPlugInHTML();

実装により、ログイン・ページに埋め込める有効な拡張HTMLが返されます。このHTMLでは、サポートしているテクノロジがクライアントで使用できなかったり、無効になっている場合に、例外を処理できる必要があります。

次に、拡張HTMLの例を示します。

<applet alt="Browser has Java disabled" name="OAAMDeviceIdentifier" width="0"
height="0"
code="com.bharosa.uio.processor.device.SampleAppletDeviceIdentifierClient"
codebase="applet"
archive="oaam_device_sample_applet.jar">
</applet>

注意: このメソッドは、ユーザーがログイン・ページに移動したときにoaamLoginPage.jspによりコールされます。

13.2.2.3.2 getFingerPrint

public String getFingerPrint();

このメソッドにより、拡張によって送信されたデータを使用してクライアント・デバイスを識別する、一意のフィンガープリントを作成するロジックが実装されます。

このメソッドは、クライアント・サイドの拡張からデバイス識別データがOAAMサーバーに送信されるときにコールされます。

このメソッドは、UIOContext.getCurrentInstance().getRequestをコールしてHttpServletRequestオブジェクトへのハンドルを取得し、クライアント拡張により送信されたデータを読み取ります。

前の項で説明したように、クライアント拡張は、データ・ポイントのリストをfpリクエスト・パラメータの値として1つの文字列で送信します。

このクラスは、この文字列をトークン化してデータ・ポイントとその値のリストを判別します。

13.2.2.3.3 getDigitalCookie

public String getDigitalCookie();

実装により、クライアント拡張から送信されたデジタルCookieが返されます。クライアントとサーバーでは、デジタルCookieを示すHttpパラメータが指定されます。

このメソッドは、UIOContext.getCurrentInstance().getRequestをコールしてHttpServletRequestオブジェクトへのハンドルを取得し、クライアント拡張により送信されたデータを読み取ります。

13.2.2.3.4 getClientDataMap

public Map getClientDataMap(HttpServletRequest request);

実装により、リクエストからデータが読み込まれ、ロギングまたは監査の目的で使用できるマップに格納されます。

13.2.3 相互作用の概要

次に、デバイス識別拡張の動作と、OAAMサーバーとの相互作用の概要を示します。

1. ユーザーは、OAAMサーバー上のOAAMユーザー・ログイン・ページに移動します。

2. OAAMサーバーは、デバイス識別構成を使用して、デバイス識別拡張クラスを適切にインスタンス化します。さらに、拡張クラスに、ユーザー・ログイン・ページに埋め込む必要のあるHTMLを要求します。OAAMサーバーは、ユーザー・ログイン・ページをデバイス識別拡張HTMLとともに返します。

3. ログイン・ページがレンダリングされると、クライアント・ベースの拡張がアクティブになり、デバイスに関する情報が収集されます。

4. クライアント拡張は、収集されたデータをOAAMサーバー上のデバイス識別URLに送信します。

5. OAAMサーバーはデバイス識別拡張をコールして、クライアント拡張から収集したデータに基づき、フィンガープリントを取得します。

6. さらに、フィンガープリントが既存のデバイスに対応しているかどうかを確認します。対応していない場合は、デバイスを新規に作成して、そのデバイスにフィンガープリントを関連付けます。

7. OAAMサーバーはデバイス識別拡張をコールして、デジタルCookieを取得します。デジタルCookieが存在しない場合は、新規に作成されます。

8. デジタルCookieがクライアント拡張に返されて、クライアント・システムに格納されます。

9. ユーザーIDを入力すると、デジタルCookieまたはブラウザCookie、またはその両方を使用して、ユーザー・リクエストがデバイスに関連付けられます。

10. 認証後に(成否にかかわらず)、ユーザー・リクエストが認証結果で更新されます。

11. 今後のログインで同じデバイスを使用する場合は、フィンガープリント処理をしなくても、デジタルCookieを使用してデバイスを検索できます。

13.2.4 コンパイル、アセンブルおよびデプロイ

カスタム・デバイス認証拡張クラスをコンパイルし、OAAM拡張共有ライブラリをアセンブルします。OAAM拡張共有ライブラリのデプロイ手順については、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。

13.2.5 拡張の実装に関する重要な注意

拡張を実装する際、次の点に留意してください。

- カスタム・デバイス識別クラスによってクライアント・サイド拡張のアクティブ化に必要な有効なHTMLが出力されることを確認します。

- クライアント・サイド拡張が、既存のHTTPセッションを使用してOAAMサーバーにデータをポストすることを確認します。

14 デバイス登録の有効化

デバイス登録により、ユーザーはログインしているコンピュータ、PDA、携帯電話、またはその他のデバイスに安全なデバイスであること確証するフラグを付けることができます。

そのデバイスは、ユーザーのプロファイルに登録済デバイスとして追加されます。

この章では、次の内容を説明します。

- 第14.1項「ネイティブ統合でのデバイス登録の有効化」

- 第14.2項「即時利用可能なデバイス登録の有効化」

- 第14.3項「デバイス情報を使用するポリシーの作成」

- 第14.4項「デバイス登録をリセットするCSR」

14.1 ネイティブ統合でのデバイス登録の有効化

ネイティブ統合でデバイス登録を有効にするには、次の手順を実行します。

1. bharosa.tracker.send.devideIdをtrueに設定して、デバイスIDを取得できるようにします。

2. 次のAPIを直接コールします。

- handleTrackerRequest

- updateLog

- markDeviceSafe

- IsDeviceMarkedSafe

- clearSafeDeviceList

- processRules

14.2 即時利用可能なデバイス登録の有効化

Oracle Adaptive Access Managerの即時利用可能な機能で、ユーザーのデバイスをすべてのアプリケーションに登録できるようにデバイス登録を有効化するには、次の手順を実行します。

ユーザーに対してデバイス登録オプションを有効にするには、次のプロパティをoaam_custom.propertiesに追加します。

プロパティ

説明

bharosa.uio.default.register.questions.registerdevice.enabled

デバイス登録をチャレンジ質問登録ページに追加します。

trueに設定します。

bharosa.uio.default.register.userinfo.registerdevice.enabled

デバイス登録を「連絡先情報」の登録ページに追加します。

trueに設定します。

bharosa.uio.default.registerdevice.enabled

デバイス登録を有効化します。

trueに設定します。

注意:

この機能をアプリケーション別に有効化するには、前のそれぞれのプロパティ名でdefaultを適切なappIdに置換します。

「ユーザー・プリファレンス」からのデバイス・オプションの登録解除を有効化するには、次のプロパティを追加します。

プロパティ

説明

bharosa.uio.default.userpreferences.unregister.this.enabled

ユーザーがユーザー・プリファレンスで現在のデバイスを登録解除できるようにします。

trueに設定します。

bharosa.uio.default.userpreferences.unregister.all.enabled=true

ユーザーがユーザー・プリファレンスですべてのデバイスを登録解除できるようにします。

trueに設定します。

これらのプロパティを設定すると、ユーザーはOAAMサーバー上のユーザー・プリファレンスでデバイスを登録することを選択できます。

14.3 デバイス情報を使用するポリシーの作成

一度機能を有効化すると、そのユーザーのデバイスに関する情報が収集されます。収集している情報を利用するには、ポリシーを作成し、それを適切に構成する必要があります。たとえば、登録済デバイスの1つからロギングしていないユーザーへのチャレンジ・ルールを指定したポリシーを作成できます。

14.4 デバイス登録をリセットするCSR

ユーザーのすべてのデバイスを登録解除するカスタマ・リセット・アクションは、CSRタイプ・ケースで使用できます。「デバイス登録解除」アクションにより、すべての登録済デバイスがユーザーのプロファイルから削除されます。これらのアクションは、OAAMサーバーにあるユーザー・プリファレンスでも使用できます。

第IV部

アプリケーションの統合

この部の構成は、次のとおりです。

- 第15章「トランザクションに対するクライアント・アプリケーションとOAAMとの統合」

- 第16章「すべての場所でのOTP実装」

- 第17章「モバイル・アプリケーションとOAAMとの統合」

- 第18章「Juniper Networks Secure Access (SA)とOAAMの統合」

- 第19章「Java Message Serviceキュー(JMSQ)の統合」

15 トランザクションに対するクライアント・アプリケーションとOAAMとの統合

Oracle Adaptive Access Managerでは、不正および誤用を防ぐために、トランザクションに関連するリスクをリアルタイムで評価できます。正常ログイン後に監視が必要となるユーザー・アクティビティは、トランザクションと呼ばれます。

この章では、トランザクションのリスク分析に対応するネイティブ・クライアント・アプリケーションとOAAMとの統合について説明します。この章の内容は次のとおりです。

- 第15.1項「トランザクションの例」

- 第15.2項「トランザクション・フローについて」

- 第15.3項「ネイティブ・クライアント・アプリケーションとOAAMとの統合に必要な高度な手順

- 第15.4項「OAAMの設定と構成」

- 第15.5項「クライアントの設定」

- 第15.6項「エンティティとトランザクションのAPI」

- 第15.7項「ランタイム・データ分析」

- 第15.8項「トランザクションおよびエンティティ・データのターゲット・パージ」

15.1 トランザクションの例

トランザクションの例として、購入者がインターネットを通して書籍を購入するe-commerceトランザクションを取り上げます。John Doeはラップトップにログオンし、「Bigbookemporium.com」インターネット・サイトにアクセスして、電子検索を実行します。Johnが目的の書籍を選択すると、Bigbookemporium.comで購入価格が表示されます。チェックアウトする際に、Johnは次の情報を入力してクレジット・カードによる支払いを行います。

- トランザクションの金額

- クレジット・カード・タイプ

- クレジット・カード番号

- クレジット・カード有効期限

- 購入者の姓名

- 購入者の請求先住所

15.2 トランザクション・フローについて

図15-1に、OAAMサーバーがリスクに関するクライアント・トランザクションを処理するときのトランザクション・フローを示します。数字は、図中の数字に対応しています。

図15-1 OAAMサーバーを追加した場合の標準的なトランザクション・フロー

1. Webサイトで、カスタマがトランザクションを発行します。

2. Create Transaction OAAM APIをトランザクション・データとともに起動して、トランザクションをOAAMデータベースに作成します。

3. OAAM APIは、トランザクション作成のステータスを返します。

4. ビジネス要件に基づき、Run Rules APIを起動してカスタマのトランザクションに関連するリスク/不正行為を分析します。

5. OAAMサーバーは、アクションとスコアが含まれているルール・レスポンスを返します。

6. OAAMレスポンスに基づいて、対応するアクション(許可、ブロック、チャレンジなど)を決定すると、その結果がWebサイト上でカスタマに表示されます。

15.3 ネイティブ・クライアント・アプリケーションとOAAMとの統合に必要な高度な手順

次に、ネイティブ・クライアント・アプリケーションとOAAMとの統合に必要な高度な手順について説明します。

1. OAAMとの統合を必要とするクライアント・トランザクションのタイプを識別します。トランザクションを構成するトランザクション固有の属性(データ)のリストを作成します。これをソース・データまたはクライアント・データと呼びます。たとえば、オンライン・トランザクションでは、クレジット・カード、電子小切手、デビット・カード、ドル金額、名前、出荷先住所および請求先住所などのデータが関連します。

2. トランザクションとエンティティ定義をOAAMで設計し、開発します。OAAMサーバーでクライアント・アプリケーションからの情報を処理できるように、エンティティとトランザクションのデータ要素がソース・データ(クライアント固有のデータ)にマップされます。OAAMにおけるトランザクションのモデリングの詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

3. トランザクションのタイプに基づいて、必要なチェックポイントを識別し、決定します。

4. リスク評価を行うために、各トランザクションに固有のセキュリティ・ポリシーとルールを定義および構成します。

5. トランザクションの作成または更新、リスクの評価、OAAMからの特定レスポンスの取得を行うために、OAAM APIをコールするコードをクライアント・アプリケーションに作成します。

6. 統合をテストして、エンドツーエンドで機能することを確認します。

7. 統合およびリスク評価のトランザクション別の実装方法とトランザクションAPIの使用方法については、即時利用可能なOAAMサンプル・アプリケーションを参照してください。
OAAMサンプル・アプリケーションでは、Java API統合について説明しています。このサンプル・アプリケーションは、My Oracle Supportの記事ID1351899.1「OAAM 11g PS1 (11.1.1.5)サンプル・アプリケーションのダウンロード」を使用してダウンロードできます。

My Oracle Supportにはhttps://support.oracle.comからアクセスできます。

15.4 OAAMの設定と構成

この章では、次の項目について説明します。

- トランザクション定義の設定

- ポリシーとルールの設定

- サイズ設定と容量の要件

15.4.1 トランザクション定義の設定

OAAMでクライアント・トランザクションに関連するリスク評価を実行するには、OAAMでのクライアント・トランザクションの表現方法、OAAMにより収集されたカスタマ・データの処理方法、および不正行為と悪用を防ぐためのカスタマ・データの使用方法を決定する必要があります。たとえば、eCommerceトランザクションの場合、トランザクションで処理するデータはクレジット・カード番号、出荷先住所および請求先住所、名前、ドル金額などです。電信送金の場合、重要なデータとして金額、名前、送金先口座、送金元口座、ルーティング番号、銀行住所、銀行電話番号などが考えられます。エンティティの詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

OAAMでは、トランザクション定義を使用してクライアント固有のトランザクションを表現します。そのため、クライアントにより指定されたExternal transaction IDがOAAMのトランザクション定義キーと一致している必要があります。

OAAMのトランザクション定義は、トランザクション・パラメータとエンティティで構成されます。トランザクション定義の作成方法および管理方法の詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

エンティティ構造は、最適化のために複数の関連するデータ・ポイントを組み込むことで作成されます。エンティティは、そのエンティティの新しいインスタンスを作成することで、複数のトランザクションで再使用できます。エンティティはどのトランザクションにも関連付けられておらず、依存もしていません。

たとえば、shipping addressおよびbilling addressインスタンスは、Addressエンティティの2つの異なるトランザクション用に作成できます。住所エンティティには、データ・ポイントとしてstreet number、street name、apartment number、city、state、postal codeおよびcountryを含めることができます。

エンティティは、インスタンスの作成に使用できるだけでなく他のエンティティにもリンクできるため、エンティティ間の関係またはアソシエーションを確立できます。Customerエンティティは、Addressなどの別のエンティティにリンクできます。CustomerとAddressエンティティ間には1対1の直接マッピングがあるため、これらの間の関係は1対1 (1:1)であると言うことができます。AddressエンティティはCustomerに依存していないため、単独で常駐できます。

結合してもエンティティを形成できないデータ・フィールドはすべて、トランザクション・パラメータとして追加する必要があります。通常、これらの属性は一意/固有であり、現在のトランザクションに依存します。

たとえば、次のようになります。

トランザクション・データ

- Amount

- Item #

エンティティ

- クレジット・カード・エンティティ(これには、クレジット・カード番号、有効期限などのデータ要素が含まれています)

- カスタマ(これには、名、姓、生年月日などのデータ要素が含まれています)

15.4.2 ポリシーとルールの設定

Oracle Adaptive Access Managerでは、OAAMに定義されているポリシーとルールに基づいて、クライアントのトランザクションに対してリスク評価と不正行為分析が実行されます。次のガイドラインに従って、トランザクションに関するポリシーとルールを設定してください。

1. トランザクションに関する新規ポリシーを定義するために、即時利用可能なOAAMチェックポイントを使用できるかどうかを判別します。既存のチェックポイントが再使用できる場合、チェックポイントを作成する必要はありません。そうでない場合は、OAAMチェックポイントを新規作成します。チェックポイントの作成の詳細は、第25章「チェックポイントおよび最終アクションの作成」を参照してください。

2. OAAMセキュリティ・ポリシーを作成し、次の情報を指定します。

- 名前

- Status

- スコアリング・エンジン

- 重み

- 説明

3. ルールをポリシーに追加します。ルールには、トランザクション固有の条件を含める必要があります。次の情報を入力します。

- ルール名

- Status

- 説明

- 条件

- ルール条件が満たされた場合に結果を出します。
アラート・グループとアクション・グループをリンクして、スコアを指定します。

ルール条件の詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

4. OAAMでリスク評価を実行するために、トランザクション定義とポリシーをアクティブ化します。
ポリシーの構成方法の詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

15.4.3 サイズ設定と容量の要件

サイズ設定と容量の要件の詳細は、『Oracle Fusion Middlewareパフォーマンスおよびチューニング・ガイド』を参照してください。

これで、OAAMにおける設定と構成が完了しました。

15.5 クライアントの設定

クライアント・アプリケーションをOAAMと統合するには、次の手順を実行します。

1. OAAMにより提供されるAPIを使用して、トランザクションの作成と更新、およびトランザクションでのルール実行を行うカスタム・クライアント・コードを作成します。OAAM APIの詳細は、第4章「OAAMとJavaアプリケーションとのネイティブ統合」を参照してください。

2. OAAM共有ライブラリを使用したクライアント・アプリケーションとOAAMとの統合は、第2章「Oracle Adaptive Access Managerのネイティブ統合」を参照してください。

3. OAAMからの結果を解釈できるようにクライアント・アプリケーションを更新し、ユーザーを関連ページにリダイレクトする際に適切なアクションを実行します。たとえば、ユーザーには電信送金の実行を許可しないなどと指定します。

15.6 エンティティとトランザクションのAPI

API

タスク

createOAAMSession

ログイン・セッションを作成します。

createTransaction

OAAMにトランザクションを作成します。

updateTransaction

既存のOAAMトランザクションを更新します。通常、これはprocessRules APIの結果に基づいて実行されます。

processRules

不正なルールを処理します。

createOrUpdateEntities

トランザクションに関する完全データを送信せずに、エンティティを作成または更新します。

searchEntityByKey

エンティティのキー属性に基づいてエンティティを検索します。

15.6.1 APIコールのシーケンス

この項では、OAAMでトランザクションを処理し、API操作の値をクライアント・アプリケーションから指定する方法を示しています。

- 情報がクライアント・アプリケーションによって提供され、createTransaction APIがコールされます。

- createTransaction操作のステータスがisSuccess()であることを確認してから、メソッドgetTransactionResponse()を使用してトランザクションIDを取得します。

- processRules APIをコールして、トランザクション・チェックポイントに関連する不正行為ポリシー/ルールをトリガーします。この手順により、該当するチェックポイントに関連しているポリシーやルールを実行するルール・エンジンがトリガーされ、関連したルールがトリガーされた場合はアラートが作成されます。このAPIの出力は、ポリシーやルールによって返される一連のアクションおよびリスク・スコアです。

- processRules APIコールの結果に基づき、クライアント・アプリケーションはupdateTransaction APIをコールしてトランザクション・ステータスを設定するか、または既存トランザクションのデータを更新するかを選択できます。

- クライアント・アプリケーションは、トランザクションの作成後に実行する必要のあるポリシーまたはルールが割り当てられているPost Transactionタイプのチェックポイントを使用して、processRules APIを実行するように選択できる場合もあります。

15.6.2 即時利用可能なチェックポイント

この項では、トランザクション前およびトランザクション後のチェックポイントについて説明します。

15.6.2.1 トランザクション前のチェックポイント

トランザクション作成操作が成功した場合は、processRules APIをコールして、トランザクション前チェックポイントに関連している不正行為ポリシーまたはルールをトリガーできます。この手順により、該当するチェックポイントに関連しているポリシーやルールを実行するルール・エンジンがトリガーされ、関連しているルールがトリガーされた場合はアラートが作成されます。この出力は、ポリシーやルールによって返される一連のアクションおよびリスク・スコアです。

15.6.2.2 トランザクション後のチェックポイント

トランザクション更新操作が成功した場合は、processRules APIをコールして、トランザクション後のチェックポイントに関連している不正行為ポリシーまたはルールをトリガーできます。この手順により、該当するチェックポイントに関連しているポリシーやルールを実行するルール・エンジンがトリガーされ、関連したルールがトリガーされた場合はアラートが作成されます。この出力は、ポリシーやルールによって返される一連のアクションおよびリスク・スコアです。

15.6.3 エンティティAPIリスト

次に、2つのエンティティAPIを示します。

15.6.3.1 createOrUpdateEntities

createOrUpdateEntities APIを使用すると、次のタスクを実行できます。

- エンティティを作成および更新する。

- エンティティ更新時に属性値を置換およびマージする。

詳細は、第4.5.7項「createOrUpdateEntities」を参照してください。

15.6.3.2 SearchEntityByKey

searchEntityByKey APIを使用すると、キー属性に基づいてエンティティを検索できます。このAPIの詳細は、第4.5.26項「searchEntityByKey」を参照してください。

15.7 ランタイム・データ分析

OAAMには、トランザクションのランタイム・データ分析ツールがあります。

15.7.1 調査トランザクションの検索、比較およびユーティリティ・パネル

OAAMには、次の表で説明するように、トランザクションの不正行為を調査するいくつかの機能があります。これらの調査ツールの詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

機能

説明

トランザクション検索

調査担当者は、セッションおよびトランザクション検索ページを使用して、トランザクション中心の方法でOAAMランタイム・データを検索できます。たとえば、調査担当者は調査の手始めに、過去24時間以内の、特定のアラート・レベルの小売りE-Commerceのトランザクションを検索します。

ユーティリティ・パネル

調査担当者は、ユーティリティ・パネルを使用して次の処理を実行できます。

- 共通のデータを持つセッションおよびトランザクションを迅速に特定します。

- 問合せを繰り返して、結果を拡大および縮小します。

- 検出されたセッションおよびトランザクションの合計数を表示し、調査を拡大するために詳細を確認します。

トランザクションの比較

調査担当者は、トランザクションの比較機能を使用してトランザクションを並べて比較し、一致するデータ要素を検索できます。

15.7.2 BIPレポート

OAAMには、トランザクションに対して即時利用可能なSearchTransactionsレポートがあります。表15-0に、SearchTransactionsレポートの検索フィルタを示します。

図15-2 BIPレポート

必要に応じて、トランザクション・データにカスタム・レポートを作成し、構成することもできます。カスタム・レポートの作成方法の詳細は、第23.2項「OAAMトランザクション・レポートの作成」を参照してください。

15.8 トランザクションおよびエンティティ・データのターゲット・パージ

トランザクション・タイプ別またはエンティティ別に異なる保存期間を指定する場合は、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』のエンティティ・データのターゲット・パージ設定に関する項およびトランザクション定義別のトランザクション・データのターゲット・パージ設定に関する項を参照してください。

16 OTP Anywhereの実装

この章では、OTP Anywhereの実装方法について説明します。OTP Anywhereにより、エンド・ユーザーは、サーバーで生成されたワンタイム・パスワード(OTP)を入力することで自己認証を行えます。OTPがSMS経由で送信される場合は、ユーザーの携帯電話が、ユーザーが所有していることを示す物理的な二次的要因として機能します。同様に、有効なユーザーのみがワンタイム・パスワードにアクセスできることをより高いレベルで保証するために、認証が帯域外で送信されます。

この章には次の項が含まれます:

- 第16.1項「OTPの実装について」

- 第16.2項「概念と用語」

- 第16.3項「前提条件」

- 第16.4項「OTPの設定」

- 第16.5項「OTPの構成」

- 第16.6項「OTPのカスタマイズ」

- 第16.7項「チャレンジ・タイプの作業を実行するSMSプロセッサの登録」

- 第16.8項「ワンタイム・パスワード生成のカスタマイズ」

- 第16.9項「ワンタイム・パスワードの有効期間のカスタマイズ」

- 第16.10項「チャレンジ・タイプに使用するチャレンジ・パッドの構成」

- 第16.11項「OTP Anywhereのデータ・ストレージのカスタマイズ」

- 第16.12項「構成例」

- 第16.13項「チャレンジのユースケース」

16.1 OTPの実装について

ワンタイム・パスワード(OTP)は二次的認証であり、標準的なユーザー名とパスワードの資格証明に加えてこれを使用することにより、既存の認証および権限プロセスが強化され、ユーザーに対するセキュリティが補強されます。アプリケーションから、現在のセッションだけで有効なワンタイム・パスワードがユーザーに送信されます。システムはこのパスワードを使用して、ユーザーにチャレンジしてアイデンティティを検証します。

Oracle Adaptive Access Manager 11gには、Oracle User Messaging Service (UMS)を使用したワンタイム・パスワード(OTP)認証をサポートするフレームワークが組み込まれています。この実装により、アプリケーションはOTPを使用してユーザーにチャレンジする際に、Oracle User Messaging Service (UMS)をパスワード配信方法として使用できます。

OTP Anywhereの利点は、次のとおりです。

- これは、11gチャレンジ・プロセッサ・フレームワーク上にビルドされています。

- Oracle User Messaging Serviceとの統合が即時利用可能です。

- 登録ユーザー・インタフェースがカスタマイズ可能です。

- オプションとしてオプトアウト機能が使用できます。

- 配信チャネルとして電子メール、SMSがサポートされています。

16.2 概念と用語

この項では、OTP Anywhere実装に関連するキー定義、頭字語、略語について説明します。

表16-1 OTP Anywhereの用語

用語

説明

ワンタイム・パスワード認証(OTP)

ワンタイム・パスワード(OTP)は、1回だけ使用する英数字の資格証明に基づいて個人を認証するために使用します。OTPは、ユーザーが構成した配信方法に従って配信されます。ユーザーは操作を続行するために、レスポンスとしてOTP資格証明を提供します。帯域外OTPを使用する主な利点は次のとおりです。

- エンド・ユーザーのブラウザ/インターネットに障害が発生しても、ブラウザとは別の通信帯域で認証を安全に行うことができます。

- ユーザーは、独自のハードウェアまたはいかなる種類のクライアント・ソフトウェアも必要としません。

Oracle User Messaging Service (UMS)

Oracle User Messaging Serviceは、SOAスイートのインストール時にSOAドメインにインストールされるファシリティです。Oracle User Messaging Serviceは、ユーザーとデプロイされたアプリケーション間での双方向通信を可能にします。通信は、電子メール、インスタント・メッセージ(IMまたはチャット)、およびSMSなどの様々なチャネルを通すことができます。OAAMは、ユーザーとの通信手段としてOracle User Messaging Serviceを使用します。

チャレンジ・プロセッサ

チャレンジ・プロセッサは、ChallengeProcessorIntfインタフェースを実装するか、AbstractChallengeProcessorクラスを拡張するJavaコードです。カスタム・チャレンジ・プロセッサを作成して、チャレンジの生成、ユーザーからのチャレンジ回答の検証、およびサービス配信とサービス可用性のステータスの確認を行うことができます。デフォルトでは、OAAMには、Oracle User Messaging Service配信を介して、SMSと電子メールによるKBA質問チャレンジおよびOTPチャレンジに対するサポート(またはチャレンジ・プロセッサ実装)が組み込まれています。

チャレンジ・タイプ

チャネルは、OTPをユーザーに送信するために使用される配信チャネル(電子メール、SMSまたはIM)です。チャレンジ・タイプは、ユーザーにチャレンジするためにOTPで使用しているチャネルです。チャレンジ・タイプを構成すれば、必要なチャレンジの処理で生じる差異に対応できます。チャレンジ・タイプの処理として、チャレンジに使用する機密情報の生成からユーザーへの機密情報の配信、および最終的なユーザー入力の検証にいたるまで、チャレンジ・タイプのあらゆる作業が考えられます。これらの主要プロセス(生成、送信、および検証)では、チャレンジのタイプ別に若干異なるコードが必要になる場合があります。

16.3 前提条件

アプリケーションにOTPを構成する前に、次の前提条件が満たされていることを確認してください。

注意:

カスタムOAAM拡張のデプロイに精通している必要があります。

Oracle Adaptive Access Managerは、カスタマイズされたJARファイルとその他のファイルを拡張共有ライブラリに追加してカスタマイズされている必要があります。

カスタマイズされたJARファイルとその他のファイルの追加の詳細は、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。

16.3.1 SOAスイートのインストール

Oracle User Messaging Service (UMS)ドライバとOTPを構成するには、事前にSOAスイート11gをインストールしてSOAドメインを構成し、管理サーバーとSOAサーバーを実行しておく必要があります。また、Oracle Enterprise Manager Fusion Middleware管理コンソールにアクセスする必要もあります。

SOA Suite 11gのインストールの詳細は、『Oracle Fusion Middleware Oracle SOA SuiteおよびOracle Business Process Management Suiteインストレーション・ガイド』を参照してください。

16.3.2 Oracle User Messaging Serviceドライバの構成

User Messaging Serviceには、それぞれ特定のチャネルのトラフィックを処理するドライバがいくつか含まれています。ドライバはチャネルを管理します。ドライバを構成するには、メッセージの送信元である適切な配信サーバー、プロトコルなどのプロパティを指定する必要があります。OAAMサーバーをチャネル用に設定します。

これらのドライバは、特定のインストールで使用できるメッセージング・チャネルに従って、相互に独立してデプロイまたはアンデプロイできます。

Oracle Enterprise Manager Fusion Middleware管理コンソール(通常は、http://host:7001/em)に移動して、User Messaging Serviceノードを開きます。右パネルのドロップダウン・メニューから、ドライバ・プロパティのオプションを選択します。たとえば、「電子メール・ドライバ・プロパティ」を選択します。表示されたフォームでは、ドライバに関する様々なプロパティ(サーバーやプロトコルなどの詳細情報も含む)を設定して操作に利用できます。たとえば、電子メール操作でドライバが使用できるように、電子メール・サーバーの詳細を入力できます。

16.3.2.1 電子メール・ドライバ

電子メール・ドライバをSMTPサーバーに構成します。電子メール・ドライバの構成の詳細は、『Oracle Fusion Middleware Oracle SOA SuiteおよびOracle Business Process Management Suite管理者ガイド』を参照してください。

表16-2 SMTPサーバーへの接続

パラメータ

説明

OutgoingMailServer

電子メールの送信が必要な場合は必須です。例: smtp.name.com for name

OutgoingMailServerPort

SMTPサーバーのポート番号。

OutgoingMailServerSecurity

使用可能な値はTLSとSSLです。

OutgoingDefaultFromAddress(オプション)

電子メール・メッセージの送信者として指定される電子メールのアドレス。

OutgoingUsername

電子メールの送信元であるユーザー・アカウント。

OutgoingPassword

アカウントのパスワード(暗号化形式で格納されています)。

「適用」を押します。これらの設定を有効にするには、ドライバを再起動する必要があります。

16.3.2.2 SMPPドライバ

Short Message Peer-to-Peer (SMPP)は、最も一般的なGSM SMSプロトコルの1つです。ユーザー・メッセージング・サービスには、事前作成のSMPPプロトコルの実装がドライバとして含まれています。このドライバは、ショート・メッセージを送受信できます。

注意:

SMSの場合は、デプロイして即時利用できる電子メール・ドライバと異なり、最初にSMPPドライバをデプロイしてから構成を変更する必要があります。

『Oracle Fusion Middleware Oracle SOA SuiteおよびOracle Business Process Management Suite管理者ガイド』のSMPPドライバの構成に関する項のように、SMPPドライバを構成してください。ドライバのゲートウェイ・ベンダーに接続するためのパラメータ値を指定する必要があります。

表16-3 ベンダーへの接続

パラメータ

説明

SmsAccountId

SMS-CのアカウントID。これはベンダー・アカウントIDであり、ベンダーから取得する必要があります。

SmsServerHost

SMS-Cサーバーの名前(またはIPアドレス)。TransmitterSystemId

TransmitterSystemPassword

送信側システムのパスワード。パスワードのタイプ(「間接パスワード、新規のユーザーの作成」、「間接パスワード、既存のユーザーの使用」、「クリアテキスト・パスワードの使用」から選択)とパスワードが含まれています。これは、ベンダー・アカウントIDに対応するパスワードです。

TransmitterSystemType

送信側システムのタイプ。デフォルトはLogicaです。

ReceiverSystemId

メッセージの受信に使用するアカウントID。ReceiverSystemPassword

ReceiverSystemType

受信側システムのタイプ。デフォルトはLogicaです。

ServerTransmitterPort

送信側サーバーのTCPポート番号。

ServerReceiverPort

受信側サーバーのTCPポート番号。

DefaultEncoding

SMPPドライバのデフォルトのエンコーディング。デフォルトはIA5です。ドロップダウン・リストから「IA5」、「UCS2」または「GSM_DEFAULT」を選択します。

DefaultSenderAddress

デフォルトの送信者アドレス。

パラメータ値を指定した後で、「適用」を押します。これらの設定を有効にするには、ドライバを再起動する必要があります。

16.4 OTPの設定

配信方法としてOracle User Messaging Service (UMS)を使用するOTPは、OAAMサーバーの標準機能です。この項では、この機能の実装に必要な手順の概要について説明します。

OAAMサーバー・インタフェースのカスタマイズ手順に従って、カスタマイズされたJARファイルとその他のファイルを拡張共有ライブラリに追加します。OAAMサーバー・インタフェースのカスタマイズの詳細は、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。

表16-4 OTPの設定タスク

番号

タスク

1

SOAスイートのインストール

2

Oracle User Messaging Serviceドライバの構成

3

Oracle User Messaging Serviceの統合

4

OTPチャレンジ・タイプの有効化

5

登録とユーザー・プリファレンスの有効化

6

登録フィールドと検証のカスタマイズ

7

ご使用条件のカスタマイズ

8

登録ページのメッセージのカスタマイズ

9

チャレンジ・ページのメッセージのカスタマイズ

10

OTPメッセージ・テキストのカスタマイズ

11

オプトアウト機能の有効化

12

チャレンジ・タイプの作業を実行するSMSプロセッサの登録

13

ワンタイム・パスワード生成のカスタマイズ

14

ワンタイム・パスワードの有効期間のカスタマイズ

15

チャレンジ・タイプに使用するチャレンジ・パッドの構成

16

OTP Anywhereのデータ・ストレージのカスタマイズ

Oracle User Messaging Service (UMS)とOTP実装は、OAAMサーバーのチャレンジ・プロセス・フレームワークを使用してOAAMサーバー・ログイン、チャレンジ、および登録の各フローに統合されています。ログイン、チャレンジ、登録の各フローの詳細は、第2章「Oracle Adaptive Access Managerのネイティブ統合」を参照してください。

16.5 OTPの構成

この項の内容は次のとおりです。

- Oracle User Messaging Serviceの統合

- OTPチャレンジ・タイプの有効化

- 登録とユーザー・プリファレンスの有効化

16.5.1 Oracle User Messaging Serviceの統合

Oracle User Messaging Service (UMS)サーバーのURLと資格証明用に設定するプロパティを、表16-5に示します。これらのプロパティは、OAAM管理でプロパティ・エディタを使用して編集できます。注意: エンド・ポイントは、OAAMでOracle User Messaging Serviceへのコール送信に使用するWebサービスURLです。

表16-5 Oracle User Messaging Service ServerのURLと資格証明

プロパティ

デフォルト値

説明

bharosa.uio.default.ums.integration.webservice

UMSサーバーのWebサービスURL

http://UMS_Server_URL:

UMS_Port/

ucs/messaging/webservice

bharosa.uio.default.ums.integration.parlayx.endpoint

UMSサーバーのParlayXエンドポイントURL

http://UMS_Server_URL:UMS_Port/

sdpmessaging/parlayx/

SendMessageService

bharosa.uio.default.ums.integration.useParlayX

false

WebサービスAPIまたはparlayx APIの使用を構成します。デフォルトでは、この値はfalseです(Webサービスの使用をお薦めします)。

bharosa.uio.default.ums.integration.userName

Oracle User Messaging Serviceサーバーのユーザー名

bharosa.uio.default.ums.integration.password

Oracle User Messaging Serviceサーバーのパスワード

bharosa.uio.default.ums.integtaion.policies

Oracle User Messaging Serviceの認証ポリシー

bharosa.uio.default.ums.integration.fromAddress

demo@oracle.com

OTPメッセージ用のOAAM送信元アドレス

bharosa.uio.default.ums.integration.message.status.poll.attempts

3

待機ページが表示されるたびにステータス・ポーリングを試みる回数

bharosa.uio.default.ums.integration.message.status.poll.delay

1000

待機ページが表示されているときのステータス・ポーリング間の遅延

bharosa.uio.default.ums.integration.sleepInterval

10000

bharosa.uio.default.ums.integration.deliveryPage.delay

3000

Oracle User Messaging Serviceサーバーのプロパティ設定後に、アプリケーションを再起動してください。

16.5.2 OTPチャレンジ・タイプの有効化

チャレンジ・タイプを有効化するには、適切なプロパティをtrueに設定します。プロパティをtrueに設定することにより、ポリシーは、チャレンジ・タイプ(電子メール、SMS、またはIM)を介し、OTPを使用してチャレンジできるようになります。登録フローで電子メール、SMS、またはIMのページが表示されます。

チャレンジ・タイプ列挙は、チャレンジ・タイプを(そのチャレンジ・タイプの関連作業を実行するために必要な)Javaコードに関連付けるのに使用できます。チャレンジ・タイプID (ChallengeEmail)は、チャレンジ・タイプを使用する際にルールにより返されるルール・アクションと一致している必要があります。

表16-6 Oracle User Messaging ServiceのOTPチャレンジ・タイプ

プロパティ

デフォルト値

説明

bharosa.uio.default.challenge.type.enum.ChallengeEmail.available

false

電子メール・チャレンジ・タイプの可用性フラグ

bharosa.uio.default.challenge.type.enum.ChallengeSMS.available

false

SMSチャレンジ・タイプの可用性フラグ

bharosa.uio.default.challenge.type.enum.ChallengeIM.available

false

インスタント・メッセージのチャレンジ・タイプの可用性フラグ

16.5.3 登録とユーザー・プリファレンスの有効化

登録フローとユーザー・プリファレンスを有効化するには、次のプロパティをtrueに設定します。

表16-7 OTPプロファイル登録とプリファレンス設定の有効化

プロパティ

説明

bharosa.uio.default.register.userinfo.enabled

OTPチャネルが有効化されていて登録が必要な場合、このプロパティをtrueに設定すると、プロファイル登録ページが有効になります。

bharosa.uio.default.userpreferences.userinfo.enabled

OTPチャネルが有効化されていてプリファレンス設定が許可されている場合、このプロパティをtrueに設定すると、ユーザーはプリファレンスを設定できます。

「ユーザー・プリファレンス」ページを使用して、ユーザーは、イメージ/フレーズ、チャレンジ質問の変更、デバイスの登録解除およびOTPプロファイルの更新を実行できます。

16.6 OTPのカスタマイズ

この項の内容は次のとおりです。

- 登録フィールドと検証のカスタマイズ

- ご使用条件のカスタマイズ

- 登録ページのメッセージのカスタマイズ

- チャレンジ・ページのメッセージのカスタマイズ

- OTPメッセージ・テキストのカスタマイズ

- オプトアウト機能の有効化

16.6.1 登録フィールドと検証のカスタマイズ

表16-8に、OTP登録ページのモバイル登録フィールドの定義と検証を示します。

モバイル入力登録フィールドのプロパティをoaam_custom.propertiesに追加します。

これらのプロパティはoaam_custom.propertiesに追加される必要があります。

表16-8 モバイル入力 - プロパティ・ファイル

プロパティ

デフォルト値

説明

bharosa.uio.default.userinfo.inputs.enum.mobile

0

携帯電話の列挙値

bharosa.uio.default.userinfo.inputs.enum.mobile.name

携帯電話

「携帯電話」フィールドの名前

bharosa.uio.default.userinfo.inputs.enum.mobile.description

携帯電話

「携帯電話」フィールドの説明

bharosa.uio.default.userinfo.inputs.enum.mobile.inputname

cell number

「携帯電話」フィールドのHTML入力名

bharosa.uio.default.userinfo.inputs.enum.mobile.inputtype

text

「携帯電話」フィールドのHTML入力タイプ

bharosa.uio.default.userinfo.inputs.enum.mobile.maxlength

15

「携帯電話」フィールドのHTML入力の最大長

bharosa.uio.default.userinfo.inputs.enum.mobile.required

true

登録およびユーザー・プリファレンスにおける「携帯電話」フィールドの必須フラグ

bharosa.uio.default.userinfo.inputs.enum.mobile.order

1

「携帯電話」フィールドのページにおける順序

bharosa.uio.default.userinfo.inputs.enum.mobile.enabled

true

「携帯電話」列挙項目の有効フラグ

bharosa.uio.default.userinfo.inputs.enum.mobile.regex

\\D?(\\d{3})

\\D?\\D?

(\\d{3})\\D?(\\d{4})

「携帯電話」フィールドの検証用の正規表現

bharosa.uio.default.userinfo.inputs.enum.mobile.errorCode

otp.invalid.mobile

「携帯電話」エントリの検証が失敗した場合にエラー・メッセージを取得するためのエラー・コード

bharosa.uio.default.userinfo.inputs.enum.mobile.managerClass

com.bharosa.uio.manager.user.DefaultContactInfoManager

データ・ストレージから携帯電話を保存/取得するために使用するJavaクラス

モバイル入力登録フィールドのプロパティをclient_resource.propertiesに追加します。

これらのプロパティをリソース・バンドルに追加する必要があります。

表16-9 モバイル入力 - リソース・バンドル

プロパティ

デフォルト値

説明

bharosa.uio.default.userinfo.inputs.enum.mobile.name

携帯電話

「携帯電話」フィールドの名前

bharosa.uio.default.userinfo.inputs.enum.mobile.description

携帯電話

「携帯電話」フィールドの説明

16.6.2 ご使用条件のカスタマイズ

次に、OTP登録ページのご使用条件定義の例を示します。

ご使用条件の定義をoaam_custom.propertiesに追加します。

これらのプロパティはoaam_custom.propertiesに追加される必要があります。

表16-10 「ご使用条件」チェック・ボックス

プロパティ

デフォルト値

説明

bharosa.uio.default.userinfo.inputs.enum.terms

4

ご使用条件の列挙値

bharosa.uio.default.userinfo.inputs.enum.terms.name

ご使用条件

「ご使用条件」チェック・ボックスの名前

bharosa.uio.default.userinfo.inputs.enum.terms.description

ご使用条件

「ご使用条件」チェック・ボックスの説明

bharosa.uio.default.userinfo.inputs.enum.terms.inputname

terms

「ご使用条件」チェック・ボックスのHTML入力名

bharosa.uio.default.userinfo.inputs.enum.terms.inputtype

checkbox

「ご使用条件」チェック・ボックスのHTML入力タイプ

bharosa.uio.default.userinfo.inputs.enum.terms.values

true

登録およびユーザー・プリファレンスにおける「ご使用条件」チェック・ボックスの必須値

bharosa.uio.default.userinfo.inputs.enum.terms.maxlength

40

「ご使用条件」チェック・ボックスのHTML入力の最大長

bharosa.uio.default.userinfo.inputs.enum.terms.required

true

登録およびユーザー・プリファレンスにおける「ご使用条件」チェック・ボックスの必須フラグ

bharosa.uio.default.userinfo.inputs.enum.terms.order

5

「ご使用条件」チェック・ボックスのページにおける順序

bharosa.uio.default.userinfo.inputs.enum.terms.enabled

true

「ご使用条件」列挙項目の有効フラグ

bharosa.uio.default.userinfo.inputs.enum.terms.regex

.+

「ご使用条件」チェック・ボックスの検証用の正規表現

bharosa.uio.default.userinfo.inputs.enum.terms.errorCode

otp.invalid.terms

「ご使用条件」の検証が失敗した場合にエラー・メッセージを取得するためのエラー・コード

bharosa.uio.default.userinfo.inputs.enum.terms.managerClass

com.bharosa.uio.manager.user.DefaultContactInfoManager

データ・ストレージからご使用条件を保存/取得するために使用するJavaクラス

ご使用条件の定義をclient_resource.propertiesに追加します。

ご使用条件のデフォルト・メッセージは、次のリソース・バンドルの値によって定義されます。

表16-11 ご使用条件のメッセージ

プロパティ

説明

bharosa.uio.default.userinfo.inputs.enum.terms.name

[会社名またはサービス名をここに入力]のご使用条件に同意します。<a href="javascript:infoWindow('terms');">Terms & Conditions</a>および<a href="javascript:infoWindow('privacy');">Privacy Policy</a>をクリックすると全体が表示されます。

bharosa.uio.default.userinfo.inputs.enum.terms.description

メッセージおよびデータ・レートが適用されます。<br/>このプログラムに関して質問がある場合は、"HELP"を[コード/短縮コードをここに入力]に送信してください。<br/>プランを取り消すには、"STOP"を[コード/短縮コードをここに入力]にいつでも送信してください。<br/><br/>このサービスの追加情報は、<a href="" target="_blank">[情報URLをここに入力]</a>をご覧ください。<br/><br/><b>サポートされているキャリア:</b><br/>AT&T、Sprint、Nextel、Boost、Verizon Wireless、U.S. Cellular&reg;、T-Mobile&reg;、Cellular One Dobson、Cincinnati Bell、Alltel、Virgin Mobile USA、Cellular South、Unicel、CentennialおよびNtelos。

bharosa.uio.default.userinfo.inputs.enum.terms.nameの値には、「ご使用条件」および「プライバシ・ポリシー」に対するOAAMサーバーのポップアップ・メッセージを使用するプレースホルダ・リンクが含まれます。ポップアップのコンテンツのプロパティおよびリソース・キーは次のとおりです。

表16-12 ご使用条件およびプライバシ・ポリシーのポップアップ・メッセージ

プロパティ

説明

bharosa.uio.default.messages.enum.terms.name

ご使用条件

bharosa.uio.default.messages.enum.terms.description

ご使用条件のプレースホルダ・テキスト

bharosa.uio.default.messages.enum.privacy.name

プライバシ・ポリシー

bharosa.uio.default.messages.enum.privacy.description

プライバシ・ポリシーのプレースホルダ・テキスト

16.6.3 登録ページのメッセージのカスタマイズ

登録プロパティをclient_resource.propertiesに追加します。

表16-13 登録リソース・バンドル

プロパティ

デフォルト値

bharosa.uio.default.register.userinfo.title

OTP Anywhere登録

bharosa.uio.default.register.userinfo.message

お客様の保護のため、今後、当社がこの番号を使用してお客様の身元を確認できるよう携帯電話番号を入力してください。電話のテキスト・メッセージが有効になっていることをご確認ください。

bharosa.uio.default.register.userinfo.registerdevice.message

現在、安全なデバイスとして使用しているデバイスの登録を確認します:

bharosa.uio.default.register.userinfo.continue.button

続行

bharosa.uio.default.register.userinfo.decline.message

辞退されたお客様には再び登録をお願いすることはありません。

bharosa.uio.default.register.userinfo.decline.button

辞退

「辞退」ボタン

プロファイル登録ページ上の「辞退」ボタンの有無を制御するには、次のプロパティを設定します。

bharosa.uio.default.register.userinfo.decline.enabled = true

bharosa.uio.default.userpreferences.userinfo.decline.enabled = true

注意:

これらのプロパティがtrueであっても、「オプトアウト」プロパティがfalseの場合、このボタンは表示されません。

「辞退」ボタンが有効になっている場合、OTP登録ページ上に別のオプションが表示され、このオプションを使用して、ユーザーはOTPチャレンジをオプトアウトできます。ユーザーはOTPの再登録を要求されることはなく、OTPチャレンジを受信しません。ただし、カスタマ・ケアOTPプロファイルのリセット(またはすべてリセット)が実行されると、ユーザーは再度OTPに登録できます。

また、OTPをオプトアウトしたとしても、ユーザーは、ユーザー・プリファレンスのOTPページにアクセスして情報を追加し、「続行」をクリックできます。これにより、OTP対象外のフラグが削除され、ユーザーがOTPに登録されます。

16.6.4 チャレンジ・ページのメッセージのカスタマイズ

チャレンジ・タイプ・フィールドをclient_resource.propertiesに追加します。

表16-14 チャレンジ・タイプ・リソース・バンドルのアイテム

プロパティ

デフォルト値

bharosa.uio.default.ChallengeSMS.message

お客様の保護のため、お客様の携帯電話にお送りしたコードを入力してください。コードが届いていない場合は、電話のテキスト・メッセージが有効になっていることを確認してから、下の再送信リンクをクリックしてください。

bharosa.uio.default.ChallengeSMS.registerdevice.message

現在、安全なデバイスとして使用しているデバイスの登録を確認します:

bharosa.uio.default.ChallengeSMS.continue.button

続行

16.6.5 OTPメッセージ・テキストのカスタマイズ

OTPメッセージ・フィールドをclient_resource.propertiesに追加します。

表16-15 チャレンジ・タイプ・リソース・バンドルのアイテム

プロパティ

デフォルト値

bharosa.uio.default.ChallengeSMS.incorrect.message

OTPが正しくありません。再試行してください。

bharosa.uio.default.ChallengeSMS.message.subject

Oracle OTPコード

bharosa.uio.default.ChallengeSMS.message.body

Oracle SMS OTPコードは次のとおりです: {0}

16.6.6 オプトアウト機能の有効化

この機能はデフォルトで無効です。ユーザーに対してオプトアウトを有効にするには、このプロパティをtrueに設定します。

表16-16 OTPのオプトアウト・プロパティ

プロパティ

デフォルト値

bharosa.uio.default.otp.optOut.enabled

false

bharosa.uio.default.otp.optOut.managerClass

com.bharosa.uio.manager.user.DefaultContactInfoManager

16.7 チャレンジ・タイプの作業を実行するSMSプロセッサの登録

チャレンジ・タイプ列挙は、チャレンジ・タイプを(そのチャレンジ・タイプの関連作業を実行するために必要な)Javaコードに関連付けるのに使用できます。チャレンジ・タイプID (ChallengeEmail)は、チャレンジ・タイプを使用する際にルールにより返されるルール・アクションと一致している必要があります。「チャネル」は通常、OTPをユーザーに送信するために使用される配信チャネル(電子メール、SMSまたはIM)です。

表16-17 チャレンジ・タイプの列挙

プロパティ

説明

available

チャレンジ・タイプが使用可能(サービスが準備され構成されている)かどうか。OTPチャレンジ・タイプを有効/無効にするには、可用性フラグを設定する必要があります。

processor

このタイプのチャレンジを処理するためのJavaクラス。

requiredInfo

登録入力列挙からの入力のカンマ区切りリスト。

表16-18に、SMSチャレンジ・プロセッサを登録するプロパティと、サービスを使用可能(または使用不可)とマークするプロパティを示します。

表16-18 SMSチャレンジ・プロセッサを登録するプロパティ

プロパティ

デフォルト値

説明

bharosa.uio.default.challenge.type.enum.ChallengeSMS

2

SMSチャレンジの列挙値

bharosa.uio.default.challenge.type.enum.ChallengeSMS.name

SMSチャレンジ

SMSチャレンジ・タイプの名前

bharosa.uio.default.challenge.type.enum.ChallengeSMS.description

SMSチャレンジ

SMSチャレンジ・タイプの説明

bharosa.uio.default.challenge.type.enum.ChallengeSMS.processor

com.bharosa.uio.processor.challenge.ChallengeSMSProcessor

SMSチャレンジ・タイプのプロセッサ・クラス

bharosa.uio.default.challenge.type.enum.ChallengeSMS.requiredInfo

mobile

SMSチャレンジ・タイプでユーザーにチャレンジするための必須フィールド

bharosa.uio.default.challenge.type.enum.ChallengeSMS.available

false

SMSチャレンジ・タイプの可用性フラグ

bharosa.uio.default.challenge.type.enum.ChallengeSMS.otp

true

SMSチャレンジ・タイプのOTPフラグ

16.8 ワンタイム・パスワード生成のカスタマイズ

プロパティの編集によって、ワンタイム・パスワードをカスタマイズできます。OTPの生成を構成するには次のプロパティを使用します。

# OTP pin generation config
bharosa.uio.otp.generate.code.length = 5
bharosa.uio.otp.generate.code.characters = 1234567890

デフォルトのOTPコードは、数字の0から9で構成される5文字になります(例: 44569)。

bharosa.uio.otp.generate.code.lengthにはOTPの長さを指定します。

bharosa.uio.otp.generate.code.charactersには、OTPの生成時に使用する文字を指定します。

数字0から9および文字aからdを使用して4文字のOTPコード(例: 0c6a)を生成する例を次に示します。

bharosa.uio.otp.generate.code.length = 4
bharosa.uio.otp.generate.code.characters = 1234567890abcd

16.9 ワンタイム・パスワードの有効期間のカスタマイズ

OTP SMSパスワードの有効期限を設定するには、次のプロパティを追加します。

bharosa.uio.default.challenge.type.enum.ChallengeSMS.otpexpirytimeMs

OTP電子メール・パスワードの有効期限を設定するには、次のプロパティを追加します。

bharosa.uio.default.challenge.type.enum.ChallengeEmail.otpexpirytimeMs to oaam_custom.properties.

時間はミリ秒単位です。値がミリ秒単位で指定されていない場合は、変換する必要があります。たとえば、OTPの有効期間を5分に設定するには、このプロパティを300000ミリ秒(5分)に設定する必要があります。

注意:

このプロパティはOTP APIに作用しますが、現在、OAAMサーバーではこのAPIを使用していません。したがって、デフォルトでは、OAAMサーバーのOTPはセッション中は有効です(または使用されるまで有効です)。

16.10 チャレンジ・タイプに使用するチャレンジ・パッドの構成

デフォルトでは、使用されるチャレンジ・デバイスはルールを使用して構成されています。ルールはAuthentiPadチェックポイントの下に存在し、これにより、デバイスの目的に基づいて使用するデバイスのタイプを指定できます。

チャレンジ・タイプを使用するポリシーを作成または更新する手順は次のとおりです。

1. 列挙rule.action.enumを指定する新しいルール・アクションMyChallengeを追加します。

2. 新規作成されたアクションMyChallengeを戻すポリシーを作成して、チャレンジ・メソッドを使用します。

または、プロパティを使用してチャレンジ・デバイスを構成する場合、bharosa.uio.default.use.authentipad.checkpointをfalseに設定して、AuthentiPadチェックポイントをバイパスできます。

チャレンジ・タイプで使用するデバイスを追加できます。

bharosa.uio.application.challengeType.authenticator.device=<value>

次の例では、チャレンジ・タイプ・キーのChallengeEmailとChallengeSMSを使用してプロパティ名を作成しています。

bharosa.uio.default.ChallengeSMS.authenticator.device=DevicePinPad
bharosa.uio.default.ChallengeEmail.authenticator.device=DevicePinPad

使用可能なチャレンジ・デバイス値はDeviceKeyPadFull、DeviceKeyPadAlpha、DeviceTextPad、DeviceQuestionPad、DevicePinPadおよびDeviceHTMLControlです。

表16-19 認証デバイス・タイプ

プロパティ

説明

なし

HTMLページまたは認証パッドはありません。

DeviceKeyPadFull

KeyPadを使用してユーザーにチャレンジします。

DeviceKeyPadAlpha

英数字KeyPad(数字と文字のみで特殊文字は含みません)を使用して、ユーザーにチャレンジします。

DeviceTextPad

TextPadを使用してユーザーにチャレンジします。

DeviceQuestionPad

QuestionPadを使用してユーザーにチャレンジします。

DevicePinPad

PinPadを使用してユーザーにチャレンジします。

DeviceHTMLControl

認証パッドのかわりにHTMLページを使用して、ユーザーにチャレンジします。

16.11 OTP Anywhereのデータ・ストレージのカスタマイズ

この項では、OTP Anywhereのデータ・ストレージをカスタマイズする方法について説明します。OTP Anywhereをカスタマイズするには、com.bharosa.uio.manager.user.UserDataManagerIntfインタフェースを実装します。

16.11.1 com.bharosa.uio.manager.user.UserDataManagerIntf

カスタマイズで使用するメソッドは、次のとおりです。

- public String getUserData(UIOSessionData sessionData, String key);

- public void setUserData(UIOSessionData sessionData, String key, String value);

16.11.2 デフォルト実装: com.bharosa.uio.manager.user.DefaultContactInfoManager

デフォルト実装はインタフェース上に展開して、すべてのgetおよびsetを次の2つのアイテム、UserDataValueおよびUserDataFlagに分解します。UserDataFlagは、値が設定されていることを追跡するか、値をソフト・リセットするために使用されます。OAAMは、ルールを使用して、ユーザーが指定のアイテムに対して登録されているかどうか、およびOAAMデータベース内のUserDataFlagを確認します。UserDataValueは、ユーザーが入力した実際のデータ要素です。デフォルト実装では、これはOAAMデータベースにも格納されますが、DefaultContactInfoManagerクラスを拡張し、UserDataValueのメソッド(getUserDataValueおよびsetUserDataValue)をオーバーライドすることにより、必要に応じてデータを外部の場所に格納することもできます。

メソッド

public class DefaultContactInfoManager implements UserDataManagerIntf {

public String getUserData(UIOSessionData sessionData, String key){
if (getUserDataFlag(sessionData, key)){
return getUserDataValue(sessionData, key);
}

return null;
}

public void setUserData(UIOSessionData sessionData, String key, String value){
setUserDataValue(sessionData, key, value);
setUserDataFlag(sessionData, key, value);
}

protected void setUserDataValue(UIOSessionData sessionData,
String key, String value){
VCryptAuthUser clientUser = sessionData.getClientAuthUser();
if (clientUser != null) {
clientUser.setUserData(BharosaConfig.get("oaam.otp.contact.info.prefix",
"otpContactInfo_") + key, value);
}
}

protected String getUserDataValue(UIOSessionData sessionData, String key) {
VCryptAuthUser clientUser = sessionData.getClientAuthUser();
if (clientUser != null) {
return
clientUser.getUserData(BharosaConfig.get("oaam.otp.contact.info.prefix",
"otpContactInfo_") + key);

}

return null;
}

protected void setUserDataFlag(UIOSessionData sessionData,
String key, String value){
VCryptAuthUser clientUser = sessionData.getClientAuthUser();
if (clientUser != null) {
if (StringUtil.isEmpty(value)) {
clientUser.setUserData(BharosaConfig.get("oaam.otp.contact.info.flag.prefix",
"otpContactInfoFlag_") + key, null);
} else {
clientUser.setUserData(BharosaConfig.get("oaam.otp.contact.info.flag.prefix",
"otpContactInfoFlag_") + key, "true");
}
}
}

protected boolean getUserDataFlag(UIOSessionData sessionData, String key) {
VCryptAuthUser clientUser = sessionData.getClientAuthUser();
if (clientUser != null) {
return
Boolean.valueOf(clientUser.getUserData(BharosaConfig.get
("oaam.otp.contact.info.flag.prefix",
"otpContactInfoFlag_") + key));
}

return false;
}

}

16.11.3 カスタム実装の推奨事項

ベース実装クラスDefaultContactInfoManagerを拡張し、メソッドsetUserDataValueおよびgetUserDataValueをオーバーライドして、実装用の適切な場所にデータ値を格納します。

デフォルト実装のsetUserDataFlagおよびgetUserDataFlagを所定の場所に置いたままにして、OAAMでユーザーに設定されたデータを適切に追跡できるようにします。

16.11.4 プロパティの構成

OTP Anywhereの登録フィールドは、ユーザー定義列挙bharosa.uio.default.userinfo.inputs.enumによって定義されます。

各要素には、登録データの格納に使用されるクラスを指定するmanagerClassプロパティが割り当てられています。

たとえば、デフォルトの携帯電話要素は次のようになります。

bharosa.uio.default.userinfo.inputs.enum=Enum for Contact information
bharosa.uio.default.userinfo.inputs.enum.mobile=0
bharosa.uio.default.userinfo.inputs.enum.mobile.name=Mobile Phone
bharosa.uio.default.userinfo.inputs.enum.mobile.description=Mobile Phone
bharosa.uio.default.userinfo.inputs.enum.mobile.inputname=cellnumber
bharosa.uio.default.userinfo.inputs.enum.mobile.inputtype=text
bharosa.uio.default.userinfo.inputs.enum.mobile.maxlength=16
bharosa.uio.default.userinfo.inputs.enum.mobile.required=true
bharosa.uio.default.userinfo.inputs.enum.mobile.order=4
bharosa.uio.default.userinfo.inputs.enum.mobile.enabled=true
bharosa.uio.default.userinfo.inputs.enum.mobile.regex=
\\d{1}\\D?(\\d{3})\\D?\\D?(\\d{3})\\D?(\\d{4})
bharosa.uio.default.userinfo.inputs.enum.mobile.errorCode=otp.invalid.mobile
bharosa.uio.default.userinfo.inputs.enum.mobile.managerClass=
com.bharosa.uio.manager.user.DefaultContactInfoManager

ここに示すように、デフォルトの携帯電話定義ではDefaultContactInfoManagerクラスを使用してデータを管理しています。カスタム実装が必要な場合は、OAAM管理で(またはOAAM拡張共有ライブラリを使用して)カスタム・クラスを使用するように、managerClass属性の値を更新できます。

16.12 構成例

この項の内容は次のとおりです。

- 追加の登録フィールド定義の例

- 追加のチャレンジ・メッセージの例

- 追加のプロセッサ登録例

16.12.1 追加の登録フィールド定義の例

表16-20に、追加の登録フィールド定義を示します。

表16-20 連絡先情報入力

プロパティ

説明

inputname

HTML形式の入力フィールドに使用される名前。

inputtype

テキスト入力またはパスワード入力用に設定されます。

maxlength

ユーザー入力の最大長。

required

フィールドが登録ページで必須である場合に設定されます。

order

ユーザー・インタフェースに表示される順序。

regex

このフィールドのユーザー入力を検証するために使用される正規表現。

errorCode

検証エラー・メッセージ(bharosa.uio.application_ID.error.errorCode)を参照するために使用されるエラー・コード

managerClass

com.bharosa.uio.manager.user.UserDataManagerIntfを実装するJavaクラス(Oracle Adaptive Access Managerデータベースでデータが盗難された場合、このプロパティはcom.bharosa.uio.manager.user.DefaultContactInfoManagerに設定される必要があります)。

16.12.1.1 電子メール入力

次に、オーセンティケータのOTP登録ページで電子メール登録を定義する列挙の例を示します。

表16-21 電子メール入力

プロパティ

デフォルト値

説明

bharosa.uio.default.userinfo.inputs.enum.email

1

「電子メール・アドレス」の列挙値

bharosa.uio.default.userinfo.inputs.enum.email.name

電子メール・アドレス

「電子メール・アドレス」フィールドの名前

bharosa.uio.default.userinfo.inputs.enum.email.description

電子メール・アドレス

「電子メール・アドレス」フィールドの説明

bharosa.uio.default.userinfo.inputs.enum.email.inputname

電子メール

「電子メール・アドレス」フィールドのHTML入力名

bharosa.uio.default.userinfo.inputs.enum.email.inputtype

text

「電子メール・アドレス」フィールドのHTML入力タイプ

bharosa.uio.default.userinfo.inputs.enum.email.maxlength

40

「電子メール・アドレス」フィールドのHTML入力の最大長

bharosa.uio.default.userinfo.inputs.enum.email.required

true

登録およびユーザー・プリファレンスにおける「電子メール・アドレス」フィールドの必須フラグ

bharosa.uio.default.userinfo.inputs.enum.email.order

2

「電子メール・アドレス」フィールドのページにおける順序

bharosa.uio.default.userinfo.inputs.enum.email.enabled

false

「電子メール・アドレス」列挙項目の有効フラグ

bharosa.uio.default.userinfo.inputs.enum.email.regex

.+@[a-zA-Z_]+?\\.[a-zA-Z]{2,3}

「電子メール・アドレス」フィールドの検証用の正規表現

bharosa.uio.default.userinfo.inputs.enum.email.errorCode

otp.invalid.email

「電子メール・アドレス」エントリの検証が失敗した場合にエラー・メッセージを取得するためのエラー・コード

bharosa.uio.default.userinfo.inputs.enum.email.managerClass

com.bharosa.uio.manager.user.DefaultContactInfoManager

データ・ストレージから電子メール・アドレスを保存/取得するために使用するJavaクラス

16.12.1.2 電話入力

次に、オーセンティケータのOTP登録ページで電話登録を定義する列挙の例を示します。

表16-22 電話入力

プロパティ

デフォルト値

説明

bharosa.uio.default.userinfo.inputs.enum.phone

2

電話番号の列挙値

bharosa.uio.default.userinfo.inputs.enum.phone.name

電話番号

電話番号フィールドの名前

bharosa.uio.default.userinfo.inputs.enum.phone.description

電話番号

電話番号フィールドの説明

bharosa.uio.default.userinfo.inputs.enum.phone.inputname

phone

電話番号フィールドのHTML入力名

bharosa.uio.default.userinfo.inputs.enum.phone.inputtype

text

電話番号フィールドのHTML入力タイプ

bharosa.uio.default.userinfo.inputs.enum.phone.maxlength

15

電話番号フィールドのHTML入力の最大長

bharosa.uio.default.userinfo.inputs.enum.phone.required

true

登録およびユーザー・プリファレンスにおける電話番号フィールドの必須フラグ

bharosa.uio.default.userinfo.inputs.enum.phone.order

3

電話番号フィールドのページ上の順序

bharosa.uio.default.userinfo.inputs.enum.phone.enabled

false

電話番号列挙アイテムの有効化されたフラグ

bharosa.uio.default.userinfo.inputs.enum.phone.regex

\\D?(\\d{3})\\D?\\D?(\\d{3})\\D?(\\d{4})

電話番号フィールドの検証用の正規表現

bharosa.uio.default.userinfo.inputs.enum.phone.errorCode

otp.invalid.phone

電話番号エントリの検証が失敗した場合にエラー・メッセージを取得するためのエラー・コード

bharosa.uio.default.userinfo.inputs.enum.phone.managerClass

com.bharosa.uio.manager.user.DefaultContactInfoManager

データ・ストレージへの電話番号の保存またはデータ・ストレージからの電話番号の取得に使用するJavaクラス

16.12.1.3 例: 携帯電話のかわりに電子メール・アドレスのエントリに値を表示するOTP登録ページ

登録に関して電子メールのエントリ情報のみを表示し、携帯電話のエントリ情報を無効にするには、次のように設定します。

bharosa.uio.default.userinfo.inputs.enum.email.enabled=true

bharosa.uio.default.userinfo.inputs.enum.mobile.enabled=false
Enabling the email field will require a server restart.

16.12.1.4 IM入力

次に、オーセンティケータのOTP登録ページでIM登録を定義する列挙の例を示します。

表16-23 IM入力

プロパティ

デフォルト値

説明

bharosa.uio.default.userinfo.inputs.enum.im

3

インスタント・メッセージの列挙値

bharosa.uio.default.userinfo.inputs.enum.im.name

インスタント・メッセージ

インスタント・メッセージ・フィールドの名前

bharosa.uio.default.userinfo.inputs.enum.im.description

インスタント・メッセージ

インスタント・メッセージ・フィールドの説明

bharosa.uio.default.userinfo.inputs.enum.im.inputname

im

インスタント・メッセージ・フィールドのHTML入力名

bharosa.uio.default.userinfo.inputs.enum.im.inputtype

text

インスタント・メッセージ・フィールドのHTML入力タイプ

bharosa.uio.default.userinfo.inputs.enum.im.maxlength

15

インスタント・メッセージ・フィールドのHTML入力の最大長

bharosa.uio.default.userinfo.inputs.enum.im.required

true

登録およびユーザー・プリファレンスにおけるインスタント・メッセージ・フィールドの必須フラグ

bharosa.uio.default.userinfo.inputs.enum.im.order

4

インスタント・メッセージ・フィールドのページ上の順序

bharosa.uio.default.userinfo.inputs.enum.im.enabled

false

インスタント・メッセージ列挙アイテムの有効化されたフラグ

bharosa.uio.default.userinfo.inputs.enum.im.regex

TBD

インスタント・メッセージ・フィールドの検証用の正規表現

bharosa.uio.default.userinfo.inputs.enum.im.errorCode

otp.invalid.im

インスタント・メッセージのエントリの検証が失敗した場合にエラー・メッセージを取得するためのエラー・コード

bharosa.uio.default.userinfo.inputs.enum.im.managerClass

com.bharosa.uio.manager.user.DefaultContactInfoManager

データ・ストレージへのインスタント・メッセージの保存またはデータ・ストレージからのインスタント・メッセージの取得に使用するJavaクラス

16.12.2 追加のチャレンジ・メッセージの例

チャレンジ・メッセージ・リソース・バンドルのその他の例は、以降の項に示します。これらのプロパティをclient_resource.propertiesに追加する必要があります。

16.12.2.1 OTP電子メール・メッセージのカスタマイズ

表16-24に、OTP電子メール・メッセージのプロパティを示します。カスタマイズされたOTP電子メール・メッセージのプロパティbharosa.uio.default.ChallengeEmail.message.subjectおよびbharosa.uio.default.ChallengeEmail.message.bodyを、client_resource.propertiesに追加する必要があります。プロパティbharosa.uio.default.ChallengeEmail.message.from.addressをoaam_custom.propertiesに追加する必要があります。

表16-24 OTP電子メール・メッセージのカスタマイズ

プロパティ

デフォルト値

説明

bharosa.uio.default.ChallengeEmail.message.from.name

Oracle ASAテスト

アドレスからの電子メール・メッセージ

bharosa.uio.default.ChallengeEmail.message.subject

Oracle OTPコード

電子メール・メッセージの件名

bharosa.uio.default.ChallengeEmail.message.body

このOracle電子メールのOTPコード: {0}

電子メール・メッセージの本体

16.12.2.2 OTP IMメッセージのカスタマイズ

表16-25に、OTP IMメッセージのプロパティを示します。

表16-25 OTP IMメッセージのカスタマイズ

プロパティ

デフォルト値

説明

bharosa.uio.default.ChallengeIM.message.from.name

Oracle ASAテスト

名前からのIMメッセージ

bharosa.uio.default.ChallengeIM.message.subject

Oracle OTPコード

IMメッセージの件名

bharosa.uio.default.ChallengeIM.message.body

このOracle IMのOTPコード: {0}

IMメッセージの本体

16.12.3 追加のプロセッサ登録例

表16-26に、追加のプロセッサ登録プロパティを示します。

表16-26 チャレンジ・タイプの列挙

プロパティ

説明

available

チャレンジ・タイプが使用可能(サービスが準備され構成されている)かどうか。OTPチャレンジ・タイプを有効/無効にするには、可用性フラグを設定する必要があります。

processor

このタイプのチャレンジを処理するためのJavaクラス。

requiredInfo

登録入力列挙からの入力のカンマ区切りリスト。

16.12.3.1 電子メール・チャレンジ・プロセッサの登録

表16-27に、電子メール・チャレンジ・プロセッサを登録するプロパティと、サービスを使用可能(または使用不可)としてマークするプロパティを示します。

表16-27 電子メール・チャレンジ・プロセッサを登録するプロパティ

プロパティ

デフォルト値

説明

bharosa.uio.default.challenge.type.enum.ChallengeEmail

1

電子メール・チャレンジの列挙値

bharosa.uio.default.challenge.type.enum.ChallengeEmail.name

電子メール・チャレンジ

電子メール・チャレンジ・タイプの名前

bharosa.uio.default.challenge.type.enum.ChallengeEmail.description

電子メール・チャレンジ

電子メール・チャレンジ・タイプの説明

bharosa.uio.default.challenge.type.enum.ChallengeEmail.processor

com.bharosa.uio.processor.challenge.ChallengeEmailProcessor

電子メール・チャレンジ・タイプのプロセッサ・クラス

bharosa.uio.default.challenge.type.enum.ChallengeEmail.requiredInfo

email

電子メール・チャレンジ・タイプでユーザーにチャレンジするための必須フィールド

bharosa.uio.default.challenge.type.enum.ChallengeEmail.available

false

電子メール・チャレンジ・タイプの可用性フラグ

bharosa.uio.default.challenge.type.enum.ChallengeEmail.otp

true

電子メール・チャレンジ・タイプのOTPフラグ

16.12.3.2 IMチャレンジ・プロセッサの登録

表16-28に、IMチャレンジ・プロセッサを登録するプロパティと、サービスを使用可能(または使用不可)としてマークするプロパティを示します。

表16-28 IMチャレンジ・プロセッサを登録するプロパティ

プロパティ

デフォルト値

説明

bharosa.uio.default.challenge.type.enum.ChallengeIM

3

インスタント・メッセージのチャレンジ列挙値

bharosa.uio.default.challenge.type.enum.ChallengeIM.name

IMチャレンジ

インスタント・メッセージのチャレンジ・タイプの名前

bharosa.uio.default.challenge.type.enum.ChallengeIM.description

インスタント・メッセージ・チャレンジ

インスタント・メッセージのチャレンジ・タイプの説明

bharosa.uio.default.challenge.type.enum.ChallengeIM.processor

com.bharosa.uio.processor.challenge.ChallengeIMProcessor

インスタント・メッセージのチャレンジ・タイプのプロセッサ・クラス

bharosa.uio.default.challenge.type.enum.ChallengeIM.requiredInfo

mobile

インスタント・メッセージのチャレンジ・タイプでユーザーにチャレンジするための必須フィールド

bharosa.uio.default.challenge.type.enum.ChallengeIM.available

false

インスタント・メッセージのチャレンジ・タイプの可用性フラグ

bharosa.uio.default.challenge.type.enum.ChallengeIM.otp

true

インスタント・メッセージのチャレンジ・タイプのOTPフラグ

16.13 チャレンジのユースケース

チャレンジ・シナリオの例は、次のとおりです。

1. Oracle Adaptive Access Managerサーバーにより、ユーザーに対してユーザー名ページが表示されます。

2. ユーザーは、ユーザー名ページでユーザー名を送信します。

3. Oracle Adaptive Access Managerにより、ユーザー・デバイスのフィンガープリントが処理され、ユーザーがパスワード・ページに進むことを許可するかどうかを決定する認証前ルールが実行されます。

4. ユーザーは、パスワード・ページに進むことが許可されて、自分のパスワードを入力します。

5. OAAMポリシーにより、ユーザーにチャレンジする必要があることが示されます。

6. チャレンジ・チェックポイントが実行され、使用するチャレンジのタイプ(KBA、電子メール、SMSなど)が決定されます。SMSチャレンジが返された場合は、SMSチャレンジ・プロセッサがロードされます。このSMSチャレンジ・プロセッサを使用してOTPが生成され、そのOTPがSMSを通じてユーザーに配信されます。

7. SMSが送信されると、ユーザーのOTPがSMSでユーザーに送信されたことを示すチャレンジ・ページが表示されます。

8. アプリケーションでの処理を継続するために、ユーザーは正しいOTPを入力してからログイン・フローを完了します。

生成されてユーザーに送信されたOTPは、各HTTPセッションで1回のみ入力可能です。ユーザーのHTTPセッションが期限切れになると、ユーザーが後続のセッションで再度チャレンジされた場合に新規OTPが生成されて送信されます。

17 モバイル・アプリケーションとOAAMとの統合

この章では、ネイティブ・モバイル・アプリケーションとOAAMとの統合について説明します。ブラウザに基づくモバイルWebアプリケーションや、Webビューを使用するモバイルWebアプリケーションは対象ではありません。

この章は、次の項で構成されています。

- 第17.1項「モバイル・アプリケーションとOAAMとの統合の概要」

- 第17.2項「モバイル・デバイス・フィンガープリントの決定」

- 第17.3項「OAAM固有のデータを処理するためのクライアント・サーバー・インタフェースの開発/拡張」

- 第17.4項「即時利用可能なモバイル・デバイスの識別ポリシー」

- 第17.5項「即時利用可能なセキュリティ・ポリシーのレビューと必要に応じたカスタム・ポリシーの開発」

- 第17.6項「紛失/盗難デバイスの管理プロセス」

- 第17.7項「ブラック・リスト上のデバイスの管理プロセス」

- 第17.8項「モバイル固有のルール結果の処理」

- 第17.9項「モバイル・デバイスのユーザー・インタフェースのカスタマイズ」

- 第17.10項「カスタム・モバイルCSSファイルの包含」

17.1 モバイル・アプリケーションとOAAMとの統合の概要

モバイル・アプリケーションのOAAMとの統合は、主にサーバー・サイドの統合に限定されています。統合開発者は、ネイティブ・モバイル・アプリケーションとビジネス・アプリケーション間でのデータのやりとりを担当します。

OAAMには現在、モバイル・アプリケーションに固有のソフトウェア開発キット(SDK)は用意されていません。

注意:

Oracle Access Management Mobile and Social (Mobile and Social)を使用した場合は、ネイティブ・モバイル・アプリケーションとOAAMを別途統合する必要はありません。Mobile and Socialは、すでにOAAMと統合されています。詳細は、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

表17-1に、ネイティブ・モバイル・アプリケーションとOAAMとの統合に必要な高度な手順をリストします。

表17-1 モバイル・アプリケーション統合の概要

番号

手順

1

モバイルの識別方法を決定します。デバイスを一意に識別できるデバイス固有の属性のリストを作成します。この章では、この情報をモバイル・デバイスのフィンガープリントと呼ぶことにします。

2

ビジネス・アプリケーション・データだけでなく、OAAM固有のデータを送受信できるクライアント・サーバー・インタフェースを設計および開発します。代表的なOAAM固有のデータとして、デバイス識別関連情報と、ユーザー・セッションの範囲におけるセッション/リクエストIDがあります。トランザクションを使用している場合は、トランザクション固有のデータも適宜渡す必要があります。

3

モバイル・デバイスからのデータの受信、OAAM APIからモバイル・デバイスへの必要なデータの送信を行うために、OAAM APIをコールするコードをビジネス・アプリケーションに作成します。

4

統合をテストして、エンドツーエンドで機能することを確認します。

以降の各項で、統合タスクについて詳しく説明します。

17.2 モバイル・デバイス・フィンガープリントの決定

即時利用可能なOAAMには、次の属性で構成されるデフォルトのモバイル・デバイス・フィンガープリントが用意されています。

- オペレーティング・システムのタイプ

- ハードウェアIMEI番号

- ハードウェアMACアドレス

これらの属性は、vcrypt.fingerprint.type.enum.native_mobileという列挙要素を介して指定されます。OAAM管理コンソールの「プロパティ」エディタ・オプションを使用して、この列挙要素の属性を表示できます。

モバイル・フィンガープリントを変更するには、次の手順を実行します。

1. OAAM管理コンソールにログインします。

2. ナビゲーション・ペインで、「環境」ノードの下の「プロパティ」をダブルクリックします。プロパティ検索ページが表示されます。

3. 「名前」フィールドに「vcrypt.fingerprint.type.enum.native_mobile」と入力して、「検索」をクリックします。
「検索結果」セクションに、プロパティの属性が表示されます。

4. モバイル・デバイスを識別する属性がさらに必要な場合は、「名前」フィールドに「vcrypt.fingerprint.type.enum.native_mobile.header_list」と入力して、「検索」をクリックします。

5. 「検索結果」セクションでクリックしてプロパティを選択し、属性のリストを追加して「保存」をクリックします。

6. 属性とその値のマッピングを指定するには、「名前」フィールドに「vcrypt.fingerprint.type.enum.native_mobile.header_name_nv」と入力して、「検索」をクリックします。

7. 「検索結果」セクションでクリックしてプロパティを選択し、マッピング属性を追加して「保存」をクリックします。

8. 実際値と表示値のマッピングを指定するには、「名前」フィールドに「vcrypt.fingerprint.type.enum.native_mobile.header_value_nv」と入力して、「検索」をクリックします。

9. 「検索結果」セクションでクリックしてプロパティを選択し、表示する実際値を追加して「保存」をクリックします。

注意: 非常に動的な属性(IPアドレスなど)を、モバイル・デバイス・フィンガープリントの属性として追加しないでください。デバイスを一意に識別できる属性のみを追加してください。

次の例は、モバイル・フィンガープリント列挙を示しています。

vcrypt.fingerprint.type.enum.native_mobile=900
vcrypt.fingerprint.type.enum.native_mobile.name=Native Mobile
vcrypt.fingerprint.type.enum.native_mobile.description=
Native Mobile implementation using Mobile and Social
vcrypt.fingerprint.type.enum.native_mobile.processor=
com.bharosa.uio.processor.device.NativeMobileDeviceIdentificationProcessor
vcrypt.fingerprint.type.enum.native_mobile.header_list=
os.type,os.version,hw.imei,hw.mac_addr
vcrypt.fingerprint.type.enum.native_mobile.header_name_nv=
os.type,Operating System Type,os.version,Operating System Version,
hw.imei,Hardware IMEI Number,hw.mac_addr,Hardware Mac Address
vcrypt.fingerprint.type.enum.native_mobile.header_value_nv=t,true,f,false

17.3 OAAM固有のデータを処理するためのクライアント・サーバー・インタフェースの開発/拡張

特定のOAAM固有のデータをネイティブ・モバイル・アプリケーション(クライアント)とOAAM間で受け渡す必要があります。これを実現するには、クライアント・サーバー・インタフェースを設計、開発および拡張して、OAAM固有のデータを処理できるようにする必要があります。

次に、処理する必要のある代表的なOAAMデータを示します。

OAAMデバイス・フィンガープリント・データ

- クライアント(ネイティブ・モバイル・アプリケーション)
すべてのデバイス識別関連データをサーバーに送信します。

- サーバー

- デバイス識別関連データを解析し、デバイス・フィンガープリントをフォーマット化します。

- OAAMセッション作成APIコールの実行中に、デバイス・フィンガープリント・データを使用します。

OAAMデバイスCookie

- クライアント(ネイティブ・モバイル・アプリケーション)

- 既存のOAAM Cookieをサーバーに渡します。

- サーバーから返された新規のOAAM Cookieを永続化します。

- Cookieを格納して、セキュアになるようにします。(盗難されることはありません)

- サーバー

- ネイティブ・モバイル・アプリケーション(クライアント)から既存のCookieを取得し、それをOAAMセッション作成APIで使用します。

- 新規のデバイスCookieをクライアントに渡します。

クライアント・アプリケーションのID/名前を渡します。

- クライアントからモバイル・アプリケーション名を送信します。

- サーバーは、OAAMセッション作成APIをコールするときに、Client Applicationとしてモバイル・アプリケーションを使用する必要があります。

OAAMセッション/リクエストID

- クライアント(ネイティブ・モバイル・アプリケーション)
セッションが新規または既存のいずれであるかに基づいて、OAAMセッション/リクエストIDを新規に生成するか、既存のものを使用します。セッションの終了/期限切れになり次第、OAAMセッションIDを破棄するように注意する必要があります。

- サーバー
OAAM APIをコールする際に、クライアントからのセッション/リクエストIDを適切に使用してください。

トランザクション・データの処理

- クライアント(ネイティブ・モバイル・アプリケーション)
トランザクションと関連データのタイプの識別に必要なデータを送信します。

- サーバー

- クライアントからのデータに基づいて、トランザクション定義キーとトランザクション・コンテキスト・データを決定します。

- トランザクション定義キーとトランザクション・コンテキスト・データを使用して、OAAMトランザクションAPIをコールします。

- トランザクション関連チェックポイント/ルールをコールして、結果をクライアントに送信します。

17.4 即時利用可能なモバイル・デバイスの識別ポリシー

この項では、即時利用可能なモバイル・デバイスの識別ポリシーの動作方法について説明します。

17.4.1 モバイルCookieによるデバイスの識別

次の条件が満たされる場合、モバイルCookieはデバイスを識別します。

- モバイルCookieが有効である

- 既知のヘッダーとの不一致がない

その場合、スコアはゼロ(0)になります。

17.4.2 新規デバイス

次のいずれかの条件が満たされる場合、デバイスは新規デバイスとして扱われます。

- モバイルCookieは有効だが、既知のヘッダーが一致しない

- モバイルCookieが無効である(または失効している)

- 最初の2つが両方ともtrueの場合は、モバイル・デバイス・フィンガープリントを使用してデバイスを識別できるかどうか確認するため、バックグラウンド・チェックが実行されます。

17.5 即時利用可能なセキュリティ・ポリシーのレビューと必要に応じたカスタム・ポリシーの開発

モバイル・デバイスに特化したOAAM認証後セキュリティ・ポリシーで、次のルールをレビューします。

紛失または盗難デバイス

現在のデバイスが紛失または盗難とレポートされているかどうかを検出します。

ルール

ルールの条件およびパラメータの値

結果

紛失または盗難デバイス

デバイス: デバイスが特定のタイプであるかどうかの確認

デバイス・タイプ = モバイル・デバイス

戻り値 = True

デバイス: グループ内デバイス

グループ内 = True

グループ内デバイス = OAAM紛失または盗難デバイス

アクション = OAAM紛失デバイス

アラート = OAAM紛失または盗難デバイス

スコア = 1000

ジェイルブレークされたモバイル・デバイス

モバイル・デバイスからのコンテキスト・データに基づいて、現在のデバイスがジェイルブレークされたものかどうかを検出します。

ルール

ルールの条件およびパラメータの値

結果

ジェイルブレークされたモバイル・デバイス

デバイス: デバイスが特定のタイプであるかどうかの確認

デバイス・タイプ = モバイル・デバイス

戻り値 = True

セッション: 文字列パラメータ値の確認

パラメータ・キー = isJailBroken

値 = true

アクション = OAAMチャレンジ

アラート = OAAMジェイルブレークされたデバイス

スコア = 500

多すぎるモバイル・デバイス

ユーザーのログイン元の未登録モバイル・デバイスが多すぎないかどうかを検出します。

ルール

ルールの条件およびパラメータの値

結果

多すぎるモバイル・デバイス

デバイス: デバイスが特定のタイプであるかどうかの確認

デバイス・タイプ = モバイル・デバイス

戻り値 = True

デバイス: 登録済

登録済の場合の戻り値 = False

ユーザー: 特定のタイプの登録済デバイス数の確認

デバイス数 = 次より大きい

比較するデバイス数 = 4

デバイス・タイプ = モバイル・デバイス

アクション = OAAM多すぎるモバイル・デバイス

アラート = OAAM許可されている数を超えて使用されているモバイル・デバイス

スコア = 1000

ブラック・リストに記載されたモバイル・デバイス

現在のログインがブラック・リスト・デバイスからのものかどうかを検出します。

ハードウェア識別子は同一だがオペレーティング・システムは不一致

HW識別子が前に識別されたデバイスのハードウェア識別子と同じであっても、オペレーティング・システムが一致していないかどうかを検出します。

ルール

ルールの条件およびパラメータの値

結果

ハードウェア識別子は同一だがオペレーティング・システムは不一致

事前条件: デバイス・リスク・スコアが599から601の間

デバイス: デバイスが特定のタイプであるかどうかの確認

デバイス・タイプ = モバイル・デバイス

戻り値 = True

デバイス: ブラウザ・ヘッダー・サブストリング

サブストリング = "OIC"

アクション = OAAMモバイル・デバイスOSの不一致

アラート = OAAM異なるOSのモバイル・デバイス

スコア = 1000

追加/カスタム要件に関しては、別のポリシーを作成し、そのポリシーに必須ルールを追加することをお薦めします。

17.6 紛失/盗難デバイスの管理プロセス

紛失または盗難デバイスを検出するには、紛失または盗難としてレポートされたデバイスIDを関連リストに移入する必要があります。

次のアプローチをお薦めします。

1. OAAM管理コンソールにログインします。

2. 紛失または盗難としてレポートされたデバイスのデバイスIDを識別します。

1. これを行うには、ユーザー・セッションを検索し、デバイスの使用場所を確認できるセッションに絞り込みます。

2. 関連デバイスのデバイスIDを書き留めます。

3. タイプDevicesのグループを検索します。

4. 「OAAM紛失または盗難デバイス」グループを選択します。

5. このグループにデバイスIDを追加します。

17.7 ブラック・リスト上のデバイスの管理プロセス

このプロセスは、紛失/盗難デバイスの管理プロセスとほとんど同じです。デバイスIDが「OAAMブラック・リストに記載されたモバイル・デバイス」グループに追加される点が異なります。

17.8 モバイル固有のルール結果の処理

即時利用可能なOAAM認証後ポリシーでは、モバイル・デバイス固有の次の結果が返されることもあります。統合コードに関してこの結果を適切に処理し、ビジネス固有のアクションを実行する必要があります。

- OAAM紛失デバイス

- OAAM多すぎるモバイル・デバイス

- OAAMブラック・リストに記載されたモバイル・デバイス

- OAAMモバイル・デバイスのOS不一致

17.9 モバイル・デバイスのユーザー・インタフェースのカスタマイズ

OAAMサーバーは、モバイル・フレンドリーにカスタマイズできます。ユーザーがモバイル・デバイスでWebページを表示できるように、ベース・モバイルCSS(外部スタイルシート)ファイルが用意されています。OAAMでサポートされるデバイスで検索されたブラウザと、各デバイスのネイティブのルック・アンド・フィールが大きく異なるため、OAAMサーバーではモバイルCSSに対するカスタム・オーバーライドをサポートしています。汎用のモバイルCSSに加えて、デバイス固有のCSSを定義できるため、よりきめの細かいカスタマイズが可能です。モバイル・デバイスには、iPhone、iPad、Android、Windows Phone、およびBlackberryがあります。

デバイス固有のCSSファイルを実装するには、次の手順を実行します。

1. 外部CSSファイルを作成します。
たとえば、customAndroid.css、customIPhone.css、customBlackBerry.css、customWindows7phone.cssなどです。

2. このCSSテキスト・ファイル内に、すべてのスタイル・ルールを定義します。たとえば、すべての本体テキストをイタリックにするスタイルを追加します。

body{
font-style:italic
}

3. 次の参照を、oaam_custom.propertiesにあるカスタム・ファイルに追加します。

bharosa.uio.default.custom.mobile.css=/css/customMobile.css

デバイス名をプロパティに含めることによってモバイル・デバイスごとにカスタム・モバイルCSSを追加して、次の処理ができるようにします。

bharosa.uio.default.custom.mobile.device.css=/css/customdevice.css

deviceとして、iPhone、Blackberry、Android、Windows Phoneなど、任意の定義済デバイスが指定できます。

bharosa.uio.default.custom.mobile.android.css=/css/customAndroid.css
bharosa.uio.default.custom.mobile.iphone.css=/css/customIPhone.css
bharosa.uio.default.custom.mobile.blackberry.css=/css/customBlackBerry.css
bharosa.uio.default.custom.mobile.windowsphone7.css=
/css/customWindowsPhone7.css

4. OAAM拡張ライブラリにCSSファイルを追加します。

17.10 カスタム・モバイルCSSファイルの包含

カスタム・モバイルCSSファイルの包含は、プロパティの定義と、CSSファイルがOAAM拡張ライブラリに含まれているかどうかに依存します。

デフォルトの包含順序は次のとおりです。

1. 製品CSS

2. カスタムCSS(定義されている場合)

3. 製品の右から左のCSS(右から左のロケールの場合)

4. カスタムの右から左のCSS(右から左のロケールであり、このファイルが定義されている場合)

5. 製品モバイルCSS(モバイル・デバイスの場合)

6. カスタム・モバイルCSS(モバイル・デバイスであり、このファイルが定義されている場合)

7. 製品のモバイル・デバイス固有のCSS(デバイス用に定義されている場合)

8. カスタムのモバイル・デバイス固有のCSS(デバイス用に定義されている場合)

ファイルで同じ属性が定義されている場合、前のファイルは後続のファイルによってオーバーライドされます。

カスタムCSSファイルに加えて、OAAMの即時利用可能なポリシーでは、モバイル・デバイスのユーザー向けに質問登録ページのHTMLバージョンが用意されています。

- ユーザーが新規のセキュリティ質問を登録するよう要求され、ユーザーがモバイル・デバイスのWebブラウザからアプリケーションにアクセスしようとしているときに、認証パッド・ポリシーによってHTMLアクションが返されます。

- ユーザーが新規のセキュリティ質問を登録するよう要求され、ユーザーがモバイル・デバイス以外のWebブラウザからアプリケーションにアクセスしようとしているときに、認証パッド・ポリシーによってQuestion Padアクションが返されます。

18 Juniper Networks Secure Access (SA)とOAAMの統合

Juniper Networks Secure Access (SA)とOracle Adaptive Access Managerとの統合により、企業は、厳密なマルチファクタ認証と高度なリアルタイム不正行為防止機能を備えたリモート・アクセス制御ソリューションを実装して、企業のアプリケーションにセキュアにアクセスできます。

この章では、Juniper Secure Access (SA)の統合に対応するOAAMの構成方法について説明します。この章では、次の内容を説明します。

- 第18.1項「概要」

- 第18.2項「認証およびパスワードを忘れた場合のフロー」

- 第18.3項「セキュリティおよび認証統合」

- 第18.4項「統合の検証」

- 第18.5項「統合のデバッグ」

- 第18.6項「一般的な問題のトラブルシューティング」

18.1 概要

ネットワーク・セキュリティ信頼ゾーンで保護されたエンタープライズ・リソースにアクセスするには、すべてのリモート・アクセスのセキュアなゲートウェイであるSSL VPNにアクセスする必要があります。

Juniper SAは、リモートおよびモバイルの従業員、顧客、パートナがいつでも、どこでも企業のリソースとアプリケーションにセキュアにアクセスできるための一連のSSL VPNアプライアンスです。

Oracle Adaptive Access Manager 11gは、強力かつデプロイの容易なリスク・ベース認証、フィッシング対策、およびマルウェア対策の各種機能を駆使して最重要のオンライン・ビジネス・アプリケーションを保護します。

SAML (Security Assertion Markup Language)は、セキュリティ・ドメイン間で認証および権限データを交換するためのXMLベースのオープン標準です。

この統合では、リソースへのアクセスを制御するJuniper SAは認証時にOAAMを使用して、ユーザー認証中のリスクを最小限に抑え、セキュリティを強化します。ソリューションの組合せによって、認証時の不正行為とリスクの検出が可能になり、それに応じて、Challenge、Block、その他のアクションなどのOAAM機能を使用してユーザーを強力に認証します。Juniper SAは、Security Assertion Markup Language (SAML)を使用してユーザー認証と権限データを交換できるように構成されます。

図18-1に、Juniper SAとOAAM間の高レベルのフローを示します。認証フローの詳細は、第18.2.1項「認証フロー」を参照してください。

図18-1 Juniper SSL VPNとOAAMの統合アーキテクチャ

18.2 認証およびパスワードを忘れた場合のフロー

2つの統合ユースケースは、Juniper SSL VPNで認証およびパスワードを忘れた場合のフローに対応するためのOAAMの統合に重点を置いています。

- OAAMは、認証時の不正行為とリスクを検出し、Challenge、Blockやその他のアクションなど、厳密な認証機能を提供します。統合によって、ユーザーが認証されない場合に認証順序が遂行できるようにユーザーがOAAMにリダイレクトされます。

- OAAMは、パスワード・リセット認証を実現します。パスワードを忘れた場合のフローでは、ユーザーは、チャレンジ質問に正しく回答した後で自分のパスワードをリセットできます。

18.2.1 認証フロー

図18-2に、OAAMで認証フローが実現される場合に、Juniper SAによって保護されているWebアプリケーションまたはURLにユーザーがログインする方法を示します。

図18-2 Juniper SAおよび認証フローを実現するOAAM

次のプロセスでは、OAAMで認証フローが実現される場合に、Juniper SAによって保護されているWebアプリケーションまたはURLにユーザーがログインする方法を説明しています。

1. ユーザーは、Juniper SAにより保護されているWebアプリケーションまたはURLにアクセスしようと試みます。Juniper SAはSAMLを使用するように構成されています。

2. Juniper SAは、ユーザーが認証されているかどうかを検出します。認証されている場合は、ユーザーはWebアプリケーションに進むことができます。

3. 認証されていない場合、ユーザーはOAAMサーバーにリダイレクトされます。OAAMサーバーはOAAMログイン・ページを表示し、ユーザーIDを入力するようにユーザーに促します。

4. 資格証明コレクションの一部としてユーザーIDが入力されると、OAAMは認証前チェックポイントを評価して、ユーザーをブロックする必要があるかどうかを検証します。次に、OAAMはユーザーが認証パッドを登録しているかどうかを確認します。登録済の場合は、登録された認証パッドが表示され、登録済でない場合は、汎用テキスト・パッドが表示されます。

5. OAAMサーバーは認証パッドのあるパスワード・ページを表示し、パスワードを入力するようユーザーに促します。

6. パスワードが入力されると、OAAMはOracle Platform Security Services (OPSS)を使用して、そのパスワードをユーザー・ストアと照合します(ユーザー・ストアにはLDAP、Active Directory、またはその他の認証プロバイダが使用できます)。OPSSは、Javaアプリケーションに対応する標準ベースの、ポータブルな、統合されたエンタープライズ級のセキュリティ・プラットフォームです。
OAAMでは、デバイス識別プロセスを実行してデバイスの識別も行われます。

7. 資格証明が正しくない場合は、エラー・ページが表示されて、資格証明を再入力するようユーザーに要求します。

8. 資格証明が正しい場合は、認証後チェックポイントが評価されます。チェックポイントの結果に基づき、OAAMはユーザーにチャレンジするか、ユーザーをブロックします。

9. 認証後の結果がALLOWの場合は、ユーザーを登録する必要があるかどうかが判別されます。登録のタイプに基づいて、登録ページが順次に表示されます。
登録とは、アカウントを新規に開く場合など、ユーザーに情報を求めるイベントからなる登録プロセスのことです。登録プロセスでは、ユーザーは質問、イメージ、フレーズ、およびデプロイメントでOTPがサポートされている場合にはOTP(電子メールや電話など)を登録するように求められます。

10. 認証後の結果がCHALLENGEであり、ユーザーが1つ以上のチャレンジ・メカニズムにすでに登録されている場合、OAAMはユーザーにチャレンジします。チャレンジに回答できる場合、ユーザーは次のステップに送られます。

11. 認証が成功した後、OAAMはユーザー・ストアからユーザー属性を取得し、そのユーザー属性に基づいてSAMLアサーションを作成し、それに署名して、そのアサーションをJuniper SAのリダイレクションURLにポストします。Juniper SAはアサーションを使用して検証し、ユーザーが要求したターゲット・ページまたはWebアプリケーションにユーザーをログインします。

12. 認証後チェックポイントの結果がBLOCKの場合、ユーザーはブロックされ、アクセスを試みたWebアプリケーションにアクセスできなくなります。

18.2.2 パスワードを忘れた場合のフロー

図18-3に、ユーザーがすべてのチャレンジ質問に正しく回答した後でパスワードをリセットする方法を示します。

図18-3 Juniper SAおよびOAAMのパスワード忘れフロー

次のプロセスでは、ユーザーがすべてのチャレンジ質問に正しく回答した後でパスワードをリセットする方法について説明します。

このユースケースでは、パスワードを忘れた場合のフローに対応するOAAMとJuniper SAとの統合に重点を置いています。

1. ユーザーは、Juniper SAにより保護されているWebアプリケーションまたはURLにアクセスしようと試みます。Juniper SAはSAMLを使用するように構成されています。

2. Juniper SAは、ユーザーが認証されているかどうかを検出します。認証されている場合、ユーザーはWebアプリケーションに進むことができます。

3. 認証されていない場合、ユーザーはOAAMサーバーにリダイレクトされます。

4. OAAMサーバーはOAAMログイン・ページを表示し、ユーザーIDを入力するようにユーザーに促します。

5. ユーザーIDが入力されると、OAAMは認証前チェックポイントを評価して、ユーザーをブロックする必要があるかどうかを確認します。次に、OAAMはユーザーが認証パッドを登録しているかどうかを確認します。ブロックの必要が確認された場合は、登録された認証パッドが表示され、確認されない場合は、汎用テキスト・パッドが表示されます。

6. OAAMサーバーは認証パッドのあるパスワード・ページを表示し、パスワードを入力するようユーザーに促します。

7. ユーザーは、「パスワード忘れ」リンクをクリックします。

8. OAAMサーバーは、「パスワード忘れ」チェックポイントを実行して、パスワードを忘れた場合のフローを開始します。

9. 結果に基づいて、OAAMサーバーはユーザーにチャレンジするか、ユーザーをブロックします。

10. チャレンジに正しく回答できた場合、ユーザーは新規パスワードを入力するよう促されます。

11. 次に、OAAMはユーザー・ストアをコールしてパスワードを更新します。

12. さらに、ユーザー・ストアからユーザー属性を取得し、SAMLアサーションを作成し、それに署名して、そのアサーションをJuniper SAのリダイレクションURLにポストします。

18.3 セキュリティおよび認証統合

Oracle Adaptive Access ManagerとJuniper Networks Secure Access (SA)を統合してOracle Adaptive Access Managerの認証フローとパスワードを忘れた場合のフローを使用するには、この項の手順を参照してください。

18.3.1 統合ロードマップ

表18-1に、Oracle Adaptive Access ManagerとJuniper SAとの統合の高レベルのタスクの概要を示します。

表18-1 統合ステップ

番号

タスク

情報

1

前提条件をレビューします。

詳細は、前提条件を参照してください。

2

認証プロバイダを構成します。

詳細は、「認証プロバイダの構成」を参照してください。

3

Oracle Platform Security Servicesを認証用に構成します。

詳細は、「Oracle Platform Security Services (OPSS)の統合用の構成」を参照してください。

4

サーバー・プロパティをインポートします。

詳細は、「OAAM管理コンソールを使用したSAML構成関連サーバー・プロパティのインポート」を参照してください。

5

証明書またはトラストを設定します。

詳細は、「アサーションの署名に対する証明書の設定」を参照してください。

6

統合プロパティを変更します。

詳細は、「OAAM管理コンソールを使用した統合プロパティの変更」を参照してください。

7

Juniper SSLの構成

詳細は、「Juniper Networks Secure Access (SA)の構成」を参照してください。

18.3.2 前提条件

この章のタスクを開始する前に、次の点に留意してください。

- Juniper SAとOAAMサーバーのノードでシステム・クロックを同期化しておく必要があります。Juniper SAのシステム・クロックとOAAMサーバーのクロック間で時間を同期化する必要があります。Juniper SAシステム・クロックの時間がOAAMサーバーのクロックよりも進まないようにする必要があります。

- Oracle WebLogicは必須です。WebLogicのバージョンについては、現在の動作保証マトリクスを確認してください。現在、この統合はOracle WebLogicのみのOAAM 11gでテスト済です。

- この統合は、SAML 1.1バージョンに実装されています。

18.3.3 認証プロバイダの構成

WebLogicでは、認証プロバイダを使用してユーザーまたはシステム・プロセスのアイデンティティを指定します。認証プロバイダは、そのアイデンティティ情報を記憶したり、システムの各種コンポーネントに転送したり、必要に応じて(サブジェクトを通して)使用可能にすることもあります。

WebLogicの組込みLDAP、AD (Active Directory)、その他の認証プロバイダをアイデンティティ・ストアとして使用できます。

認証プロバイダを構成するには、次の手順を実行します。

1. Oracle WebLogic管理コンソールにWebLogic管理者としてログインします。たとえば、次のようになります。

http://hostname:7001/console

デフォルトのポートは7001です。

2. 左ペインの「ドメイン構造」セクションから「セキュリティ・レルム」を選択します。

3. 「セキュリティ・レルム」ページの「サマリー」で、構成中のレルムの名前をクリックします。たとえば、「myrealm」をクリックします。

「myrealmの設定」ページが表示されます。

4. 「プロバイダ」タブをクリックして、「認証」サブタブを表示します。

5. 「DefaultAuthenticator」を選択して、組込みLDAPを使用します。その他のアイデンティティ・ストアに関しては、適切なプロバイダを選択してください。たとえば、Active Directoryには「AD Authenticator」を選択します。

6. 「DefaultAuthenticator」が最初の位置に表示されるように、プロバイダを並べ替えます。

1. 「並替え」をクリックし、「認証プロバイダの並替え」ページを表示します。

2. 「DefaultAuthenticator」を選択し、矢印ボタンを使用してそれをリストの最初に移動させます。

3. 「OK」をクリックして、変更を保存します。

7. 組込みLDAPを使用している場合は、次の手順を実行する必要があります。

1. Oracle WebLogic管理コンソールで、左ペインの「ドメイン構造」の「base_domain」をクリックします。

2. 「セキュリティ」タブをクリックします。

3. 「組込みLDAP」タブをクリックします。

4. 「マスター優先」オプションを選択します。

5. 「保存」をクリックします。

8. WebLogic管理サーバーおよび管理対象サーバーを再起動します。

18.3.4 Oracle Platform Security Services (OPSS)の統合用の構成

Oracle Platform Security Services (OPSS)では、企業の製品開発チーム、システム・インテグレータ(SI)および独立系ソフトウェア・ベンダー(ISV)に、Java Standard Edition (Java SE)およびJava Enterprise Edition (Java EE)のアプリケーション向けに標準ベースで移植可能な企業向け統合セキュリティ・フレームワークを提供します。OPSS抽象レイヤーが認証に使用されます。認証の構成はWebLogicで実行する必要があります。OPSSの詳細は、『Oracle Fusion Middlewareアプリケーション・セキュリティ・ガイド』を参照してください。

1. OAAMがインストールされているマシン上で、WebLogic_Domain/config/fmwconfigに移動します。

2. jps-config.xmlをバックアップします。

3. JPS、config.xmlを開きます。

4. タグ</jpsContexts>を閉じる前に、次のJPSコンテキストを追加します。

<!-- This context is used for OAAM Juniper Integration -->
<jpsContext name="idcontext">
<serviceInstanceRef ref="user.authentication.loginmodule"/>
<serviceInstanceRef ref="idstore.ldap"/>
<serviceInstanceRef ref="credstore"/>
<serviceInstanceRef ref="keystore"/>
<serviceInstanceRef ref="policystore.xml"/>
<serviceInstanceRef ref="audit"/>
</jpsContext>

5. ファイルを保存して終了します。

注意:

ファイルを保存した後で、XMLエディタを使用してすべてのタグが正しいことを確認する必要が生じることがあります。インターネット・エクスプローラでこのファイルを開いて、タグが抜けていないか確認することもできます。変更が正しい場合は、インターネット・エクスプローラでファイルを正常に開くことができます。

6. これらの変更では再起動が必要なため、WebLogic管理サーバー、OAAM管理サーバー、OAAM管理対象サーバーを停止および起動してください。

18.3.5 OAAM管理コンソールを使用したSAML構成関連サーバー・プロパティのインポート

SAML構成関連プロパティをインポートして、OAAMデータベースに追加されるようにします。

SAML構成関連プロパティをインポートするには、次の手順を実行します。

1. OAAM管理コンソールにセキュリティ管理者としてログインします。たとえば、次のようになります。

http://hostname:port/oaam_admin

2. ナビゲーション・ペインで、「環境」ノードの下の「プロパティ」をクリックします。

3. 「プロパティ」ページで「プロパティのインポート」をクリックして、統合用にサーバー・プロパティをインポートします。

4. IDM_ORACLE_HOME/oaam/initディレクトリでsaml_properties.zipを参照し、「オープン」をクリックし、「インポート」をクリックします。
インポートが完了すると、プロパティが正常にインポートされたことが表示されます。

5. 「完了」をクリックして、インポートを完了します。
これによって、統合に必要なプロパティがインポートされます。第18.3.7項「OAAM管理コンソールを使用した統合プロパティの変更」で、環境に応じてこれらのプロパティを変更します。

18.3.6 アサーションの署名に対する証明書の設定

認証局(CA)は、サード・パーティやその他のエンティティ(ユーザー、データベース、管理者、クライアント、サーバーなど)のアイデンティティを証明する信頼できる第三者機関です。認証局は、当事者の識別情報を検証し、秘密鍵で署名された証明書を付与します。

Juniper SAとOAAM間で信頼の証明書を設定するには、以降の各項に説明する手順を実行します。

- 証明書の秘密鍵の作成

- 証明書リクエストの作成

- 独自の認証局としての行動

- 証明書を自分のキーストアにインポート

18.3.6.1 証明書の秘密鍵の作成

最初に、証明書の秘密鍵を作成します。この秘密鍵を作成するには、次の手順を実行します。

1. 作業ディレクトリをセキュリティ・プロパティのディレクトリMW_HOME/jdk160_18/jre/lib/securityに変更します。

2. keytoolというキーおよび証明書管理ユーティリティを使用して、秘密鍵を作成します。cacertsをキーストアとして使用して、次のコマンドを入力します。

keytool -genkey -keyalg rsa -validity 1825
-keysize 2048 -alias OAAMCert
-keystore cacerts -storepass changeit

3. 証明書の詳細を入力します。
出力の例は次のとおりです。

What is your first and last name?
[Unknown]:  ag-oracle-oaam
What is the name of your organizational unit?
[Unknown]: Juniper
What is the name of your organization?
[Unknown]: Juniper
What is the name of your City or Locality?
[Unknown]:  Sunnyvale
What is the name of your State or Province?
[Unknown]:  CA
What is the two-letter country code for this unit?
[Unknown]:  US
Is CN=ag-oracle-oaam, OU=Juniper, O=Juniper, L=Sunnyvale, ST=CA, C=US correct?
[no]:  yes

注意:

通常、証明書のCNはマシンの名前です。

4. プロンプトが表示されたら、キーストアのパスワードを入力します。

Enter key password for <OAAMCert>
(RETURN if same as keystore password):
Reenter new password:

このパスワードは、統合用にあとで必要になるので覚えておいてください。

18.3.6.2 証明書リクエストの作成

秘密鍵と自己署名証明書を作成した後で、keytoolコマンドを使用して証明書署名リクエスト(CSR)を生成します。

1. 作業ディレクトリをMW_HOME/jdk160_18/jre/lib/securityに変更します。

2. 次のコマンドを実行して、証明書リクエストを作成します。

keytool -certreq -alias OAAMCert -file server.csr
-keystore cacerts -storepass changeit

この例では、server.csrというファイルに証明書リクエストを作成しました。

18.3.6.3 証明書署名リクエスト(CSR)の認証局への送信

証明書署名リクエスト(CSR)を認証局に送信して、デジタル証明書を取得します。認証局から証明書が発行されます。発行された証明書と、リクエストを署名したルートCA証明書を受信する必要が生じる場合もあります。

テストとして、独自の認証局として行動して証明書に署名することができます。本番シナリオでは、認証局からの証明書を使用する必要があります。

本番シナリオでは、第18.3.6.4項「独自の認証局として行動」をスキップして、第18.3.6.5項「自分のキーストアに証明書をインポート」に進み、外部認証局から証明書をインポートします。

18.3.6.4 独自の認証局としての行動

テストの目的で、独自の認証局として行動して証明書に自己署名することができます。次の手順を1つずつ実行して、証明書の自己署名を設定します。この設定を行うには、後続の例に従って実行します。

18.3.6.4.1 前提条件

証明書の管理、または証明書リクエストの作成に使用するマシンに、パッケージOpenSSLをインストールする必要があります。OpenSSLは、SSL (Secure Sockets Layer)プロトコルのオープン・ソースの実装です。OpenSSLは基本的な暗号機能を実装し、ユーティリティ関数を提供します。

18.3.6.4.2 必要なディレクトリの作成

必要なディレクトリを作成するには、次の手順を実行します。

1. すべての証明書ファイルが保持されるディレクトリを作成します。デフォルトのディレクトリは/etc/pki/tls/です。ルートとして次のコマンドを発行し、専用のディレクトリを作成します。

# mkdir -m 0755 /etc/pki_jungle

2. 次のコマンドを発行して、認証局のディレクトリを作成します。

# mkdir -m 0755 \
/etc/pki_jungle/myCA \
/etc/pki_jungle/myCA/private \
/etc/pki_jungle/myCA/certs \
/etc/pki_jungle/myCA/newcerts \
/etc/pki_jungle/myCA/crl

説明:

- myCAは、自分の認証局のディレクトリです。

- myCA/privateは、秘密鍵が配置されるディレクトリです。すべての秘密鍵に制限的な権限を設定して、ルートのみ、またはサーバー実行の権限を持つユーザーのみが秘密鍵を読み込めるようにします。認証局の秘密鍵が盗まれると、最悪の結果が生じる可能性があります。

- myCA/certsディレクトリは、サーバー証明書が配置される場所です。

- myCA/newcertsディレクトリは、OpenSSLがPEM(暗号化されていない)フォーマットおよびcert_serial_number.pemフォーム(07.pemなど)で作成された証明書を入れる場所です。OpenSSLにはこのディレクトリが必要なため、必ず作成してください。

- myCA/crlは、証明書取消しリストが配置される場所です。

18.3.6.4.3 初期OpenSSL構成

1. デフォルトのOpenSSL構成ファイル(openssl.cnf)を/etc/pki/tlsから自分の認証局のディレクトリにコピーして、それにopenssl.my.cnfという名前を付けるには、ルートとして次のコマンドを発行します。

# cp /etc/pki/tls/openssl.cnf /etc/pki_jungle/myCA/openssl.my.cnf

2. このファイルはすべてのユーザーにとって読取り可能である必要がないため、次のコマンドを発行してその属性を変更できます。

# chmod 0600 /etc/pki_jungle/myCA/openssl.my.cnf

3. 次のコマンドを発行して、OpenSSLのデータベースとして使用できるファイルを作成します。

# touch /etc/pki_jungle/myCA/index.txt

4. 次のコマンドを発行して、次の証明書のシリアル番号を持つファイルを作成します。

# echo '01' > /etc/pki_jungle/myCA/serial

証明書をまだ作成していないため、それを「01」に設定します。

18.3.6.4.4 CA証明書と秘密鍵の作成

初期構成の完了後に、他の証明書リクエストや秘密鍵に署名するために自分の認証局の証明書として使用できる自己署名証明書を生成できるようになります。

1. 自分の認証局のディレクトリに変更します。
ルートとしてOpenSSLコマンドを発行します。

# cd  /etc/pki_jungle/myCA/

これはOpenSSLの構成ファイル(openssl.my.cnf)の保存場所であるため、この場所ですべてのOpenSSLコマンドを発行する必要があります。

2. 次に、自分の認証局の証明書と秘密鍵を作成します。ルートとして次のコマンドを発行します。

# openssl req -config openssl.my.cnf -new -x509 -extensions v3_ca
-keyout private/myca.key -out certs/myca.crt -days 1825

これによって、5年間有効なデフォルトのCA拡張を持つ自己署名証明書が作成されます。

3. 自分の認証局の秘密鍵に対してパスフレーズの入力を促すプロンプトが表示されたら、厳密なパスフレーズを設定します。

4. プロンプトが表示されたら、証明書リクエストに組み込まれる情報を指定します。認証局に関する情報は、次に示す例に類似しています。

Country Name (2 letter code) [GB]:GR
State or Province Name (full name) [Berkshire]:Greece
Locality Name (For example, city) [Newbury]:Thessaloniki
Organization Name (For example, company) [My Company Ltd]:My Network
Organizational Unit Name (For example, section) []:My Certificate Authority
Common Name (For example, your name or your server's hostname)
[]:server.example.com
Email Address []:whatever@server.example.com

次の2つのファイルが作成されます。

certs/myca.crt: これは自分の認証局の証明書であり、パブリックに使用可能で、すべてのユーザーが読取り可能なファイルです。

private/myca.key: これは自分の認証局の秘密鍵です。これはパスフレーズで保護されていますが、ルートのみが読み取れるようにアクセスを制限する必要があります。

5. 自分の認証局の秘密鍵はパスフレーズで保護されていますが、ルートのみが読み取れるようにアクセスを制限する必要があります。これを実行するには、次のコマンドを発行します。

# chmod 0400 /etc/pki_jungle/myCA/private/myca.key

18.3.6.4.5 追加のOpenSSL構成(必須)

証明書の管理にカスタム・ディレクトリを使用しているため、/etc/pki_jungle/myCA/openssl.my.cnfを変更する必要があります。

1. テキスト・エディタでルートとしてopenssl.my.cnfを開き、次のセクション(35行目あたり)を検索します。

_________________________________________________________
[ CA_default ]
dir                  = ../../CA               # Where everything is kept
certs                = $dir/certs             # Where the issued certs are kept
crl_dir              = $dir/crl               # Where the issued crl are kept
database             = $dir/index.txt         # database index file.
#unique_subject = no                          # Set to 'no' to allow
# creation of
# several certificates with
# the same subject.
new_certs_dir       = $dir/newcerts           # default place for new certs.
certificate         = $dir/cacert.pem         # The CA certificate
serial              = $dir/serial             # The current serial number
#crlnumber          = $dir/crlnumber          # the current crl number must be
# commented out to leave a V1 CRL
crl                 = $dir/crl.pem            # The current CRL
private_key         = $dir/private/cakey.pem  # The private key
RANDFILE            = $dir/private/.rand      # private random number file
x509_extensions = usr_cert                    # The extentions to add
# to the cert

2. カスタム・ディレクトリ、カスタム認証局キー(秘密鍵)、および証明書に適合するようにパス値を変更し、変更内容を保存します。

__________________________________________________________
[ CA_default ]
dir     = .                                # <--CHANGE THIS
certs           = $dir/certs
crl_dir         = $dir/crl
database        = $dir/index.txt
#unique_subject = no
new_certs_dir   = $dir/newcerts
certificate     = $dir/certs/myca.crt      # <--CHANGE THIS
serial          = $dir/serial
#crlnumber      = $dir/crlnumber
crl             = $dir/crl.pem
private_key     = $dir/private/myca.key    # <--CHANGE THIS
RANDFILE        = $dir/private/.rand
x509_extensions = usr_cert
_____________________________________________________________

18.3.6.4.6 証明書リクエストの署名

次に、証明書リクエストに署名し、サーバーの証明書を生成します。これを行うには、次の手順を実行します。

1. まず、次のコマンドを発行して、server.csrを自分の認証局のディレクトリにコピーします。

# cp server.csr /etc/pki_jungle/myCA/

2. 次のコマンドを発行して、自分の認証局のディレクトリに変更します。

# cd /etc/pki_jungle/myCA/

3. さらに、次のコマンドを発行して、証明書リクエストに署名します。

# openssl ca -config openssl.my.cnf -policy policy_anything
-out certs/server.crt -infiles server.csr

4. リクエストに署名するために、認証局の秘密鍵を指定します。openssl.my.cnfファイルでpolicy_anythingの意味を確認できます。要するに、Country、StateまたはCityに関するフィールドは、自分の認証局の証明書と一致している必要がありません。
これらの手順が完了すると、次の2つのファイルが新規に作成されます。

- certs/server.crt.
これはサーバーの証明書であり、パブリックに使用可能にすることができます。

- newcerts/01.pem
これは同じ証明書ですが、ファイル名として証明書のシリアル番号が使われています。これは必要ありません。

5. これで証明書リクエスト(server.csr)は不要になったため、これを削除します。

18.3.6.5 証明書を自分のキーストアにインポート

SSL VPNは、このサーバー証明書の公開鍵をインポートして、OAAMから送信されたメッセージを復号化する必要があります。

ルートCA証明書をインポートした後で、認証局により発行された証明書をインポートする必要があります。ルート証明書の名前はmyca.crtであり、発行された証明書の名前はserver.crtです。

証明書をキーストアにインポートするには、次の手順を実行します。

1. 作業ディレクトリをMW_HOME/jdk160_18/jre/lib/securityに変更します。

2. 次のkeytoolコマンドを使用して、ルート証明書をキーストアにインポートします。

keytool -importcert -alias rootCA -file myca.crt -keystore cacerts
-storepass changeit

前述の構文の各要素は次のとおりです。

- aliasは、ルートCA証明書の別名を表します。

- rootCA -fileは、ルートCA証明書が含まれているファイルの名前を表します。

- keystoreは、キーストアの名前を表します。

3. テキスト・エディタでserver.crtを開き、BEGIN CERTIFICATEタグとEND CERTIFICATEタグの間のコンテンツ以外のすべてを削除します。

4. 次のkeytoolコマンドを使用して、発行された証明書をキーストアにインポートします。

keytool -importcert -alias OAAMCert -file server.crt -keystore cacerts
-storepass changeit

前述の構文の各要素は次のとおりです。

- aliasは証明書の別名を表します。これは、「証明書の秘密鍵の作成」で割り当てられた秘密鍵の別名と同じである必要があります。

- server.crtは、証明書が含まれているファイルの名前を表します。

- keystoreは、キーストアの名前を表します。

5. <OAAMCert>に対するキー・パスワードを入力します。
証明書の返信はキーストアにインストールされています。

注意:

別名がリクエスト作成時に使用したものと同じであることを確認します。

18.3.7 OAAM管理コンソールを使用した統合プロパティの変更

統合の確立に必要なSAML構成プロパティを定義するには、次の手順を実行します。

1. OAAM管理コンソールにログインします。

2. 「プロパティ」をダブルクリックして、プロパティ・ページを開きます。

3. 「名前」フィールドに「oracle.saml*」と入力し、「検索」をクリックして統合プロパティを検索します。

4. 「検索結果」で、変更するプロパティをクリックします。

5. 「プロパティ」タブでプロパティの値を変更して、「保存」をクリックします。

統合の一環としてインポートされた、変更の必要のあるプロパティが表18-2「SAML統合プロパティ」に表示されます。

表18-2 SAML統合プロパティ

プロパティ

説明

oracle.saml.integration.version

統合に使用されるSAMLバージョン

使用可能な値は1.1および2.0です。

デフォルト値は1.1です。

Juniper SAでもSAML2.0をサポートしています。

使用するSAMLのバージョンを決定する必要があります。

oracle.saml.target.default.url

SAMLアサーションが成功したことをJuniper SAで検証された後にユーザーが移動するターゲットURL(ホームページ)

例: https://ag-example-oaam.juniperlabs.local/

oracle.saml.keystore

アサーションの署名に必要な証明書を格納するためのキーストアのフルパス。この例では、次のようになります。

MW_HOME/jdk160_18/jre/lib/security/cacerts

oracle.saml.keystore.password

キーストアのパスワード

oracle.saml.keystore.certalias

アサーションに使用する証明書の別名

oracle.saml.keystore.privatekeypassword

秘密鍵のパスワード

oracle.saml.redirect.post.url

SAMLアサーションがポストされるURL

例: https://ag-example-oaam.juniperlabs.local/dana-na/auth/saml-consumer.cgi

oracle.saml.set.attributes

アサーションの一環として追加の属性をJuniper SAに送信する必要があるかどうかを指定します。

指定可能な値はfalseまたはtrueです。

デフォルト値はfalseです。

oracle.saml.user.attributes

アサーションの一環として追加する必要のある属性のリスト

このプロパティは、oracle.saml.set.attributeがtrueに設定されている場合のみ使用されます。

oracle.saml.attribute.namespace

アサーションに使用するネームスペースの名前。デフォルト値はJuniperNSです。

SAML1.1の場合のみ。

oracle.saml.nameidformat

SAMLアサーションで使用するnameidフォーマット

デフォルト値はX509SubjectNameです。

oracle.saml.nameidattribute

SAMLアサーションでユーザーを識別するNameID属性

デフォルト値はdistinguishedNameです。

nameidフォーマットがX509SubjectNameに設定されている場合、これはdistinguishedNameである必要があります。

oracle.saml.issuer.url

SAMLの発行者のURL

これは、OAAM認証サーバーが実行しているマシンです。

例: http://abcdefgh.example.com:14300

18.3.8 Juniper Networks Secure Access (SA)の構成

この統合用にJuniper Networks Secure Access (SA)を構成するには、次の処理を行う必要があります。

- SAML 1.1認証サーバーの作成

- SAMLのユーザー・レルムの作成

- サインイン・ポリシーの作成

Juniper SA構成の詳細は、次のサイトで入手可能な『Juniper Networks Secure Access管理ガイド』を参照してください。

http://www.juniper.net/techpubs

18.3.8.1 SAML 1.1認証サーバーの作成

Juniper SAに認証サーバーを作成する必要があります。これを行うには、次の手順を実行します。

1. Juniper SSL VPN管理コンソールにログインします。

2. Juniper管理コンソールの左ペインで「Authentication」メニューを開き、「Auth. Servers」をクリックします。

3. 「New」ドロップダウン・リストから「SAML Server」を選択し、「New Server」をクリックします。

次のダイアログが表示されます。

4. 表18-3の値を使用して、認証サーバーを定義します。

表18-3 認証サーバーの作成

パラメータ

詳細

値

Server Name

SAMLServerの名前

OAAM SAML 1.1

表示されている値と同じものを入力します。

SAML Version

認証サーバーのSAMLバージョン

1.1

表示されている値と同じものを入力します。

Source Site Inter-Site Transfer Service URL

OAAMサーバーのエントリURL。これは、認証のためにユーザーがリダイレクトされる場所です。

例: @ https://ag-exampleoaam.acmegizmo.com:14301/oaam_server/juniperLoginPage.jsp

環境に応じて、ホストとポートを指定してください。

User Name Template

認証されたユーザーを識別する、値の抽出に使用されるテンプレート

<assertionNameDN.cn>

表示されている値と同じものを入力します。また、'<'および'>'を最初と最後に保持しておく必要もあります。

Allowed Clock Skew (minutes)

アサーションに許容されるクロックの偏り。

30

表示されている値と同じものを入力します。

SSO Method

SAMLに使用するSSOメソッド

Post

Response Signing Certificate

レスポンスの署名に使用される証明書。

これは、認証局から取得した証明書です。手順「証明書を自分のキーストアにインポート」で、同じ証明書をキーストアにインポートしました。

5. サーバー証明書(たとえば、第18.3.6.4.6項「証明書リクエストの署名」で作成したserver.crt)をインポートします。

6. 「Save Changes」をクリックして、変更を保存します。

18.3.8.2 SAMLのユーザー・レルムの作成

認証レルムでは、サインインするためにユーザーが満たす必要のある条件が指定されます。レルムは、認証リソースのグループで構成されます。

SAMLのユーザー・レルムを作成するには、次の手順を実行します。

1. Juniper管理コンソールの左ペインで「Users」メニューを開き、「User Realms」をポイントして「New User Realm」をクリックします。

2. 名前を「OAAM SAML 1.1 User Realm」と指定します。

3. 前の手順でこのユーザー・レルムの認証サーバーとして作成された認証サーバー「OAAM SAML 1.1」を選択します。

4. 変更を保存します。
新規に作成されたユーザー・レルムが表示されます。

5. Juniper管理コンソールの左ペインで「Users」メニューを開き、「User Realms」をポイントして「OAAM SAML 1.1 User Realm」をクリックします。

6. OAAM SAML 1.1. User Realmで「Role Mapping」タブをクリックして、1つ以上のロール・マッピング・ルールを構成します。

18.3.8.3 サインイン・ポリシーの作成

Juniper SAで、認証のためにOAAMにリダイレクトされるのに必要なURLを定義するサインイン・ポリシーを作成します。

1. サインイン・ポリシーを作成するには、Juniper管理コンソールで「Authentication」メニューを開き、「Signing In」をポイントして「Sign-in Policies」をクリックします。

2. 「New URL」をクリックし、表示された「Sign-in URL」フィールドで、URLとして「*/OAAM11/」と入力します。

3. 「Sign-in」ページで、「Default Sign-in Page」を選択します。

4. 認証レルムに対して、前に作成した「OAAM SAML 1.1 User Realm」を選択します。

5. 「Save Changes」をクリックして、それが有効になっていることを確認します。

18.4 統合の検証

必要なコンポーネントをすべて構成した後で、次の手順としてログイン・フローとパスワードを忘れた場合のフローをテストします。後続の手順に従って、OAAMとJuniper SAが正常に統合されたことを検証します。

ログイン・フローのテスト

1. Webブラウザを開いて、ターゲットのリソースURL、またはJuniperにより保護されている保護リソースURLに移動します。
Juniper管理コンソールにログインしたWebブラウザのインスタンスまたはウィンドウがないことを確認します。

ターゲット/保護されたリソースURLは、OAAM管理コンソールで指定されたoracle.saml.target.default.urlプロパティの値です。

OAAMサーバー・ログイン・ページが表示されます。

2. ログイン・プロセスを完了してください。
Juniperサインイン・ページが表示され、ユーザー名と、ブックマークおよびリソースへのリンクを示したサインイン・ページが表示されます。

パスワードを忘れた場合のフローのテスト

1. Webブラウザを開いて、ターゲットのリソースURL、またはJuniperにより保護されている保護リソースURLに移動します。
Juniper管理コンソールにログインしたWebブラウザのインスタンスまたはウィンドウがないことを確認します。

ターゲット/保護されたリソースURLは、OAAM管理コンソールで指定されたoracle.saml.target.default.urlプロパティの値です。

OAAMサーバー・ログイン・ページが表示されます。

2. ユーザー名を入力して、「続行」をクリックします。

3. 「パスワード」ページで、「パスワード忘れ」リンクをクリックします。

4. チャレンジ質問またはOTPに回答します。
チャレンジに正しく回答した後、ユーザーはパスワードを変更して、Juniperサインイン・ページにログインできるようになります。

18.5 統合のデバッグ

OAAM側で統合をデバッグするには、次の手順に従ってデバッグ・ログを有効にします。

1. Oracle Enterprise Manager Fusion Middleware Controlにログインします。たとえば、次のようになります。

http://host.domain.com:7001/em/

Fusion Middleware Controlの使用の詳細は、『Oracle Fusion Middleware管理者ガイド』を参照してください。

2. 「WebLogicドメイン」ノードを開き、OAAMサーバーをクリックします。

3. 右クリックして「ログ」を選択し、「ログ構成」を選択して、OAAMサーバーのログ構成を開きます。
デフォルト・ロギングがFINERレベルに設定されます。

4. ログ・レベルをNOTIFICATION:1(INFO)に変更します。さらに、「コンポーネントの再起動後もログ・レベル状態を維持」を選択します。「適用」ボタンをクリックして、変更を保存します。

デバッグ・ログは次の場所にあります。

MW_HOME/user_projects/domains/YOURDOMAIN/servers/oaam_server/
logs/oaam_server-diagnostic.log

18.6 一般的な問題のトラブルシューティング

この項では、Oracle Adaptive Access ManagerとJuniper Networks Secure Access (SA)を統合した環境で生じる可能性のある一般的な問題と、その解決方法について説明します。

表示される可能性のあるエラー・メッセージの詳細は、この項に加えて、Oracle Fusion Middlewareエラー・メッセージ・リファレンスを参照してください。

その他のトラブルシューティング・リソースの詳細は、第27.1項「My Oracle Supportを使用したその他のトラブルシューティング情報」を参照してください。

18.6.1 Juniper SAとOAAMのクロック同期

Juniper SAとOAAMサーバーのシステム・クロックが同期化していることを確認します。Juniper SAシステム・クロックがOAAMサーバーのクロックよりも進まないようにする必要があります。Juniperアプリケーションの日付と時刻をリセットするには、『Juniper Networks Secure Access管理ガイド』を参照してください。次のJuniper Technical Documentation Webサイトにアクセスできます。

http://www.juniper.net/techpubs

18.6.2 正しい証明書がJuniperに存在しない

OAAMフローの完了後に、ユーザーが保護されたリソースにリダイレクトされず、WebサイトにInvalidCryptoExceptionが表示されます。

Juniper管理コンソールに、次のようなログが表示されます。

Logs(Juniper admin->Log/monitoring->Events): ERR24377 : Caught a SAML exception
'InvalidCryptoException' while verifying response. Error:
SAMLSignedObject::verify() failed
to validate signature value.

原因

正しい証明書がJuniperに存在しません。

解決策

サーバー証明書(たとえば、server.crt)がJuniperにアップロードされていることを確認します。第18.3.8.1項「SAML 1.1認証サーバーの作成」を参照してください。

18.6.3 SAMLレスポンスの署名の失敗

OAAMにパスワードを入力した後、次のメッセージが表示されます。

There has been an error reaching your destination

次の例外がOAAMサーバー・ログ・ファイル(oaam_server_server1.log)に表示されます。

java.lang.NullPointerException
at java.io.PrintWriter.write(PrintWriter.java:429)
at jsp_servlet.__samlsubmit._jspService(__samlsubmit.java:96)
at weblogic.servlet.jsp.JspBase.service(JspBase.java:34)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.ServletStubImpl.onAddToMapException(ServletStubImpl.java:416)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:326)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183)

原因

SAMLレスポンスに署名の失敗がありました。

解決策

次のプロパティが正しい値に設定されていることを確認します。

詳細は、表18-2「SAML統合プロパティ」を参照してください。

プロパティ

説明

oracle.saml.keystore

アサーションの署名に必要な証明書を格納するためのキーストアのフルパス。この例では、次のようになります。

MW_HOME/jdk160_18/jre/lib/security/cacerts

oracle.saml.keystore.password

キーストアのパスワード

oracle.saml.keystore.certalias

アサーションに使用する証明書の別名

oracle.saml.keystore.privatekeypassword

秘密鍵のパスワード

18.6.4 OAAMのエントリ・ポイントURL

保護されたリソースにアクセスすると、次のエラー・メッセージが表示されます。

There has been an error reaching destination

原因

OAAMのエントリ・ポイントURLが、Juniperに正しく設定されていません。

解決策

ブラウザでURLを確認してください。https://OAAM_HOST:OAAM_PORT/oaam_server/juniperLoginPage.jspに設定されていない場合は、この正しい値に変更する必要があります。

次の手順を実行します。

1. Juniper管理コンソールにログインします。

2. 左ペインで「Auth servers」をクリックします。

3. OAAMに対応しているサーバーを選択します。たとえば、OAAMサーバーです。

4. 「Source Site Inter-Site Transfer Service URL」を次の値に設定します。

https://OAAM_HOST:OAAM_PORT/oaam_server/juniperLoginPage.jsp

5. 変更を保存します。

19 Java Message Serviceキュー(JMSQ)の統合

複数のアプリケーションやデータ・ソースを必要とするアクセス監視要件のあるカスタマは、セキュリティおよびコンプライアンスについて率先した姿勢で措置を講じることができるようになりました。付属のJava Message Service Queue (JMSQ)を使用すると、カスタマはほぼリアルタイムのリスク分析を実装できるため、疑わしい不正や誤用を積極的に特定できます。

この章では、OAAMとJava Message Service Queue (JMSQ)の非同期統合の統合方法について説明します。この章の内容は、次のとおりです。

- 第19.1項「JMS定義」

- 第19.2項「非同期統合オプションのインストール」

- 第19.3項「JMSの統合」

- 第19.4項「JMSメッセージ」

- 第19.5項「エンティティおよびトランザクションのデータベース・ビュー」

- 第19.6項「Pythonルール条件」

19.1 JMS定義

表19-1に、JMSの用語と定義を示します。Java Message Serviceの詳細は、『Oracle Fusion Middleware Oracle WebLogic Server JMSの構成と管理』を参照してください。

表19-1 JMS定義

用語

定義

メッセージング

メッセージングは、ソフトウェア・コンポーネントまたはアプリケーション間の通信方法です。メッセージング・システムは、peer-to-peerの機能です。メッセージング・クライアントは、別のクライアントにメッセージを送信したり、そこからメッセージを受信したりできます。各クライアントは、メッセージの作成、送信、受信および読取り機能を提供するメッセージング・エージェントに接続します。メッセージングによって、疎結合な分散通信が可能です。コンポーネントが宛先にメッセージを送信し、受信者がメッセージを宛先から取得します。通信する際には、送信者と受信者の両方が同時に使用可能である必要はありません。実際、送信者は受信者に関する情報を知る必要はなく、また受信者も送信者に関する情報を知る必要はありません。送信者と受信者が知る必要があるのは、使用するメッセージの書式と宛先のみです。メッセージングは、人との間、またはソフトウェア・アプリケーションと人との間の通信方式である電子メール(Eメール)とも異なります。メッセージングは、ソフトウェア・アプリケーションまたはソフトウェア・コンポーネント間の通信に使用されます。

Java Message Service (JMS)

Java Message Service (JMS)は、アプリケーションによるメッセージの作成、送信、受信および読取りを可能にするJava APIです。これには、信頼できる非同期の疎結合通信が使用されます。JMS APIには、共通のインタフェースおよび関連するセマンティックが定義されており、Javaプログラミング言語で書かれたプログラムと他のメッセージングの実装との通信を可能にします。

JMSキュー

JMSキューは、ソフトウェアまたはアプリケーションが非同期に情報を交換できるメッセージ・キューです。各メッセージは特定のキューに送信され、受信するクライアントはメッセージを保持するために確立されたキューからメッセージを抽出します。メッセージが消費されるか、または期限が切れるまで、キューに送信されたすべてのメッセージがキューに保持されます。

JNDI

JNDIは、Javaネーミングおよびディレクトリ・サービスです。JNDIの名前を使用してJMSキューにアクセスできます。

JMSキュー宛先

アプリケーションはメッセージをキューに送信します。プロバイダは、OAAMがメッセージを受信するまで、メッセージごとにコピーを1つ格納しています。

JMSリスナー

JMSリスナーは、XML形式のメッセージに関してJMSキューをリスニングするように構成されています。クライアントは、コンシューマでメッセージ・リスナーを登録できます。メッセージ・リスナーは、イベント・リスナーと類似しています。メッセージが宛先に到達するたびにJMSプロバイダはメッセージを配信し、メッセージの内容が処理されます。メッセージ形式の詳細は、第19.4.2項「メッセージの書式のXMLスキーマの例」のXMLスキーマを参照してください。

OAAM JMSメッセージ

OAAM JMSメッセージのコンテンツは、Oracle Adaptive Access ManagerのWeb Services APIコールと類似しています。メッセージ形式の詳細は、第19.4.2項「メッセージの書式のXMLスキーマの例」のXMLスキーマを参照してください。

19.2 非同期統合オプションのインストール

表19-2に、非同期統合オプションのインストールに関するタスクのサマリーを示します。

表19-2 非同期統合オプションのインストール

番号

タスク

情報

1

前提条件をレビューします。

詳細は、前提条件を参照してください。

2

非同期統合オプションをインストールします。

詳細は、「非同期統合オプションのインストール」を参照してください。

3

JMSキューを設定します。

詳細は、「JMSキューの設定」を参照してください。

4

OAAM拡張ライブラリを更新します。

詳細は、「OAAM拡張ライブラリの更新」を参照してください。

5

データベースを更新します。

詳細は、「OAAMデータベースの更新」を参照してください。

19.2.1 前提条件

継続する前に、Oracle Adaptive Access Manager 11gのインストールと構成が完了していることを確認してください。本項では、非同期統合オプションのインストールに必要な手順について説明します。

非同期統合オプションには、Oracle Business Intelligence Publisherのレポート・テンプレートとしての様々なレポートが含まれています。非同期統合オプションをインストールする前に、Oracle Business Intelligence Publisherのインストールと構成が完了していることを確認してください。Oracle Business Intelligence Publisherのインストール方法の詳細は、Oracle Fusion Middleware Oracle Business Intelligenceインストレーション・ガイドを参照してください。

19.2.2 非同期統合オプションのインストール

非同期統合オプションには、osg_integration_kit.zipファイルが含まれています。

非同期統合オプションをインストールするには、次の手順を実行します。

1. OAAMがインストールされているマシン上で、osg_installという作業ディレクトリを作成します。このフォルダは、インストール・ディレクトリ以外であればどこにでも作成できます。

2. osg_integration_kitディレクトリをosg_installディレクトリ内に作成します。

3. IAM_Home/oaam/oaam_extensions/genericディレクトリに格納されているosg_integration_kit.zipを特定します。

4. osg_integration_kit.zipのコンテンツをosg_install/osg_integration_kitディレクトリに抽出します。

19.2.3 OAAM拡張ライブラリの更新

非同期実行機能は、Oracle Adaptive Access Managerの拡張として実装されています。次の手順に従って、デフォルトの拡張ライブラリを置換します。

1. Oracle Adaptive Access Managerサーバーを停止します。たとえば、oaam_server_server1とoaam_admin_server1。

2. Oracle Adaptive Access ManagerがデプロイされているWebLogic Serverを起動して、Oracle WebLogic管理コンソールにログインします。

3. 「ロックして編集」をクリックします。

4. 「oracle.oaam.extensions」を選択し、「削除」をクリックします。

5. ドメイン環境→「デプロイメント」に移動して、コンソールをロックします。

6. 「インストール」ボタンをクリックします。

7. osg_oaam_extensions.warファイルの場所を参照し、WARファイルの横のオプションをクリックして選択します。その後、「次へ」をクリックします。

8. 「このデプロイメントをライブラリとしてインストールする」が選択されていることを確認して、「次へ」をクリックします。

9. すべてのOAAMサーバーをデプロイ先として選択します。たとえば、oaam_admin_server1とoaam_server_server1。

10. 「次へ」を再度クリックしてこの次のページでデフォルトを受け入れ、「終了」をクリックします。

11. 「保存」ボタンをクリックしてから、「変更のアクティブ化」をクリックします。

12. 必要なすべてのOracle Adaptive Access Managerサーバーを開始します。

19.2.4 JMSキューの設定

OAAMは、統合メカニズムの1つとしてJMS (Java Message Service)キューを使用します。OAAMは、1つ以上のJMSキューでXMLメッセージをリスニングします。たとえば、電子カルテ(EMR)は、OAAMサーバーで使用されるトランザクション詳細を送信するためにメッセージ・キューを必要とします。XMLスキーマとリスナー構成の詳細は、第19.3項「JMS統合」を参照してください。

osg_oaam_extension.warに含まれているデフォルトの構成では、OAAMは、t3://localhost:7001でJNDI名jms/oaamDefaultQueueのJMSキューにあるメッセージをリスニングします。第19.3「JMS統合」に示す詳細に従ってこの構成をレビューし、デプロイメントの必要に応じて更新します。

リスナー構成で指定されたJMSキューが存在し、アクティブであることを確認します。存在しないものがあれば、適切なWebLogic Serverにそれを作成してください。WebLogic ServerでのJMSキュー設定の詳細は、『Oracle Fusion Middleware Oracle WebLogic Server JMSの構成と管理』を参照してください。

19.2.5 OAAMデータベースの更新

エンティティとトランザクションのデータベース・ビューは、ルール条件とレポートで使用するために作成できます。これらのデータベース・ビューの詳細は、第19.5項「エンティティとトランザクションのデータベース・ビュー」を参照してください。OAAMデータベース・ユーザーのデータベース権限を更新し、ビューの作成や他のデータベース操作を行えるようにする必要があります。

必要な権限を付与するには、管理者の資格証明を使用してOracleデータベースにログインし、次のSQL文を実行してください。dev_oaamはOAAMデータベース・スキーマで置き換える必要があります。

grant create view to dev_oaam.

19.3 JMS統合

非同期デプロイメントでのJMSリスナーの実装によって、XML形式のメッセージ用のJMSキュー(またはトピック)をリスニングするようにOracle Adaptive Access Managerを構成できます。メッセージの書式の詳細は、第19.4.2項「メッセージの書式を表すXMLスキーマの例」に示すXMLスキーマを参照してください。パラメータの詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager Java APIリファレンス』を参照してください。JMSメッセージのコンテンツは、OAAM WebサービスAPIのコールと類似しています。

19.3.1 WebサービスAPI

WebサービスAPIのサブセットで、JMSを通して使用できるものは次のとおりです。

- VCryptTracker.updateLog

- VCryptTracker.updateEntity

- VCryptTracker.createTransaction

- VCryptRulesEngine.processRules

19.3.2 JMS統合の図

次の図に、OAAMとのJMS統合の概要を示します。

図19-1 OAAMとのJMS統合

統合のフローは次のとおりです。

1. アプリケーション(JMS送信者)がメッセージをJMSキューに送信します。アプリケーションは、JNDIネームスペースによってキュー宛先を識別します。

2. キューイング・システムはJMS送信者からメッセージを受信して、そのメッセージを宛先にルーティングします。

3. OAAMサーバーは、構成済JMSリスナーを使用してメッセージをリスニングします。

4. メッセージは、メッセージ・プロセッサにより処理されます。

5. 情報は、トランザクション・データまたはログイン・データとしてデータベースにロードされます。

6. オフラインのログインおよびトランザクション・データに対してルールが実行されます。

19.3.3 JMSリスナーの登録

Oracle Adaptive Access Managerのプロパティとユーザー定義列挙を使用して、JMS統合の様々な要素を構成できます。ユーザー定義列挙の詳細は、第7.1項「列挙の編集によるOAAMのカスタマイズまたは拡張」を参照してください。

表19-3に、JMSの構成プロパティのリストを示します。監視するキュー(またはトピック)ごとに、ユーザー定義列挙oracle.oaam.jms.listeners.enumに列挙要素を追加して、1つのリスナーを構成する必要があります。リスナー・リストまたはプロパティを変更する場合は、リスナーが実行されているOAAMサーバーを再起動する必要があります。

表19-3 JMSの構成プロパティ

プロパティ名

説明

jms.message.processor.default.user

loginIdフィールドがVCryptTracker.updateLogメッセージに指定されていない場合は、このプロパティの値が使用されます。

デフォルト値: JmsDefaultUser

jms.message.processor.default.usergroup

groupIdフィールドがVCryptTracker.updateLogメッセージに指定されていない場合は、このプロパティの値が使用されます。

デフォルト値: default

jms.message.processor.default.ip

remoteIPAddrフィールドがVCryptTracker.updateLogメッセージに指定されていない場合は、このプロパティの値が使用されます。

デフォルト値: 127.0.0.1

jms.message.processor.default.clientver

clientVersionフィールドがVCryptTracker.updateLogメッセージに指定されていない場合は、このプロパティの値が使用されます。

デフォルト値: 1.0

jms.message.processor.default.authtype

clientTypeフィールドがVCryptTracker.updateLogメッセージに指定されていない場合は、このプロパティの値が使用されます。

デフォルト値:normal

jms.message.processor.default.sessionid

requestIdフィールドがVCryptTracker.updateLogメッセージに指定されていない場合は、このプロパティの値が使用されます。値が指定されていない場合は、「remoteIPAddr」フィールドを使用して生成された値が使用されます。

requestIdフィールドがcreateTransaction/updateEntity/processRulesメッセージに対して指定されていないときに1つのMessageListで複数のメッセージが送信された場合、前のupdateLogメッセージ(存在する場合)で使用したrequestIdが使用されます。

jms.message.processor.default.browser.fingerprint

fingerPrintフィールドがVCryptTracker.updateLogメッセージに指定されていない場合は、このプロパティの値が使用されます。

jms.message.processor.default.flash.fingerprint

fingerPrint2フィールドがVCryptTracker.updateLogメッセージに指定されていない場合は、このプロパティの値が使用されます。

oracle.oaam.jms.listeners.default.initial.cont ext.factory

初期コンテキスト・ファクトリを実装するJavaクラスの名前。この値は、Java Namingコンテキストの初期化に使用されます。

デフォルト値: weblogic.jndi.WLInitialContextFactory

oracle.oaam.jms.listeners.default.connection.factory

キュー/トピックの接続の作成に使用されるJMSコネクション・ファクトリのJNDI名。

デフォルト値: weblogic.jms.ConnectionFactory

oracle.oaam.jms.listeners.enum.lsnr_1

lsnr_1という名前の新規リスナーを定義します。リストされているプロパティを使用して、このリスナーに様々な属性を指定できます。

有効な値: この列挙で他のどの要素にも割り当てられていない整数

oracle.oaam.jms.listeners.enum. lsnr_1.type

リスナーがJMSキューまたはJMSトピックに接続するかどうかを指定します。

有効な値: queueまたはtopic

oracle.oaam.jms.listeners.enum. lsnr_1.url

キュー(またはトピック)の名前を解決するJNDIプロバイダのURL。

oracle.oaam.jms.listeners.enum.lsnr_1.jndiname

キューまたはトピックのJNDI名

oracle.oaam.jms.listeners.enum.lsnr_1.initial.context.factory

初期コンテキスト・ファクトリを実装するJavaクラスの名前。この値は、Java Namingコンテキストの初期化に使用されます。

デフォルト値: プロパティoracle.oaam.jms.listeners.default.initial.context.factoryの値

oracle.oaam.jms.listeners.enum.lsnr_1.connection.factory

キュー/トピックの接続の作成に使用されるJMSコネクション・ファクトリのJNDI名。

デフォルト値: プロパティoracle.oaam.jms.listeners.default.connection.factoryの値

oracle.oaam.jms.listeners.enum.lsnr_1.processor

メッセージ・プロセッサ・インタフェースを実装するJavaクラスの名前。このリスナーにより受信されるメッセージを処理するために、このクラスのインスタンスが作成されます。

デフォルト値: oracle.oaam.jms.JmsDefaultMessageProcessor

oracle.oaam.jms.listeners.enum.lsnr_1.instancecount

指定されたキュー/トピックからのメッセージを作成、処理するリスナーの数。

デフォルト値: 1

19.3.4 メッセージ・プロセッサの構成

Oracle Adaptive Access Managerのプロパティとユーザー定義列挙を使用して、メッセージ・プロセッサのプロパティを構成します。ユーザー定義列挙の詳細は、第7.1項「列挙の編集によるOAAMのカスタマイズまたは拡張」を参照してください。

OAAMのデフォルトのJMSメッセージ・プロセッサでは、タイプjavax.jms.TextMessageのみが処理されます。JMSメッセージ・プロセッサによって、その他のタイプのメッセージは無視されます。

その他のタイプのメッセージを処理するには、カスタム・プロセッサを実装する必要があります。これを行うには、oracle.oaam.jms.JmsAbstractMessageProcessorまたはoracle.oaam.jms.JmsDefaultMessageProcessorを拡張して、プロセッサをJmsListenerに関連付けます。

さらに、TextMessageのコンテキストが、第19.4.2項「メッセージの書式を表すXMLスキーマの例」に示すXMLスキーマに準拠したXML文字列であるかぎり、デフォルトのJMSメッセージ・プロセッサによる処理が行われます。

19.4 JMSメッセージ

この項の内容は次のとおりです。

- JMSメッセージの例

- メッセージの書式を表すXMLスキーマの例

- JMSキューへのメッセージの送信

19.4.1 JMSメッセージの例

この項では、JMSメッセージの例を示します。含まれる内容は、次のとおりです。

- VCryptTracker.updateLog

- VCryptTracker.updateEntity

- VCryptTracker.createTransaction

- VCryptRulesEngine.processRules

- MessageList

これらのメッセージの例には、メッセージでサポートされるすべてのデータ要素が含まれているわけではありません。サポートされるデータ要素の完全なリストは、第19.4.2項「メッセージの書式を表すXMLスキーマの例」を参照してください。

19.4.1.1 VCryptTracker.updateLog

VCryptTracker.updateLogメッセージは、Oracle Adaptive Access Managerでのユーザー・セッション(ログイン)の作成または更新に使用されます。requestIdデータ要素に値が指定されていない場合は、一意の値が生成され使用されます。

VCryptTracker.updateLogメッセージの例を次に示します。

<?xml version="1.0"?>
<OaamJmsMessage>
<VCryptTracker.updateLog>
<UpdateAuthResultRequest>
<requestId>20110721_00_9004_terminal_1</requestId>
<requestTime>07/21/2011 00:21:01</requestTime>
<userId>9004</userId>
<loginId>jjames</loginId>
<isSecure>false</isSecure>
<groupId>HealthcareUsers</groupId>
<result>0</result>
<clientType>10</clientType>
<clientVersion>1.0</clientVersion>
<remoteIPAddr>192.168.0.0</remoteIPAddr>
<remoteHost>server.domain.com</remoteHost>
</UpdateAuthResultRequest>
</VCryptTracker.updateLog>
<OaamJmsMessage>

このメッセージは、OAAM API VCryptTracker.updateLog()に対するJMS等価です。データ要素(パラメータ)の詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager Java APIリファレンス』を参照してください。

19.4.1.2 VCryptTracker.updateEntity

VCryptTracker.updateEntity メッセージは、Oracle Adaptive Access Managerでのユーザー定義のエンティティ・インスタンスの作成または更新に使用されます。

VCryptTracker.updateEntityメッセージの例を次に示します。

<?xml version="1.0"?>
<OaamJmsMessage>
<VCryptTracker.updateEntity>
<updateEntity>
<entityDefKey>Patient</entityDefKey>
<contexts>
<context>
<name>Patient_ID</name>
<value>21600481</value>
</context>
<context>
<name>MR_Number</name>
<value>21600481</value>
</context>
<context>
<name>Short_Name</name>
<value>Jane</value>
</context>
<context>
<name>Last_Name</name>
<value>Celebrity</value>
</context>
<context>
<name>First_Name</name>
<value>Jane</value>
</context>
<context>
<name>Phone_Number</name>
<value>603.555.0100</value>
</context>
<context>
<name>Email_Address</name>
<value>Jane.Celebrity@hotmail.com</value>
</context>
<context>
<name>Date_Of_Birth</name>
<value>1979-05-12 00:00:00 -0800</value>
</context>
<context>
<name>Confidential_Indicator</name>
<value>true</value>
</context>
<context>
<name>homeAddr.Line1</name>
<value>6819 Park Blvd</value>
</context>
<context>
<name>homeAddr.City</name>
<value>Los Angeles</value>
</context>
<context>
<name>homeAddr.State</name>
<value>California</value>
</context>
<context>
<name>homeAddr.Zip</name>
<value>90001</value>
</context>
<context>
</updateEntity>
</VCryptTracker.updateEntity>
</OaamJmsMessage>

このメッセージは、OAAM API VCryptTracker.updateEntity()に対するJMS等価です。データ要素(パラメータ)の詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager Java APIリファレンス』を参照してください。

19.4.1.3 VCryptTracker.createTransaction

VCryptTracker.createTransactionメッセージは、Oracle Adaptive Access Managerでのトランザクションの作成に使用されます。

VCryptTracker.createTransactionメッセージの例を次に示します。

<?xml version="1.0"?>
<OaamJmsMessage>
<VCryptTracker.createTransaction>
<createTransaction>
<requestId>20110721_00_9004_terminal_1</requestId>
<requestTime>07/21/2011 00:21:01</requestTime>
<transactionDefKey>pat_rec_acc</transactionDefKey>
<status>0</status>
<contexts>
<context>
<name>Person_ID</name>
<value>9004</value>
</context>
<context>
<name>Patient_ID</name>
<value>21600481</value>
</context>
<context>
<name>Action</name>
<value>View_Records</value>
</context>
<context>
<name>Application_ID</name>
<value>Healthcare_App</value>
</context>
<context>
<name>Terminal_ID</name>
<value>terminal_1</value>
</context>
<context>
<name>Item_Key</name>
<value>image-x-20110720-156</value>
</context>
<context>
<name>Is_Restricted_Item</name>
<value>false</value>
</context>
<contexts>
</createTransaction>
</VCryptTracker.createTransaction>
</OaamJmsMessage>

このメッセージは、OAAM API VCryptTracker.createTransaction()に対するJMS等価です。データ要素(パラメータ)の詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager Java APIリファレンス』を参照してください。

19.4.1.4 VCryptRulesEngine.processRules

VCryptRulesEngine.processRulesメッセージは、OAAMルールの実行に使用されます。

VCryptRulesEngine.processRulesメッセージの例を次に示します。

<?xml version="1.0"?>
<OaamJmsMessage>
<VCryptRulesEngine.processRules>
<ProcessRulesRequest>
<requestId>20110721_00_9004_terminal_1</requestId>
<requestTime>07/21/2011 00:21:01</requestTime>
<profileTypeList>
<profileType>800</profileType>
</profileTypeList>
<contexts></contexts>
</ProcessRulesRequest>
</VCryptRulesEngine.processRules>
</OaamJmsMessage>

このメッセージは、OAAM API VCryptRulesEngine.processRules()に対するJMS等価です。データ要素(パラメータ)の詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager Java APIリファレンス』を参照してください。

19.4.1.5 MessageList

MessageListメッセージは、1つのJMSメッセージで1つ以上のメッセージの送信に使用されます。

MessageListメッセージの例を次に示します。

<?xml version="1.0"?>
<OaamJmsMessage>
<MessageList>
<VCryptTracker.updateLog>
</VCryptTracker.updateLog>

<VCryptTracker.updateEntity>
</VCryptTracker.updateEntity>

<VCryptTracker.updateEntity>
</VCryptTracker.updateEntity>

<VCryptTracker.createTransaction>
</VCryptTracker.createTransaction>

<VCryptRulesEngine.processRules>
</VCryptRulesEngine.processRules>
</MessageList>
</OaamJmsMessage>

このメッセージは、1つのバッチで複数のOAAM APIコールをコールする場合のJMS等価です。

MessageListメッセージは、メッセージをバッチ処理するだけでなく、データ要素requestIdおよびtransactionLogIdに有用なデフォルト値を提供します。

- transactionLogIdがprocessRulesメッセージで明示的に指定されていない場合、前のcreateTranasctionメッセージから返された値がある場合は、その値が使用されます。

- requestIdがcreateTransaction、processRulesまたはupdateEntityメッセージで明示的に指定されていない場合は、(このMessageList内の)前のメッセージから返されたrequestIdデータ要素の値が使用されます。

19.4.2 メッセージの書式を表すXMLスキーマの例

次のXMLスキーマの例に、メッセージの書式の詳細を示します。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="OaamJmsMessage"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="OaamJmsMessage" type="MessageList"/>

<xs:complexType name="MessageList">
<xs:sequence>
<xs:element name="MessageList" type="MessageList"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="VCryptTracker.updateLog"
type="updateLog"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="VCryptTracker.createTransaction"
type="createTransaction"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="VCryptRulesEngine.processRules"
type="processRules"
minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="VCryptTracker.updateEntity"
type="updateEntity"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="updateLog">
<xs:sequence>
<xs:element name="UpdateAuthResultRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="requestId" type="xs:string"
minOccurs="0" maxOccurs="1"/>
<xs:element name="requestTime" type="xs:string"
minOccurs="1" maxOccurs="1"/>
<xs:element name="userId" type="xs:string"
minOccurs="0" maxOccurs="1"/>
<xs:element name="loginId" type="xs:string"
minOccurs="0" maxOccurs="1"/>
<xs:element name="isSecure" type="xs:boolean"
minOccurs="0" maxOccurs="1"/>
<xs:element name="groupId" type="xs:string"
minOccurs="0" maxOccurs="1"/>
<xs:element name="result" type="xs:integer"
minOccurs="0" maxOccurs="1"/>
<xs:element name="secureCookie" type="xs:string"
minOccurs="0" maxOccurs="1"/>
<xs:element name="digitalCookie" type="xs:string"
minOccurs="0" maxOccurs="1"/>
<xs:element name="clientType" type="xs:integer"
minOccurs="0" maxOccurs="1"/>
<xs:element name="clientVersion" type="xs:string"
minOccurs="0" maxOccurs="1"/>
<xs:element name="remoteIPAddr" type="xs:string"
minOccurs="0" maxOccurs="1"/>
<xs:element name="remoteHost" type="xs:string"
minOccurs="0" maxOccurs="1"/>
<xs:element name="fingerPrintType" type="xs:integer"
minOccurs="0" maxOccurs="1"/>
<xs:element name="fingerPrint" type="xs:string"
minOccurs="0" maxOccurs="1"/>
<xs:element name="fingerPrintType2" type="xs:integer"
minOccurs="0" maxOccurs="1"/>
<xs:element name="fingerPrint2" type="xs:string"
minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="createTransaction">
<xs:sequence>
<xs:element name="createTransaction">
<xs:complexType>
<xs:sequence>
<xs:element name="requestId" type="xs:string"
minOccurs="0" maxOccurs="1"/>
<xs:element name="requestTime" type="xs:string"
minOccurs="0" maxOccurs="1"/>
<xs:element name="transactionDefKey" type="xs:string"
minOccurs="1" maxOccurs="1"/>
<xs:element name="status" type="xs:integer"
minOccurs="0" maxOccurs="1"/>
<xs:element name="contexts"
minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="context"
minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"
minOccurs="1" maxOccurs="1"/>
<xs:element name="value" type="xs:string"
minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="updateEntity">
<xs:sequence>
<xs:element name="updateEntity">
<xs:complexType>
<xs:sequence>
<xs:element name="requestId" type="xs:string"
minOccurs="0" maxOccurs="1"/>
<xs:element name="entityDefKey" type="xs:string"
minOccurs="1" maxOccurs="1"/>
<xs:element name="status" type="xs:integer"
minOccurs="0" maxOccurs="1"/>
<xs:element name="isReplace" type="xs:boolean"
minOccurs="0" maxOccurs="1"/>
<xs:element name="createTime" type="xs:string"
minOccurs="0" maxOccurs="1"/>
<xs:element name="updateTime" type="xs:string"
minOccurs="0" maxOccurs="1"/>
<xs:element name="unlinkEntities"
minOccurs="0" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="entityRelation"
type="xs:string"
minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="contexts"
minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="context"
minOccurs="0 maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"
minOccurs="1" maxOccurs="1"/>
<xs:element name="value" type="xs:string"
minOccurs="1" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>

<xs:complexType name="processRules">
<xs:sequence>
<xs:element name="ProcessRulesRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="requestId" type="xs:string"
minOccurs="0" maxOccurs="1"/>
<xs:element name="requestTime" type="xs:string"
minOccurs="0" maxOccurs="1"/>
<xs:element name="transactionLogId" type="xs:integer"
minOccurs="0" maxOccurs="1"/>
<xs:element name="extTransactionId" type="xs:string"
minOccurs="0" maxOccurs="1"/>
<xs:element name="profileTypeList"
minOccurs="1" maxOccurs="1">
<xs:complexType>
<xs:sequence>
<xs:element name="profileType" type="xs:integer"
minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>

</xs:schema>

19.4.3 JMSキューへのメッセージの送信

次のJavaコードの例は、JMSキューに送信するメッセージを書き込む方法を示しています。

/* XML Message */
String xmlString = ;

/* get reference to queue from its JNDI name */
javax.jms.Queue queue = ;

/* get a queue connection from connection factory */
QueueConnection queueConn = ;

QueueSession queueSess   = conn.createQueueSession(...);
QueueSender  queueSender = queueSess.createSender(queue);

TextMessage msg = queueSess.createTextMessage(xmlString);

queueSender.send(msg);

19.5 エンティティおよびトランザクションのデータベース・ビュー

ユーザーは、任意の数のデータ・フィールドを使用して、Oracle Adaptive Access Managerにエンティティとトランザクションを定義できます。さらに、トランザクションはエンティティを参照するように定義することもできます。Oracle Adaptive Access Managerでは、エンティティ・データとトランザクション・データがデータベースに永続化されます。OAAMデータベース・スキーマは、任意のタイプのエンティティとトランザクション・データを格納できるようにデザインされています。しかし、この汎用的なスキーマでは、エンティティとトランザクション・データと使用できるSQL問合せを書き込むのは簡単ではありません。

Oracle Adaptive Access Managerには、Oracle Adaptive Access Managerでのエンティティとトランザクションのビューを作成するためのSQL問合せを含むSQLスクリプト・ファイルを生成するコマンドライン・ツールがあります。これらのデータベース・ビューによって、トランザクションとエンティティのデータへの問合せとOracle Business Intelligence Publisherを使用したレポートの作成が簡素化されます。

19.5.1 SQLスクリプト・ファイルの生成

SQLスクリプトを生成するには次を実行します。

1. OAAM CLI環境を設定します。
OAAMコマンドライン環境の設定手順については、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』のCLI環境の設定手順に関する項を参照してください。

2. SQLスクリプト・ファイルを生成します。
SQLスクリプト・ファイルを生成するには、次のコマンドをOAAM CLI作業フォルダから実行します。

$ sh generateTrxEntityViewsSQL.sh

デフォルトのファイル名はcreateTrxEntityViews.sqlです。オプションで、管理者は、oaam.trxentityview.filenameという名前のプロパティを追加して必要なファイル名を値として指定することによって、デフォルトのファイル名を変更できます。

3. エンティティおよびトランザクションのデータベース・ビューを作成します。
次の手順に従って、OAAMデータベース内に格納されているエンティティとトランザクションのデータベース・ビューを作成します。

1. OAAMデータベース・スキーマにビューの作成権限があることを確認します。

2. OAAMデータベース・スキーマ・ユーザーとしてデータベースに接続します。
たとえば、次のようになります。

sqlplus DEV_OAAM/PASSWORD

3. createTrxEntityViews.sqlスクリプトを実行します。

SQL>@ createTrxEntityViews.sql

このスクリプトにより、OAAMデータベース内に定義されているエンティティおよびトランザクションごとにデータベース・ビューが作成されます。

19.5.2 エンティティ・ビューの詳細

Oracle Adaptive Access Manager内に定義されているエンティティごとに、1つのビューがoaam_ent_entity_keyという名前で作成されます。entity_keyは、Oracle Adaptive Access Managerに定義されているエンティティ・キーによって置き換わります。

作成されたビューには、エンティティで定義されているデータごとに1つの列が存在します。データ列の命名規則とビュー名の詳細は、第19.5.4項「識別子」を参照してください。

これらのデータ列に加えて、作成されたビューには次の列が含まれます。

- entity_id: エンティティ・インスタンスの一意の識別子

- create_time: エンティティの作成時

- update_time: エンティティの最終更新時

19.5.3 トランザクション・ビューの詳細

Oracle Adaptive Access Manager内に定義されているトランザクションごとに、1つのビューがoaam_trx_transaction_keyという名前で作成されます。transaction_keyは、Oracle Adaptive Access Managerに定義されているトランザクション名に置き換わります。

作成されたビューには、トランザクションで定義されているデータごとに1つの列が存在します。データ列の命名規則とビュー名の詳細は、第19.5.4項「識別子」を参照してください。

作成されたビューには、トランザクションで参照されているエンティティごとに1つの列が存在します。ここに、参照されたエンティティのentity_idが格納されます。これは、oaam_ent_entity_keyビューのentity_id列です。インスタンス名に含まれるスペースは、列名では下線に置き換えられます。

これらのデータ列に加えて、作成されたビューには次の列が含まれます。

- log_id: トランザクションの一意の識別子

- user_id: このトランザクションの実行ユーザー

- request_id: このトランザクションが実行されたセッション

- ext_trx_id: このトランザクションの外部ID

- status: トランザクションのステータス

- create_time: エンティティの作成時

- update_time: エンティティの最終更新時

- created_hour: 最も近い時間に切り捨てた作成時

- created_day: 最も近い日に切り捨てた作成時

- created_week: 最も近い週に切り捨てた作成時

- created_month: 最も近い月に切り捨てた作成時

- created_year: 最も近い年に切り捨てた作成時

19.5.4 識別子

Oracleデータベースでは、表名、ビュー名および列名などの識別子の長さが30文字に制限されます。このスクリプトで生成されたビューをこの要件に準拠させるには、エンティティ、トランザクションおよびデータ・フィールドの名前の長さを次のように制限してください。

- エンティティ: 21(ビューの名前はoaam_ent_ + entity_keyになる)

- トランザクション: 21(ビューの名前はoaam_trx_ + transaction_keyになる)

- データ・フィールド: 28(列の名前はd_ + data_element_nameになる)

- entity-ref: 20(列の名前はrelationship_name + _entity_idになる)

スクリプトでは、これらの制限よりも長い名前の識別子はトリミングされます。作成されたビューに対するSQL問合せを書き込む際には、トリミングされた列名やビュー名に注意してください。

名前に含まれるスペース、ダッシュ(-)およびピリオド(.)は、下線に置き換えられます。

19.6 Pythonルール条件

Pythonルール条件を使用して、OAAMオブジェクトを使用するPython式を評価できます。

19.6.1 Pythonの式

非同期統合オプションには、Pythonの式を実行するOAAM条件が含まれています。この条件をosg_install/osg_integration_kit/osg_rule_conditions.zipファイルからインポートする必要があります。Pythonの式によって、カスタムJavaコードを記述しなくても、洗練された条件を記述できます。この条件に使用する式には、関数コール、SQL問合せ、複数の文などの、任意のPython構成を含めることができます。唯一の要件は、式が条件結果(ブール値)をoaamResultという名前の変数に返す必要があるということです。式には、第19.6.2項「Pythonで使用可能なオブジェクト」に記載されているセッション、ユーザー、デバイス、場所、トランザクション、ロガーなどのOAAM APIやOAAMオブジェクトへのアクセスが設定されています。

19.6.2 Pythonで使用可能なオブジェクト

表19-4に、Pythonの式からアクセス可能なオブジェクト(変数)を示します。使用可能なメソッドの詳細は、『Oracle Fusion Middleware Oracle Adaptive Access Manager Java APIリファレンス』の各変数の対応するJavaインタフェースを参照してください。

表19-4 Pythonで使用可能なオブジェクト

Pythonの変数

Javaインタフェース

説明

oaamAuth

VCryptAuth

OAAM Java API

oaamTracker

VCryptTracker

OAAM Java API

oaamRulesEngine

VCryptRulesEngine

OAAM Java API

oaamCommon

VCryptCommon

OAAM Java API

oaamCC

VCryptCC

OAAM Java API

oaamSession

VCryptTrackerSession

現在のセッション

oaamUser

VCryptTrackerUser

現在のセッション・ユーザー

oaamDevice

VCryptTrackerDevice

現在のセッション・デバイス

oaamLocation

VCryptTrackerLocation

現在のセッションの場所

oaamTrx

OaamTrxHelper

現在のトランザクション

oaamDb

OaamDbHelper

OAAM DB問合せインタフェース

oaamLogger

Logger

デバッグ用のロガー・オブジェクト

19.6.3 例

表19-5に、Pythonの式の条件に使用できる複数の式を示します。

表19-5 Pythonの式

説明

Pythonの式

このデバイスは初めてのユーザーによって使用されましたか。

oaamResult = oaamDevice.isUserFirstTime(oaamUser.userId);

24時間以内に現在の場所に6つ以上のデバイスがありましたか。

deviceCount = 5;

durationUnit = 24;

durationUnitType = 4; # hours

authStatus = 0; # success

oaamResult = oaamLocation.checkDeviceCountMorethan(

deviceCount, authStatus,

durationUnit, durationUnitType);

現在のデバイスには、この1時間で5人を超えるユーザーが割り当てられましたか。

users = oaamDevice.getAllUsersForDevice(3600);

oaamResult = (len(users) > 5);

現在のトランザクションのAccessType属性に値Prescriptionが設定されていますか。

oaamResult = (oaamTrx.AccessType == "Prescription");

現在のトランザクションにある患者とプロバイダのエンティティに同じ苗字が含まれていますか。

oaamResult = (oaamTrx.provider.LastName == oaamTrx.patient.LastName);

シングル・サインオンのログイン・タイプがCOOKIE_LOGIN、つまりauthClientType=1である場合、このデバイスを初めて使用したユーザーであるかどうかを確認します。

oaamResult =

((oaamSession.authClientType == 11) and oaamDevice.isUserFirstTime(oaamUser.userId));

現在のトランザクションにあるプロバイダに、指定された期間に患者との予約がありましたか。

from jarray import array;

from java.lang import String;

from java.lang import Object;

apptCount = oaamDb.executeSqlSelectSingleValue(

"select count(*)from oaam_ent_appointmentinfo appt where appt.PatientId=:patientId and appt.ProviderId=:providerId and appt.StartTime between (:trxTime - (:withinHours / 24.0)) and (:trxTime)'",

array(['patientId', 'providerId', 'trxTime', 'withinHours'], String),

array([oaamTrx.patient.PatientId, oaamTrx.provider.ProviderId, oaamTrx.createTime, 1], Object));

oaamResult = (apptCount.intValue() > 0);

ユーザー定義のSQL機能を実行し、患者とプロバイダが同僚かどうかを決定します。

from jarray import array;

from java.lang import String;

from java.lang import Object;

isCoworker = oaamDb.executeSqlSelectSingleValue(

"select IsSameWorkLocation(:patientID, :providerID) from dual",

array(['patientID', 'providerID'], String),

array([oaamTrx.patient.PatientID, oaamTrx.provider.ProviderID], Object));

oaamResult = (isCoworker.intValue() > 0);

第V部

カスタム開発

第V部の構成は次のとおりです。

- 第20章「仮想認証デバイスの使用と開発」

- 第21章「タスク・プロセッサの統合」

- 第22章「OAAMオフラインのカスタム・ローダーの開発」

- 第23章「OAAM Oracle BI Publisherレポートの作成」

- 第24章「構成可能なアクションの開発」

- 第25章「チェックポイントおよび最終アクションの作成」

20 仮想認証デバイスの使用と開発

OAAMには、非常にセキュアな仮想認証デバイス一式が、ユーザーの選択に応じてデプロイできるサンプルとして組み込まれています。これらのサンプルの変更は、カスタム開発と見なされます。この章のソース画像と情報は、ユーザーが独自のカスタム仮想認証デバイスを開発するための参考用に提供されています。

注意:

これらのサンプルは、英語のみで提供されています。

この章は、次の項で構成されています。

- 第20.1項「仮想認証デバイスについて」

- 第20.2項「カスタマイズできるオーセンティケータの要素」"

- 第20.3項「カスタマイズ手順」

- 第20.4項「構成の簡単な例」

- 第20.5項「仮想認証デバイスの表示」

- 第20.6項「アクセシビリティ対応バージョンのオーセンティケータの有効化」

- 第20.7項「OAAMサーバー・ページのカスタマイズ」

- 第20.8項「OAAM 11gの仮想認証デバイスのローカライズ」

- 第20.9項「パスワードの文字制限の変更」

- 第20.10項「KeyPadのシナリオ」

20.1 仮想認証デバイスについて

仮想認証デバイスは、認証資格証明の入力と送信のプロセスにおいて、エンド・ユーザー情報の保護に使用されるオーセンティケータ・インタフェースで、エンド・ユーザーは、有効なアプリケーションに対して認証していることを確認できます。オーセンティケータのユーザー・インタフェースには、数多くのセキュリティ技術が実装されています。それぞれの仮想認証デバイスには、独自のユニークなセキュリティ機能のセットが用意されており、それらの機能は、仮想認証デバイスがただ単にWebページ上のイメージではないことを印象付けています。

20.1.1 仮想認証デバイスの用語

ここでは、この章で使用される用語の定義を紹介します。

表20-1 VAD用語

用語

説明

オーセンティケータ/AuthentiPad

OAAMに付属するユーザー入力のコントロール。キーボードを提供し、パーソナライズを可能にします。

パーソナライズ

登録時におけるイメージおよび生成されたフレーズの割当て。このフレーズとイメージによって、エンド・ユーザーは、有効なアプリケーションに対して認証していることを確認できます。

仮想Keypad/キーボード

ユーザーが、外部キーボードではなく画面上のキーをクリックする、ユーザー入力の方式。

ジッター

オーセンティケータが生成されるたびにキーの位置が少しずれる動作。

サブ・ジッター

ジッター値が計算された後、個別のキーが移動されます。

オフセット

画面上のキー・セット全体が動く動作。

キーのランダム化

キー順序のランダム化の動作。(スクランブル)

タイムスタンプ

現在のシステム時間またはクライアント側の時間から生成された文字列。

マスキング

HTML入力フィールドにおける文字の置換え。

20.1.2 仮想認証デバイスのタイプ

仮想認証デバイスは、ユーザー情報をフィッシング攻撃、データ盗難およびボットから保護します。各ユーザーには、企業とエンド・ユーザーとの間の共有シークレットとして使用される、イメージとフレーズが割り当てられます。共有シークレットによって、エンド・ユーザーのWebサイトへのアクセスが認証されます。これにより、エンド・ユーザーはフィッシング操作(ソーシャル・エンジニアリングによってユーザーをだますこと)から保護されます。

図20-1 パーソナライズ

PinPadまたはKeyPadが使用されるたびに、Web上に送信されるデータはランダム化されます。エンド・ユーザーが実際の資格証明を入力して送信することはありません。かわりに、画面上の座標が送信されます。基本的なジッター、サブ・ジッターおよびスクランブルが提供されます。次の各項では、仮想認証デバイスについて説明します。

20.1.2.1 TextPad

TextPadは、通常のキーボードを使用してパスワードやPINを入力するための単一のフォーム・フィールドを持つ、パーソナライズされたデバイスです。このデータ入力方法は、主に、フィッシングからの防御に役立ちます。このフィールドは、データ入力をマスキングするパスワードHTMLのコントロールとして機能できます。TextPadは、一般的に、大規模なデプロイメントにおいて、すべてのユーザーのデフォルトとしてデプロイされます。その後、各ユーザーが必要に応じて個別に別のデバイスにアップグレードできます。ユーザーが登録した個人イメージおよびフレーズは、ユーザーが有効なサイトにログインするたびに表示され、ユーザーとサーバーとの間の共有シークレットとして機能します。この共有シークレットが表示されないか、間違った内容が表示されると、ユーザーは気付きます。TextPadの例を図20-2に示します。

図20-2 TextPad

20.1.2.2 PinPadおよびKeyPad

PinPadとKeyPadは、認証資格証明の間接的な入力仮想デバイスです。これらは必要に応じて、ログイン時またはセッション中に起動できます。ユーザーは、マウスを使用して視覚的なキーをクリックすることによって移動します。Web上では、入力したデータは、OAAMサーバーのみが有効なパスワード/PIN/データにデコードできる、ランダム数値からなる文字列になります。構成可能な複数のランダム化メカニズムにより、ユーザビリティと必要なセキュリティ・レベルとの間のバランスを取ることができます。PinPadとKeyPadは通常、ユーザーがその使用を選択できるオプション・アップグレードとして提供されています。これにより、データ保護を強化したいユーザーのみがこれらの機能を利用することになります。そのナビゲーションには、多少の習熟を要するからです。

PinPadは、数値PINを入力するための軽量な認証デバイスです。データ入力は、数字に限定されています。これは、キー・ジッター、ランダム化およびオフセットをサポートしています。PinPadの例を図20-3に示します。

図20-3 PinPad

KeyPadは、パーソナライズされたグラフィック・キーボードです。ユーザーは、KeyPadを使用して、通常のキーボードを使用した英数字や特殊文字の入力を行います。KeyPadはパスワードやその他の機密データの入力に最適です。たとえば、クレジット・カード番号を入力できます。KeyPadの例を図20-4に示します。

図20-4 KeyPad

20.1.2.3 QuestionPad

QuestionPadは、プロンプトまたは質問の形式でテキストをレンダリングするパーソナライズされたデバイスです。ユーザーは、通常のキーボードを使用して情報を提供したり、質問に回答します。QuestionPadでは、チャレンジ質問を質問イメージに組み込むことができます。他の適応厳密認証デバイスと同様、QuestionPadはフィッシングの問題の解決にも役立ちます。QuestionPadの例を図20-5に示します。

図20-5 QuestionPad

20.1.3 仮想認証デバイスの構成ファイルとプロパティ

サーバー側のテキスト・ベースのプロパティ・ファイルは、仮想認証デバイスのレンダリング方法および動作方法を制御します。これらのファイルは、ネイティブ・デプロイメントではビジネス・アプリケーション内に、UIOデプロイメントではアプリケーション内にあります。この章では参考用に、仮想認証デバイスのプロパティの詳細を示します。

20.1.3.1 仮想認証デバイスの構成で使用されるファイル

仮想認証デバイスでは、次のファイルを使用します。

- oaam_custom.propertiesは、仮想認証デバイスのカスタム・プロパティが追加され、KeyPadおよびPinPadデバイスで使用されるKeySetが定義され、ローカライズ(翻訳)されない構成プロパティが存在するファイルです。

- oaam_custom_locale.propertiesは、アプリケーションをカスタマイズする管理者が、翻訳された表示メッセージなどロケール固有のプロパティを組み込むために作成するファイルです。ロケール識別子は、言語識別子(必須)と地域識別子(必要な場合)で構成されています。たとえば、US Englishのカスタム・プロパティ・ファイルはoaam_custom_en_US.propertiesになります。

注意:

仮想認証デバイス関連のプロパティの多くは、ローカライズできるようにリソース・バンドルに含められています。リソース・ファイルにデフォルト値が存在する場合は、クライアント・オーバーライド・ファイルのリソース・バンドル値(client_resource.properties)に対してオーバーライド値を指定する必要があります。

20.1.3.2 仮想認証デバイスのプロパティ構成

プロパティは次のように構成されます。

bharosa.authentipad.padtype.property.subproperty=value

たとえば、次のようになります。

bharosa.authentipad.textpad.datafield.x=100

パッド・タイプ値は次のとおりです。

- textpad

- keypad

- pinpad

- questionpad

定義されたすべてのプロパティは、oaam_custom.propertiesファイルのプロパティを再定義することにより上書きまたは更新できます。これにより、新しいセットのすべてのプロパティを再コーディングすることなく、関連するプロパティのみを変更できます。

20.1.3.3 ランダム化とジッターのプロパティ

PinPad、KeyPadおよびQuestionPadが使用されるたびに、Web上に送信されるデータはランダム化されます。エンド・ユーザーが実際の資格証明を入力して送信することはありません。かわりに、画面上の座標やオフセット値が送信されます。また、これらのプロパティを介して、基本的なジッター、サブ・ジッターおよびスクランブルが提供されます。次の図に、ジッターの生成方法を示します。

図20-6 ランダム化およびジッター

20.1.3.3.1 TextPadのランダム化とジッターのプロパティ

bharosa.authentipad.textpad.encrypt.checksum = true
#This contains the values for the checksum encryption process
bharosa.authentipad.textpad.checksum.min = 100
bharosa.authentipad.textpad.checksum.max = 200
bharosa.authentipad.textpad.checksum.total = 300

20.1.3.3.2 KeyPadのランダム化とジッターのプロパティ

bharosa.authentipad.keypad.encrypt.jitter = true
bharosa.authentipad.keypad.randomizeKeys=false
bharosa.authentipad.keypad.keyWidthJitter=50
bharosa.authentipad.keypad.keyHeightJitter=15
bharosa.authentipad.keypad.encrypt.checksum = true
bharosa.authentipad.keypad.checksum.min = 100
bharosa.authentipad.keypad.checksum.max = 200
bharosa.authentipad.keypad.checksum.total = 300

20.1.3.3.3 PinPadのランダム化とジッターのプロパティ

bharosa.authentipad.pinpad.encrypt.jitter = true
bharosa.authentipad.pinpad.randomizeKeys=false
bharosa.authentipad.pinpad.keyWidthJitter=50
bharosa.authentipad.pinpad.keyHeightJitter=15
bharosa.authentipad.pinpad.encrypt.checksum = true
#This contains the values for the checksum encryption process
bharosa.authentipad.pinpad.checksum.min = 100
bharosa.authentipad.pinpad.checksum.max = 200
bharosa.authentipad.pinpad.checksum.total = 300

20.1.3.3.4 QuestionPadのランダム化とジッターのプロパティ

bharosa.authentipad.questionpad.encrypt.checksum = true
#This contains the values for the checksum encryption process
bharosa.authentipad.questionpad.checksum.min = 100
bharosa.authentipad.questionpad.checksum.max = 200
bharosa.authentipad.questionpad.checksum.total = 300

20.2 カスタマイズできるオーセンティケータの要素

オーセンティケータ・インタフェースの個々の要素はカスタマイズ可能です。これらの構成の詳細は次のとおりです。

20.2.1 仮想認証デバイスの構成

仮想認証デバイスは多くの要素から構成されます。図20-7に、クライアント側で表示される仮想認証デバイスを生成するために実行時に組み合される各要素を示します。

図20-7 仮想認証デバイスの構成

表20-2に、この構成の各要素を示します。

表20-2 オーセンティケータの要素

要素

説明

パーソナライズされたイメージ

登録時にユーザーが選択したイメージ。これは、OAAMのユーザー・リポジトリに格納されます。

オーセンティケータ・フレーム

オーセンティケータのフレームを形成するイメージ。ユーザー・コントロールのグラフィックを含みます。

タイムスタンプ、フレーズおよびKeyset

オーセンティケータのパーソナライズを構築するために生成されるイメージ要素。

HTMLコントロール

JavaScriptで制御される、データ入力とデータ送信のための一連のHTML要素。

20.2.2 パーソナライズされたイメージ

各仮想認証デバイスには、8,423個のパーソナライズされたイメージが存在します。仮想認証デバイスでバックグラウンド・イメージを表示するには、次のプロパティを設定します。

vcrypt.user.image.dirlist.property.name=bharosa.image.dirlist
bharosa.image.dirlist=absolute_folder_path_where_oaam_images_are_available

仮想認証デバイスに対してカスタム・バックグラウンド・イメージを作成するには、次の手順を実行します。

1. 使用される仮想認証デバイスごとに、イメージが適切な解像度になるように処理します。
グラフィック・エディタを構成すれば、イメージをバッチで変換できます。

2. 仮想認証デバイスごとに、イメージを正しいディレクトリに追加します。たとえば、TextPadイメージはtextpadフォルダ内に配置されます。

3. 仮想認証デバイスごとに、次のプロパティを設定します。

bharosa.image.dirlist=absolute_folder_path_where_oaam_images_are_available

たとえば、次のようになります。

bharosa.image.dirlist=/scratch/user/Oracle/Middleware/Oracle_IDM1/oaam/
oaam_images/virtual_authentication_device

ここで、virtual_authentication_deviceは、keypad、questionpad、またはtextpadサブディレクトリのうちの1つになります。

20.2.3 フレーム

TextPad、KeyPad、PinPadなどの各オーセンティケータ・インタフェースには、フレームが存在します。フレームはオーセンティケータ・ユーザー・インタフェースの外側の境界を示しており、仮想認証デバイスをページ上の残りの領域から区別するものです。

どんなグラフィック処理を行ったとしてもデバイスの外観が維持されるように、このフレームは常に識別可能な状態にある必要があります。フレームは、視覚から消えてしまうほど、HTMLページの周囲の要素に溶け込んではならないということです。

各パッドの全体サイズとアスペクト率は固定されているため変更できません。インタフェースのすべての要素は、フレーム内に収まっている必要があります。

フレームとキーのサンプルは、英語のみで提供されています。仮想認証デバイスのフレームとキーのマスター・ファイル、また各部の説明は、必要に応じて提供されています。独自のカスタム・フレームとキー・イメージを作成して、本番ドキュメントを使用してデプロイできますが、これらのイメージや対応するプロパティに対する変更は、カスタム開発とみなされます。

Oracle Adaptive Access Managerには、一連のサンプル・バックグラウンド・イメージが同梱されています。これらのイメージは、仮想認証デバイスのみでの使用を目的としています。セキュリティ上の理由から、仮想認証デバイスのコンテキスト以外でエンド・ユーザーに使用可能にしないでください。あらゆるユーザーを対象にした迅速なダウンロードを可能にするために、その内容、ファイル・サイズおよびその他の属性が最適化されています。パッケージでは、各サポート言語用のサンプル・フレーズ・テキストが提供されています。これらのイメージやテキストに対する変更は、カスタム開発とみなされます。イメージを編集するときには、そのイメージの物理的寸法を拡大したり、サンプル・イメージのアスペクト率を変更したりしないでください。そのイメージがゆがんでしまうからです。これらの要素には、ボタン、フィールド、個人フレーズおよび個人イメージが含まれます。

1つのイメージ・ファイルには、ブランド、フレームおよびボタン・イメージが含まれます。特に注意を要するのは、テキスト、ホット・スポットおよびキー・サイズに関する問題です。これらは、提供サンプルよりもサイズを小さくしないでください。また、デプロイメントで使用されている仮想認証デバイスごとに同じ名前のイメージが存在している必要があります。

フレームは、次の方法でのみ変更できます。

- フレームのアウトラインおよび塗りつぶしのカラーを変更できます。

- フレームのボタンのカラーを変更できます。

- ブランドを変更できます。

注意:

デフォルト値が「リソース」ファイル内にある場合は、client_resource.propertiesでオーバーライド値を指定する必要があります。

20.2.3.1 TextPadのオーセンティケータ・イメージおよびフレーム・プロパティ

表20-3に、TextPadのオーセンティケータのプロパティを示します。

表20-3 TextPadのオーセンティケータのプロパティ

機能

プロパティ

デフォルトのバックグラウンド・グラフィック

(アプリケーション固有でも可能)

bharosa.uio.appId.DeviceTextPad.default.image = textpad_bg/UIO_BG.jpg

パスワード・フレーム・ファイル

(アプリケーション固有でも可能)

bharosa.uio.appId.password.DeviceTextPad.frame =

チャレンジ・フレーム・ファイル

(アプリケーション固有でも可能)

bharosa.uio.appId.challengeType.DeviceTextPad.frame =

注意: チャレンジ・タイプとして、構成されているすべてのチャレンジ・タイプ(ChallengeQuestion、ChallengeEmailなど)を指定できます。

登録フレーム・ファイル

(アプリケーション固有でも可能)

このプロパティは登録ページに適用されます。

bharosa.uio.appId.register.DeviceTextPad.frame = textpad_bg/TP_O_preview.png

ユーザー・プリファレンス・フレーム・ファイル

(アプリケーション固有でも可能)

このプロパティは、セルフサービス・ユーザー・プリファレンスのページに適用されます。

bharosa.uio.appId.userpreferences.DeviceTextPad.frame = textpad_bg/TP_O_preview.png

20.2.3.2 PinPadのオーセンティケータ・イメージおよびフレーム・プロパティ

表20-4に、PinPadのオーセンティケータのプロパティを示します。

表20-4 PinPadのオーセンティケータのプロパティ

機能

プロパティ

デフォルトのバックグラウンド・グラフィック

(アプリケーション固有でも可能)

bharosa.uio.default.DevicePinPad.default.image = pinpad_bg/UIO_BG.jpg

パスワード・フレーム・ファイル

(アプリケーション固有でも可能)

bharosa.uio.appId.password.DevicePinPad.frame =

チャレンジ・フレーム・ファイル

(アプリケーション固有でも可能)

bharosa.uio.appId.challengeType.DevicePinPad.frame =

注意: チャレンジ・タイプとして、構成されているすべてのチャレンジ・タイプ(ChallengeQuestion、ChallengeEmailなど)を指定できます。

登録フレーム・ファイル

(アプリケーション固有でも可能)

bharosa.uio.appId.register.DevicePinPad.frame = pinpad_bg/PP_v02_frame_preview.png

ユーザー・プリファレンス・フレーム・ファイル

(アプリケーション固有でも可能)

bharosa.uio.appId.userpreferences.DevicePinPad.frame = pinpad_bg/PP_v02_frame_preview.png

20.2.3.3 QuestionPadのオーセンティケータ・イメージおよびフレーム・プロパティ

表20-5に、QuestionPadのオーセンティケータのプロパティを示します。

表20-5 QuestionPadのオーセンティケータのプロパティ

機能

プロパティ

デフォルトのバックグラウンド・グラフィック

(アプリケーション固有でも可能)

bharosa.uio.appId.DeviceQuestionPad.default.image = textpad_bg/UIO_BG.jpg

チャレンジ・フレーム・ファイル

(アプリケーション固有でも可能)

bharosa.uio.appId.challengeType.DeviceQuestionPad.frame =

注意: チャレンジ・タイプとして、構成されているすべてのチャレンジ・タイプ(ChallengeQuestion、ChallengeEmailなど)を指定できます。

20.2.3.4 KeyPadのオーセンティケータ・イメージおよびフレーム・プロパティ

表20-6に、KeyPadのオーセンティケータのプロパティを示します。

表20-6 KeyPadのオーセンティケータのプロパティ

機能

プロパティ

デフォルトのバックグラウンド・グラフィック

(アプリケーション固有でも可能)

bharosa.uio.appId.DeviceKeyPadFull.default.image = keypad_bg/UIO_BG.jpg

パスワード・フレーム・ファイル

(アプリケーション固有でも可能)

bharosa.uio.appId.password.DeviceKeyPadFull.frame =

チャレンジ・フレーム・ファイル

(アプリケーション固有でも可能)

bharosa.uio.appId.challengeType.DeviceKeyPadFull.frame =

注意: challengeTypeとして、構成されているすべてのチャレンジ・タイプ(ChallengeQuestion、ChallengeEmailなど)を指定できます。

登録フレーム・ファイル

(アプリケーション固有でも可能)

bharosa.uio.appId.register.DeviceKeyPadFull.frame = alphapad_bg/kp_O_preview.png

ユーザー・プリファレンス・フレーム・ファイル

(アプリケーション固有でも可能)

bharosa.uio.appId.userpreferences.DeviceKeyPadFull.frame = alphapad_bg/kp_O_preview.png

20.2.4 [Enter]キー、パーソナライズされたフレーズおよびタイムスタンプの位置

それぞれの仮想認証デバイスには、独自のユニークなセキュリティ機能が用意されています。これらの要素のデフォルトの位置を参考用に示します。

表20-7 独自のセキュリティ機能

ビジュアル要素

説明

[Enter]キーのホットスポット

ユーザーが、認証デバイスに入力したデータを送信できるリンク領域。

フレーズ

登録時にユーザーに割り当てられたパーソナライズされたフレーズ。ユーザーは、このフレーズによって目的のWebサイトを利用していることを確認できます。

タイムスタンプ

イメージ生成時のタイムスタンプ。ユーザーは、認証デバイスが最新の状態であることを確認できます。

20.2.4.1 TextPadのビジュアル要素

この項では、TextPadのビジュアル要素について説明します。

フレーズ(キャプション)

bharosa.authentipad.textpad.caption.personalize = true
bharosa.authentipad.textpad.caption.x = 14
bharosa.authentipad.textpad.caption.y = 203
bharosa.authentipad.textpad.caption.frame = false
bharosa.authentipad.textpad.caption.wrap = false
bharosa.authentipad.textpad.caption.width = 130
bharosa.authentipad.textpad.caption.height = 16
bharosa.authentipad.textpad.caption.font.name = Arial
bharosa.authentipad.textpad.caption.font.color = 000000
bharosa.authentipad.textpad.caption.font.type= 0
bharosa.authentipad.textpad.caption.font.size = 9

タイムスタンプ

bharosa.authentipad.textpad.timestamp.x = 25
bharosa.authentipad.textpad.timestamp.y = 165
bharosa.authentipad.textpad.timestamp.width = 132
bharosa.authentipad.textpad.timestamp.height = 16
bharosa.authentipad.textpad.timestamp.frame = false
bharosa.authentipad.textpad.timestamp.wrap = false
bharosa.authentipad.textpad.timestamp.font.name = Arial
bharosa.authentipad.textpad.timestamp.font.color = ffffff
bharosa.authentipad.textpad.timestamp.font.type= 0
bharosa.authentipad.textpad.timestamp.font.size = 9

[Enter]キーのホットスポット

bharosa.authentipad.textpad.enterkey.x=98
bharosa.authentipad.textpad.enterkey.y=181
bharosa.authentipad.textpad.enterkey.width=45
bharosa.authentipad.textpad.enterkey.height=19
bharosa.authentipad.textpad.enterkey.label=enter
bharosa.authentipad.textpad.enterkey.enable=true

20.2.4.2 PinPadのビジュアル要素

この項では、PinPadのビジュアル要素について説明します。

フレーズ(キャプション)

bharosa.authentipad.pinpad.caption.personalize = true
bharosa.authentipad.pinpad.caption.x = 5
bharosa.authentipad.pinpad.caption.y = 206
bharosa.authentipad.pinpad.caption.frame = false
bharosa.authentipad.pinpad.caption.wrap = false
bharosa.authentipad.pinpad.caption.width = 130
bharosa.authentipad.pinpad.caption.height = 16
bharosa.authentipad.pinpad.caption.font.name = Arial
bharosa.authentipad.pinpad.caption.font.color = 000000
bharosa.authentipad.pinpad.caption.font.type= 0
bharosa.authentipad.pinpad.caption.font.size = 9

タイムスタンプ

bharosa.authentipad.pinpad.timestamp.x = 15
bharosa.authentipad.pinpad.timestamp.y = 165
bharosa.authentipad.pinpad.timestamp.width = 132
bharosa.authentipad.pinpad.timestamp.height = 16
bharosa.authentipad.pinpad.timestamp.frame = false
bharosa.authentipad.pinpad.timestamp.wrap = false
bharosa.authentipad.pinpad.timestamp.font.name = Arial
bharosa.authentipad.pinpad.timestamp.font.color = ffffff
bharosa.authentipad.pinpad.timestamp.font.type= 0
bharosa.authentipad.pinpad.timestamp.font.size = 9

[Enter]キーのホットスポット

bharosa.authentipad.pinpad.enterkey.x=78
bharosa.authentipad.pinpad.enterkey.y=182
bharosa.authentipad.pinpad.enterkey.width=49
bharosa.authentipad.pinpad.enterkey.height=20
bharosa.authentipad.pinpad.enterkey.label=enter
bharosa.authentipad.pinpad.enterkey.enable=true

[Back Space]キーのホットスポット

bharosa.authentipad.pinpad.backspace.x=86
bharosa.authentipad.pinpad.backspace.y=8
bharosa.authentipad.pinpad.backspace.width=20
bharosa.authentipad.pinpad.backspace.height=20
bharosa.authentipad.pinpad.backspace.label=&lt;
bharosa.authentipad.pinpad.backspace.enable=true

20.2.4.3 QuestionPadのビジュアル要素

この項では、QuestionPadのビジュアル要素について説明します。

注意:

10.1.4.5以降では、QuestionPadは単一行のフィールドです。

フレーズ(キャプション)

bharosa.authentipad.questionpad.caption.personalize = true
bharosa.authentipad.questionpad.caption.x = 14
bharosa.authentipad.questionpad.caption.y = 203
bharosa.authentipad.questionpad.caption.frame = false
bharosa.authentipad.questionpad.caption.wrap = false
bharosa.authentipad.questionpad.caption.width = 130
bharosa.authentipad.questionpad.caption.height = 16
bharosa.authentipad.questionpad.caption.font.name = Arial
bharosa.authentipad.questionpad.caption.font.color = 000000
bharosa.authentipad.questionpad.caption.font.type= 0
bharosa.authentipad.questionpad.caption.font.size = 9

タイムスタンプ

bharosa.authentipad.questionpad.timestamp.x = 25
bharosa.authentipad.questionpad.timestamp.y = 165
bharosa.authentipad.questionpad.timestamp.width = 132
bharosa.authentipad.questionpad.timestamp.height = 16
bharosa.authentipad.questionpad.timestamp.frame = false
bharosa.authentipad.questionpad.timestamp.wrap = false
bharosa.authentipad.questionpad.timestamp.font.name = Arial
bharosa.authentipad.questionpad.timestamp.font.color = ffffff
bharosa.authentipad.questionpad.timestamp.font.type= 0
bharosa.authentipad.questionpad.timestamp.font.size = 9

質問のテキスト

bharosa.authentipad.questionpad.question.x = 9
bharosa.authentipad.questionpad.question.y = 32
bharosa.authentipad.questionpad.question.width = 132
bharosa.authentipad.questionpad.question.height = 62
bharosa.authentipad.questionpad.question.frame = false
bharosa.authentipad.questionpad.question.wrap = true
bharosa.authentipad.questionpad.question.font.name = Arial
bharosa.authentipad.questionpad.question.font.color = 000000
bharosa.authentipad.questionpad.question.font.type= 0
bharosa.authentipad.questionpad.question.font.size = 9

[Enter]キーのホットスポット

bharosa.authentipad.questionpad.enterkey.x=98
bharosa.authentipad.questionpad.enterkey.y=181
bharosa.authentipad.questionpad.enterkey.width=45
bharosa.authentipad.questionpad.enterkey.height=19
bharosa.authentipad.questionpad.enterkey.label=enter
bharosa.authentipad.questionpad.enterkey.enable=true

表示されるテキスト入力またはパスワード(非表示)の入力設定

oaam_custom.propertiesの次のプロパティにより、QuestionPadに表示されるテキスト入力が設定されるか、それともパスワード(非表示)入力が設定されるかが決定されます。

bharosa.authentipad.questionpad.datafield.input.type

有効な値はtextおよびpasswordです。

20.2.4.4 KeyPadのビジュアル要素

この項では、KeyPadのビジュアル要素について説明します。

フレーズ(キャプション)

bharosa.authentipad.keypad.caption.personalize = true
bharosa.authentipad.keypad.caption.x = 240
bharosa.authentipad.keypad.caption.y = 206
bharosa.authentipad.keypad.caption.frame = false
bharosa.authentipad.keypad.caption.wrap = false
bharosa.authentipad.keypad.caption.width = 130
bharosa.authentipad.keypad.caption.height = 16
bharosa.authentipad.keypad.caption.font.name = Arial
bharosa.authentipad.keypad.caption.font.color = 000000
bharosa.authentipad.keypad.caption.font.type= 0
bharosa.authentipad.keypad.caption.font.size = 9

タイムスタンプ

bharosa.authentipad.keypad.timestamp.x = 110
bharosa.authentipad.keypad.timestamp.y = 202
bharosa.authentipad.keypad.timestamp.width = 132
bharosa.authentipad.keypad.timestamp.height = 16
bharosa.authentipad.keypad.timestamp.frame = false
bharosa.authentipad.keypad.timestamp.wrap = false
bharosa.authentipad.keypad.timestamp.font.name = Arial
bharosa.authentipad.keypad.timestamp.font.color = ffffff
bharosa.authentipad.keypad.timestamp.font.type= 0
bharosa.authentipad.keypad.timestamp.font.size = 9

[Enter]キーのホットスポット

bharosa.authentipad.keypad.enterkey.x=292
bharosa.authentipad.keypad.enterkey.y=8
bharosa.authentipad.keypad.enterkey.width=50
bharosa.authentipad.keypad.enterkey.height=20
bharosa.authentipad.keypad.enterkey.label=enter
bharosa.authentipad.keypad.enterkey.enable=true

[Back Space]キーのホットスポット

bharosa.authentipad.keypad.backspace.x=164
bharosa.authentipad.keypad.backspace.y=8
bharosa.authentipad.keypad.backspace.width=20
bharosa.authentipad.keypad.backspace.height=20
bharosa.authentipad.keypad.backspace.enable=true

[Caps Lock]キーの状態

bharosa.authentipad.keypad.capslock.x=188
bharosa.authentipad.keypad.capslock.y=0
bharosa.authentipad.keypad.capslock.width=43
bharosa.authentipad.keypad.capslock.height=29
bharosa.authentipad.keypad.capslock.capsonimg=kp_v2_all_caps.jpg
bharosa.authentipad.keypad.capslock.capsshiftimg=kp_v2_first_caps.jpg

20.2.4.5 Apple iPhone用のテキスト・サイズの構成

TextPadのパスワードおよびQuestionPadの回答のフォント・サイズをApple iPhoneにあわせて変更する場合は、次のプロパティをclient_resource.propertiesファイルに追加します。

bharosa.authentipad.textpad.datafield.font.size=12
bharosa.authentipad.questionpad.datafield.font.size=12

20.2.5 KeysSet

KeySetは、仮想認証デバイスにどの文字キーを表示するかを定義する構成です。KeySetは、KeyPadおよびPinPad仮想認証デバイスで使用されます。

KeySetsは、一連のユーザー定義の列挙で定義されます。

最初の列挙はKeySetの行を定義し、その行に存在する各キーを記述する別の列挙を指します。

たとえば、次の列挙は、PinPadのキーの各行を定義します。

bharosa.authentipad.pinpad.default.keyset.enum=Default PinPad Keyset Enum
bharosa.authentipad.pinpad.default.keyset.enum.row1=0
bharosa.authentipad.pinpad.default.keyset.enum.row1.name=
Default PinPad Keyset Row 1
bharosa.authentipad.pinpad.default.keyset.enum.row1.description=
Default PinPad Keyset Row 1
bharosa.authentipad.pinpad.default.keyset.enum.row1.keys=
bharosa.authentipad.pinpad.default.keyset.row1.enum
bharosa.authentipad.pinpad.default.keyset.enum.row1.order=1

bharosa.authentipad.pinpad.default.keyset.enum.row2=1
bharosa.authentipad.pinpad.default.keyset.enum.row2.name=
Default PinPad Keyset Row 2
bharosa.authentipad.pinpad.default.keyset.enum.row2.description=
Default PinPad Keyset Row 2
bharosa.authentipad.pinpad.default.keyset.enum.row2.keys=
bharosa.authentipad.pinpad.default.keyset.row2.enum
bharosa.authentipad.pinpad.default.keyset.enum.row2.order=2

bharosa.authentipad.pinpad.default.keyset.enum.row3=2
bharosa.authentipad.pinpad.default.keyset.enum.row3.name=
Default PinPad Keyset Row 3
bharosa.authentipad.pinpad.default.keyset.enum.row3.description=
Default PinPad Keyset Row 3
bharosa.authentipad.pinpad.default.keyset.enum.row3.keys=
bharosa.authentipad.pinpad.default.keyset.row3.enum
bharosa.authentipad.pinpad.default.keyset.enum.row3.order=3

bharosa.authentipad.pinpad.default.keyset.enum.row4=3
bharosa.authentipad.pinpad.default.keyset.enum.row4.name=
Default PinPad Keyset Row 4
bharosa.authentipad.pinpad.default.keyset.enum.row4.description=
Default PinPad Keyset Row 4
bharosa.authentipad.pinpad.default.keyset.enum.row4.keys=
bharosa.authentipad.pinpad.default.keyset.row4.enum
bharosa.authentipad.pinpad.default.keyset.enum.row4.order=4

各行は次のプロパティから構成されます。

表20-8 行のプロパティ

プロパティ

説明

name

行の名前。

description

行の説明。

keys

行のキーを定義する列挙の列挙識別子。

order

キー行における特定のキーの配列順。

この場合、row1列挙は次のように定義されます。

bharosa.authentipad.pinpad.default.keyset.row1.enum=Default Pinpad Keyset Row 1
bharosa.authentipad.pinpad.default.keyset.row1.enum.key1=0
bharosa.authentipad.pinpad.default.keyset.row1.enum.key1.name=1
bharosa.authentipad.pinpad.default.keyset.row1.enum.key1.description=1
bharosa.authentipad.pinpad.default.keyset.row1.enum.key1.value=1
bharosa.authentipad.pinpad.default.keyset.row1.enum.key1.shiftvalue=1
bharosa.authentipad.pinpad.default.keyset.row1.enum.key1.image=kp_v2_1.png
bharosa.authentipad.pinpad.default.keyset.row1.enum.key1.order=1

bharosa.authentipad.pinpad.default.keyset.row1.enum.key2=1
bharosa.authentipad.pinpad.default.keyset.row1.enum.key2.name=2
bharosa.authentipad.pinpad.default.keyset.row1.enum.key2.description=2
bharosa.authentipad.pinpad.default.keyset.row1.enum.key2.value=2
bharosa.authentipad.pinpad.default.keyset.row1.enum.key2.shiftvalue=2
bharosa.authentipad.pinpad.default.keyset.row1.enum.key2.image=kp_v2_2.png
bharosa.authentipad.pinpad.default.keyset.row1.enum.key2.order=2

bharosa.authentipad.pinpad.default.keyset.row1.enum.key3=2
bharosa.authentipad.pinpad.default.keyset.row1.enum.key3.name=3
bharosa.authentipad.pinpad.default.keyset.row1.enum.key3.description=3
bharosa.authentipad.pinpad.default.keyset.row1.enum.key3.value=3
bharosa.authentipad.pinpad.default.keyset.row1.enum.key3.shiftvalue=3
bharosa.authentipad.pinpad.default.keyset.row1.enum.key3.image=kp_v2_3.png
bharosa.authentipad.pinpad.default.keyset.row1.enum.key3.order=3

各キーは次のプロパティから構成されます。

表20-9 各キーのプロパティ

プロパティ

説明

name

キーの名前。

description

キーの説明。

value

クリックされたときにキーが表す文字値。

shiftvalue

[Caps Lock]キーのモードがオンになっているときにキーが表す文字値。

image

キーの視覚表現を表示するために使用されるイメージ・ファイルの名前。

order

キー行における特定のキーの配列順。

20.3 カスタマイズ手順

このプロセスは、次のとおりです。

1. oaam_extensionsという作業フォルダを作成します。
このフォルダは、インストール・フォルダ以外であればどこにでも作成できます。

2. oracle.oaam.extensions.warファイルを作業フォルダ内に抽出します。
oaam_extensionsフォルダに、次のサブフォルダが表示されます。

- META-INF

- WEB-INF

- WEB-INF\lib

- WEB-INF\classes

3. カスタム・プロパティをoaam_custom.propertiesというファイルに追加し、そのファイルをoaam_extensions\WEB-INF\classesディレクトリに保存します。
oaam_custom.propertiesをoaam_extensions\WEB-INF\classes\bharosa_propertiesに保存したら、そのまま何もする必要はありません。いずれの場所も使用できます。

4. カスタム・リソース・バンドル値をclient_resource_locale.propertiesというファイルに追加し(ここで、localeは、「en」など関連性のあるロケールに置き換わります)、そのファイルをoaam_extensions\WEB-INF\classesフォルダに保存します。
たとえば、bharosa.uio.default.register.DeviceTextPad.frame=textpad_bg/TP_nologo_frame_01.pngおよびbharosa.uio.default.DeviceTextPad.default.image = textpad_bg/BG_003.jpgをこのファイルに追加できます。

ユーザーが使用するテキストもリソース・バンドルの値としてみなされるため、これらをファイルに追加する必要があります。OAAMサーバーにはイメージ・パスやregexプロパティなど、その他の項目もあり、これらはロケールに基づいてカスタマイズできます。

5. カスタム・パッド関連のイメージをoaam_extensions\WEB-INF\classes\bharosa_propertiesに追加します。
OAAMインストール内にロゴなしフレームなどのイメージがある場合、そのイメージはこのフォルダに移動する必要はありません。カスタム・ファイルを追加する場合にのみ、それをこのフォルダに追加する必要があります。

6. 次のコマンドを使用して、OAAM拡張共有ライブラリ、oracle.oaam.extensions.warをoaam_extensionsの親フォルダから再パッケージ化します。

jar -cvfm oracle.oaam.extensions.war oaam_extensions/META-INF/MANIFEST.MF -C  oaam_extensions/ .

注意:

元のMANIFEST.MFが、共有ライブラリ情報を含んだMANIFEST.MFと同じであることを確認してください。

7. 管理対象サーバーが稼働している場合はすべて停止します。

8. WebLogic管理サーバーを起動します。

9. Oracle Adaptive Access ManagerがデプロイされているOracle WebLogic Serverを起動して、Oracle WebLogic管理コンソールにログインします。

10. 現在デプロイされているoracle.oaam.extensions.warを削除します。

11. oaam_serverおよびoaam_adminをターゲット・アプリケーションとする、新しいoracle.oaam.extensions.warファイルを、共有ライブラリとしてデプロイします。
oaam_offlineが同じドメインにデプロイされている場合は、これもターゲットにする必要があります。

12. 使用するすべての管理対象サーバーを起動します。

13. カスタム機能をテストして、oracle.oaam.extensions.warに追加したファイルをOracle Adaptive Access Managerアプリケーションが使用していることを確認します。

20.4 構成の簡単な例

オーセンティケータを開発する例が紹介されています。

20.4.1 フレームの設計

次のプロパティで指定されているとおり、デフォルトのTextpadフレームは幅148px、高さ223pxになります。

bharosa.authentipad.textpad.width=148
bharosa.authentipad.textpad.height=223

これらのプロパティを変更して、より大きなAuthentiPadを新規作成するには、oaam_custom.propertiesファイルに2つの新しいプロパティを追加します。

たとえば、次のようになります。

bharosa.authentipad.textpad.width=368
bharosa.authentipad.textpad.height=223

フレーム自体には、次の要素が存在している必要があります。

- ユーザー・パスワード入力用のスペース: フォーム・フィールドとして認識されます。

- [Enter]キーまたはログイン・ボタン。

- パーソナライズされたフレーズ用のスペース。

- タイムスタンプ文字列用のスペース。

- パーソナライズされたイメージが透けて見える透明セクション。

これらのすべての要素を含む新しいイメージを、指定の幅ピクセルと高さピクセルで作成します。

20.4.2 要素の位置決定

次のプロパティを使用して、各要素が設定されます。すべてのプロパティで、イメージの左上を「0,0」に設定した標準的なXY座標が使用されます。

パーソナライズされたフレーズ(キャプション)

bharosa.authentipad.textpad.caption.personalize = true
bharosa.authentipad.textpad.caption.x = 14
bharosa.authentipad.textpad.caption.y = 203
bharosa.authentipad.textpad.caption.frame = false
bharosa.authentipad.textpad.caption.wrap = false
bharosa.authentipad.textpad.caption.width = 130
bharosa.authentipad.textpad.caption.height = 16
bharosa.authentipad.textpad.caption.font.name = Arial
bharosa.authentipad.textpad.caption.font.color = 000000
bharosa.authentipad.textpad.caption.font.type= 0
bharosa.authentipad.textpad.caption.font.size = 9

タイムスタンプ

bharosa.authentipad.textpad.timestamp.x = 25
bharosa.authentipad.textpad.timestamp.y = 165
bharosa.authentipad.textpad.timestamp.width = 132
bharosa.authentipad.textpad.timestamp.height = 16
bharosa.authentipad.textpad.timestamp.frame = false
bharosa.authentipad.textpad.timestamp.wrap = false
bharosa.authentipad.textpad.timestamp.font.name = Arial
bharosa.authentipad.textpad.timestamp.font.color = ffffff
bharosa.authentipad.textpad.timestamp.font.type= 0
bharosa.authentipad.textpad.timestamp.font.size = 9

[Enter]キー

bharosa.authentipad.textpad.enterkey.x=98
bharosa.authentipad.textpad.enterkey.y=181
bharosa.authentipad.textpad.enterkey.width=45
bharosa.authentipad.textpad.enterkey.height=19
bharosa.authentipad.textpad.enterkey.label=enter
bharosa.authentipad.textpad.enterkey.enable=true

20.5 仮想認証デバイスの表示

この項では、仮想認証デバイスをレンダリングする流れを説明します。内容は次のとおりです。

- get<pad_type>メソッドをコールする前の設定

- 仮想認証デバイスの取得

- タイムスタンプとタイムゾーンの設定

- 仮想認証デバイスの表示

20.5.1 get<pad_type>メソッドをコールする前の設定

bgFileは、次のように実行してユーザーから取得する必要があります。

String bgFile = (String) authUser.getSecurityPreferences().get("imagePath");

20.5.2 仮想認証デバイスの取得

仮想認証デバイスの生成を担当する主なAPIはBharosaClientImpl.getInstance().get<pad type>です。

次のメソッドを使用すると、一般的に使用されている仮想認証デバイスを取得できます。

- BharosaClientImpl.getInstance().getFullKeyPad(...)

- BharosaClientImpl.getInstance().getAlphaNumericKeyPad(...)

- BharosaClientImpl.getInstance().getTextPad(...)

- BharosaClientImpl.getInstance().getQuestionPad(...)

- BharosaClientImpl.getInstance().getPinPad(...)

各メソッドは、次の同じパラメータのセットをとります。

表20-10 仮想認証デバイス: メソッドのパラメータ

パラメータ

説明

String padName

仮想認証デバイスの識別子。HTMLで、入力フィールドとJavaScript変数のベース名として使用されています。

String frameFile

フレームに対して使用するイメージ・パス。

String backgroundFile

バックグラウンド・イメージに対して使用するイメージ・パス。

OAAM割当てAPIを使用する場合、ユーザーが割り当てたイメージがVCryptAuthUserオブジェクト(String) authUser.getSecurityPreferences().get("imagePath")に保存されます。

VCryptLocalizedString captionText

仮想認証デバイスのキャプションとして表示されるローカライズされた文字列。

- VCryptLocalizedString(String, VCryptLocale)

- VCryptLocalizedString(String, Locale)

- VCryptLocalizedString(String)

boolean isADACompliant

スクリーン・リーダー用のテキストとリンクが追加された仮想認証デバイスをレンダリングする必要がある場合に指定するフラグ。

boolean hasJS

ユーザーがJavaScriptを有効にした場合に指定するフラグ。

boolean hasImages

ユーザーがイメージを有効にした場合に指定するフラグ。

20.5.3 タイムスタンプとタイムゾーンの設定

取得した仮想認証デバイスに対して、タイムスタンプ、タイムゾーンおよび表示プロパティを設定する必要があります。

表20-11に、仮想認証デバイスを作成した後で設定が必要な場合がある各フィールドを示します。

表20-11 仮想認証デバイス: 追加フィールドの設定

パラメータ

説明

authentiPad.setTimeStamp(Date timeStamp)

仮想認証デバイスに表示されるタイムスタンプを設定します。

authentiPad.setTimeZone(TimeZone timeZone)

仮想認証デバイスに表示されるタイムゾーンを設定します。

authentiPad.setDisplayOnly(boolean displayOnly)

対話型のフィールドとリンクなしで仮想認証デバイスをレンダリングする必要がある場合に指定するフラグ。イメージを登録する際に一般的に使用されています。

authentiPad.setQuestionText(VCryptLocalizedString questionText)

QuestionPadの質問を表示するために使用されます。

20.5.4 仮想認証デバイスの表示

VADは、HTMLページでレンダリングされます。VADのレンダリングに使用されるすべてのページには、JavaScriptファイルbharosa_pad.jsが組み込まれている必要があります。bharosa_pad.jsファイルは、VADをレンダリングし、ユーザー操作を処理するJavaScriptライブラリです。

HTMLまたはJavaScriptでレンダリングされた文字列を取得してHTMLページに配置するには、authentiPad.getHTML()をコールします。

このメソッドの出力は、VADを表示するために必要なイメージ・マップとJavaScriptコンストラクタを含むHTML文字列です。

レンダリング後は、VADによってイメージの表示を求めるリクエストが送信されます。イメージのレンダリングに使用するURLは、bharosa.authentipad.image.urlプロパティによって構成されます。

20.6 アクセシビリティ対応バージョンのオーセンティケータの有効化

アシスティブ・テクノロジを使用してアクセスするユーザーは、仮想認証デバイスのアクセシビリティ対応バージョンを使用する必要があります。デフォルトでは、TextPad、QuestionPad、KeyPadおよびPinPadのアクセシビリティ対応バージョンは有効化されていません。デプロイメント内でアクセシビリティ対応バージョンが必要な場合は、所定のプロパティを通して有効化できます。

アクセシビリティ対応バージョンの仮想認証デバイスには、スクリーン・リーダーおよびその他のアシスティブ・テクノロジを使用したナビゲーションで必要なタブ、使用方法およびALTテキストが含まれます。

これらのバージョンを有効にするには、is ADA compliantフラグをtrueに設定します。

ネイティブ統合では、次のプロパティで仮想認証デバイスを制御します。

desertref.authentipad.isADACompliant

Oracle Adaptive Access Managerの即時利用可能な機能では、次のプロパティで仮想認証デバイスを制御します。

bharosa.uio.default.authentipad.is_ada_compliant

20.7 OAAMサーバー・ページのカスタマイズ

ページ・ディレクションおよび仮想認証デバイスのテキスト(必要な場合)のオーバーライドに使用できるリソース・バンドルの領域は次のとおりです。

# ユーザー名のページ

bharosa.uio.default.signon.page.title=Sign In:
bharosa.uio.default.signon.page.message=Enter your user name.

# パスワード・ページ

bharosa.uio.default.password.page.title=Sign In:
bharosa.uio.default.password.page.message=
Use this security device to enter your password.
bharosa.uio.default.password.page.DeviceHTMLControl.message=Enter your password.
bharosa.uio.default.password.page.DeviceKeyPadFull.message=
Please use this secure KeyPad to enter your password.
bharosa.uio.default.password.page.DeviceKeyPadAlpha.message=
Please use this secure KeyPad to enter your password.
bharosa.uio.default.password.page.DeviceTextPad.message=
Please use this secure TextPad to enter your password.
bharosa.uio.default.password.page.DevicePinPad.message=
Please use this secure PinPad to enter your PIN.

### KeyPadの説明およびディレクション

bharosa.authentipad.keypad.accessibility.directions =
KeyPad directions: Use the following links to enter your password.
Your personalized caption text comes first,
followed by control links, which are then followed by the key links.
Once you have entered your password, use shift-tab to return
to the enter link to submit your password.

bharosa.authentipad.keypad.security.image.alt = Security Device Image
bharosa.authentipad.keypad.datafield.label=Password
bharosa.authentipad.keypad.enterkey.label=enter

### PinPadの説明およびディレクション

bharosa.authentipad.pinpad.accessibility.directions =
PinPad directions: Use the following links to enter your numeric pin.
Your personalized caption text comes first, followed by control links,
which are then followed by the numeric links.
Once you have entered your numeric pin,
use shift-tab to return to the enter link to submit your pin.

bharosa.authentipad.pinpad.security.image.alt = Security Device Image
bharosa.authentipad.pinpad.datafield.label=Pin
bharosa.authentipad.pinpad.enterkey.label=enter

### TextPadの説明およびディレクション

bharosa.authentipad.textpad.accessibility.directions =
TextPad directions: Use the following items to validate your device.
Your personalized caption text comes first,
followed by a timestamp to ensure the device was generated for this session.
Once you have entered your password in the previous password entry field,
use tab to navigate to the enter link to submit your password.

bharosa.authentipad.textpad.security.image.alt = Security Device Image
bharosa.authentipad.textpad.datafield.label=Password
bharosa.authentipad.textpad.enterkey.label=enter

### TextPadResetの説明およびディレクション

bharosa.authentipad.textpadreset.accessibility.directions =
TextPad directions:
Use the following items to enter your new password.
Your personalized caption text comes first,
followed by a password input field and password confirmation field.
Once you have entered your password, use tab to navigate to the enter link
to submit your new password.

bharosa.authentipad.textpadreset.security.image.alt = Security Device Image
bharosa.authentipad.textpadreset.datafield.label=Password
bharosa.authentipad.textpadreset.confirmfield.label=Confirm Password
bharosa.authentipad.textpadreset.enterkey.label=enter

### CaptionPadの説明およびディレクション

bharosa.authentipad.captionpad.accessibility.directions =
CaptionPad directions:
Use the following items to enter your new caption text.
Control links come first, followed by a text input field.
Once you have entered your caption, use tab to navigate to the enter link
to submit your new caption.

bharosa.authentipad.captionpad.security.image.alt = Security Device Image
bharosa.authentipad.captionpad.datafield.label=Security Phrase
bharosa.authentipad.captionpad.enterkey.label=enter

### CaptionPadConfirmの説明およびディレクション

bharosa.authentipad.captionconfirmpad.accessibility.directions =
CaptionConfirmPad directions: Use the following items to review your caption text.
To edit your caption text, tab to the Edit link and press Enter.
bharosa.authentipad.captionconfirmpad.security.image.alt = Security Device Image
bharosa.authentipad.captionconfirmpad.datafield.label=Security Phrase
bharosa.authentipad.captionconfirmpad.enterkey.label=enter

### QuestionPadの説明およびディレクション

bharosa.authentipad.questionpad.accessibility.directions =
QuestionPad directions: Use the following items to enter your answer.
Your personalized question comes first, followed by your personalized caption,
which is then followed by your answer input field.  Once you have entered
your answer, use tab to navigate to the enter link to submit your answer.
bharosa.authentipad.questionpad.security.image.alt = Security Device Image
bharosa.authentipad.questionpad.datafield.label=Answer
bharosa.authentipad.questionpad.enterkey.label=enter

20.8 OAAM 11gの仮想認証デバイスのローカライズ

この項では、次の項目について説明します。

- 概要

- ドイツ語のロケールの使用例

20.8.1 概要

このプロセスは、次のとおりです。

1. 仮想認証デバイス関連のプロパティを指定してoaam_custom_locale.propertiesファイルを作成し、temp-folder/WEB-INF/classesフォルダに保存します。

2. カスタム・キーセット関連列挙プロパティをoaam_custom.propertiesに追加して、temp-folder/WEB-INF/classesフォルダに保存します。この章では、Keysetや他の仮想認証デバイスのプロパティの定義方法についても説明されています。

3. キー・イメージ・ファイルをtemp-folder/WEB-INF/classes/bharosa_properties/alphapad_skins_localeに追加します。

4. フレーム・イメージ・ファイルをtemp-folder//WEB-INF/classes/bharosa_properties/alphapad_bgに追加します。

5. client_resource_locale.propertiesおよびoaam_custom.propertiesを使用して、OAAM拡張共有ライブラリを作成します。

6. カスタムのOAAM拡張共有ライブラリを、両方のOAAM管理対象サーバー(OAAM管理サーバーおよびOAAMサーバー)にデプロイします。

7. ローカライズされた仮想認証デバイスをテストします。

20.8.2 ドイツ語のロケールの使用例

次の例では、仮想認証デバイスをドイツ語でローカライズする方法について説明します。

1. OAAM拡張共有ライブラリのWARファイルを一時フォルダtemp-folderに抽出します。

2. client_resource_de.propertiesをtemp-folder/WEB-INF/classes/内に作成します(存在しない場合)。

3. client_resource_de.propertiesに、次のプロパティを追加します。

# Keyset to use for German locale
bharosa.authentipad.keypad.default.keyset=german

# Caption Coordinates for new German Pad
bharosa.authentipad.keypad.caption.y = 330
bharosa.authentipad.keypad.caption.frame = false
bharosa.authentipad.keypad.caption.wrap = false
bharosa.authentipad.keypad.caption.width = 130
bharosa.authentipad.keypad.caption.height = 16
bharosa.authentipad.keypad.caption.font.name = Arial
bharosa.authentipad.keypad.caption.font.color = 000000
bharosa.authentipad.keypad.caption.font.type= 0
bharosa.authentipad.keypad.caption.font.size = 9

# Frame files to use for new German Pad
bharosa.authentipad.keypad.frame.file=alphapad_bg/kp_frame_O3.png
bharosa.authentipad.keypad.sample.frame.file=alphapad_bg/
kp_frame_O3.png
bharosa.uio.default.register.DeviceKeyPadFull.frame =
alphapad_bg/kp_frame_O3.png
bharosa.uio.default.userpreferences.DeviceKeyPadFull.frame =
alphapad_bg/kp_frame_O3.png

# Skins folder containing German key images
bharosa.authentipad.keypad.skins.dirlist=alphapad_skins_de/square

# Timestamp Coordinates for new German Pad
bharosa.authentipad.keypad.timestamp.y = 330
bharosa.authentipad.keypad.timestamp.width = 132
bharosa.authentipad.keypad.timestamp.height = 16
bharosa.authentipad.keypad.timestamp.frame = false
bharosa.authentipad.keypad.timestamp.wrap = false
bharosa.authentipad.keypad.timestamp.font.name = Arial
bharosa.authentipad.keypad.timestamp.font.color = ffffff
bharosa.authentipad.keypad.timestamp.font.type= 0
bharosa.authentipad.keypad.timestamp.font.size = 9

4. oaam_custom.propertiesをtemp-folder/WEB-INF/classes内に作成します(存在しない場合)。

################# German Full Keypad Keyset #############################

bharosa.authentipad.keypad.german.keyset.enum=German KeyPad Keyset Enum
bharosa.authentipad.keypad.german.keyset.enum.row1=0
bharosa.authentipad.keypad.german.keyset.enum.row1.name=
German KeyPad Keyset Row 1
bharosa.authentipad.keypad.german.keyset.enum.row1.description=
German KeyPad Keyset Row 1
bharosa.authentipad.keypad.german.keyset.enum.row1.keys=
bharosa.authentipad.keypad.german.keyset.row1.enum
bharosa.authentipad.keypad.german.keyset.enum.row1.order=1

bharosa.authentipad.keypad.german.keyset.enum.row2=1
bharosa.authentipad.keypad.german.keyset.enum.row2.name=
German KeyPad Keyset Row 2
bharosa.authentipad.keypad.german.keyset.enum.row2.description=
German KeyPad Keyset Row 2
bharosa.authentipad.keypad.german.keyset.enum.row2.keys=
bharosa.authentipad.keypad.german.keyset.row2.enum
bharosa.authentipad.keypad.german.keyset.enum.row2.order=2

bharosa.authentipad.keypad.german.keyset.enum.row3=2
bharosa.authentipad.keypad.german.keyset.enum.row3.name=
German KeyPad Keyset Row 3
bharosa.authentipad.keypad.german.keyset.enum.row3.description=
German KeyPad Keyset Row 3
bharosa.authentipad.keypad.german.keyset.enum.row3.keys=
bharosa.authentipad.keypad.german.keyset.row3.enum
bharosa.authentipad.keypad.german.keyset.enum.row3.order=3

bharosa.authentipad.keypad.german.keyset.enum.row4=3
bharosa.authentipad.keypad.german.keyset.enum.row4.name=
German KeyPad Keyset Row 4
bharosa.authentipad.keypad.german.keyset.enum.row4.description=
German KeyPad Keyset Row 4
bharosa.authentipad.keypad.german.keyset.enum.row4.keys=
bharosa.authentipad.keypad.german.keyset.row4.enum
bharosa.authentipad.keypad.german.keyset.enum.row4.order=4

bharosa.authentipad.keypad.german.keyset.enum.row5=4
bharosa.authentipad.keypad.german.keyset.enum.row5.name=
German KeyPad Keyset Row 5
bharosa.authentipad.keypad.german.keyset.enum.row5.description=
German KeyPad Keyset Row 5
bharosa.authentipad.keypad.german.keyset.enum.row5.keys=
bharosa.authentipad.keypad.german.keyset.row5.enum
bharosa.authentipad.keypad.german.keyset.enum.row5.order=5

#########################\u00C0 to \u00FF Keyset ##############################

bharosa.authentipad.keypad.german.keyset.enum=German KeyPad Keyset Enum
bharosa.authentipad.keypad.german.keyset.enum.row6=5
bharosa.authentipad.keypad.german.keyset.enum.row6.name=
German KeyPad Keyset Row 6
bharosa.authentipad.keypad.german.keyset.enum.row6.description=
German KeyPad Keyset Row 6
bharosa.authentipad.keypad.german.keyset.enum.row6.keys=
bharosa.authentipad.keypad.german.keyset.row6.enum
bharosa.authentipad.keypad.german.keyset.enum.row6.order=6

bharosa.authentipad.keypad.german.keyset.enum.row7=6
bharosa.authentipad.keypad.german.keyset.enum.row7.name=
German KeyPad Keyset Row 7
bharosa.authentipad.keypad.german.keyset.enum.row7.description=
German KeyPad Keyset Row 7
bharosa.authentipad.keypad.german.keyset.enum.row7.keys=
bharosa.authentipad.keypad.german.keyset.row7.enum
bharosa.authentipad.keypad.german.keyset.enum.row7.order=7

bharosa.authentipad.keypad.german.keyset.enum.row8=7
bharosa.authentipad.keypad.german.keyset.enum.row8.name=
German KeyPad Keyset Row 8
bharosa.authentipad.keypad.german.keyset.enum.row8.description=
German KeyPad Keyset Row 8
bharosa.authentipad.keypad.german.keyset.enum.row8.keys=
bharosa.authentipad.keypad.german.keyset.row8.enum
bharosa.authentipad.keypad.german.keyset.enum.row8.order=8

bharosa.authentipad.keypad.german.keyset.enum.row9=8
bharosa.authentipad.keypad.german.keyset.enum.row9.name=
German KeyPad Keyset Row 9
bharosa.authentipad.keypad.german.keyset.enum.row9.description=
German KeyPad Keyset Row 9
bharosa.authentipad.keypad.german.keyset.enum.row9.keys=
bharosa.authentipad.keypad.german.keyset.row9.enum
bharosa.authentipad.keypad.german.keyset.enum.row9.order=9

bharosa.authentipad.keypad.german.keyset.enum.row10=9
bharosa.authentipad.keypad.german.keyset.enum.row10.name=
German KeyPad Keyset Row 10
bharosa.authentipad.keypad.german.keyset.enum.row10.description=
German KeyPad Keyset Row 10
bharosa.authentipad.keypad.german.keyset.enum.row10.keys=
bharosa.authentipad.keypad.german.keyset.row10.enum
bharosa.authentipad.keypad.german.keyset.enum.row10.order=10

###############################################################################

bharosa.authentipad.keypad.german.keyset.row1.enum=German KeyPad Keyset Row 1
bharosa.authentipad.keypad.german.keyset.row1.enum.key1=0
bharosa.authentipad.keypad.german.keyset.row1.enum.key1.name=!
bharosa.authentipad.keypad.german.keyset.row1.enum.key1.description=!
bharosa.authentipad.keypad.german.keyset.row1.enum.key1.value=!
bharosa.authentipad.keypad.german.keyset.row1.enum.key1.shiftvalue=!
bharosa.authentipad.keypad.german.keyset.row1.enum.key1.image=kp_v2_exclaim.png
bharosa.authentipad.keypad.german.keyset.row1.enum.key1.order=1

bharosa.authentipad.keypad.german.keyset.row1.enum.key2=1
bharosa.authentipad.keypad.german.keyset.row1.enum.key2.name=@
bharosa.authentipad.keypad.german.keyset.row1.enum.key2.description=@
bharosa.authentipad.keypad.german.keyset.row1.enum.key2.value=@
bharosa.authentipad.keypad.german.keyset.row1.enum.key2.shiftvalue=@
bharosa.authentipad.keypad.german.keyset.row1.enum.key2.image=kp_v2_rate.png
bharosa.authentipad.keypad.german.keyset.row1.enum.key2.order=2

bharosa.authentipad.keypad.german.keyset.row1.enum.key3=2
bharosa.authentipad.keypad.german.keyset.row1.enum.key3.name=#
bharosa.authentipad.keypad.german.keyset.row1.enum.key3.description=#
bharosa.authentipad.keypad.german.keyset.row1.enum.key3.value=#
bharosa.authentipad.keypad.german.keyset.row1.enum.key3.shiftvalue=#
bharosa.authentipad.keypad.german.keyset.row1.enum.key3.image=kp_v2_hash.png
bharosa.authentipad.keypad.german.keyset.row1.enum.key3.order=3

bharosa.authentipad.keypad.german.keyset.row1.enum.key4=3
bharosa.authentipad.keypad.german.keyset.row1.enum.key4.name=$
bharosa.authentipad.keypad.german.keyset.row1.enum.key4.description=$
bharosa.authentipad.keypad.german.keyset.row1.enum.key4.value=$
bharosa.authentipad.keypad.german.keyset.row1.enum.key4.shiftvalue=$
bharosa.authentipad.keypad.german.keyset.row1.enum.key4.image=kp_v2_dollar.png
bharosa.authentipad.keypad.german.keyset.row1.enum.key4.order=4

bharosa.authentipad.keypad.german.keyset.row1.enum.key5=4
bharosa.authentipad.keypad.german.keyset.row1.enum.key5.name=%
bharosa.authentipad.keypad.german.keyset.row1.enum.key5.description=%
bharosa.authentipad.keypad.german.keyset.row1.enum.key5.value=%
bharosa.authentipad.keypad.german.keyset.row1.enum.key5.shiftvalue=%
bharosa.authentipad.keypad.german.keyset.row1.enum.key5.image=kp_v2_percent.png
bharosa.authentipad.keypad.german.keyset.row1.enum.key5.order=5

bharosa.authentipad.keypad.german.keyset.row1.enum.key6=5
bharosa.authentipad.keypad.german.keyset.row1.enum.key6.name=^
bharosa.authentipad.keypad.german.keyset.row1.enum.key6.description=^
bharosa.authentipad.keypad.german.keyset.row1.enum.key6.value=^
bharosa.authentipad.keypad.german.keyset.row1.enum.key6.shiftvalue=^
bharosa.authentipad.keypad.german.keyset.row1.enum.key6.image=kp_v2_carat.png
bharosa.authentipad.keypad.german.keyset.row1.enum.key6.order=6

bharosa.authentipad.keypad.german.keyset.row1.enum.key7=6
bharosa.authentipad.keypad.german.keyset.row1.enum.key7.name=&
bharosa.authentipad.keypad.german.keyset.row1.enum.key7.description=&
bharosa.authentipad.keypad.german.keyset.row1.enum.key7.value=&
bharosa.authentipad.keypad.german.keyset.row1.enum.key7.shiftvalue=&
bharosa.authentipad.keypad.german.keyset.row1.enum.key7.image=kp_v2_and.png
bharosa.authentipad.keypad.german.keyset.row1.enum.key7.order=7

bharosa.authentipad.keypad.german.keyset.row1.enum.key8=7
bharosa.authentipad.keypad.german.keyset.row1.enum.key8.name=*
bharosa.authentipad.keypad.german.keyset.row1.enum.key8.description=*
bharosa.authentipad.keypad.german.keyset.row1.enum.key8.value=*
bharosa.authentipad.keypad.german.keyset.row1.enum.key8.shiftvalue=*
bharosa.authentipad.keypad.german.keyset.row1.enum.key8.image=
kp_v2_asterisk.png
bharosa.authentipad.keypad.german.keyset.row1.enum.key8.order=8

bharosa.authentipad.keypad.german.keyset.row1.enum.key9=8
bharosa.authentipad.keypad.german.keyset.row1.enum.key9.name=(
bharosa.authentipad.keypad.german.keyset.row1.enum.key9.description=(
bharosa.authentipad.keypad.german.keyset.row1.enum.key9.value=(
bharosa.authentipad.keypad.german.keyset.row1.enum.key9.shiftvalue=(
bharosa.authentipad.keypad.german.keyset.row1.enum.key9.image=
kp_v2_leftbraces.png
bharosa.authentipad.keypad.german.keyset.row1.enum.key9.order=9

bharosa.authentipad.keypad.german.keyset.row1.enum.key10=9
bharosa.authentipad.keypad.german.keyset.row1.enum.key10.name=)
bharosa.authentipad.keypad.german.keyset.row1.enum.key10.description=)
bharosa.authentipad.keypad.german.keyset.row1.enum.key10.value=)
bharosa.authentipad.keypad.german.keyset.row1.enum.key10.shiftvalue=)
bharosa.authentipad.keypad.german.keyset.row1.enum.key10.image=
kp_v2_rightbraces.png
bharosa.authentipad.keypad.german.keyset.row1.enum.key10.order=10

bharosa.authentipad.keypad.german.keyset.row1.enum.key11=10
bharosa.authentipad.keypad.german.keyset.row1.enum.key11.name=_
bharosa.authentipad.keypad.german.keyset.row1.enum.key11.description=_
bharosa.authentipad.keypad.german.keyset.row1.enum.key11.value=_
bharosa.authentipad.keypad.german.keyset.row1.enum.key11.shiftvalue=_
bharosa.authentipad.keypad.german.keyset.row1.enum.key11.image=
kp_v2_underscore.png
bharosa.authentipad.keypad.german.keyset.row1.enum.key11.order=11

bharosa.authentipad.keypad.german.keyset.row1.enum.key12=11
bharosa.authentipad.keypad.german.keyset.row1.enum.key12.name=+
bharosa.authentipad.keypad.german.keyset.row1.enum.key12.description=+
bharosa.authentipad.keypad.german.keyset.row1.enum.key12.value=+
bharosa.authentipad.keypad.german.keyset.row1.enum.key12.shiftvalue=+
bharosa.authentipad.keypad.german.keyset.row1.enum.key12.image=kp_v2_plus.png
bharosa.authentipad.keypad.german.keyset.row1.enum.key12.order=12

bharosa.authentipad.keypad.german.keyset.row1.enum.key13=12
bharosa.authentipad.keypad.german.keyset.row1.enum.key13.name=~
bharosa.authentipad.keypad.german.keyset.row1.enum.key13.description=~
bharosa.authentipad.keypad.german.keyset.row1.enum.key13.value=~
bharosa.authentipad.keypad.german.keyset.row1.enum.key13.shiftvalue=~
bharosa.authentipad.keypad.german.keyset.row1.enum.key13.image=kp_v2_tilda.png
bharosa.authentipad.keypad.german.keyset.row1.enum.key13.order=13

bharosa.authentipad.keypad.german.keyset.row2.enum=German KeyPad Keyset Row 2
bharosa.authentipad.keypad.german.keyset.row2.enum.key1=0
bharosa.authentipad.keypad.german.keyset.row2.enum.key1.name=1
bharosa.authentipad.keypad.german.keyset.row2.enum.key1.description=1
bharosa.authentipad.keypad.german.keyset.row2.enum.key1.value=1
bharosa.authentipad.keypad.german.keyset.row2.enum.key1.shiftvalue=1
bharosa.authentipad.keypad.german.keyset.row2.enum.key1.image=kp_v2_1.png
bharosa.authentipad.keypad.german.keyset.row2.enum.key1.order=1

bharosa.authentipad.keypad.german.keyset.row2.enum.key2=1
bharosa.authentipad.keypad.german.keyset.row2.enum.key2.name=2
bharosa.authentipad.keypad.german.keyset.row2.enum.key2.description=2
bharosa.authentipad.keypad.german.keyset.row2.enum.key2.value=2
bharosa.authentipad.keypad.german.keyset.row2.enum.key2.shiftvalue=2
bharosa.authentipad.keypad.german.keyset.row2.enum.key2.image=kp_v2_2.png
bharosa.authentipad.keypad.german.keyset.row2.enum.key2.order=2

bharosa.authentipad.keypad.german.keyset.row2.enum.key3=2
bharosa.authentipad.keypad.german.keyset.row2.enum.key3.name=3
bharosa.authentipad.keypad.german.keyset.row2.enum.key3.description=3
bharosa.authentipad.keypad.german.keyset.row2.enum.key3.value=3
bharosa.authentipad.keypad.german.keyset.row2.enum.key3.shiftvalue=3
bharosa.authentipad.keypad.german.keyset.row2.enum.key3.image=kp_v2_3.png
bharosa.authentipad.keypad.german.keyset.row2.enum.key3.order=3

bharosa.authentipad.keypad.german.keyset.row2.enum.key4=3
bharosa.authentipad.keypad.german.keyset.row2.enum.key4.name=4
bharosa.authentipad.keypad.german.keyset.row2.enum.key4.description=4
bharosa.authentipad.keypad.german.keyset.row2.enum.key4.value=4
bharosa.authentipad.keypad.german.keyset.row2.enum.key4.shiftvalue=4
bharosa.authentipad.keypad.german.keyset.row2.enum.key4.image=kp_v2_4.png
bharosa.authentipad.keypad.german.keyset.row2.enum.key4.order=4

bharosa.authentipad.keypad.german.keyset.row2.enum.key5=4
bharosa.authentipad.keypad.german.keyset.row2.enum.key5.name=5
bharosa.authentipad.keypad.german.keyset.row2.enum.key5.description=5
bharosa.authentipad.keypad.german.keyset.row2.enum.key5.value=5
bharosa.authentipad.keypad.german.keyset.row2.enum.key5.shiftvalue=5
bharosa.authentipad.keypad.german.keyset.row2.enum.key5.image=kp_v2_5.png
bharosa.authentipad.keypad.german.keyset.row2.enum.key5.order=5

bharosa.authentipad.keypad.german.keyset.row2.enum.key6=5
bharosa.authentipad.keypad.german.keyset.row2.enum.key6.name=6
bharosa.authentipad.keypad.german.keyset.row2.enum.key6.description=6
bharosa.authentipad.keypad.german.keyset.row2.enum.key6.value=6
bharosa.authentipad.keypad.german.keyset.row2.enum.key6.shiftvalue=6
bharosa.authentipad.keypad.german.keyset.row2.enum.key6.image=kp_v2_6.png
bharosa.authentipad.keypad.german.keyset.row2.enum.key6.order=6

bharosa.authentipad.keypad.german.keyset.row2.enum.key7=6
bharosa.authentipad.keypad.german.keyset.row2.enum.key7.name=7
bharosa.authentipad.keypad.german.keyset.row2.enum.key7.description=7
bharosa.authentipad.keypad.german.keyset.row2.enum.key7.value=7
bharosa.authentipad.keypad.german.keyset.row2.enum.key7.shiftvalue=7
bharosa.authentipad.keypad.german.keyset.row2.enum.key7.image=kp_v2_7.png
bharosa.authentipad.keypad.german.keyset.row2.enum.key7.order=7

bharosa.authentipad.keypad.german.keyset.row2.enum.key8=7
bharosa.authentipad.keypad.german.keyset.row2.enum.key8.name=8
bharosa.authentipad.keypad.german.keyset.row2.enum.key8.description=8
bharosa.authentipad.keypad.german.keyset.row2.enum.key8.value=8
bharosa.authentipad.keypad.german.keyset.row2.enum.key8.shiftvalue=8
bharosa.authentipad.keypad.german.keyset.row2.enum.key8.image=kp_v2_8.png
bharosa.authentipad.keypad.german.keyset.row2.enum.key8.order=8

bharosa.authentipad.keypad.german.keyset.row2.enum.key9=8
bharosa.authentipad.keypad.german.keyset.row2.enum.key9.name=9
bharosa.authentipad.keypad.german.keyset.row2.enum.key9.description=9
bharosa.authentipad.keypad.german.keyset.row2.enum.key9.value=9
bharosa.authentipad.keypad.german.keyset.row2.enum.key9.shiftvalue=9
bharosa.authentipad.keypad.german.keyset.row2.enum.key9.image=kp_v2_9.png
bharosa.authentipad.keypad.german.keyset.row2.enum.key9.order=9

bharosa.authentipad.keypad.german.keyset.row2.enum.key10=9
bharosa.authentipad.keypad.german.keyset.row2.enum.key10.name=0
bharosa.authentipad.keypad.german.keyset.row2.enum.key10.description=0
bharosa.authentipad.keypad.german.keyset.row2.enum.key10.value=0
bharosa.authentipad.keypad.german.keyset.row2.enum.key10.shiftvalue=0
bharosa.authentipad.keypad.german.keyset.row2.enum.key10.image=kp_v2_0.png
bharosa.authentipad.keypad.german.keyset.row2.enum.key10.order=10

bharosa.authentipad.keypad.german.keyset.row2.enum.key11=10
bharosa.authentipad.keypad.german.keyset.row2.enum.key11.name=-
bharosa.authentipad.keypad.german.keyset.row2.enum.key11.description=-
bharosa.authentipad.keypad.german.keyset.row2.enum.key11.value=-
bharosa.authentipad.keypad.german.keyset.row2.enum.key11.shiftvalue=-
bharosa.authentipad.keypad.german.keyset.row2.enum.key11.image=kp_v2_hyphen.png
bharosa.authentipad.keypad.german.keyset.row2.enum.key11.order=11

bharosa.authentipad.keypad.german.keyset.row2.enum.key12=11
bharosa.authentipad.keypad.german.keyset.row2.enum.key12.name==
bharosa.authentipad.keypad.german.keyset.row2.enum.key12.description==
bharosa.authentipad.keypad.german.keyset.row2.enum.key12.value==
bharosa.authentipad.keypad.german.keyset.row2.enum.key12.shiftvalue==
bharosa.authentipad.keypad.german.keyset.row2.enum.key12.image=kp_v2_equals.png
bharosa.authentipad.keypad.german.keyset.row2.enum.key12.order=12

bharosa.authentipad.keypad.german.keyset.row2.enum.key13=12
bharosa.authentipad.keypad.german.keyset.row2.enum.key13.name=`
bharosa.authentipad.keypad.german.keyset.row2.enum.key13.description=`
bharosa.authentipad.keypad.german.keyset.row2.enum.key13.value=`
bharosa.authentipad.keypad.german.keyset.row2.enum.key13.shiftvalue=`
bharosa.authentipad.keypad.german.keyset.row2.enum.key13.image=kp_v2_apost.png
bharosa.authentipad.keypad.german.keyset.row2.enum.key13.order=13

bharosa.authentipad.keypad.german.keyset.row3.enum=German KeyPad Keyset Row 3
bharosa.authentipad.keypad.german.keyset.row3.enum.key1=0
bharosa.authentipad.keypad.german.keyset.row3.enum.key1.name=q
bharosa.authentipad.keypad.german.keyset.row3.enum.key1.description=q
bharosa.authentipad.keypad.german.keyset.row3.enum.key1.value=q
bharosa.authentipad.keypad.german.keyset.row3.enum.key1.shiftvalue=Q
bharosa.authentipad.keypad.german.keyset.row3.enum.key1.image=kp_v2_Q.png
bharosa.authentipad.keypad.german.keyset.row3.enum.key1.order=1

bharosa.authentipad.keypad.german.keyset.row3.enum.key2=1
bharosa.authentipad.keypad.german.keyset.row3.enum.key2.name=w
bharosa.authentipad.keypad.german.keyset.row3.enum.key2.description=w
bharosa.authentipad.keypad.german.keyset.row3.enum.key2.value=w
bharosa.authentipad.keypad.german.keyset.row3.enum.key2.shiftvalue=W
bharosa.authentipad.keypad.german.keyset.row3.enum.key2.image=kp_v2_W.png
bharosa.authentipad.keypad.german.keyset.row3.enum.key2.order=2

bharosa.authentipad.keypad.german.keyset.row3.enum.key3=2
bharosa.authentipad.keypad.german.keyset.row3.enum.key3.name=e
bharosa.authentipad.keypad.german.keyset.row3.enum.key3.description=e
bharosa.authentipad.keypad.german.keyset.row3.enum.key3.value=e
bharosa.authentipad.keypad.german.keyset.row3.enum.key3.shiftvalue=E
bharosa.authentipad.keypad.german.keyset.row3.enum.key3.image=kp_v2_E.png
bharosa.authentipad.keypad.german.keyset.row3.enum.key3.order=3

bharosa.authentipad.keypad.german.keyset.row3.enum.key4=3
bharosa.authentipad.keypad.german.keyset.row3.enum.key4.name=r
bharosa.authentipad.keypad.german.keyset.row3.enum.key4.description=r
bharosa.authentipad.keypad.german.keyset.row3.enum.key4.value=r
bharosa.authentipad.keypad.german.keyset.row3.enum.key4.shiftvalue=R
bharosa.authentipad.keypad.german.keyset.row3.enum.key4.image=kp_v2_R.png
bharosa.authentipad.keypad.german.keyset.row3.enum.key4.order=4

bharosa.authentipad.keypad.german.keyset.row3.enum.key5=4
bharosa.authentipad.keypad.german.keyset.row3.enum.key5.name=t
bharosa.authentipad.keypad.german.keyset.row3.enum.key5.description=t
bharosa.authentipad.keypad.german.keyset.row3.enum.key5.value=t
bharosa.authentipad.keypad.german.keyset.row3.enum.key5.shiftvalue=T
bharosa.authentipad.keypad.german.keyset.row3.enum.key5.image=kp_v2_T.png
bharosa.authentipad.keypad.german.keyset.row3.enum.key5.order=5

bharosa.authentipad.keypad.german.keyset.row3.enum.key6=5
bharosa.authentipad.keypad.german.keyset.row3.enum.key6.name=y
bharosa.authentipad.keypad.german.keyset.row3.enum.key6.description=y
bharosa.authentipad.keypad.german.keyset.row3.enum.key6.value=y
bharosa.authentipad.keypad.german.keyset.row3.enum.key6.shiftvalue=Y
bharosa.authentipad.keypad.german.keyset.row3.enum.key6.image=kp_v2_Y.png
bharosa.authentipad.keypad.german.keyset.row3.enum.key6.order=6

bharosa.authentipad.keypad.german.keyset.row3.enum.key7=6
bharosa.authentipad.keypad.german.keyset.row3.enum.key7.name=u
bharosa.authentipad.keypad.german.keyset.row3.enum.key7.description=u
bharosa.authentipad.keypad.german.keyset.row3.enum.key7.value=u
bharosa.authentipad.keypad.german.keyset.row3.enum.key7.shiftvalue=U
bharosa.authentipad.keypad.german.keyset.row3.enum.key7.image=kp_v2_U.png
bharosa.authentipad.keypad.german.keyset.row3.enum.key7.order=7

bharosa.authentipad.keypad.german.keyset.row3.enum.key8=7
bharosa.authentipad.keypad.german.keyset.row3.enum.key8.name=i
bharosa.authentipad.keypad.german.keyset.row3.enum.key8.description=i
bharosa.authentipad.keypad.german.keyset.row3.enum.key8.value=i
bharosa.authentipad.keypad.german.keyset.row3.enum.key8.shiftvalue=I
bharosa.authentipad.keypad.german.keyset.row3.enum.key8.image=kp_v2_I.png
bharosa.authentipad.keypad.german.keyset.row3.enum.key8.order=8

bharosa.authentipad.keypad.german.keyset.row3.enum.key9=8
bharosa.authentipad.keypad.german.keyset.row3.enum.key9.name=o
bharosa.authentipad.keypad.german.keyset.row3.enum.key9.description=o
bharosa.authentipad.keypad.german.keyset.row3.enum.key9.value=o
bharosa.authentipad.keypad.german.keyset.row3.enum.key9.shiftvalue=O
bharosa.authentipad.keypad.german.keyset.row3.enum.key9.image=kp_v2_O.png
bharosa.authentipad.keypad.german.keyset.row3.enum.key9.order=9

bharosa.authentipad.keypad.german.keyset.row3.enum.key10=9
bharosa.authentipad.keypad.german.keyset.row3.enum.key10.name=p
bharosa.authentipad.keypad.german.keyset.row3.enum.key10.description=p
bharosa.authentipad.keypad.german.keyset.row3.enum.key10.value=p
bharosa.authentipad.keypad.german.keyset.row3.enum.key10.shiftvalue=P
bharosa.authentipad.keypad.german.keyset.row3.enum.key10.image=kp_v2_P.png
bharosa.authentipad.keypad.german.keyset.row3.enum.key10.order=10

bharosa.authentipad.keypad.german.keyset.row3.enum.key11=10
bharosa.authentipad.keypad.german.keyset.row3.enum.key11.name={
bharosa.authentipad.keypad.german.keyset.row3.enum.key11.description={
bharosa.authentipad.keypad.german.keyset.row3.enum.key11.value={
bharosa.authentipad.keypad.german.keyset.row3.enum.key11.shiftvalue={
bharosa.authentipad.keypad.german.keyset.row3.enum.key11.image=
kp_v2_leftcurlybraces.png
bharosa.authentipad.keypad.german.keyset.row3.enum.key11.order=11

bharosa.authentipad.keypad.german.keyset.row3.enum.key12=11
bharosa.authentipad.keypad.german.keyset.row3.enum.key12.name=}
bharosa.authentipad.keypad.german.keyset.row3.enum.key12.description=}
bharosa.authentipad.keypad.german.keyset.row3.enum.key12.value=}
bharosa.authentipad.keypad.german.keyset.row3.enum.key12.shiftvalue=}
bharosa.authentipad.keypad.german.keyset.row3.enum.key12.image=
kp_v2_rightcurlybraces.png
bharosa.authentipad.keypad.german.keyset.row3.enum.key12.order=12

bharosa.authentipad.keypad.german.keyset.row3.enum.key13=12
bharosa.authentipad.keypad.german.keyset.row3.enum.key13.name="
bharosa.authentipad.keypad.german.keyset.row3.enum.key13.description="
bharosa.authentipad.keypad.german.keyset.row3.enum.key13.value="
bharosa.authentipad.keypad.german.keyset.row3.enum.key13.shiftvalue="
bharosa.authentipad.keypad.german.keyset.row3.enum.key13.image=kp_v2_quotes.png
bharosa.authentipad.keypad.german.keyset.row3.enum.key13.order=13

bharosa.authentipad.keypad.german.keyset.row4.enum=German KeyPad Keyset Row 4
bharosa.authentipad.keypad.german.keyset.row4.enum.key1=0
bharosa.authentipad.keypad.german.keyset.row4.enum.key1.name=a
bharosa.authentipad.keypad.german.keyset.row4.enum.key1.description=a
bharosa.authentipad.keypad.german.keyset.row4.enum.key1.value=a
bharosa.authentipad.keypad.german.keyset.row4.enum.key1.shiftvalue=A
bharosa.authentipad.keypad.german.keyset.row4.enum.key1.image=kp_v2_A.png
bharosa.authentipad.keypad.german.keyset.row4.enum.key1.order=1

bharosa.authentipad.keypad.german.keyset.row4.enum.key2=1
bharosa.authentipad.keypad.german.keyset.row4.enum.key2.name=s
bharosa.authentipad.keypad.german.keyset.row4.enum.key2.description=s
bharosa.authentipad.keypad.german.keyset.row4.enum.key2.value=s
bharosa.authentipad.keypad.german.keyset.row4.enum.key2.shiftvalue=S
bharosa.authentipad.keypad.german.keyset.row4.enum.key2.image=kp_v2_S.png
bharosa.authentipad.keypad.german.keyset.row4.enum.key2.order=2

bharosa.authentipad.keypad.german.keyset.row4.enum.key3=2
bharosa.authentipad.keypad.german.keyset.row4.enum.key3.name=d
bharosa.authentipad.keypad.german.keyset.row4.enum.key3.description=d
bharosa.authentipad.keypad.german.keyset.row4.enum.key3.value=d
bharosa.authentipad.keypad.german.keyset.row4.enum.key3.shiftvalue=D
bharosa.authentipad.keypad.german.keyset.row4.enum.key3.image=kp_v2_D.png
bharosa.authentipad.keypad.german.keyset.row4.enum.key3.order=3

bharosa.authentipad.keypad.german.keyset.row4.enum.key4=3
bharosa.authentipad.keypad.german.keyset.row4.enum.key4.name=f
bharosa.authentipad.keypad.german.keyset.row4.enum.key4.description=f
bharosa.authentipad.keypad.german.keyset.row4.enum.key4.value=f
bharosa.authentipad.keypad.german.keyset.row4.enum.key4.shiftvalue=F
bharosa.authentipad.keypad.german.keyset.row4.enum.key4.image=kp_v2_F.png
bharosa.authentipad.keypad.german.keyset.row4.enum.key4.order=4

bharosa.authentipad.keypad.german.keyset.row4.enum.key5=4
bharosa.authentipad.keypad.german.keyset.row4.enum.key5.name=g
bharosa.authentipad.keypad.german.keyset.row4.enum.key5.description=g
bharosa.authentipad.keypad.german.keyset.row4.enum.key5.value=g
bharosa.authentipad.keypad.german.keyset.row4.enum.key5.shiftvalue=G
bharosa.authentipad.keypad.german.keyset.row4.enum.key5.image=kp_v2_G.png
bharosa.authentipad.keypad.german.keyset.row4.enum.key5.order=5

bharosa.authentipad.keypad.german.keyset.row4.enum.key6=5
bharosa.authentipad.keypad.german.keyset.row4.enum.key6.name=h
bharosa.authentipad.keypad.german.keyset.row4.enum.key6.description=h
bharosa.authentipad.keypad.german.keyset.row4.enum.key6.value=h
bharosa.authentipad.keypad.german.keyset.row4.enum.key6.shiftvalue=H
bharosa.authentipad.keypad.german.keyset.row4.enum.key6.image=kp_v2_H.png
bharosa.authentipad.keypad.german.keyset.row4.enum.key6.order=6

bharosa.authentipad.keypad.german.keyset.row4.enum.key7=6
bharosa.authentipad.keypad.german.keyset.row4.enum.key7.name=j
bharosa.authentipad.keypad.german.keyset.row4.enum.key7.description=j
bharosa.authentipad.keypad.german.keyset.row4.enum.key7.value=j
bharosa.authentipad.keypad.german.keyset.row4.enum.key7.shiftvalue=J
bharosa.authentipad.keypad.german.keyset.row4.enum.key7.image=kp_v2_J.png
bharosa.authentipad.keypad.german.keyset.row4.enum.key7.order=7

bharosa.authentipad.keypad.german.keyset.row4.enum.key8=7
bharosa.authentipad.keypad.german.keyset.row4.enum.key8.name=k
bharosa.authentipad.keypad.german.keyset.row4.enum.key8.description=k
bharosa.authentipad.keypad.german.keyset.row4.enum.key8.value=k
bharosa.authentipad.keypad.german.keyset.row4.enum.key8.shiftvalue=K
bharosa.authentipad.keypad.german.keyset.row4.enum.key8.image=kp_v2_K.png
bharosa.authentipad.keypad.german.keyset.row4.enum.key8.order=8

bharosa.authentipad.keypad.german.keyset.row4.enum.key9=8
bharosa.authentipad.keypad.german.keyset.row4.enum.key9.name=l
bharosa.authentipad.keypad.german.keyset.row4.enum.key9.description=l
bharosa.authentipad.keypad.german.keyset.row4.enum.key9.value=l
bharosa.authentipad.keypad.german.keyset.row4.enum.key9.shiftvalue=L
bharosa.authentipad.keypad.german.keyset.row4.enum.key9.image=kp_v2_L.png
bharosa.authentipad.keypad.german.keyset.row4.enum.key9.order=9

bharosa.authentipad.keypad.german.keyset.row4.enum.key10=9
bharosa.authentipad.keypad.german.keyset.row4.enum.key10.name=:
bharosa.authentipad.keypad.german.keyset.row4.enum.key10.description=:
bharosa.authentipad.keypad.german.keyset.row4.enum.key10.value=:
bharosa.authentipad.keypad.german.keyset.row4.enum.key10.shiftvalue=:
bharosa.authentipad.keypad.german.keyset.row4.enum.key10.image=kp_v2_colon.png
bharosa.authentipad.keypad.german.keyset.row4.enum.key10.order=10

bharosa.authentipad.keypad.german.keyset.row4.enum.key11=10
bharosa.authentipad.keypad.german.keyset.row4.enum.key11.name=;
bharosa.authentipad.keypad.german.keyset.row4.enum.key11.description=;
bharosa.authentipad.keypad.german.keyset.row4.enum.key11.value=;
bharosa.authentipad.keypad.german.keyset.row4.enum.key11.shiftvalue=;
bharosa.authentipad.keypad.german.keyset.row4.enum.key11.image=kp_v2_semicolon.png
bharosa.authentipad.keypad.german.keyset.row4.enum.key11.order=11

bharosa.authentipad.keypad.german.keyset.row4.enum.key12=11
bharosa.authentipad.keypad.german.keyset.row4.enum.key12.name=\\
bharosa.authentipad.keypad.german.keyset.row4.enum.key12.description=\\
bharosa.authentipad.keypad.german.keyset.row4.enum.key12.value=\\
bharosa.authentipad.keypad.german.keyset.row4.enum.key12.shiftvalue=\\
bharosa.authentipad.keypad.german.keyset.row4.enum.key12.image=
kp_v2_backslash.png
bharosa.authentipad.keypad.german.keyset.row4.enum.key12.order=12

bharosa.authentipad.keypad.german.keyset.row4.enum.key13=12
bharosa.authentipad.keypad.german.keyset.row4.enum.key13.name='
bharosa.authentipad.keypad.german.keyset.row4.enum.key13.description='
bharosa.authentipad.keypad.german.keyset.row4.enum.key13.value='
bharosa.authentipad.keypad.german.keyset.row4.enum.key13.shiftvalue='
bharosa.authentipad.keypad.german.keyset.row4.enum.key13.image=kp_v2_quote.png
bharosa.authentipad.keypad.german.keyset.row4.enum.key13.order=13

bharosa.authentipad.keypad.german.keyset.row5.enum=German KeyPad Keyset Row 5
bharosa.authentipad.keypad.german.keyset.row5.enum.key1=0
bharosa.authentipad.keypad.german.keyset.row5.enum.key1.name=z
bharosa.authentipad.keypad.german.keyset.row5.enum.key1.description=z
bharosa.authentipad.keypad.german.keyset.row5.enum.key1.value=z
bharosa.authentipad.keypad.german.keyset.row5.enum.key1.shiftvalue=Z
bharosa.authentipad.keypad.german.keyset.row5.enum.key1.image=kp_v2_Z.png
bharosa.authentipad.keypad.german.keyset.row5.enum.key1.order=1

bharosa.authentipad.keypad.german.keyset.row5.enum.key2=1
bharosa.authentipad.keypad.german.keyset.row5.enum.key2.name=x
bharosa.authentipad.keypad.german.keyset.row5.enum.key2.description=x
bharosa.authentipad.keypad.german.keyset.row5.enum.key2.value=x
bharosa.authentipad.keypad.german.keyset.row5.enum.key2.shiftvalue=X
bharosa.authentipad.keypad.german.keyset.row5.enum.key2.image=kp_v2_X.png
bharosa.authentipad.keypad.german.keyset.row5.enum.key2.order=2

bharosa.authentipad.keypad.german.keyset.row5.enum.key3=2
bharosa.authentipad.keypad.german.keyset.row5.enum.key3.name=c
bharosa.authentipad.keypad.german.keyset.row5.enum.key3.description=c
bharosa.authentipad.keypad.german.keyset.row5.enum.key3.value=c
bharosa.authentipad.keypad.german.keyset.row5.enum.key3.shiftvalue=C
bharosa.authentipad.keypad.german.keyset.row5.enum.key3.image=kp_v2_C.png
bharosa.authentipad.keypad.german.keyset.row5.enum.key3.order=3

bharosa.authentipad.keypad.german.keyset.row5.enum.key4=3
bharosa.authentipad.keypad.german.keyset.row5.enum.key4.name=v
bharosa.authentipad.keypad.german.keyset.row5.enum.key4.description=v
bharosa.authentipad.keypad.german.keyset.row5.enum.key4.value=v
bharosa.authentipad.keypad.german.keyset.row5.enum.key4.shiftvalue=V
bharosa.authentipad.keypad.german.keyset.row5.enum.key4.image=kp_v2_V.png
bharosa.authentipad.keypad.german.keyset.row5.enum.key4.order=4

bharosa.authentipad.keypad.german.keyset.row5.enum.key5=4
bharosa.authentipad.keypad.german.keyset.row5.enum.key5.name=b
bharosa.authentipad.keypad.german.keyset.row5.enum.key5.description=b
bharosa.authentipad.keypad.german.keyset.row5.enum.key5.value=b
bharosa.authentipad.keypad.german.keyset.row5.enum.key5.shiftvalue=B
bharosa.authentipad.keypad.german.keyset.row5.enum.key5.image=kp_v2_B.png
bharosa.authentipad.keypad.german.keyset.row5.enum.key5.order=5

bharosa.authentipad.keypad.german.keyset.row5.enum.key6=5
bharosa.authentipad.keypad.german.keyset.row5.enum.key6.name=n
bharosa.authentipad.keypad.german.keyset.row5.enum.key6.description=n
bharosa.authentipad.keypad.german.keyset.row5.enum.key6.value=n
bharosa.authentipad.keypad.german.keyset.row5.enum.key6.shiftvalue=N
bharosa.authentipad.keypad.german.keyset.row5.enum.key6.image=kp_v2_N.png
bharosa.authentipad.keypad.german.keyset.row5.enum.key6.order=6

bharosa.authentipad.keypad.german.keyset.row5.enum.key7=6
bharosa.authentipad.keypad.german.keyset.row5.enum.key7.name=m
bharosa.authentipad.keypad.german.keyset.row5.enum.key7.description=m
bharosa.authentipad.keypad.german.keyset.row5.enum.key7.value=m
bharosa.authentipad.keypad.german.keyset.row5.enum.key7.shiftvalue=M
bharosa.authentipad.keypad.german.keyset.row5.enum.key7.image=kp_v2_M.png
bharosa.authentipad.keypad.german.keyset.row5.enum.key7.order=7

bharosa.authentipad.keypad.german.keyset.row5.enum.key8=7
bharosa.authentipad.keypad.german.keyset.row5.enum.key8.name=<
bharosa.authentipad.keypad.german.keyset.row5.enum.key8.description=<
bharosa.authentipad.keypad.german.keyset.row5.enum.key8.value=<
bharosa.authentipad.keypad.german.keyset.row5.enum.key8.shiftvalue=<
bharosa.authentipad.keypad.german.keyset.row5.enum.key8.image=
kp_v2_lessthan.png
bharosa.authentipad.keypad.german.keyset.row5.enum.key8.order=8

bharosa.authentipad.keypad.german.keyset.row5.enum.key9=8
bharosa.authentipad.keypad.german.keyset.row5.enum.key9.name=>
bharosa.authentipad.keypad.german.keyset.row5.enum.key9.description=>
bharosa.authentipad.keypad.german.keyset.row5.enum.key9.value=>
bharosa.authentipad.keypad.german.keyset.row5.enum.key9.shiftvalue=>
bharosa.authentipad.keypad.german.keyset.row5.enum.key9.image=
kp_v2_greaterthan.png
bharosa.authentipad.keypad.german.keyset.row5.enum.key9.order=9

bharosa.authentipad.keypad.german.keyset.row5.enum.key10=9
bharosa.authentipad.keypad.german.keyset.row5.enum.key10.name=,
bharosa.authentipad.keypad.german.keyset.row5.enum.key10.description=,
bharosa.authentipad.keypad.german.keyset.row5.enum.key10.value=,
bharosa.authentipad.keypad.german.keyset.row5.enum.key10.shiftvalue=,
bharosa.authentipad.keypad.german.keyset.row5.enum.key10.image=kp_v2_comma.png
bharosa.authentipad.keypad.german.keyset.row5.enum.key10.order=10

bharosa.authentipad.keypad.german.keyset.row5.enum.key11=10
bharosa.authentipad.keypad.german.keyset.row5.enum.key11.name=.
bharosa.authentipad.keypad.german.keyset.row5.enum.key11.description=.
bharosa.authentipad.keypad.german.keyset.row5.enum.key11.value=.
bharosa.authentipad.keypad.german.keyset.row5.enum.key11.shiftvalue=.
bharosa.authentipad.keypad.german.keyset.row5.enum.key11.image=kp_v2_period.png
bharosa.authentipad.keypad.german.keyset.row5.enum.key11.order=11

bharosa.authentipad.keypad.german.keyset.row5.enum.key12=11
bharosa.authentipad.keypad.german.keyset.row5.enum.key12.name=/
bharosa.authentipad.keypad.german.keyset.row5.enum.key12.description=/
bharosa.authentipad.keypad.german.keyset.row5.enum.key12.value=/
bharosa.authentipad.keypad.german.keyset.row5.enum.key12.shiftvalue=/
bharosa.authentipad.keypad.german.keyset.row5.enum.key12.image=
kp_v2_forwardslash.png
bharosa.authentipad.keypad.german.keyset.row5.enum.key12.order=12

bharosa.authentipad.keypad.german.keyset.row5.enum.key13=12
bharosa.authentipad.keypad.german.keyset.row5.enum.key13.name=?
bharosa.authentipad.keypad.german.keyset.row5.enum.key13.description=?
bharosa.authentipad.keypad.german.keyset.row5.enum.key13.value=?
bharosa.authentipad.keypad.german.keyset.row5.enum.key13.shiftvalue=?
bharosa.authentipad.keypad.german.keyset.row5.enum.key13.image=
kp_v2_questionmark.png
bharosa.authentipad.keypad.german.keyset.row5.enum.key13.order=13

######################### Alternate Keypad Keyset ######################

bharosa.authentipad.keypad.german.keyset.row6.enum=German KeyPad Keyset Row 6
bharosa.authentipad.keypad.german.keyset.row6.enum.key1=0
bharosa.authentipad.keypad.german.keyset.row6.enum.key1.name=\u00C0
bharosa.authentipad.keypad.german.keyset.row6.enum.key1.description=\u00C0
bharosa.authentipad.keypad.german.keyset.row6.enum.key1.value=\u00C0
bharosa.authentipad.keypad.german.keyset.row6.enum.key1.shiftvalue=\u00C0
bharosa.authentipad.keypad.german.keyset.row6.enum.key1.image=kp_v01_00C0.png
bharosa.authentipad.keypad.german.keyset.row6.enum.key1.order=1

bharosa.authentipad.keypad.german.keyset.row6.enum.key2=1
bharosa.authentipad.keypad.german.keyset.row6.enum.key2.name=\u00C1
bharosa.authentipad.keypad.german.keyset.row6.enum.key2.description=\u00C1
bharosa.authentipad.keypad.german.keyset.row6.enum.key2.value=\u00C1
bharosa.authentipad.keypad.german.keyset.row6.enum.key2.shiftvalue=\u00C1
bharosa.authentipad.keypad.german.keyset.row6.enum.key2.image=kp_v01_00C1.png
bharosa.authentipad.keypad.german.keyset.row6.enum.key2.order=2

bharosa.authentipad.keypad.german.keyset.row6.enum.key3=2
bharosa.authentipad.keypad.german.keyset.row6.enum.key3.name=\u00C2
bharosa.authentipad.keypad.german.keyset.row6.enum.key3.description=\u00C2
bharosa.authentipad.keypad.german.keyset.row6.enum.key3.value=\u00C2
bharosa.authentipad.keypad.german.keyset.row6.enum.key3.shiftvalue=\u00C2
bharosa.authentipad.keypad.german.keyset.row6.enum.key3.image=kp_v01_00C2.png
bharosa.authentipad.keypad.german.keyset.row6.enum.key3.order=3

bharosa.authentipad.keypad.german.keyset.row6.enum.key4=3
bharosa.authentipad.keypad.german.keyset.row6.enum.key4.name=\u00C3
bharosa.authentipad.keypad.german.keyset.row6.enum.key4.description=\u00C3
bharosa.authentipad.keypad.german.keyset.row6.enum.key4.value=\u00C3
bharosa.authentipad.keypad.german.keyset.row6.enum.key4.shiftvalue=\u00C3
bharosa.authentipad.keypad.german.keyset.row6.enum.key4.image=kp_v01_00C3.png
bharosa.authentipad.keypad.german.keyset.row6.enum.key4.order=4

bharosa.authentipad.keypad.german.keyset.row6.enum.key5=4
bharosa.authentipad.keypad.german.keyset.row6.enum.key5.name=\u00C4
bharosa.authentipad.keypad.german.keyset.row6.enum.key5.description=\u00C4
bharosa.authentipad.keypad.german.keyset.row6.enum.key5.value=\u00C4
bharosa.authentipad.keypad.german.keyset.row6.enum.key5.shiftvalue=\u00C4
bharosa.authentipad.keypad.german.keyset.row6.enum.key5.image=kp_v01_00C4.png
bharosa.authentipad.keypad.german.keyset.row6.enum.key5.order=5

bharosa.authentipad.keypad.german.keyset.row6.enum.key6=5
bharosa.authentipad.keypad.german.keyset.row6.enum.key6.name=\u00C5
bharosa.authentipad.keypad.german.keyset.row6.enum.key6.description=\u00C5
bharosa.authentipad.keypad.german.keyset.row6.enum.key6.value=\u00C5
bharosa.authentipad.keypad.german.keyset.row6.enum.key6.shiftvalue=\u00C5
bharosa.authentipad.keypad.german.keyset.row6.enum.key6.image=kp_v01_00C5.png
bharosa.authentipad.keypad.german.keyset.row6.enum.key6.order=6

bharosa.authentipad.keypad.german.keyset.row6.enum.key7=6
bharosa.authentipad.keypad.german.keyset.row6.enum.key7.name=\u00C6
bharosa.authentipad.keypad.german.keyset.row6.enum.key7.description=\u00C6
bharosa.authentipad.keypad.german.keyset.row6.enum.key7.value=\u00C6
bharosa.authentipad.keypad.german.keyset.row6.enum.key7.shiftvalue=\u00C6
bharosa.authentipad.keypad.german.keyset.row6.enum.key7.image=kp_v01_00C6.png
bharosa.authentipad.keypad.german.keyset.row6.enum.key7.order=7

bharosa.authentipad.keypad.german.keyset.row6.enum.key8=7
bharosa.authentipad.keypad.german.keyset.row6.enum.key8.name=\u00C7
bharosa.authentipad.keypad.german.keyset.row6.enum.key8.description=\u00C7
bharosa.authentipad.keypad.german.keyset.row6.enum.key8.value=\u00C7
bharosa.authentipad.keypad.german.keyset.row6.enum.key8.shiftvalue=\u00C7
bharosa.authentipad.keypad.german.keyset.row6.enum.key8.image=kp_v01_00C7.png
bharosa.authentipad.keypad.german.keyset.row6.enum.key8.order=8

bharosa.authentipad.keypad.german.keyset.row6.enum.key9=8
bharosa.authentipad.keypad.german.keyset.row6.enum.key9.name=\u00C8
bharosa.authentipad.keypad.german.keyset.row6.enum.key9.description=\u00C8
bharosa.authentipad.keypad.german.keyset.row6.enum.key9.value=\u00C8
bharosa.authentipad.keypad.german.keyset.row6.enum.key9.shiftvalue=\u00C8
bharosa.authentipad.keypad.german.keyset.row6.enum.key9.image=kp_v01_00C8.png
bharosa.authentipad.keypad.german.keyset.row6.enum.key9.order=9

bharosa.authentipad.keypad.german.keyset.row6.enum.key10=9
bharosa.authentipad.keypad.german.keyset.row6.enum.key10.name=\u00C9
bharosa.authentipad.keypad.german.keyset.row6.enum.key10.description=\u00C9
bharosa.authentipad.keypad.german.keyset.row6.enum.key10.value=\u00C9
bharosa.authentipad.keypad.german.keyset.row6.enum.key10.shiftvalue=\u00C9
bharosa.authentipad.keypad.german.keyset.row6.enum.key10.image=kp_v01_00C9.png
bharosa.authentipad.keypad.german.keyset.row6.enum.key10.order=10

bharosa.authentipad.keypad.german.keyset.row6.enum.key11=10
bharosa.authentipad.keypad.german.keyset.row6.enum.key11.name=\u00CA
bharosa.authentipad.keypad.german.keyset.row6.enum.key11.description=\u00CA
bharosa.authentipad.keypad.german.keyset.row6.enum.key11.value=\u00CA
bharosa.authentipad.keypad.german.keyset.row6.enum.key11.shiftvalue=\u00CA
bharosa.authentipad.keypad.german.keyset.row6.enum.key11.image=kp_v01_00CA.png
bharosa.authentipad.keypad.german.keyset.row6.enum.key11.order=11

bharosa.authentipad.keypad.german.keyset.row6.enum.key12=11
bharosa.authentipad.keypad.german.keyset.row6.enum.key12.name=\u00CB
bharosa.authentipad.keypad.german.keyset.row6.enum.key12.description=\u00CB
bharosa.authentipad.keypad.german.keyset.row6.enum.key12.value=\u00CB
bharosa.authentipad.keypad.german.keyset.row6.enum.key12.shiftvalue=\u00CB
bharosa.authentipad.keypad.german.keyset.row6.enum.key12.image=kp_v01_00CB.png
bharosa.authentipad.keypad.german.keyset.row6.enum.key12.order=12

bharosa.authentipad.keypad.german.keyset.row6.enum.key13=12
bharosa.authentipad.keypad.german.keyset.row6.enum.key13.name=\u00CC
bharosa.authentipad.keypad.german.keyset.row6.enum.key13.description=\u00CC
bharosa.authentipad.keypad.german.keyset.row6.enum.key13.value=\u00CC
bharosa.authentipad.keypad.german.keyset.row6.enum.key13.shiftvalue=\u00CC
bharosa.authentipad.keypad.german.keyset.row6.enum.key13.image=kp_v01_00CC.png
bharosa.authentipad.keypad.german.keyset.row6.enum.key13.order=13

bharosa.authentipad.keypad.german.keyset.row7.enum=German KeyPad Keyset Row 7
bharosa.authentipad.keypad.german.keyset.row7.enum.key1=0
bharosa.authentipad.keypad.german.keyset.row7.enum.key1.name=\u00CD
bharosa.authentipad.keypad.german.keyset.row7.enum.key1.description=\u00CD
bharosa.authentipad.keypad.german.keyset.row7.enum.key1.value=\u00CD
bharosa.authentipad.keypad.german.keyset.row7.enum.key1.shiftvalue=\u00CD
bharosa.authentipad.keypad.german.keyset.row7.enum.key1.image=kp_v01_00CD.png
bharosa.authentipad.keypad.german.keyset.row7.enum.key1.order=1

bharosa.authentipad.keypad.german.keyset.row7.enum.key2=1
bharosa.authentipad.keypad.german.keyset.row7.enum.key2.name=\u00CE
bharosa.authentipad.keypad.german.keyset.row7.enum.key2.description=\u00CE
bharosa.authentipad.keypad.german.keyset.row7.enum.key2.value=\u00CE
bharosa.authentipad.keypad.german.keyset.row7.enum.key2.shiftvalue=\u00CE
bharosa.authentipad.keypad.german.keyset.row7.enum.key2.image=kp_v01_00CE.png
bharosa.authentipad.keypad.german.keyset.row7.enum.key2.order=2

bharosa.authentipad.keypad.german.keyset.row7.enum.key3=2
bharosa.authentipad.keypad.german.keyset.row7.enum.key3.name=\u00CF
bharosa.authentipad.keypad.german.keyset.row7.enum.key3.description=\u00CF
bharosa.authentipad.keypad.german.keyset.row7.enum.key3.value=\u00CF
bharosa.authentipad.keypad.german.keyset.row7.enum.key3.shiftvalue=\u00CF
bharosa.authentipad.keypad.german.keyset.row7.enum.key3.image=kp_v01_00CF.png
bharosa.authentipad.keypad.german.keyset.row7.enum.key3.order=3

bharosa.authentipad.keypad.german.keyset.row7.enum.key4=3
bharosa.authentipad.keypad.german.keyset.row7.enum.key4.name=\u00D0
bharosa.authentipad.keypad.german.keyset.row7.enum.key4.description=\u00D0
bharosa.authentipad.keypad.german.keyset.row7.enum.key4.value=\u00D0
bharosa.authentipad.keypad.german.keyset.row7.enum.key4.shiftvalue=\u00D0
bharosa.authentipad.keypad.german.keyset.row7.enum.key4.image=kp_v01_00D0.png
bharosa.authentipad.keypad.german.keyset.row7.enum.key4.order=4

bharosa.authentipad.keypad.german.keyset.row7.enum.key5=4
bharosa.authentipad.keypad.german.keyset.row7.enum.key5.name=\u00D1
bharosa.authentipad.keypad.german.keyset.row7.enum.key5.description=\u00D1
bharosa.authentipad.keypad.german.keyset.row7.enum.key5.value=\u00D1
bharosa.authentipad.keypad.german.keyset.row7.enum.key5.shiftvalue=\u00D1
bharosa.authentipad.keypad.german.keyset.row7.enum.key5.image=kp_v01_00D1.png
bharosa.authentipad.keypad.german.keyset.row7.enum.key5.order=5

bharosa.authentipad.keypad.german.keyset.row7.enum.key6=5
bharosa.authentipad.keypad.german.keyset.row7.enum.key6.name=\u00D2
bharosa.authentipad.keypad.german.keyset.row7.enum.key6.description=\u00D2
bharosa.authentipad.keypad.german.keyset.row7.enum.key6.value=\u00D2
bharosa.authentipad.keypad.german.keyset.row7.enum.key6.shiftvalue=\u00D2
bharosa.authentipad.keypad.german.keyset.row7.enum.key6.image=kp_v01_00D2.png
bharosa.authentipad.keypad.german.keyset.row7.enum.key6.order=6

bharosa.authentipad.keypad.german.keyset.row7.enum.key7=6
bharosa.authentipad.keypad.german.keyset.row7.enum.key7.name=\u00D3
bharosa.authentipad.keypad.german.keyset.row7.enum.key7.description=\u00D3
bharosa.authentipad.keypad.german.keyset.row7.enum.key7.value=\u00D3
bharosa.authentipad.keypad.german.keyset.row7.enum.key7.shiftvalue=\u00D3
bharosa.authentipad.keypad.german.keyset.row7.enum.key7.image=kp_v01_00D3.png
bharosa.authentipad.keypad.german.keyset.row7.enum.key7.order=7

bharosa.authentipad.keypad.german.keyset.row7.enum.key8=7
bharosa.authentipad.keypad.german.keyset.row7.enum.key8.name=\u00D4
bharosa.authentipad.keypad.german.keyset.row7.enum.key8.description=\u00D4
bharosa.authentipad.keypad.german.keyset.row7.enum.key8.value=\u00D4
bharosa.authentipad.keypad.german.keyset.row7.enum.key8.shiftvalue=\u00D4
bharosa.authentipad.keypad.german.keyset.row7.enum.key8.image=kp_v01_00D4.png
bharosa.authentipad.keypad.german.keyset.row7.enum.key8.order=8

bharosa.authentipad.keypad.german.keyset.row7.enum.key9=8
bharosa.authentipad.keypad.german.keyset.row7.enum.key9.name=\u00D5
bharosa.authentipad.keypad.german.keyset.row7.enum.key9.description=\u00D5
bharosa.authentipad.keypad.german.keyset.row7.enum.key9.value=\u00D5
bharosa.authentipad.keypad.german.keyset.row7.enum.key9.shiftvalue=\u00D5
bharosa.authentipad.keypad.german.keyset.row7.enum.key9.image=kp_v01_00D5.png
bharosa.authentipad.keypad.german.keyset.row7.enum.key9.order=9

bharosa.authentipad.keypad.german.keyset.row7.enum.key10=9
bharosa.authentipad.keypad.german.keyset.row7.enum.key10.name=\u00D6
bharosa.authentipad.keypad.german.keyset.row7.enum.key10.description=\u00D6
bharosa.authentipad.keypad.german.keyset.row7.enum.key10.value=\u00D6
bharosa.authentipad.keypad.german.keyset.row7.enum.key10.shiftvalue=\u00D6
bharosa.authentipad.keypad.german.keyset.row7.enum.key10.image=kp_v01_00D6.png
bharosa.authentipad.keypad.german.keyset.row7.enum.key10.order=10

bharosa.authentipad.keypad.german.keyset.row7.enum.key11=10
bharosa.authentipad.keypad.german.keyset.row7.enum.key11.name=\u00D7
bharosa.authentipad.keypad.german.keyset.row7.enum.key11.description=\u00D7
bharosa.authentipad.keypad.german.keyset.row7.enum.key11.value=\u00D7
bharosa.authentipad.keypad.german.keyset.row7.enum.key11.shiftvalue=\u00D7
bharosa.authentipad.keypad.german.keyset.row7.enum.key11.image=kp_v01_00D7.png
bharosa.authentipad.keypad.german.keyset.row7.enum.key11.order=11

bharosa.authentipad.keypad.german.keyset.row7.enum.key12=11
bharosa.authentipad.keypad.german.keyset.row7.enum.key12.name=\u00D8
bharosa.authentipad.keypad.german.keyset.row7.enum.key12.description=\u00D8
bharosa.authentipad.keypad.german.keyset.row7.enum.key12.value=\u00D8
bharosa.authentipad.keypad.german.keyset.row7.enum.key12.shiftvalue=\u00D8
bharosa.authentipad.keypad.german.keyset.row7.enum.key12.image=kp_v01_00D8.png
bharosa.authentipad.keypad.german.keyset.row7.enum.key12.order=12

bharosa.authentipad.keypad.german.keyset.row7.enum.key13=12
bharosa.authentipad.keypad.german.keyset.row7.enum.key13.name=\u00D9
bharosa.authentipad.keypad.german.keyset.row7.enum.key13.description=\u00D9
bharosa.authentipad.keypad.german.keyset.row7.enum.key13.value=\u00D9
bharosa.authentipad.keypad.german.keyset.row7.enum.key13.shiftvalue=\u00D9
bharosa.authentipad.keypad.german.keyset.row7.enum.key13.image=kp_v01_00D9.png
bharosa.authentipad.keypad.german.keyset.row7.enum.key13.order=13

bharosa.authentipad.keypad.german.keyset.row8.enum=German KeyPad Keyset Row8
bharosa.authentipad.keypad.german.keyset.row8.enum.key1=0
bharosa.authentipad.keypad.german.keyset.row8.enum.key1.name=\u00DA
bharosa.authentipad.keypad.german.keyset.row8.enum.key1.description=\u00DA
bharosa.authentipad.keypad.german.keyset.row8.enum.key1.value=\u00DA
bharosa.authentipad.keypad.german.keyset.row8.enum.key1.shiftvalue=\u00DA
bharosa.authentipad.keypad.german.keyset.row8.enum.key1.image=kp_v01_00DA.png
bharosa.authentipad.keypad.german.keyset.row8.enum.key1.order=1

bharosa.authentipad.keypad.german.keyset.row8.enum.key2=1
bharosa.authentipad.keypad.german.keyset.row8.enum.key2.name=\u00DB
bharosa.authentipad.keypad.german.keyset.row8.enum.key2.description=\u00DB
bharosa.authentipad.keypad.german.keyset.row8.enum.key2.value=\u00DB
bharosa.authentipad.keypad.german.keyset.row8.enum.key2.shiftvalue=\u00DB
bharosa.authentipad.keypad.german.keyset.row8.enum.key2.image=kp_v01_00DB.png
bharosa.authentipad.keypad.german.keyset.row8.enum.key2.order=2

bharosa.authentipad.keypad.german.keyset.row8.enum.key3=2
bharosa.authentipad.keypad.german.keyset.row8.enum.key3.name=\u00DC
bharosa.authentipad.keypad.german.keyset.row8.enum.key3.description=\u00DC
bharosa.authentipad.keypad.german.keyset.row8.enum.key3.value=\u00DC
bharosa.authentipad.keypad.german.keyset.row8.enum.key3.shiftvalue=\u00DC
bharosa.authentipad.keypad.german.keyset.row8.enum.key3.image=kp_v01_00DC.png
bharosa.authentipad.keypad.german.keyset.row8.enum.key3.order=3

bharosa.authentipad.keypad.german.keyset.row8.enum.key4=3
bharosa.authentipad.keypad.german.keyset.row8.enum.key4.name=\u00DD
bharosa.authentipad.keypad.german.keyset.row8.enum.key4.description=\u00DD
bharosa.authentipad.keypad.german.keyset.row8.enum.key4.value=\u00DD
bharosa.authentipad.keypad.german.keyset.row8.enum.key4.shiftvalue=\u00DD
bharosa.authentipad.keypad.german.keyset.row8.enum.key4.image=kp_v01_00DD.png
bharosa.authentipad.keypad.german.keyset.row8.enum.key4.order=4

bharosa.authentipad.keypad.german.keyset.row8.enum.key5=4
bharosa.authentipad.keypad.german.keyset.row8.enum.key5.name=\u00DE
bharosa.authentipad.keypad.german.keyset.row8.enum.key5.description=\u00DE
bharosa.authentipad.keypad.german.keyset.row8.enum.key5.value=\u00DE
bharosa.authentipad.keypad.german.keyset.row8.enum.key5.shiftvalue=\u00DE
bharosa.authentipad.keypad.german.keyset.row8.enum.key5.image=kp_v01_00DE.png
bharosa.authentipad.keypad.german.keyset.row8.enum.key5.order=5

bharosa.authentipad.keypad.german.keyset.row8.enum.key6=5
bharosa.authentipad.keypad.german.keyset.row8.enum.key6.name=\u00DF
bharosa.authentipad.keypad.german.keyset.row8.enum.key6.description=\u00DF
bharosa.authentipad.keypad.german.keyset.row8.enum.key6.value=\u00DF
bharosa.authentipad.keypad.german.keyset.row8.enum.key6.shiftvalue=\u00DF
bharosa.authentipad.keypad.german.keyset.row8.enum.key6.image=kp_v01_00DF.png
bharosa.authentipad.keypad.german.keyset.row8.enum.key6.order=6

bharosa.authentipad.keypad.german.keyset.row8.enum.key7=6
bharosa.authentipad.keypad.german.keyset.row8.enum.key7.name=\u00E0
bharosa.authentipad.keypad.german.keyset.row8.enum.key7.description=\u00E0
bharosa.authentipad.keypad.german.keyset.row8.enum.key7.value=\u00E0
bharosa.authentipad.keypad.german.keyset.row8.enum.key7.shiftvalue=\u00E0
bharosa.authentipad.keypad.german.keyset.row8.enum.key7.image=kp_v01_00E0.png
bharosa.authentipad.keypad.german.keyset.row8.enum.key7.order=7

bharosa.authentipad.keypad.german.keyset.row8.enum.key8=7
bharosa.authentipad.keypad.german.keyset.row8.enum.key8.name=\u00E1
bharosa.authentipad.keypad.german.keyset.row8.enum.key8.description=\u00E1
bharosa.authentipad.keypad.german.keyset.row8.enum.key8.value=\u00E1
bharosa.authentipad.keypad.german.keyset.row8.enum.key8.shiftvalue=\u00E1
bharosa.authentipad.keypad.german.keyset.row8.enum.key8.image=kp_v01_00E1.png
bharosa.authentipad.keypad.german.keyset.row8.enum.key8.order=8

bharosa.authentipad.keypad.german.keyset.row8.enum.key9=8
bharosa.authentipad.keypad.german.keyset.row8.enum.key9.name=\u00E2
bharosa.authentipad.keypad.german.keyset.row8.enum.key9.description=\u00E2
bharosa.authentipad.keypad.german.keyset.row8.enum.key9.value=\u00E2
bharosa.authentipad.keypad.german.keyset.row8.enum.key9.shiftvalue=\u00E2
bharosa.authentipad.keypad.german.keyset.row8.enum.key9.image=kp_v01_00E2.png
bharosa.authentipad.keypad.german.keyset.row8.enum.key9.order=9

bharosa.authentipad.keypad.german.keyset.row8.enum.key10=9
bharosa.authentipad.keypad.german.keyset.row8.enum.key10.name=\u00E3
bharosa.authentipad.keypad.german.keyset.row8.enum.key10.description=\u00E3
bharosa.authentipad.keypad.german.keyset.row8.enum.key10.value=\u00E3
bharosa.authentipad.keypad.german.keyset.row8.enum.key10.shiftvalue=\u00E3
bharosa.authentipad.keypad.german.keyset.row8.enum.key10.image=kp_v01_00E3.png
bharosa.authentipad.keypad.german.keyset.row8.enum.key10.order=10

bharosa.authentipad.keypad.german.keyset.row8.enum.key11=10
bharosa.authentipad.keypad.german.keyset.row8.enum.key11.name=\u00E4
bharosa.authentipad.keypad.german.keyset.row8.enum.key11.description=\u00E4
bharosa.authentipad.keypad.german.keyset.row8.enum.key11.value=\u00E4
bharosa.authentipad.keypad.german.keyset.row8.enum.key11.shiftvalue=\u00E4
bharosa.authentipad.keypad.german.keyset.row8.enum.key11.image=kp_v01_00E4.png
bharosa.authentipad.keypad.german.keyset.row8.enum.key11.order=11

bharosa.authentipad.keypad.german.keyset.row8.enum.key12=11
bharosa.authentipad.keypad.german.keyset.row8.enum.key12.name=\u00E5
bharosa.authentipad.keypad.german.keyset.row8.enum.key12.description=\u00E5
bharosa.authentipad.keypad.german.keyset.row8.enum.key12.value=\u00E5
bharosa.authentipad.keypad.german.keyset.row8.enum.key12.shiftvalue=\u00E5
bharosa.authentipad.keypad.german.keyset.row8.enum.key12.image=kp_v01_00E5.png
bharosa.authentipad.keypad.german.keyset.row8.enum.key12.order=12

bharosa.authentipad.keypad.german.keyset.row8.enum.key13=12
bharosa.authentipad.keypad.german.keyset.row8.enum.key13.name=\u00E6
bharosa.authentipad.keypad.german.keyset.row8.enum.key13.description=\u00E6
bharosa.authentipad.keypad.german.keyset.row8.enum.key13.value=\u00E6
bharosa.authentipad.keypad.german.keyset.row8.enum.key13.shiftvalue=\u00E6
bharosa.authentipad.keypad.german.keyset.row8.enum.key13.image=kp_v01_00E6.png
bharosa.authentipad.keypad.german.keyset.row8.enum.key13.order=13

bharosa.authentipad.keypad.german.keyset.row9.enum=German KeyPad Keyset row9
bharosa.authentipad.keypad.german.keyset.row9.enum.key1=0
bharosa.authentipad.keypad.german.keyset.row9.enum.key1.name=\u00E7
bharosa.authentipad.keypad.german.keyset.row9.enum.key1.description=\u00E7
bharosa.authentipad.keypad.german.keyset.row9.enum.key1.value=\u00E7
bharosa.authentipad.keypad.german.keyset.row9.enum.key1.shiftvalue=\u00E7
bharosa.authentipad.keypad.german.keyset.row9.enum.key1.image=kp_v01_00E7.png
bharosa.authentipad.keypad.german.keyset.row9.enum.key1.order=1

bharosa.authentipad.keypad.german.keyset.row9.enum.key2=1
bharosa.authentipad.keypad.german.keyset.row9.enum.key2.name=\u00E8
bharosa.authentipad.keypad.german.keyset.row9.enum.key2.description=\u00E8
bharosa.authentipad.keypad.german.keyset.row9.enum.key2.value=\u00E8
bharosa.authentipad.keypad.german.keyset.row9.enum.key2.shiftvalue=\u00E8
bharosa.authentipad.keypad.german.keyset.row9.enum.key2.image=kp_v01_00E8.png
bharosa.authentipad.keypad.german.keyset.row9.enum.key2.order=2

bharosa.authentipad.keypad.german.keyset.row9.enum.key3=2
bharosa.authentipad.keypad.german.keyset.row9.enum.key3.name=\u00E9
bharosa.authentipad.keypad.german.keyset.row9.enum.key3.description=\u00E9
bharosa.authentipad.keypad.german.keyset.row9.enum.key3.value=\u00E9
bharosa.authentipad.keypad.german.keyset.row9.enum.key3.shiftvalue=\u00E9
bharosa.authentipad.keypad.german.keyset.row9.enum.key3.image=kp_v01_00E9.png
bharosa.authentipad.keypad.german.keyset.row9.enum.key3.order=3

bharosa.authentipad.keypad.german.keyset.row9.enum.key4=3
bharosa.authentipad.keypad.german.keyset.row9.enum.key4.name=\u00EA
bharosa.authentipad.keypad.german.keyset.row9.enum.key4.description=\u00EA
bharosa.authentipad.keypad.german.keyset.row9.enum.key4.value=\u00EA
bharosa.authentipad.keypad.german.keyset.row9.enum.key4.shiftvalue=\u00EA
bharosa.authentipad.keypad.german.keyset.row9.enum.key4.image=kp_v01_00EA.png
bharosa.authentipad.keypad.german.keyset.row9.enum.key4.order=4

bharosa.authentipad.keypad.german.keyset.row9.enum.key5=4
bharosa.authentipad.keypad.german.keyset.row9.enum.key5.name=\u00EB
bharosa.authentipad.keypad.german.keyset.row9.enum.key5.description=\u00EB
bharosa.authentipad.keypad.german.keyset.row9.enum.key5.value=\u00EB
bharosa.authentipad.keypad.german.keyset.row9.enum.key5.shiftvalue=\u00EB
bharosa.authentipad.keypad.german.keyset.row9.enum.key5.image=kp_v01_00EB.png
bharosa.authentipad.keypad.german.keyset.row9.enum.key5.order=5

bharosa.authentipad.keypad.german.keyset.row9.enum.key6=5
bharosa.authentipad.keypad.german.keyset.row9.enum.key6.name=\u00EC
bharosa.authentipad.keypad.german.keyset.row9.enum.key6.description=\u00EC
bharosa.authentipad.keypad.german.keyset.row9.enum.key6.value=\u00EC
bharosa.authentipad.keypad.german.keyset.row9.enum.key6.shiftvalue=\u00EC
bharosa.authentipad.keypad.german.keyset.row9.enum.key6.image=kp_v01_00EC.png
bharosa.authentipad.keypad.german.keyset.row9.enum.key6.order=6

bharosa.authentipad.keypad.german.keyset.row9.enum.key7=6
bharosa.authentipad.keypad.german.keyset.row9.enum.key7.name=\u00ED
bharosa.authentipad.keypad.german.keyset.row9.enum.key7.description=\u00ED
bharosa.authentipad.keypad.german.keyset.row9.enum.key7.value=\u00ED
bharosa.authentipad.keypad.german.keyset.row9.enum.key7.shiftvalue=\u00ED
bharosa.authentipad.keypad.german.keyset.row9.enum.key7.image=kp_v01_00ED.png
bharosa.authentipad.keypad.german.keyset.row9.enum.key7.order=7

bharosa.authentipad.keypad.german.keyset.row9.enum.key8=7
bharosa.authentipad.keypad.german.keyset.row9.enum.key8.name=\u00EE
bharosa.authentipad.keypad.german.keyset.row9.enum.key8.description=\u00EE
bharosa.authentipad.keypad.german.keyset.row9.enum.key8.value=\u00EE
bharosa.authentipad.keypad.german.keyset.row9.enum.key8.shiftvalue=\u00EE
bharosa.authentipad.keypad.german.keyset.row9.enum.key8.image=kp_v01_00EE.png
bharosa.authentipad.keypad.german.keyset.row9.enum.key8.order=8

bharosa.authentipad.keypad.german.keyset.row9.enum.key9=8
bharosa.authentipad.keypad.german.keyset.row9.enum.key9.name=\u00EF
bharosa.authentipad.keypad.german.keyset.row9.enum.key9.description=\u00EF
bharosa.authentipad.keypad.german.keyset.row9.enum.key9.value=\u00EF
bharosa.authentipad.keypad.german.keyset.row9.enum.key9.shiftvalue=\u00EF
bharosa.authentipad.keypad.german.keyset.row9.enum.key9.image=kp_v01_00EF.png
bharosa.authentipad.keypad.german.keyset.row9.enum.key9.order=9

bharosa.authentipad.keypad.german.keyset.row9.enum.key10=9
bharosa.authentipad.keypad.german.keyset.row9.enum.key10.name=\u00F0
bharosa.authentipad.keypad.german.keyset.row9.enum.key10.description=\u00F0
bharosa.authentipad.keypad.german.keyset.row9.enum.key10.value=\u00F0
bharosa.authentipad.keypad.german.keyset.row9.enum.key10.shiftvalue=\u00F0
bharosa.authentipad.keypad.german.keyset.row9.enum.key10.image=kp_v01_00F0.png
bharosa.authentipad.keypad.german.keyset.row9.enum.key10.order=10

bharosa.authentipad.keypad.german.keyset.row9.enum.key11=10
bharosa.authentipad.keypad.german.keyset.row9.enum.key11.name=\u00F1
bharosa.authentipad.keypad.german.keyset.row9.enum.key11.description=\u00F1
bharosa.authentipad.keypad.german.keyset.row9.enum.key11.value=\u00F1
bharosa.authentipad.keypad.german.keyset.row9.enum.key11.shiftvalue=\u00F1
bharosa.authentipad.keypad.german.keyset.row9.enum.key11.image=kp_v01_00F1.png
bharosa.authentipad.keypad.german.keyset.row9.enum.key11.order=11

bharosa.authentipad.keypad.german.keyset.row9.enum.key12=11
bharosa.authentipad.keypad.german.keyset.row9.enum.key12.name=\u00F2
bharosa.authentipad.keypad.german.keyset.row9.enum.key12.description=\u00F2
bharosa.authentipad.keypad.german.keyset.row9.enum.key12.value=\u00F2
bharosa.authentipad.keypad.german.keyset.row9.enum.key12.shiftvalue=\u00F2
bharosa.authentipad.keypad.german.keyset.row9.enum.key12.image=kp_v01_00F2.png
bharosa.authentipad.keypad.german.keyset.row9.enum.key12.order=12

bharosa.authentipad.keypad.german.keyset.row9.enum.key13=12
bharosa.authentipad.keypad.german.keyset.row9.enum.key13.name=\u00F3
bharosa.authentipad.keypad.german.keyset.row9.enum.key13.description=\u00F3
bharosa.authentipad.keypad.german.keyset.row9.enum.key13.value=\u00F3
bharosa.authentipad.keypad.german.keyset.row9.enum.key13.shiftvalue=\u00F3
bharosa.authentipad.keypad.german.keyset.row9.enum.key13.image=kp_v01_00F3.png
bharosa.authentipad.keypad.german.keyset.row9.enum.key13.order=13

bharosa.authentipad.keypad.german.keyset.row10.enum=German KeyPad Keyset row10
bharosa.authentipad.keypad.german.keyset.row10.enum.key1=0
bharosa.authentipad.keypad.german.keyset.row10.enum.key1.name=\u00F4
bharosa.authentipad.keypad.german.keyset.row10.enum.key1.description=\u00F4
bharosa.authentipad.keypad.german.keyset.row10.enum.key1.value=\u00F4
bharosa.authentipad.keypad.german.keyset.row10.enum.key1.shiftvalue=\u00F4
bharosa.authentipad.keypad.german.keyset.row10.enum.key1.image=kp_v01_00F4.png
bharosa.authentipad.keypad.german.keyset.row10.enum.key1.order=1

bharosa.authentipad.keypad.german.keyset.row10.enum.key2=1
bharosa.authentipad.keypad.german.keyset.row10.enum.key2.name=\u00F5
bharosa.authentipad.keypad.german.keyset.row10.enum.key2.description=\u00F5
bharosa.authentipad.keypad.german.keyset.row10.enum.key2.value=\u00EF5
bharosa.authentipad.keypad.german.keyset.row10.enum.key2.shiftvalue=\u00F5
bharosa.authentipad.keypad.german.keyset.row10.enum.key2.image=kp_v01_00F5.png
bharosa.authentipad.keypad.german.keyset.row10.enum.key2.order=2

bharosa.authentipad.keypad.german.keyset.row10.enum.key3=2
bharosa.authentipad.keypad.german.keyset.row10.enum.key3.name=\u00F6
bharosa.authentipad.keypad.german.keyset.row10.enum.key3.description=\u00F6
bharosa.authentipad.keypad.german.keyset.row10.enum.key3.value=\u00F6
bharosa.authentipad.keypad.german.keyset.row10.enum.key3.shiftvalue=\u00F6
bharosa.authentipad.keypad.german.keyset.row10.enum.key3.image=kp_v01_00F6.png
bharosa.authentipad.keypad.german.keyset.row10.enum.key3.order=3

bharosa.authentipad.keypad.german.keyset.row10.enum.key4=3
bharosa.authentipad.keypad.german.keyset.row10.enum.key4.name=\u00F7
bharosa.authentipad.keypad.german.keyset.row10.enum.key4.description=\u00F7
bharosa.authentipad.keypad.german.keyset.row10.enum.key4.value=\u00F7
bharosa.authentipad.keypad.german.keyset.row10.enum.key4.shiftvalue=\u00F7
bharosa.authentipad.keypad.german.keyset.row10.enum.key4.image=kp_v01_00F7.png
bharosa.authentipad.keypad.german.keyset.row10.enum.key4.order=4

bharosa.authentipad.keypad.german.keyset.row10.enum.key5=4
bharosa.authentipad.keypad.german.keyset.row10.enum.key5.name=\u00F8
bharosa.authentipad.keypad.german.keyset.row10.enum.key5.description=\u00F8
bharosa.authentipad.keypad.german.keyset.row10.enum.key5.value=\u00F8
bharosa.authentipad.keypad.german.keyset.row10.enum.key5.shiftvalue=\u00F8
bharosa.authentipad.keypad.german.keyset.row10.enum.key5.image=kp_v01_00F8.png
bharosa.authentipad.keypad.german.keyset.row10.enum.key5.order=5

bharosa.authentipad.keypad.german.keyset.row10.enum.key6=5
bharosa.authentipad.keypad.german.keyset.row10.enum.key6.name=\u00F9
bharosa.authentipad.keypad.german.keyset.row10.enum.key6.description=\u00F9
bharosa.authentipad.keypad.german.keyset.row10.enum.key6.value=\u00F9
bharosa.authentipad.keypad.german.keyset.row10.enum.key6.shiftvalue=\u00F9
bharosa.authentipad.keypad.german.keyset.row10.enum.key6.image=kp_v01_00F9.png
bharosa.authentipad.keypad.german.keyset.row10.enum.key6.order=6

bharosa.authentipad.keypad.german.keyset.row10.enum.key7=6
bharosa.authentipad.keypad.german.keyset.row10.enum.key7.name=\u00FA
bharosa.authentipad.keypad.german.keyset.row10.enum.key7.description=\u00FA
bharosa.authentipad.keypad.german.keyset.row10.enum.key7.value=\u00FA
bharosa.authentipad.keypad.german.keyset.row10.enum.key7.shiftvalue=\u00FA
bharosa.authentipad.keypad.german.keyset.row10.enum.key7.image=kp_v01_00FA.png
bharosa.authentipad.keypad.german.keyset.row10.enum.key7.order=7

bharosa.authentipad.keypad.german.keyset.row10.enum.key8=7
bharosa.authentipad.keypad.german.keyset.row10.enum.key8.name=\u00FB
bharosa.authentipad.keypad.german.keyset.row10.enum.key8.description=\u00FB
bharosa.authentipad.keypad.german.keyset.row10.enum.key8.value=\u00FB
bharosa.authentipad.keypad.german.keyset.row10.enum.key8.shiftvalue=\u00FB
bharosa.authentipad.keypad.german.keyset.row10.enum.key8.image=kp_v01_00FB.png
bharosa.authentipad.keypad.german.keyset.row10.enum.key8.order=8

bharosa.authentipad.keypad.german.keyset.row10.enum.key9=8
bharosa.authentipad.keypad.german.keyset.row10.enum.key9.name=\u00FC
bharosa.authentipad.keypad.german.keyset.row10.enum.key9.description=\u00FC
bharosa.authentipad.keypad.german.keyset.row10.enum.key9.value=\u00FC
bharosa.authentipad.keypad.german.keyset.row10.enum.key9.shiftvalue=\u00FC
bharosa.authentipad.keypad.german.keyset.row10.enum.key9.image=kp_v01_00FC.png
bharosa.authentipad.keypad.german.keyset.row10.enum.key9.order=9

bharosa.authentipad.keypad.german.keyset.row10.enum.key10=9
bharosa.authentipad.keypad.german.keyset.row10.enum.key10.name=\u00FD
bharosa.authentipad.keypad.german.keyset.row10.enum.key10.description=\u00FD
bharosa.authentipad.keypad.german.keyset.row10.enum.key10.value=\u00FD
bharosa.authentipad.keypad.german.keyset.row10.enum.key10.shiftvalue=\u00FD
bharosa.authentipad.keypad.german.keyset.row10.enum.key10.image=kp_v01_00FD.png
bharosa.authentipad.keypad.german.keyset.row10.enum.key10.order=10

bharosa.authentipad.keypad.german.keyset.row10.enum.key11=10
bharosa.authentipad.keypad.german.keyset.row10.enum.key11.name=\u00FE
bharosa.authentipad.keypad.german.keyset.row10.enum.key11.description=\u00FE
bharosa.authentipad.keypad.german.keyset.row10.enum.key11.value=\u00FE
bharosa.authentipad.keypad.german.keyset.row10.enum.key11.shiftvalue=\u00FE
bharosa.authentipad.keypad.german.keyset.row10.enum.key11.image=kp_v01_00FE.png
bharosa.authentipad.keypad.german.keyset.row10.enum.key11.order=11

bharosa.authentipad.keypad.german.keyset.row10.enum.key12=11
bharosa.authentipad.keypad.german.keyset.row10.enum.key12.name=\u00FF
bharosa.authentipad.keypad.german.keyset.row10.enum.key12.description=\u00FF
bharosa.authentipad.keypad.german.keyset.row10.enum.key12.value=\u00FF
bharosa.authentipad.keypad.german.keyset.row10.enum.key12.shiftvalue=\u00FF
bharosa.authentipad.keypad.german.keyset.row10.enum.key12.image=kp_v01_00FF.png
bharosa.authentipad.keypad.german.keyset.row10.enum.key12.order=12

bharosa.authentipad.keypad.german.keyset.row10.enum.key13=12
bharosa.authentipad.keypad.german.keyset.row10.enum.key13.name=\u00FF
bharosa.authentipad.keypad.german.keyset.row10.enum.key13.description=\u00FF
bharosa.authentipad.keypad.german.keyset.row10.enum.key13.value=\u00FF
bharosa.authentipad.keypad.german.keyset.row10.enum.key13.shiftvalue=\u00FF
bharosa.authentipad.keypad.german.keyset.row10.enum.key13.image=kp_v01_00FF.png
bharosa.authentipad.keypad.german.keyset.row10.enum.key13.order=13

5. フレーム・イメージ・ファイルとキー・イメージ・ファイルを次のディレクトリに追加します。

- キー・イメージ・ファイル: temp-folder/WEB-INF/classes/bharosa_properties/alphapad_skins_de

- フレーム・イメージ・ファイル: temp-folder//WEB-INF/classes/bharosa_properties/alphapad_bg

6. 次のコマンドを使用して、oracle.oaam.extensions.warファイルを再パッケージ化します。

jar -cvfm oracle.oaam.extensions.war temp-folder/META-INF/MANIFEST.MF -C <temp-folder> .

注意:

元のMANIFEST.MFが、共有ライブラリ情報を含んだMANIFEST.MFと同じであることを確認してください。

7. oaam_serverとoaam_adminをターゲットに指定した共有ライブラリとして、更新されたoracle.oaam.extensions.warをデプロイします。

8. OAAMサーバーを再起動し、ブラウザをドイツ語のロケールに設定してアプリケーションにアクセスすることで変更内容を検証します。

20.9 パスワードの文字制限の変更

OAAMでは、パスワードの25文字の制限が採用されています。ユーザーがOAAMサーバーに最初にログインするとき、入力したパスワードが25バイトを超える場合、パスワードが無効というエラーが発生し、ユーザー名のページに戻されてしまいます。

OAAMサーバーに入力するパスワードの文字制限を変更するには、次のプロパティの値を更新します。

bharosa.authentipad.textpad.datafield.maxLength

OAAM管理コンソールを使用して、文字制限を更新するには、次の手順に従います。

1. OAAM管理コンソールにログインします。

2. 左側のペインで、「環境」をクリックしてから、「プロパティ」をダブルクリックします。「プロパティ」検索ページが表示されます。

3. bharosa.authentipad.textpad.datafield.maxLengthという名前のプロパティを検索し、その値を変更します。

4. そのプロパティが存在しない場合は、bharosa.authentipad.textpad.datafield.maxLengthという名前の新しいプロパティおよびその値を追加します。

プロパティを更新するために共有ライブラリを使用する方法については、この章を参照してください。

20.10 KeyPadのシナリオ

キー・ロガーは、ユーザーがキーボードで入力した機密の資格情報を盗み取ることを目的としたソフトウェアまたはハードウェアです。キー・ロガーを防ぐ最善の方法は、機密情報を入力するための別の方法を使用することです。KeyPadでは、キーボードによる入力を排除するのみでなく、セッションごとに個別のデータ送信方法を使用することでデータを盗難から防御します。実際のデータではなく、XY座標位置が送信されます。また、「ジッター」という機能のおかげで、KeyPadを使用するたびに同一のデータが別のXY座標の値セットに変換されます。

ソーシャル・エンジニアリング攻撃は手強い脅威です。パーソナライズは個人バックグラウンド・イメージおよびフレーズから構成されます。サーバーによってタイムスタンプが生成され、再利用を防ぐために、1回のみ使用できるイメージに埋め込まれます。各オーセンティケータ・インタフェースは、1回のみ使用するためにエンド・ユーザーに提供される単一JPEGイメージです。クライアント側のインテリジェンス機能が制約を受けることはありません。

Webアプリケーションのセキュリティ保護は、パスワードに依存せずに実現できます。ユーザーがセキュリティ上のリスクを評価するためにアクセス・リクエストを送る際には、その他のすべてのデータを使用できます。また、セキュリティ上のリスクが高い場合にのみ、追加の資格証明を発行して使用できます。

21 タスク・プロセッサの統合

OAAMのサンプル・アプリケーションには、統合プロセッサとタスク・プロセッサの使用例が示されています。Java API統合の例については、第2章「Oracle Adaptive Access Managerのネイティブ統合」を参照してください。

ここでは、OAAMカスタム・プロセッサ・フレームワークの参考情報を提供します。

- 第21.1項「概要」

- 第21.2項「統合の参照用としてのOAAMサンプル・フレームワーク」

- 第21.3項「セッション管理」

- 第21.4項「タスク・プロセッサ」

- 第21.5項「チャンレンジ・プロセッサ」

- 第21.6項「チェックポイント・プロセッサ」

- 第21.7「ルール結果プロセッサ」

- 第21.8項「統合プロセッサ」

- 第21.9項「プロバイダ登録」

- 第21.10項「レガシー・ルール結果プロセッサ」

21.1 概要

OAAMには、ユーザーのビジネス・セキュリティ要件に応えるために、即時利用可能なユーザー・フローやインタフェースが用意されていますが、標準的なWebアプリケーションではユーザーのセキュリティ要件を満たせないことがあります。この場合、OAAMカスタム・プロセッサ・フレームワークを使用して、カスタム開発に対応できます。

図21-1「OAAM標準Webアプリケーション」に、標準のWebアプリケーションを示します。

図21-1 OAAM標準Webアプリケーション

図21-2「OAAMプロセッサ・フレームワーク」に、このプロセッサ・フレームワークの各種コンポーネントを示します。

図21-2 OAAMプロセッサ・フレームワーク

21.2 統合の参照用としてのOAAMサンプル・フレームワーク

参考のため、タスク・プロセッサ統合を示すOAAMサンプル・フレームワークを用意しています。最新のOAAMサンプルは、次のURLにあるOracle Technology Networkからダウンロードできます。

http://www.oracle.com/technetwork/index.html

OAAMサンプル・コードは、ユーザーがタスク・プロセッサ・フレームワークに慣れることを目的としたデモンストレーション用のコードです。このサンプル・アプリケーションは、本番コードでの使用を目的としたものではありません。

注意:

このサンプルは、Java API統合用のOAAMサンプル・アプリケーションとは異なります。Java API統合またはタスク・プロセッサ統合を示すOAAMサンプル・アプリケーションのいずれかを使用してください。これら2つのOAAMサンプル・アプリケーションは一緒にデプロイはできません。

サンプル・アプリケーションをデプロイするには、次の手順を実行します。

1. oaam_framework_sampleフォルダを作成します。

2. oaam_framework_sample.warをoaam_framework_sampleに抽出します。

3. WebLogic Serverを起動します。

4. Oracle WebLogic管理コンソールに移動します。
http://oaam_host:port/console

5. OAAM共有ライブラリ$MW_HOME\Oracle_IDM1\oaam\oaam_libs\war\oaam_native_lib.warを共有ライブラリとしてデプロイします。

1. 「IAMDomain」(左側のペイン)の下にある「デプロイメント」をクリックします。

2. 「デプロイメントのサマリー」ページで、「インストール」ボタンをクリックします。

3. 「パス」フィールドで、$MW_HOME\Oracle_IDM1\oaam\oaam_libs\war\oaam_native_lib.warを指定します。

4. oaam_native_lib.warを選択して、「次へ」をクリックします。

5. 「このデプロイメントをライブラリとしてインストールする」オプションを選択し、「次へ」をクリックします。

6. 「デプロイ・ターゲットの選択」ページで、サーバーのリストから管理対象サーバーを選択し、「次へ」をクリックします。共有ライブラリの名前がoracle.oaam.libsであることに注意してください。
管理対象サーバーがOAAMサーバーの場合、OAAMデータソースを作成する必要はありません。そうでない場合は、JNDI名jdbc/OAAM_SERVER_DB_DSのデータソースを作成して、そのデータソースでOAAMスキーマを指定します。

7. 「終了」をクリックします。

8. 「変更のアクティブ化」をクリックします。

6. OAAM共有ライブラリのデプロイ先である管理対象サーバーに、OAAMサンプル・アプリケーションをアプリケーションとしてデプロイします。

1. 「IAMDomain」(左側のペイン)の下にある「デプロイメント」をクリックします。

2. 「デプロイメントのサマリー」ページで、「インストール」ボタンをクリックします。

3. 「パス」フィールドでOAAMサンプル・アプリケーションの場所を指定して、「次へ」をクリックします。

4. 「このデプロイメントをアプリケーションとしてインストールする」オプションを選択します。「次へ」をクリックします。

5. 「デプロイ・ターゲットの選択」ページで、サーバーのリストから管理対象サーバーを選択し、「次へ」をクリックします。

6. 「終了」をクリックします。

7. 「チェンジ・センター」の「変更のアクティブ化」をクリックします。

8. デプロイメント・ディスクリプタ・ファイルで、OAAM共有ライブラリoracle.oaam.libsへの参照を設定します。
Oracle Adaptive Access Managerの共有ライブラリをWebアプリケーションで使用するには、Oracle WebLogicデプロイメント記述子ファイルweblogic.xmlに次のエントリを追加して、その共有ライブラリを参照する必要があります。

<library-ref>
<library-name>oracle.oaam.libs</library-name>
</library-ref>

Oracle Adaptive Access Managerの共有ライブラリをエンタープライズ・アプリケーションで使用するには、Oracle WebLogicデプロイメント記述子ファイルweblogic-application.xmlに次のエントリを追加して、その共有ライブラリを参照する必要があります。

<library-ref>
<library-name>oracle.oaam.libs</library-name>
</library-ref>

9. 管理対象サーバーを起動します。

10. Oracle WebLogic管理コンソールに移動します。「ロックして編集」をクリックして「デプロイメント」ノードを選択します。「デプロイメントのサマリー」ページで、OAAMサンプル・アプリケーションを検索して選択します。「起動」→「すべてのリクエストを処理」をクリックします。「はい」をクリックして確認します。

11. OAAM管理アプリケーションにログインし、スナップショットをインポートします。

12. Sample_Txn_Models.zipファイルからトランザクション・ポリシーをインポートします。

13. URLhttp://managed_server:port/oaam_framework_sampleに移動します。OAAMサンプル・アプリケーションのログイン・ページが表示されます。

14. 次のページで、ユーザー名とパスワードを入力します。登録を行った後、サンプル・トランザクションへのリンクが表示されます。

注意:

最初のログイン時のパスワードはtestである必要があります。このパスワードはすぐに変更してください。

21.3 セッション管理

UIOContextは、HTTPリクエスト・オブジェクトとHTTPレスポンス・オブジェクトに対するスレッド・ローカル変数を保守するコンテキスト・オブジェクトです。これにより、アプリケーションのセッション(具体的には、UIOSesisonDataオブジェクト)へのアクセスを常に確保することができます。コンテキストは各要求(HttpServletRequestおよびHttpServletResponse)の初めに入力する必要があります。

UIOContext.setCurrentInstance(new UIOContext(request, response));

UIOSessionDataオブジェクトはHTTPセッションで維持され、すべてのOAAMセッションとユーザー・データを含んでいます。

21.4 タスク・プロセッサ

インテグレータは、タスク・プロセッサで、重要なOAAM操作を実行するカスタムJavaコードを開発できます。

タスク・プロセッサ:

- 特定のタスクに対する、一連のOAAM APIコールの実行

- OAAMセッション・データの更新

- ユーザー・インタフェースをOAAMの「作業」から分離

タスク・プロセッサは通常、エンド・ユーザー・ページと1対1の関係があります。

- Login.jsp

- ユーザー名のフィールドをユーザーに表示

- ユーザー名をloginAction.doに送信

- LoginAction

- プレゼンテーションからのデータの受入れ

- OAAMタスク・プロセッサへのデータのマップ

- LoginTaskProcessor

- OAAM APIを呼び出して、UIOSessionDataを更新

- 「ターゲット」を返す

21.4.1 インタフェースおよび抽象クラス

各タスク・プロセッサ・クラスはTaskProcessorIntfを実装し、AbstractTaskProcessorを拡張します。

TaskProcessorIntf

- タスク、ターゲット、タスク・パラメータ、およびタスク・アクションの静的変数

- メソッドの実行

AbstractTaskProcessor

- インタフェース実行メソッドを、次の3つの部分に分類:

- preProcess、process、postProcess

- デフォルト・クラスのpreProcessメソッドとpostProcessメソッドは空

- カスタマイザが既存のクラスを拡張して、APIコールの前後または結果に基づいてコードを実行可能

- validateSessionメソッドを導入することで、ユーザー・セッションが各タスクに有効であることを容易に検証

- タスク・アクション(show/ submit)を決定するためのユーティリティ・メソッド

プロパティの登録

タスク・プロセッサは、プロパティを使用してシステムに登録されます。タスク・プロセッサのプロパティ定義は次のとおりです。

bharosa.uioappId.task.processor.taskName = java_class

たとえば、次のようになります。

bharosa.uio.default.task.processor.login =
com.bharosa.uio.processor.task.LoginTaskProcessor

タスク・プロセッサへのアクセス

タスク・プロセッサは、Utilityメソッドを呼び出すことでアクセスされます。

UIOUtil.getTaskProcessor(UIOSessionData sessionData, String taskId)

パラメータの作成

TaskParams params = new TaskParams();
params.addParam(LoginTaskProcessor.PARAM_LOGIN_ID, loginId);
params.setActionSubmit();

タスクの実行

target = taskProc.execute(params).getResult();

21.4.1.1 TaskProcessorIntf

各タスク・プロセッサでは、TaskProcessorIntfインタフェースを実装する必要があります。また、既存のタスク・プロセッサまたはAbstractTaskprocessorクラスを拡張することをお薦めします。これにより、統合の目的で追加するJavaコードが少量な場合、カスタマイズにpreProcessやpostProcessメソッドを組み込むだけで済みます。

たとえば、LogoutTaskProcessorがコールされるたびに外部APIが必要になる場合は、LogoutTaskProcessorを拡張するCustomLogoutTaskProcessorを実装して、外部APIのコールでpostProcessメソッドのみが実装されるようにできます。その後、新しいCustomTaskProcessorクラスを指定するようにログアウト・タスク・プロセッサのプロパティを更新できます。

bharosa.uio.default.task.processor.logout = com.bharosa.uio.processor.task.CustomLogoutTaskProcessor

TaskProcessorIntfの内容は次のとおりです。

public interface TaskProcessorIntf {

public static final String TASK_LOGIN = "login";
public static final String TASK_JUMP = "jump";
public static final String TASK_PASSWORD = "password";
public static final String TASK_CHALLENGE = "challenge";
public static final String TASK_CHANGE_PASSWORD = "changePassword";
public static final String TASK_CHANGE_USERNAME = "changeUsername";
public static final String TASK_FINGERPRINT = "fingerprint";
public static final String TASK_LOGOUT = "logout";
public static final String TASK_FORGOT_PASSWORD = "forgotPassword";
public static final String TASK_CHECKPOINT= "checkpoint";
public static final String TASK_UPDATE_STATUS = "updateStatus";
public static final String TASK_REGISTER_SUMMARY = "registerSummary";
public static final String TASK_REGISTER_IMAGE_PHRASE = "registerImagePhrase";
public static final String TASK_REGISTER_QUESTIONS = "registerQuestions";
public static final String TASK_REGISTER_USER_INFO = "registerUserInfo";
public static final String TASK_REGISTER_COMPLETE = "registerComplete";
public static final String TASK_REGISTER_SKIP = "registerSkip";
public static final String TASK_USERPREF_IMAGE_PHRASE =
"userPrefsImagePhrase";
public static final String TASK_USERPREF_QUESTIONS = "userPrefsQuestions";
public static final String TASK_USERPREF_USER_INFO = "userPrefsUserInfo";
public static final String TASK_USERPREF_COMPLETE = "userPrefsComplete";
public static final String TASK_TRANSACTION = "transaction";
public static final String TASK_UPDATE_TRANSACTION_STATUS =
"updateTransactionStatus";

public static final String TARGET_ERROR = "error";
public static final String TARGET_SESSION_EXPIRED = "session_expired";
public static final String TARGET_FAIL = "fail";
public static final String TARGET_ACCESS_DENIED = "accessDenied";
public static final String TARGET_INVALID_USER = "invalid_user";
public static final String TARGET_SUCCESS = "success";
public static final String TARGET_UPDATE_STATUS = "updateStatus";
public static final String TARGET_LOGIN = "login";
public static final String TARGET_JUMP = "jump";
public static final String TARGET_RESET_PASSWORD = "resetPassword";
public static final String TARGET_CHANGE_PASSWORD = "changePassword";
public static final String TARGET_CHALLENGE= "challenge";
public static final String TARGET_FORGOT_PASSWORD = "forgotPassword";
public static final String TARGET_USER_DISABLED = "user_disabled";
public static final String TARGET_NEXT = "next";

public static final String TARGET_ALLOW = Preferences.ACTION_ALLOW;
public static final String TARGET_BLOCK = Preferences.ACTION_BLOCK;

public static final String TARGET_REGISTER = Preferences.ACTION_REGISTER;
public static final String TARGET_REGISTER_SUMMARY = "registerInfo";
public static final String TARGET_REGISTER_IMAGE_PHRASE =
"registerAuthenticator";
public static final String TARGET_REGISTER_QUESTIONS = "registerQuestions";
public static final String TARGET_REGISTER_QUESTIONS_HTML =
"registerQuestionsHTML";
public static final String TARGET_REGISTER_USER_INFO = "registerUserInfo";
public static final String TARGET_REGISTER_COMPLETE = "registerComplete";
public static final String TARGET_REGISTER_REQUIRED =
Preferences.ACTION_REGISTRATION_REQUIRED;
public static final String PARAM_ACTION = "action";
public static final String ACTION_SUBMIT = "submitAnswer";
public static final String ACTION_WAIT = "wait";
public static final String ACTION_UPGRADE = "upgrade";
public static final String ACTION_DOWNGRADE = "revert";
public static final String ACTION_SHOW = "show";

public String execute(UIOSessionData sessionData, Map<String, String> params);

}

21.4.1.2 AbstractTaskProcessor

AbstractTaskProcessorの内容は次のとおりです。

public abstract class AbstractTaskProcessor implements Serializable, TaskProcessorIntf {

public AbstractTaskProcessor() {
}

public TaskResult execute(TaskParams params) {
UIOSessionData sessionData = UIOContext.getCurrentInstance().getSessionData();

if (params == null)
params = new TaskParams();

String validateSession = validateSession();
if (validateSession != null) {
List errorCodes = null;
if (sessionData != null)
errorCodes = sessionData.getErrorCodes();

return new TaskResult(validateSession, errorCodes);
}

String target = preProcess(params);
if (!StringUtil.equalsIgnoreCase(target, TARGET_ERROR)){
target = process(params, target);
}

target = postProcess(params, target);

TaskResult result = new TaskResult(target, sessionData.getErrorCodes());
result.setActionList(sessionData.getActionList());
result.setChallengeType(UIOUtil.getCurrentChallengeType(sessionData));
result.setChallengeQuestion(sessionData.getSecretQuestion());
result.setRequestId(sessionData.getRequestId());
result.setLoginId(sessionData.getLoginId());
result.setCurrentAuthDevice(sessionData.getPreferences().getCurrentDevice());
result.setCanSkipRegistration(sessionData.getPreferences().getCanSkipRegistration(
));
// Update the sessionData object in session for replication.
UIOSessionData.updateSession();
return result;
}

protected String preProcess(TaskParams params) {
return null;
}

abstract protected String process(TaskParams params, String target);

protected String postProcess(TaskParams params, String target) {
return target;
}

protected String validateSession(){
String target = null;
UIOSessionData sessionData =
UIOContext.getCurrentInstance().getSessionData();

if (sessionData == null){
// Attempt to populate from context.
sessionData = UIOContext.getCurrentInstance().getSessionData();
if (sessionData == null){
logger.info("SessionData is not found in session, so the session
is expired or UIOContext not pupulated.");
return TARGET_SESSION_EXPIRED;
}
}

String customerId = sessionData.getCustomerId();
VCryptAuthUser clientUser = sessionData.getClientAuthUser();

if (clientUser == null && StringUtil.isEmpty(customerId)) {
logger.info("Client User is not found in session, so the session is
expired.");
target = TARGET_SESSION_EXPIRED;
} else if (clientUser == null && !StringUtil.isEmpty(customerId)) {
logger.info("Client User is not found in session.");
target = TARGET_ACCESS_DENIED;
}

return target;

}

public boolean isShow(TaskParams params){
return StringUtil.equalsIgnoreCase(params.getAction(),
TaskProcessorIntf.ACTION_SHOW);
}

public boolean isSubmit(TaskParams params){
return StringUtil.equalsIgnoreCase(params.getAction(),
TaskProcessorIntf.ACTION_SUBMIT);
}
}

21.4.1.3 デフォルトのクラス

次のプロパティでは、デフォルトのタスク・プロセッサが定義されます。

bharosa.uio.default.task.processor.login =
com.bharosa.uio.processor.task.LoginTaskProcessor
bharosa.uio.default.task.processor.jump =
com.bharosa.uio.processor.task.JumpTaskProcessor
bharosa.uio.default.task.processor.password =
com.bharosa.uio.processor.task.PasswordTaskProcessor
bharosa.uio.default.task.processor.challenge =
com.bharosa.uio.processor.task.ChallengeUserTaskProcessor
bharosa.uio.default.task.processor.changePassword =
com.bharosa.uio.processor.task.ChangePasswordTaskProcessor
bharosa.uio.default.task.processor.changeUsername =
com.bharosa.uio.processor.task.ChangeUsernameTaskProcessor
bharosa.uio.default.task.processor.fingerprint =
com.bharosa.uio.processor.task.FingerprintTaskProcessor
bharosa.uio.default.task.processor.logout =
com.bharosa.uio.processor.task.LogoutTaskProcessor
bharosa.uio.default.task.processor.forgotPassword =
com.bharosa.uio.processor.task.ForgotPasswordTaskProcessor
bharosa.uio.default.task.processor.checkpoint =
com.bharosa.uio.processor.task.CheckpointTaskProcessor
bharosa.uio.default.task.processor.updateStatus =
com.bharosa.uio.processor.task.UpdateAuthStatusTaskProcessor
bharosa.uio.default.task.processor.registerSummary =
com.bharosa.uio.processor.task.RegisterSummaryTaskProcessor
bharosa.uio.default.task.processor.registerImagePhrase =
com.bharosa.uio.processor.task.RegisterImageAndPhraseTaskProcessor
bharosa.uio.default.task.processor.registerQuestions =
com.bharosa.uio.processor.task.RegisterQuestionsTaskProcessor
bharosa.uio.default.task.processor.registerUserInfo =
com.bharosa.uio.processor.task.RegisterUserInfoTaskProcessor
bharosa.uio.default.task.processor.registerComplete =
com.bharosa.uio.processor.task.RegisterCompleteTaskProcessor
bharosa.uio.default.task.processor.registerSkip =
com.bharosa.uio.processor.task.RegisterSkipTaskProcessor
bharosa.uio.default.task.processor.userPrefsImagePhrase =
com.bharosa.uio.processor.task.UserPreferencesImageAndPhraseTaskProcessor
bharosa.uio.default.task.processor.userPrefsQuestions =
com.bharosa.uio.processor.task.UserPreferencesQuestionsTaskProcessor
bharosa.uio.default.task.processor.userPrefsUserInfo =
com.bharosa.uio.processor.task.UserPreferencesUserInfoTaskProcessor
bharosa.uio.default.task.processor.userPrefsComplete =
com.bharosa.uio.processor.task.UserPreferencesCompleteTaskProcessor
bharosa.uio.default.task.processor.transaction =
com.bharosa.uio.processor.task.TransactionTaskProcessor
bharosa.uio.default.task.processor.updateTransactionStatus =
com.bharosa.uio.processor.task.UpdateTransactionStatusTaskProcessor

*オプションのパラメータです。

表21-1 AbstractTaskProcessor

クラス名

パラメータ

結果

メモ

LoginTaskProcessor

LoginTaskProcessor.PARAM_LOGIN_ID

LoginTaskProcessor.PARAM_AUTH_STATUS*

ユーザー定義列挙: bharosa.uio.appId.credentials.enum*によって定義された要素

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_ERROR

ログインIDでユーザーをロードします。

JumpTaskProcessor

JumpTaskProcessor.PARAM_OFFSET

JumpTaskProcessor.PARAM_JUMP

TaskProcessorIntf.TARGET_JUMP

TaskProcessorIntf.TARGET_UPDATE_STATUS

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_LOGIN

TaskProcessorIntf.TARGET_ERROR

OAAMセッションを作成します。

ブラウザのフィンガープリント処理を実行します。

認証前ルールを実行します。

FingerprintTaskProcessor

(UIOSesisonDataのFPデータ)

TaskProcessorIntf.TARGET_SUCCESS

デジタル・フィンガープリントを処理します(Flashまたはその他の外部フィンガープリント・リクエスト)。デバイス識別プロセッサを使用します。

PasswordTaskProcessor

PasswordTaskProcessor.PARAM_PASSWORD

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_RESET_PASSWORD

TaskProcessorIntf.TARGET_INVALID_USER

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_FAIL

TaskProcessorIntf.TARGET_ERROR

TaskProcessorIntf.TARGET_UPDATE_STATUS

パスワード送信を処理して、AuthManagerクラスを使用するユーザーを認証します。

ChallengeUserTaskProcessor

ChallengeUserTaskProcessor.PARAM_ANSWER

ChallengeUserTaskProcessor.PARAM_REGISTER_DEVICE

TaskProcessorIntf.TARGET_CHALLENGE

TaskProcessorIntf.TARGET_UPDATE_STATUS

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_FAIL

TaskProcessorIntf.TARGET_ERROR

実行されたチャレンジ・タイプに基づいたチャレンジ・プロセッサ・クラスを使用して、ユーザー・チャレンジを処理します。

UpdateAuthStatusTaskProcessor

UpdateAuthStatusTaskProcessor.PARAM_STATUS

UpdateAuthStatusTaskProcessor.PARAM_SECONDARY_GROUP

(認証後ルール・アクション)

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_FAIL

TaskProcessorIntf.TARGET_ERROR

OAAMのセッション・ステータスを更新します。

RegisterSummaryTaskProcessor

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_NEXT

登録サマリーが要求されるときに実行します。(即時利用可能な機能はない)

.

RegisterImageAndPhraseTaskProcessor

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_NEXT

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_ERROR

オーセンティケータによる登録を処理します。イメージ、フレーズ、VADアップグレード/ダウングレード。

.

RegisterQuestionsTaskProcessor

RegisterQuestionsTaskProcessor.PARAM_QUESTION_COUNT

RegisterQuestionsTaskProcessor.PARAM_QUESTION_ID_BASE+#

RegisterQuestionsTaskProcessor.PARAM_QUESTION_TEXT_BASE+#

RegisterQuestionsTaskProcessor.PARAM_QUESTION_ANSWER_BASE+#

RegisterQuestionsTaskProcessor.PARAM_REGISTER_DEVICE*

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_NEXT

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_FAIL

TaskProcessorIntf.TARGET_ERROR

チャレンジ質問の登録の処理と検証を行います。

RegisterUserInfoTaskProcessor

ユーザー定義列挙によって定義された次の要素です。

bharosa.uio.appId.userinfo.inputs.enum

RegisterUserInfoTaskProcessor.PARAM_REGISTER_DEVICE*

RegisterUserInfoTaskProcessor.PARAM_OPTOUT*

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_NEXT

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_ERROR

OTP連絡先情報の登録の処理と検証を行います。

RegisterCompleteTaskProcessor

TaskProcessorIntf.TARGET_NEXT

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_ERROR

登録フローの完了後にユーザー登録ステータスを更新します。

.

RegisterSkipTaskProcessor

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_ERROR

ユーザーが登録をスキップすることを許可されている場合、登録手順をスキップします。

.

UserPreferencesImageAndPhraseTaskProcessor

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_NEXT

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_ERROR

オーセンティケータによる登録を処理します。イメージ、フレーズ、VADアップグレード/ダウングレード。

.

UserPreferencesQuestionsTaskProcessor

RegisterQuestionsTaskProcessor.PARAM_QUESTION_COUNT

RegisterQuestionsTaskProcessor.PARAM_QUESTION_ID_BASE+#

RegisterQuestionsTaskProcessor.PARAM_QUESTION_TEXT_BASE+#

RegisterQuestionsTaskProcessor.PARAM_QUESTION_ANSWER_BASE+#

RegisterQuestionsTaskProcessor.PARAM_REGISTER_DEVICE*

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_NEXT

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_FAIL

TaskProcessorIntf.TARGET_ERROR

チャレンジ質問の登録の処理と検証を行います。

UserPreferencesUserInfoTaskProcessor

ユーザー定義列挙によって定義された次の要素です。

bharosa.uio.appId.userinfo.inputs.enum

RegisterUserInfoTaskProcessor.PARAM_REGISTER_DEVICE*

RegisterUserInfoTaskProcessor.PARAM_OPTOUT*

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_NEXT

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_ERROR

OTP連絡先情報の登録の処理と検証を行います。

UserPreferencesCompleteTaskProcessor

TaskProcessorIntf.TARGET_NEXT

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_ERROR

ユーザー・プリファレンス・フローの完了後にユーザー登録ステータスを更新します。

.

ForgotPasswordTaskProcessor

ForgotPasswordTaskProcessor.PARAM_PAGEID

TaskProcessorIntf.TARGET_FORGOT_PASSWORD

TaskProcessorIntf.TARGET_SUCCESS

TaskProcessorIntf.TARGET_NO_PROXY

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_FAIL

.

LogoutTaskProcessor

TaskProcessorIntf.TARGET_SUCCESS

ユーザー・セッションをリセットします。

.

CheckpointTaskProcessor

CheckpointTaskProcessor.PARAM_CHECKPOINT

存在しない場合は、sessionData.getCheckpoint()を使用します。

ルール・アクション結果

TaskProcessorIntf.TARGET_SUCCESS

パラメータとして渡されたチェックポイントまたはsessionDataで設定したチェックポイントを実行し、その結果を返します。

ChangePasswordTaskProcessor

ChangePasswordTaskProcessor.PARAM_PAGEID

ChangePasswordTaskProcessor.PARAM_PASSWORD_OLD

ChangePasswordTaskProcessor.PARAM_PASSWORD_NEW

ChangePasswordTaskProcessor.PARAM_PASSWORD_CONFIRM

TaskProcessorIntf.SUCCESS TaskProcessorIntf.TARGET_UPDATE_STATUS

TaskProcessorIntf.TARGET_CHANGE_PASSWORD

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_ERROR

TaskProcessorIntf.TARGET_ERROR

パスワード・マネージャを使用してユーザー・パスワードを更新します。

ChangeUsernameTaskProcessor

ChangeUsernameTaskProcessor.PARAM_USERNAME_NEW

TaskProcessorIntf.SUCCESS

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_FAIL

ユーザーのログインIDとユーザー名を更新します。

TransactionTaskProcessor

TransactionTaskProcessor.PARAM_TRANSACTION_TYPE

TransactionTaskProcessor.PARAM_CHECKPOINT

TransactionTaskProcessor.PARAM_EXTERNAL_TRANSACTION_ID

TransactionTaskProcessor.PARAM_AUTO_UPDATE(オプション、falseに設定されている場合はステータスの更新が回避される)

TransactionTaskProcessor.CHECKPOINT_NONE(オプション、trueに設定されている場合はチェックポイントの実行が回避される)

(トランザクション・ルール・アクション)

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_FAIL

TaskProcessorIntf.TARGET_ERROR

トランザクション前処理を実行し、トランザクション・チェックポイントを作成します。

UpdateTransactionStatusTaskProcessor

TransactionTaskProcessor.PARAM_TRANSACTION_TYPE

TransactionTaskProcessor.PARAM_CHECKPOINT

TransactionTaskProcessor.PARAM_EXTERNAL_TRANSACTION_ID

TransactionTaskProcessor.PARAM_STATIUS

TransactionTaskProcessor.CHECKPOINT_NONE(オプション、trueに設定されている場合はチェックポイントの実行が回避される)

(トランザクション・ルール・アクション)

TaskProcessorIntf.TARGET_SESSION_EXPIRED

TaskProcessorIntf.TARGET_ACCESS_DENIED

TaskProcessorIntf.TARGET_FAIL

TaskProcessorIntf.TARGET_ERROR

更新前処理を実行し、トランザクション・チェックポイントを更新します。

21.4.2 タスク・プロセッサの登録

タスク・プロセッサでは、ユーザー名やパスワードの入力、チャレンジへの応答などのOAAMサーバー・ユーザー・タスクを処理するカスタムJavaクラスの使用が許可されています。

bharosa.uio.default.task.processor.login =
com.bharosa.uio.processor.task.LoginTaskProcessor
bharosa.uio.default.task.processor.jump =
com.bharosa.uio.processor.task.JumpTaskProcessor
bharosa.uio.default.task.processor.password =
com.bharosa.uio.processor.task.PasswordTaskProcessor
bharosa.uio.default.task.processor.challenge =
com.bharosa.uio.processor.task.ChallengeUserTaskProcessor
bharosa.uio.default.task.processor.changePassword =
com.bharosa.uio.processor.task.ChangePasswordTaskProcessor
bharosa.uio.default.task.processor.changeUsername =
com.bharosa.uio.processor.task.ChangeUsernameTaskProcessor
bharosa.uio.default.task.processor.fingerprint =
com.bharosa.uio.processor.task.FingerprintTaskProcessor
bharosa.uio.default.task.processor.logout =
com.bharosa.uio.processor.task.LogoutTaskProcessor
bharosa.uio.default.task.processor.forgotPassword =
com.bharosa.uio.processor.task.ForgotPasswordTaskProcessor
bharosa.uio.default.task.processor.checkpoint =
com.bharosa.uio.processor.task.CheckpointTaskProcessor
bharosa.uio.default.task.processor.updateStatus =
com.bharosa.uio.processor.task.UpdateAuthStatusTaskProcessor
bharosa.uio.default.task.processor.registerSummary =
com.bharosa.uio.processor.task.RegisterSummaryTaskProcessor
bharosa.uio.default.task.processor.registerImagePhrase =
com.bharosa.uio.processor.task.RegisterImageAndPhraseTaskProcessor
bharosa.uio.default.task.processor.registerQuestions =
com.bharosa.uio.processor.task.RegisterQuestionsTaskProcessor
bharosa.uio.default.task.processor.registerUserInfo =
com.bharosa.uio.processor.task.RegisterUserInfoTaskProcessor
bharosa.uio.default.task.processor.registerComplete =
com.bharosa.uio.processor.task.RegisterCompleteTaskProcessor
bharosa.uio.default.task.processor.registerSkip =
com.bharosa.uio.processor.task.RegisterSkipTaskProcessor
bharosa.uio.default.task.processor.userPrefsImagePhrase =
com.bharosa.uio.processor.task.UserPreferencesImageAndPhraseTaskProcessor
bharosa.uio.default.task.processor.userPrefsQuestions =
com.bharosa.uio.processor.task.UserPreferencesQuestionsTaskProcessor
bharosa.uio.default.task.processor.userPrefsUserInfo =
com.bharosa.uio.processor.task.UserPreferencesUserInfoTaskProcessor
bharosa.uio.default.task.processor.userPrefsComplete =
com.bharosa.uio.processor.task.UserPreferencesCompleteTaskProcessor
bharosa.uio.default.task.processor.transaction =
com.bharosa.uio.processor.task.TransactionTaskProcessor
bharosa.uio.default.task.processor.updateTransactionStatus =
com.bharosa.uio.processor.task.UpdateTransactionStatusTaskProcessor

21.5 チャレンジ・プロセッサ

OAAMサーバーでは、チャレンジ・メカニズムのカスタム実装を可能にするチャレンジ・プロセッサ・フレームワークが提供されています。

21.5.1 チャレンジ・プロセッサとは

チャレンジ・プロセッサは、ユーザー・チャレンジの生成と検証に使用されます。これらには、外部のチャレンジ・サービスと統合する機能が備わっています。

チャレンジ・プロセッサは、チャレンジに対して次のタスクを実行するために作成できます。

- ユーザーに送信するチャレンジ秘密(パスワード)の生成。

- ユーザーの回答の検証。

- 配信の待機ページの制御(必要な場合)。

- 配信サービスが使用可能かどうかの確認(必要な場合)。

たとえば、SMSを使用するには、秘密のPINを生成し、送信ステータスやクラス(チャレンジ・タイプによってコールされている)のステータスを確認するメソッドを実装する必要があります。

チャレンジ・プロセッサは、ChallengeProcessorIntfインタフェースを実装するか、AbstractChallengeProcessorクラスを拡張するJavaコードです。

21.5.2 チャレンジ・プロセッサの作成方法

この項では、実装するチャレンジ・プロセッサのクラスとメソッドについて説明します。参考用に実装例も紹介されています。

21.5.2.1 クラス

チャレンジ・プロセッサを実装するには、次のクラスを拡張する必要があります。

com.bharosa.uio.processor.challenge.AbstractChallengeProcessor

後で、$ORACLE_IDM_HOME\oaam\cli\libフォルダのoaam.jarをビルド・クラスパスに追加して、このコードをコンパイルします。

Oracle Adaptive Access Managerのプロパティのカスタマイズ、拡張またはオーバーライドの手順については、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。

21.5.2.2 メソッド

チャレンジ・プロセッサで使用されるメソッドは、後述の各項で示されています。

表21-2 チャレンジ・プロセッサのメソッド

メソッド

説明

protected boolean generateSecret(UIOSessionData sessionData, boolean isRetry)

このメソッドは、クライアントに送信するコードの生成に使用されます。

protected boolean validateAnswer(UIOSessionData sessionData, String answer)

このメソッドは、ユーザーの回答の検証に使用されます。

public String checkDeliveryStatus(UIOSessionData sessionData, boolean userWaiting, boolean isRetry)

このメソッドは、メッセージが送信されるまで待機させるために使用されます。

public boolean isServiceAvailable(UIOSessionData sessionData)

このメソッドは、外部サービスが使用可能かどうかの確認に使用されます。

21.5.2.3 例: 電子メール・チャレンジ・プロセッサの実装

電子メール・チャレンジ・プロセッサの実装は次のとおりです。

package oracle.oaam.challenge.processor.challenge;

import com.bharosa.common.util.*;
import com.bharosa.uio.util.UIOUtil;
import com.bharosa.uio.util.UIOSessionData;

import com.bharosa.common.logger.Logger;

import java.io.Serializable;

/**
* Email Challenge Processor - provides OTP Code generation, delivery
and validation
*/
public class EmailChallengeProcessor extends
com.bharosa.uio.processor.challenge.AbstractOTPChallengeProcessor implements
Serializable{

static Logger logger = Logger.getLogger(EmailChallengeProcessor.class);

public EmailChallengeProcessor( ) {
}

/**
* Generates OTP Code and stores it in sessionData
*
* @param sessionData data object available for the session
* @param isRetry boolean value if method was called as a result of a failed
answer attempt
* @return
*/
protected boolean generateSecret(UIOSessionData sessionData, boolean isRety) {
String otpCode = sessionData.getOTPCode();

// If no secret code is present in session, generate one.
if (StringUtil.isEmpty(otpCode)) {
if (logger.isDebugEnabled())
logger.debug("ChallengeEmail generating security code for user: " +
sessionData.getCustomerId());
otpCode = generateCode(sessionData);

// save the code for later reference - validate / resend
sessionData.setOTPCode(otpCode);
}

if (logger.isDebugEnabled())
logger.debug("OTP code for user " + sessionData.getCustomerId() + " : " +
otpCode);

if (StringUtil.isEmpty(otpCode)) {
logger.error("Email Challenge pin generation returned null.");
return false;
}
// isRetry flag is turned on if user fails to answer the question
if (!isRetry) {
return sendCode(sessionData);
}

return true;
}

/**
* Validate user entered answer against value in sessionData
*
* @param sessionData validate code and return result.
* @param answer answer provided by the user
* @return
*/
protected boolean validateAnswer(UIOSessionData sessionData, String answer){
//need to authenticate OTP Code
String otpCode = sessionData.getOTPCode();

if (otpCode != null && otpCode.equals(answer)) {
// Expire OTP Code
sessionData.setOTPCode(null);
return true;
}

return false;
}

/**
* Private methods to send secret code to client
*
* @param sessionData
* @return
*/
private boolean sendCode(UIOSessionData sessionData){
String otpCode = sessionData.getOTPCode();

try {
// UIOUtil.getOTPContactInfo fetches the information registered by the user.
Refer to ChallengeEmail.requiredInfo in configuration.
String toAddr = UIOUtil.getOTPContactInfo(sessionData, "email");
if (StringUtil.isEmpty(toAddr)) {
logger.error("No user email in profile.");
return false;
}

// Send secret code to customer using your email provider

} catch (Exception ex) {
logger.error("ChallengeEmail Error sending code.", ex);
return false;
}

return true;
}

public String checkStatus(UIOSessionData sessionData, boolean userWaiting,
boolean isRetry) {
String target = ChallengeProcessorIntf.TARGET_WAIT;
// user already has code, trying again - send to challenge page
if (isRetry){
return ChallengeProcessorIntf.TARGET_CHALLENGE;
}

boolean sendComplete = false;
if (userWaiting){
// if secret code is sent set target to
target = ChallengeProcessorIntf.TARGET_CHALLENGE;
// failed to send
target = ChallengeProcessorIntf.TARGET_ERROR;
// still processing
target = ChallengeProcessorIntf.TARGET_WAIT;
}
return target;
}
}

21.5.2.4 秘密(PIN)の実装

AbstractOTPChallengeProcessorクラスには、ユーザーが独自のPIN生成ロジックを提供するためにオーバーライドできる、デフォルトのPIN生成メソッドgenerateCodeが用意されています。

21.5.3 チャレンジ・プロセッサの配信チャネル・タイプの定義

この項では、ユーザーにチャレンジするために使用するチャレンジ・プロセッサの配信チャネル・タイプを定義する手順について説明します。参考用に例が紹介されています。

21.5.3.1 チャレンジ・タイプ列挙

チャレンジ・タイプは、列挙challenge.type.enumによって構成されます。実際の列挙値は次のとおりです。

bharosa.uio.application. challenge.type.enum.challenge_type

次に例を示します。

bharosa.uio.default.challenge.type.enum.ChallengeEmail

チャレンジ・タイプ列挙は、チャレンジ・タイプを(そのチャレンジ・タイプの関連作業を実行するために必要な)Javaコードに関連付けるのに使用できます。電子メール・チャレンジ・プロセッサの実装例については、第21.5.2.3項「例: 電子メール・チャレンジ・プロセッサの実装」を参照してください。

チャレンジ・タイプID (ChallengeEmailなど)は、そのチャレンジ・タイプの使用時にルールによって返されるルール・アクションと一致する必要があります。ChallengeEmailのルール・アクションはrule.action.enum.ChallengeEmailです。ルール・アクションとして、電子メールを使用し、かつ電子メールの配信チャネルを使用しているユーザーにチャレンジすることになります。通常、チャネルは、ユーザーへの送信に使用する配信チャネルのことを指します。

21.5.3.2 例: OTPチャネル・タイプの定義

チャレンジ・タイプを定義するには、次のプロパティを使用します。

bharosa.uio.default.challenge.type.enum.MyChallenge

プロパティのdefaultはUIOアプリケーション名で、MyChallengeは追加されるチャレンジ・タイプです。次の例のチャレンジ・タイプはChallengeEmailです。

bharosa.uio.default.challenge.type.enum.ChallengeEmail

ルール・アクションとして、電子メールを使用し、かつ電子メールの配信チャネルを使用しているユーザーにチャレンジすることになります。

rule.action.enum.ChallengeEmail

チャレンジ・タイプを有効/無効にするには、可用性フラグを設定する必要があります。

bharosa.uio.default.challenge.type.enum.MyChallenge.available = false

表21-3 チャレンジ・タイプのフラグ

プロパティ

説明

available

チャレンジ・タイプが使用可能(サービスが準備され構成されている)かどうか。OTPチャレンジ・タイプを有効/無効にするには、可用性フラグを設定する必要があります。

processor

このタイプのチャレンジを処理するためのJavaクラス。

requiredInfo

登録入力列挙からの入力のカンマ区切りリスト。

availableフラグの設定は、enabledフラグの設定とは異なります。enabledフラグは、リストから削除してしまいます。

チャネル・タイプの定義の例

bharosa.uio.default.challenge.type.enum属性の値の例は次のとおりです。

bharosa.uio.default.challenge.type.enum.MyChallenge = 1
// unique value to identify Challenge Email in
// bharosa.uio.default.challenge.type.enum

bharosa.uio.default.challenge.type.enum.MyChallenge.name = MyChallenge
// unique string to identify Challenge Email in
// bharosa.uio.default.challenge.type.enum,
// no spaces

bharosa.uio.default.challenge.type.enum.MyChallenge.description = Email Challenge
// descriptive name

bharosa.uio.default.challenge.type.enum.MyChallenge.processor =
oracle.oaam.challenge.processor.challenge.EmailChallengeProcessor
// Processor used for sending emails instance of
// com.bharosa.uio.processor.challenge.ChallengeProcessorIntf

bharosa.uio.default.challenge.type.enum.MyChallenge.requiredInfo = email
// comma separated field names, User registration flow captures these data fields,
// check Contact information Inputs section to define this enum

bharosa.uio.default.challenge.type.enum.MyChallenge.available = false
// to turn off this service

bharosa.uio.default.challenge.type.enum.MyChallenge.otp = true
// indicates this challenge is used for OTP, set it to true

電子メールの例

bharosa.uio.default.challenge.type.enum.ChallengeEmail = 1
bharosa.uio.default.challenge.type.enum.ChallengeEmail.name = Email Challenge
bharosa.uio.default.challenge.type.enum.ChallengeEmail.description =
Email Challenge
bharosa.uio.default.challenge.type.enum.ChallengeEmail.processor =
com.bharosa.uio.processor.challenge.EmailChallengeProcessor
bharosa.uio.default.challenge.type.enum.ChallengeEmail.requiredInfo = mobile
bharosa.uio.default.challenge.type.enum.ChallengeEmail.available = true
bharosa.uio.default.challenge.type.enum.ChallengeEmail.enabled = true

SMSの例

bharosa.uio.default.challenge.type.enum.ChallengeSMS = 2
bharosa.uio.default.challenge.type.enum.ChallengeSMS.name = SMS Challenge
bharosa.uio.default.challenge.type.enum.ChallengeSMS.description = SMS Challenge
bharosa.uio.default.challenge.type.enum.ChallengeSMS.processor =
com.bharosa.uio.processor.challenge.SmsChallengeProcessor
bharosa.uio.default.challenge.type.enum.ChallengeSMS.requiredInfo = mobile
bharosa.uio.default.challenge.type.enum.ChallengeSMS.available = true
bharosa.uio.default.challenge.type.enum.ChallengeSMS.enabled = true

21.5.4 ユーザー入力プロパティの構成

ユーザー情報プロパティの構成手順は、次の各項で説明されています。

- 登録とプリファレンスの入力の有効化

- 連絡先情報の入力の設定

Oracle Adaptive Access Managerのプロパティのカスタマイズ、拡張またはオーバーライドの手順については、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。

21.5.4.1 登録とプリファレンスの入力の有効化

登録とプリファレンスの入力を有効化するためのデフォルトの構成は次のとおりです。

連絡先情報の登録

bharosa.uio.default.register.userinfo.enabled=false

連絡先情報のプリファレンス

bharosa.uio.default.userpreferences.userinfo.enabled=false

21.5.4.2 連絡先情報の入力の設定

ユーザー情報登録とユーザー・プリファレンスがtrueの場合、入力情報を構成します。

連絡先情報の入力はuserinfo.inputs.enumに定義されています。列挙要素は次のとおりです。

bharosa.uio.application.userinfo.inputs.enum.inputname

表21-4 連絡先入力のプロパティ

プロパティ

説明

inputname

HTML形式の入力フィールドに使用される名前。

inputtype

テキスト入力またはパスワード入力用に設定されます。

maxlength

ユーザー入力の最大長。

required

フィールドが登録ページで必須である場合に設定されます。

order

ユーザー・インタフェースに表示される順序。

regex

このフィールドのユーザー入力を検証するために使用される正規表現。

errorCode

検証エラー・メッセージ(bharosa.uio.application_ID.error.errorCode)を参照するために使用されるエラー・コード

managerClass

com.bharosa.uio.manager.user.UserDataManagerIntfを実装するJavaクラス(Oracle Adaptive Access Managerデータベースにデータを格納する場合、このプロパティはcom.bharosa.uio.manager.user.DefaultContactInfoManagerに設定される必要があります)。

電子メール入力の例

bharosa.uio.default.userinfo.inputs.enum.email=1
bharosa.uio.default.userinfo.inputs.enum.email.name=Email Address
bharosa.uio.default.userinfo.inputs.enum.email.description=Email Address
bharosa.uio.default.userinfo.inputs.enum.email.inputname=email
bharosa.uio.default.userinfo.inputs.enum.email.inputtype=text
bharosa.uio.default.userinfo.inputs.enum.email.maxlength=40
bharosa.uio.default.userinfo.inputs.enum.email.required=true
bharosa.uio.default.userinfo.inputs.enum.email.order=2
bharosa.uio.default.userinfo.inputs.enum.email.enabled=true
bharosa.uio.default.userinfo.inputs.enum.email.regex=
.+@[a-zA-Z_]+?\\.[a-zA-Z]{2,3}
bharosa.uio.default.userinfo.inputs.enum.email.errorCode=otp.invalid.email
bharosa.uio.default.userinfo.inputs.enum.email.managerClass=
com.bharosa.uio.manager.user.DefaultContactInfoManager

21.5.5 各チャレンジ・タイプで使用されるチャレンジ・パッドの構成

デフォルトでは、使用されるチャレンジ・デバイスはルールを使用して構成されています。ルールはAuthentiPadチェックポイントの下に存在し、これにより、デバイスの目的に基づいて使用するデバイスのタイプを指定できます。

注意: Authentipadチェックポイントをバイパスした後、プロパティを使用してどの仮想デバイスを使用するかを決定しても、モバイル・ブラウザでのチャレンジに別のデバイスは使用できません。PinPadやKeyPadなどの一部の仮想デバイスは、モバイル・ブラウザでの使用に適していません。

チャレンジ・タイプを使用するポリシーを作成または更新する手順は次のとおりです。

1. 列挙rule.action.enumを指定する新しいルール・アクションMyChallengeを追加します。

2. 新規作成されたアクションMyChallengeを戻すポリシーを作成して、チャレンジ・メソッドを使用します。

または、プロパティを使用してチャレンジ・デバイスを構成する場合、bharosa.uio.default.use.authentipad.checkpointをfalseに設定して、AuthentiPadチェックポイントをバイパスできます。

チャレンジ・タイプで使用するデバイスを追加できます。

bharosa.uio.application.challengeType.authenticator.device=value

次の例では、チャレンジ・タイプ・キーのChallengeEmailとChallengeSMSを使用してプロパティ名を作成しています。

bharosa.uio.default.ChallengeSMS.authenticator.device=DevicePinPad
bharosa.uio.default.ChallengeEmail.authenticator.device=DevicePinPad

使用可能なチャレンジ・デバイス値はDeviceKeyPadFull、DeviceKeyPadAlpha、DeviceTextPad、DeviceQuestionPad、DevicePinPadおよびDeviceHTMLControlです。

表21-5 認証デバイス・タイプ

プロパティ

説明

None

HTMLページまたは認証パッドはありません。

DeviceKeyPadFull

KeyPadを使用してユーザーにチャレンジします。

DeviceKeyPadAlpha

英数字KeyPad(数字と文字のみで特殊文字は含みません)を使用して、ユーザーにチャレンジします。

DeviceTextPad

TextPadを使用してユーザーにチャレンジします。

DeviceQuestionPad

QuestionPadを使用してユーザーにチャレンジします。

DevicePinPad

PinPadを使用してユーザーにチャレンジします。

DeviceHTMLControl

認証パッドのかわりにHTMLページを使用して、ユーザーにチャレンジします。

21.6 チェックポイント・プロセッサ

チェックポイント・プロセッサでは、特定のチェックポイントの実行時にカスタムJavaクラスを実行することが許可されています。このプロパティには次の書式を使用します。

bharosa.uio.appId.checkpoint.processor.checkpoint=
fully_qualified_class_name

次のプロパティを使用して、チェックポイント・プロセッサがアプリケーションに登録されます。

bharosa.uio.default.checkpoint.processor.default =
com.bharosa.uio.processor.checkpoint.DefaultCheckpointProcessor
bharosa.uio.default.checkpoint.processor.preauth =
com.bharosa.uio.processor.checkpoint.PreAuthCheckpointProcessor
bharosa.uio.default.checkpoint.processor.postauth =
com.bharosa.uio.processor.checkpoint.PostAuthCheckpointProcessor
bharosa.uio.default.checkpoint.processor.ChallengeUser =
com.bharosa.uio.processor.checkpoint.ChallengeCheckpointProcessor
bharosa.uio.default.checkpoint.processor.ForgotPassword =
com.bharosa.uio.processor.checkpoint.ForgotPasswordCheckpointProcessor
bharosa.uio.default.checkpoint.processor.authentiPad =
com.bharosa.uio.processor.checkpoint.AuthentiPadCheckpointProcessor

チェックポイント・プロセッサが定義されていない場合、デフォルトのチェックポイント・プロセッサが使用されます。デフォルトのチェックポイント・プロセッサは、同様のプロパティで定義されます。

bharosa.uio.appId.checkpoint.processor.default= fully_qualified_class_name

各チェックポイント・プロセッサでは、CheckpointProcessorIntfインタフェースを実装する必要があります。

public interface CheckpointProcessorIntf{

public String processCheckpoint(UIOSessionData sessionData,
VCryptRulesResult rulesResult);

}

各カスタム・チェックポイント・プロセッサでは、DefaultCheckpointProcessorクラスを拡張することをお薦めします。デフォルトのチェックポイント・プロセッサには、チェックポイントの処理に役立つ便利なメソッドが用意されています。

/**
* Default checkpoint handling
*
* Instanciates and executes appropriatlely configured RulesResultProcessors
*/
public class DefaultCheckpointProcessor implements CheckpointProcessorIntf{

static Logger logger = Logger.getLogger(DefaultCheckpointProcessor.class);

/**
* @param sessionData
* @param rulesResult
* @return
*/
protected RulesResultProcessorIntf getResultProcessor(UIOSessionData
sessionData, VCryptRulesResult rulesResult){
if (rulesResult == null || rulesResult.getResult() == null){
logger.info("getResultProcessor :: Rules Result null - Using default rules
result processor.");
return getDefaultResultProcessor(sessionData);
}

String resultName = rulesResult.getResult();

return UIOUtil.getRulesResultProcessor(sessionData, resultName);
}

/**
* @param sessionData
* @return
*/
protected RulesResultProcessorIntf getDefaultResultProcessor(UIOSessionData
sessionData){
return UIOUtil.getRulesResultProcessor(sessionData, "default");
}

/**
* @param checkpointType
* @return
*/
protected String getCheckpointId(int checkpointType){
String checkpointId = null;
UserDefEnumElement checkpointElem =
UserDefEnum.getElement(BharosaUIOConstants.ENUM_PROFILE_TYPE, checkpointType);
if (checkpointElem != null)
checkpointId = checkpointElem.getElementId();

return checkpointId;
}

/**
* @param sessionData
* @param rulesResult
* @return
*/
public String processCheckpoint(UIOSessionData sessionData, VCryptRulesResult
rulesResult){

if (logger.isDebugEnabled())
logger.debug("DefaultCheckpointProcessor::processCheckpoint() entered.");

List actionList = rulesResult.getAllActions();
sessionData.setActionList(actionList);

RulesResultProcessorIntf rulesResultProcessor =
getResultProcessor(sessionData, rulesResult);
if (rulesResultProcessor == null){
logger.error("processCheckpoint :: rulesResultProcessor is null.");
return Preferences.ACTION_ERROR;
}

return rulesResultProcessor.processRulesResult(sessionData, rulesResult);
}

}

21.7 ルール結果プロセッサ

ルール結果プロセッサでは、ルール・エンジンによって特定のルール・アクションが返されるときにカスタムJavaクラスを実行することが許可されています。このプロパティには次の書式を使用します。

bharosa.uio.appId. rules.result.processor.rule_action= fully_qualified_class_name

次のプロパティを使用して、ルール結果プロセッサがアプリケーションに登録されます。

bharosa.uio.default.rules.result.processor.default =
com.bharosa.uio.processor.rules.result.DefaultRulesResultProcessor
bharosa.uio.default.rules.result.processor.Password =
com.bharosa.uio.processor.rules.result.PasswordRulesResultProcessor
bharosa.uio.default.rules.result.processor.Challenge =
com.bharosa.uio.processor.rules.result.ChallengeRulesResultProcessor
bharosa.uio.default.rules.result.processor.Register =
com.bharosa.uio.processor.rules.result.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegistrationRequired =
com.bharosa.uio.processor.rules.result.RegistrationRequiredRulesResultProcessor

ルール結果プロセッサが定義されていない場合、デフォルトのルール結果プロセッサが使用されます。デフォルトのルール結果プロセッサは、同様のプロパティで定義されます。

bharosa.uio.appId. rules.result.processor.default= fully_qualified_class_name

各ルール結果プロセッサでは、RulesResultProcessorIntfインタフェースを実装する必要があります。

public interface RulesResultProcessorIntf{  public String processRulesResult(UIOSessionData sessionData, VCryptRulesResult
rulesResult);  }

各カスタム・チェックポイント・プロセッサでは、DefaultRulesResultProcessorクラスを拡張することをお薦めします。デフォルトのルール結果プロセッサには、ルール結果の処理に役立つ便利なメソッドが用意されています。

/**
* Default handling of rule results
*/
public class DefaultRulesResultProcessor implements RulesResultProcessorIntf{

static Logger logger = Logger.getLogger(DefaultRulesResultProcessor.class);

/**
* Process rules results, updating user status as defined by
VCryptRulesResul object.
*
* @param sessionData
* @param rulesResult
* @return
*/
public String processRulesResult(UIOSessionData sessionData, VCryptRulesResult
rulesResult){

if (logger.isDebugEnabled())
logger.debug("DefaultRulesResultProcessor::processRulesResult() entered.");

if (rulesResult == null)
return null;

if (rulesResult.getResult() == null){
if (logger.isDebugEnabled())
logger.debug("DefaultRulesResultProcessor.processRulesResult(): rules result is
null.");
return Preferences.ACTION_NONE;
}

Preferences prefs = sessionData.getPreferences();
String ruleAction = rulesResult.getResult();
int authStatus = sessionData.getAuthResult();
int newStatus = authStatus;

UserDefEnumElement actionElement =
UserDefEnum.getElement(IBharosaConstants.ENUM_RULE_ACTION_ID, ruleAction);
String overRideStatus = actionElement.getProperty("authStatus");

if (!StringUtil.isEmpty(overRideStatus)) {
if (logger.isDebugEnabled())
logger.debug("Overriding authStatus from action. action=" +
ruleAction + ", authSatus=" +
overRideStatus);
newStatus = Integer.parseInt(overRideStatus);
}

String device = prefs.getCurrentDevice();
int clientType = UIOUtil.CLIENT_TYPE_LOGIN;
if (!StringUtil.isEmpty(device)){
if (device.equals(Preferences.AUTH_DEVICE_TYPE_DEVICE_TEXTPAD)) {
clientType = UIOUtil.CLIENT_TYPE_TEXTPAD;
} else if (device.equals(Preferences.AUTH_DEVICE_TYPE_DEVICE_KEYPAD_FULL) ||
device.equals(Preferences.AUTH_DEVICE_TYPE_DEVICE_KEYPAD_ALPHA)) {
clientType = UIOUtil.CLIENT_TYPE_KEYPAD;
} else if (device.equals(Preferences.AUTH_DEVICE_TYPE_DEVICE_HTML_CONTROL))
{
clientType = UIOUtil.CLIENT_TYPE_NORMAL;
} else if (device.equals(Preferences.AUTH_DEVICE_TYPE_DEVICE_QUESTIONPAD)) {
clientType = UIOUtil.CLIENT_TYPE_QUESTIONPAD;
} else if (device.equals(Preferences.AUTH_DEVICE_TYPE_DEVICE_PINPAD)) {
clientType = UIOUtil.CLIENT_TYPE_PINPAD;
}
}

sessionData.setClientType(clientType);

if (newStatus != authStatus) {
//Update tracker if status has changed
sessionData.setAuthResult(newStatus);
UIOUtil uioUtil = UIOUtil.instance();

try {
uioUtil.updateAuthStatus(sessionData, sessionData.getClientType(),
newStatus);
} catch (BharosaProxyException bpe){
logger.error("Failed to update auth status to " + newStatus + " while
processing ruleAction = " + ruleAction, bpe);
}
}

return ruleAction;
}

}

21.8 統合プロセッサ

統合プロセッサを使用すると、OAAM環境内の各アプリケーションにおいて、OAAMユーザー・フローのEntry、ExitおよびErrorポイントでカスタムJavaコードを開発できます。統合プロセッサでは、AuthManager、PasswordManagerおよびUserDataManager実装へのアクセスをカスタマイズすることもできます。

この項では、次の項目について説明します。

- IntegrationProcessorIntfインタフェース

- 共通ユーザー・フロー

- 統合プロセッサのパラメータ

21.8.1 IntegrationProcessorIntfインタフェース

entry、exitおよびerrorポイントにおけるカスタムJavaコードをクライアント側のOAAMコードと統合できます。

public interface IntegrationProcessorIntf extends Serializable {

public String onEntry();

public String onExit(String target);

public String onError(String target);

public String getAppId();

public FlowIntf getFlow();

public AuthManagerIntf getAuthManager();

public PasswordManagerIntf getPasswordManager();

public UserDataManagerIntf getDataManager(String key);

}

21.8.2 共通ユーザー・フロー

sessionDataオブジェクトを設定して、共通ユーザー・フローを開始できます。このフローはStartメソッドを実行して開始できます。

表21-6に、即時利用可能なオブジェクトとパラメータを示します。

*オプションのパラメータです。

表21-6 SessionDataオブジェクト

クラス

パラメータ

メモ

LoginFlow

String appId

Map<String, String> rulesMap*

Hashtable appContext*

ユーザー名ページとパスワード・ページを表示する標準的なログイン・フロー。フィンガープリント処理、チャレンジおよび登録は必要に応じて実行されます。

LoginNoUsernameFlow

String appId

String loginId

Map<String, String> rulesMap*

Hashtable appContext*

ログイン・フローに類似していますが、ユーザー名ページをスキップし、指定したユーザー名をかわりに使用します。

AuthenticateFlow

String appId

String loginId

int authStatus

Map<String, String> rulesMap*

Hashtable appContext*

ログイン・フローに類似していますが、ユーザー名ページとパスワード・ページをスキップし、指定したユーザー名と認証ステータスを使用します。

ForgotPasswordFlow

String appId

String loginId

Map<String, String> rulesMap*

Hashtable appContext*

指定したユーザー名のパスワードを忘れた場合のフローを開始します。フィンガープリント処理およびパスワードを忘れた場合のチェックポイント・ルールがそれぞれ実行され、ポリシーにチャレンジが構成されている場合はユーザーにチャレンジします。

UserPreferencesFlow

String appId

String loginId*

int authStatus*

Map<String, String> rulesMap*

Hashtable appContext*

ユーザー・プリファレンス・フローを開始します。ユーザー・セッションがすでに存在している場合、sessionDataのユーザー名と認証ステータスが使用されます。または、ユーザー名と認証ステータスを指定してユーザー・セッションを作成してから、ユーザー・プリファレンスを表示できます。

21.8.3 統合プロセッサのパラメータ

次のプロパティは、OAAMサーバー・フレームワークのカスタムJavaクラスを登録するために使用されます。

21.8.3.1 統合IDの確認

統合IDを確認するためのリクエスト・パラメータまたはヘッダーは次のとおりです。

oaam.server.integration.param=intg

21.8.3.2 統合プロセッサの登録

統合プロセッサでは、OAAMサーバーのentry、exitおよびerrorのケースを処理するカスタムJavaクラスの使用が許可されています。

oaam.server.integration.processor.default=com.bharosa.uio.processor.integration.
DefaultIntegrationProcessor
oaam.server.integration.processor.oam=com.bharosa.uio.processor.integration.
OAMIntegrationProcessor
oaam.server.integration.processor.mobile=com.bharosa.uio.processor.integration.
MobileIntegrationProcessor
oaam.server.integration.processor.juniper=com.bharosa.uio.processor.integration.
JuniperSSLIntegrationProcessor

21.8.3.3 認証レベルにおけるOracle Access Management Access Manager固有の統合プロパティ

認証レベルにおけるOracle Access Management Access Manager固有の統合プロパティは次のとおりです(OAMIntegraitonProcessorクラスで使用される)。

oaam.server.integration.oamauthentication.level.enum=Enum for oam authentication
levels provided in tap token
oaam.server.integration.oamauthentication.level.enum.oamoaamlevelmapping=0
oaam.server.integration.oamauthentication.level.enum.oamoaamlevelmapping.name=
Mapping
oaam.server.integration.oamauthentication.level.enum.oamoaamlevelmapping.
oamauthlevels= -1 to 0, 1 to 99
oaam.server.integration.oamauthentication.level.enum.oamoaamlevelmapping.
oaamauthlevels= 0,1

21.9 プロバイダ登録

プロバイダでは、認証およびパスワード管理を処理するカスタムJavaクラスの使用が許可されています。

21.9.1 認証マネージャ

認証マネージャを使用すると、外部認証サービスとのカスタム統合を実現できます。

認証マネージャのカスタム実装では、com.bharosa.uio.manager.auth.AuthManagerIntfインタフェースを実装するcom.bharosa.uio.manager.auth.AbstractAuthManagerクラスを拡張する必要があります。認証マネージャはcom.bharosa.uio.manager.auth.AuthResultオブジェクトを返します。

このプロバイダに任意の数のアプリケーションIDを登録するか、統合プロセッサのgetAuthManagerクラスをオーバーライドすることができます。

カスタム・プロバイダを登録するには、次のプロパティを設定します。

bharosa.uio.default.password.auth.provider.classname =
com.bharosa.uio.manager.auth.DummyAuthManager

AbstractAuthManagerはAuthManagerIntfインタフェースを実装して、ユーザー認証を実行します。

表21-7 AbstractAuthManager

メソッド

説明

public AuthResult authenticate(VCryptAuthUser authUser, String password, Hashtable appContext) throws Exception

内部ロギングを実行し、authenticateUserメソッドをコールします。

protected abstract AuthResult authenticateUser(VCryptAuthUser authUser, String password, Hashtable appContext) throws Exception

UIOSessionDataからOAAMユーザー・オブジェクト、パスワードおよびアプリケーション・コンテキストを取得する抽象メソッド・シグネチャ。このメソッドの実装では、外部認証サービスをコールしてAuthResultオブジェクトを作成してから、そのオブジェクトを戻す必要があります。

21.9.2 パスワード・マネージャ

パスワード・マネージャ・クラスでは、パスワード管理のカスタム処理が実行できます。カスタム・パスワード管理の実装では、com.bharosa.uio.manager.user.PasswordManagerIntfインタフェースを実装する必要があります。

パスワード・マネージャでは、パスワード変更やパスワード設定のカスタマイズ、およびパスワードの書式要件を示すためにユーザーに対して表示されるパスワード・ポリシー・テキストの取得が可能です。

このプロバイダに任意の数のアプリケーションIDを登録するか、統合プロセッサのgetPasswordManagerクラスをオーバーライドすることができます。OAAMのデフォルトの実装はプレースホルダにすぎないため、実際のパスワード管理は実行されません。

プロパティを使用してカスタム・プロバイダを登録するには、次のように設定します。

bharosa.uio.default.user.management.provider.classname =
com.bharosa.uio.manager.user.DefaultPasswordManager

PasswordManagerIntfは、パスワード・マネージャを実装するためのインタフェースです。

表21-8 PasswordManagerIntf

メソッド

説明

public VCryptResponse changePassword(UIOSessionData sessionData, String oldPasswd, String newPasswd, String confirmPasswd)

既存のパスワードのかわりに新しいパスワードの設定を求める外部サービスのコールを可能にします。パスワードの変更に使用されます。

public VCryptResponse setPassword(UIOSessionData sessionData, String password)

既存のパスワードを必要としない外部サービスのコールを可能にします。パスワードを忘れた場合のフローなど、パスワードのリセットに使用されます。

public VCryptObjectResponse<String[]> getPasswordPolicyText(UIOSessionData sessionData)

パスワード変更またはパスワードのリセットのページで、カスタム・パスワード・ポリシーのテキスト表示を可能にします。ユーザーが確認する必要のある任意のメッセージを設定できますが、本来はユーザーにパスワードの書式と制約を知らせるためのものです。

21.9.3 ユーザー・データ・マネージャ

ユーザー・データ・マネージャでは、アクセスのカスタマイズと、携帯電話番号や電子メール・アドレスなどのユーザー・プロファイル・データの管理が可能です。デフォルトでは、OAAMによってOAAMデータベースのユーザー・データが格納および取得されます。ユーザー・データ・マネージャのカスタム実装を使用すると、統合で外部サービスをコールできます。

ユーザー・データで外部サービスを使用する場合、OAAMデータベースで、設定されるユーザー・データの有無を追跡するために使用されるフラグを設定することをお薦めします。

ユーザー・データ・マネージャをカスタマイズするには、com.bharosa.uio.manager.user.DefaultContactInfoManagerクラスを拡張することをお薦めします。このクラスは、com.bharosa.uio.manager.user.UserDataManagerIntfインタフェースを実装します。

ユーザー・データ・フィールドごとに異なるユーザー・データ・マネージャを使用できます。これにより、必要に応じて各データ要素を別の外部サービスで保持できます。デフォルトでは、すべてのユーザー・データ・フィールドで同一のデータ・マネージャが使用されます。

カスタムのユーザー・データ・マネージャを登録するには、userinfo.inputs列挙のmanagerClassプロパティを設定します。

例: bharosa.uio.default.userinfo.inputs.enum.mobile.managerClass=com.bharosa.uio.manager.user.DefaultContactInfoManager

UserDataManagerIntfは、ユーザー・データを格納または取得するためのユーザー・データ・マネージャ・インタフェースです。

表21-9 UserDataManagerIntf

メソッド

説明

public String getUserData(UIOSessionData sessionData, String key)

キーのユーザー・データ値を取得します。

public void setUserData(UIOSessionData sessionData, String key, String value)

キーのユーザー・データ値を設定します。

DefaultContactInfoManager: ユーザー・データ・マネージャのデフォルトの実装。この実装では、データ値の設定と、値が設定されていることを示すフラグの設定が分割されます。

表21-10 DefaultContactInfoManager

メソッド

説明

public String getUserData(UIOSessionData sessionData, String key)

getUserDataFlagがtrueを戻す場合、getUserDataValueをコールします。

public void setUserData(UIOSessionData sessionData, String key, String value)

キーと値のsetUserDataValueおよびsetUserDataFlagをコールします。

protected String getUserDataValue(UIOSessionData sessionData, String key)

OAAMデータベースから、キーの値を取得します。

protected void setUserDataValue(UIOSessionData sessionData, String key, String value)

OAAMデータベースにキーの値を設定します。

protected boolean getUserDataFlag(UIOSessionData sessionData, String key)

OAAMデータベースで所定のキーのフラグが設定されている場合にtrueを返します。

protected void setUserDataFlag(UIOSessionData sessionData, String key, String value)

ユーザー・データ・キーに対して値が設定されているかどうかを示すフラグを設定します。渡された値が空の場合、フラグが消去されます。

21.10 レガシー・ルール結果プロセッサ

レガシー・ルール結果プロセッサでは、10gポリシーがサポートされています。プロパティは次のとおりです。

bharosa.uio.default.rules.result.processor.PasswordTextPadGeneric =
com.bharosa.uio.processor.rules.result.legacy.PasswordRulesResultProcessor
bharosa.uio.default.rules.result.processor.PasswordTextPad =
com.bharosa.uio.processor.rules.result.legacy.PasswordRulesResultProcessor
bharosa.uio.default.rules.result.processor.PasswordKeypad =
com.bharosa.uio.processor.rules.result.legacy.PasswordRulesResultProcessor
bharosa.uio.default.rules.result.processor.PasswordKeypadFull =
com.bharosa.uio.processor.rules.result.legacy.PasswordRulesResultProcessor
bharosa.uio.default.rules.result.processor.PasswordHTML =
com.bharosa.uio.processor.rules.result.legacy.PasswordRulesResultProcessor

bharosa.uio.default.rules.result.processor.RegisterUserOptionalQuestionPad =
com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterUserQuestionPad =
com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterUserOptionalTextPad =
com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterUserTextPad =
com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterUser =
com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterUserOptional =
com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterQuestionsQuestionPad =
com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterQuestionsTextPad =
com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterQuestions =
com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterImageTextPad =
com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor
bharosa.uio.default.rules.result.processor.RegisterImageKeyPad =
com.bharosa.uio.processor.rules.result.legacy.RegisterRulesResultProcessor

bharosa.uio.default.rules.result.processor.ChallengeQuestionPad =
com.bharosa.uio.processor.rules.result.legacy.ChallengeRulesResultProcessor
bharosa.uio.default.rules.result.processor.ChallengeSMS =
com.bharosa.uio.processor.rules.result.legacy.ChallengeRulesResultProcessor
bharosa.uio.default.rules.result.processor.ChallengeEmail =
com.bharosa.uio.processor.rules.result.legacy.ChallengeRulesResultProcessor
bharosa.uio.default.rules.result.processor.ChallengeIM =
com.bharosa.uio.processor.rules.result.legacy.ChallengeRulesResultProcessor
bharosa.uio.default.rules.result.processor.ChallengeVoice =
com.bharosa.uio.processor.rules.result.legacy.ChallengeRulesResultProcessor
bharosa.uio.default.rules.result.processor.ChallengeQuestion =
com.bharosa.uio.processor.rules.result.legacy.ChallengeRulesResultProcessor

22 OAAMオフラインのカスタム・ローダーの開発

この章では、次のようにOAAMオフラインのデータ・ローダー・フレームワーク全般について説明します。

- 基本フレームワークとデフォルトの実装

- デフォルト機能のオーバーライド方法

この章は次の項で構成されています:

- 第22.1項「OAAMオフラインのカスタム・ローダーの開発」

- 第22.2項「基本フレームワーク」

- 第22.3項「デフォルトの実装」

- 第22.4項「実装の詳細: ローダーまたは再生の動作のオーバーライド」

- 第22.5項「RiskAnalyzerDataSourceの実装」

- 第22.6項「RunModeの実装」

このドキュメントは、読者がOAAMオフラインの概念に精通していることを前提としています。

22.1 OAAMオフラインのカスタム・ローダーの開発

カスタム・ローダーの抽象クラスは、IDM_Homeディレクトリ内のoaam/cli/libフォルダ内にあるoaam_core.jarに格納されています。

自分のカスタム・ローダーをデプロイするには、次の手順に従います。

1. oracle.oaam.extensions.warファイルをORACLE_MW_HOME/Oracle_IDM1/oaam/oaam_extensions/genericフォルダから抽出します。

2. WEB-INF/libフォルダに自分のjarファイルを配置します。

3. oracle.oaam.extensions.warファイルを再びパッケージします。

4. Oracle WebLogic管理コンソールで、oracle.oaam.extensionsライブラリを更新して再起動し、OAAMオフライン・アプリケーションを再起動します。
カスタム・ローダーが、OAAMサーバー・データベースからトランザクションをロードします。

22.2 基本フレームワーク

カスタム・ローダーが必要になるのは、データベース以外のソースからのデータやログイン情報以外のデータが存在する場合、またはOAAMオフライン・タスクで複雑なデータが必要な場合のみです。

22.2.1 概要

OAAMオフラインのカスタム・ローダーは、次の主要部分から構成されます。

- ロード可能なオブジェクト

- データソース

- ローダー

- 実行モード

図22-1 カスタム・ローダーの基本フレームワーク

ロード可能なオブジェクトは、個々のデータ・レコードを表します。データソースは保存されたデータ・レコード全体を表し、ローダーはこれらのレコードを処理します。実行モードには、ロードと再生の2種類があります。これらの実行モードは、セッション・セットのロードとセッション・セットの実行との違いをカプセル化したものです。

22.2.2 重要なクラス

表22-1に、各種のデータ・ローダー・クラスの要約を示します。

表22-1 データ・ローダー・クラス

クラス

説明

RunMode

RunModeには基本的に、ロードと再生の2種類があります。

ロード実行モードはOAAMオフライン・システムにセッション・セット・データをインポートし、再生実行モードは事前ロードされたセッション・セット・データを処理します。それぞれの実行モードはデータソースとローダーを作成します。実行モードのその他の役割として、自動増分するセッション・セットや一時停止した後で再開される実行セッションのスケジューリングを繰り返し行う場合など、前のジョブが終了した時点からジョブを開始する方法を決定します。

AbstractLoadRunModeとAbstractPlaybackRunModeは、それぞれgetInstance()という名前のファクトリ・メソッドを持っています。このメソッドは、デフォルトの実行モードがオーバーライドされたかどうかを検証します。

RiskAnalyzerDataSource

RiskAnalyzerDataSourceは、反復中にデータを取得します。RiskAnalyzerDataSourceには、AbstractJDBCRiskAnalyzerDataSourceとAbstractTextFile-RiskAnalyzerDataSourceという2つの抽象インプリメンタが存在します。AbstractJDBCRiskAnalyzerDataSourceはJDBC結果セットを反復するための基本機能を、AbstractTextFileRiskAnalyzerDataSourceはテキスト・ファイルを反復するための基本機能をそれぞれ実装します。

AbstractTransactionRecord

AbstractTransactionRecordクラスには、リスク分析プロセス全体を管理するために必要な状態と動作のみが含まれています。サブクラスで、クライアント要件に応じてその他の状態と動作を追加できます。

AbstractRiskAnalyzerLoader

AbstractRiskAnalyzerローダーは、リスク・アナライザ・プロセスにおけるObjectLoaderの基本的な実装です。基本的な例外処理は提供されますが、それ以外については、サブクラスに実装を任せます。

22.2.3 一般的なフレームワーク実行

次の疑似コードは、一般的なフレームワーク実行を示しています。

AbstractRiskAnalyzerLoader loader = runMode.buildObjectLoader();
RiskAnalyzerDataSource dataSource = runMode.acquireDataSource();
try{
while (dataSource.hasMoreRecords()) {
AbstractTransactionRecord eachRecord = dataSource.nextRecord();
loader.process(eachRecord);
}
} finally {
dataSource.close();
}

22.3 デフォルトの実装

リスク・アナライザのデータ・ローダー・フレームワークのデフォルトの実装は次のとおりです。

ロード・モード: データソースとして任意のデータベースが使用され、ログイン・データが期待されます。また、デバイスのフィンガープリント処理が実行されます。

再生モード: データソースとしてVCRYPT_TRACKER_USERNODE_LOGS表とV_FPRINTS表が使用され、各レコードに対してすべてのアクティブ・モデルが実行されます。

22.3.1 デフォルトのロード実装

図22-2に、デフォルトのロード実装の要約を示します。

図22-2 デフォルトのロード実装

表22-2 デフォルトの実装

コンポーネント

説明

LoadRunMode

デフォルトのLoadRunModeクラスは、データソースとしてDatabaseRiskAnalyzerDatasourceを、ローダーとしてAuthFingerprintLoaderをそれぞれインスタンス化します。

DatabaseRiskAnalyzerDatasource

DatabaseRiskAnalyzerDatasourceは、JDBCデータソースからLoginRecordsを作成します。一連の構成プロパティを使用して、JDBCデータソースへの接続方法や、リモート・データベース内の表とフィールドからLoginRecordを作成する方法を指示します。これらのプロパティのデフォルト値は、OAAMデータベース内の表にマップされます。

LoginRecord

ログイン・レコードには、TrackerAPIUtilクラスでデバイスのフィンガープリント処理用のメソッドをコールする際に必要とされるすべての使用可能なフィールドが含まれます。

AuthFingerprintLoader

AuthFingerprintLoaderはLoginRecord内のデータを使用して、ログイン操作をシミュレートします。これにより、システムでデバイスのフィンガープリント処理とデバイス識別時間のルールが実行され、OAAMオフライン・データベース内にユーザー・ノード・ログとフィンガープリント・データが格納されます。

22.3.2 デフォルトの再生実装

図22-3に、デフォルトの再生実装の要約を示します。

図22-3 デフォルトの再生実装

表22-3 デフォルトの再生実装

コンポーネント

説明

PlaybackRunMode

デフォルトのPlaybackRunModeクラスは、データソースとしてUserNodeLogsRiskAnalyzerDataSourceを、ローダーとしてRunRulesLoaderをそれぞれインスタンス化します。

UserNodeLogsRiskAnalyzerDatasource

UserNodeLogsRiskAnalyzerDatasourceは、OAAMオフライン・データベース内のVCRYPT_TRACKER_USERNODE_LOGS表とV_FPRINTS表からLoginRecordsを作成します。

LoginRecord

ログイン・レコードには、TrackerAPIUtilクラスでルール処理用のメソッドをコールする際に必要とされるすべてのフィールドが含まれます。

RunRulesLoader

RunRulesLoaderは、正常な認証ステータスであるかぎり、すべてのLoginRecordsの認証前ルールとすべてのLoginRecordsの認証後ルールを処理します。

22.4 実装の詳細: ローダーまたは再生の動作のオーバーライド

いくつかのケースでは、デフォルトの動作のオーバーライドが必要になります。データベース以外のソースからデータをロードする場合やシステムにトランザクション・データをロードする場合、デフォルトのロード動作をオーバーライドする必要があります。ルール処理以外の手順を実行する場合は、デフォルトの再生動作をオーバーライドする必要があります。

図22-4 ローダーまたは再生動作のオーバーライド

22.5 RiskAnalyzerDataSourceの実装

JDBCデータベース以外のデータソースからログイン・データをロードする場合やトランザクション・データをロードする場合、RiskAnalyzerDataSourceのサブクラスを独自に作成する必要があります。それには2つの方法があり、AbstractJDBCRiskAnalyzerDataSourceを拡張するか、AbstractRiskAnalyzerDataSourceを拡張します。

22.5.1 AbstractJDBCRiskAnalyzerDataSourceの拡張

JDBC接続を介してなんらかのデータをロードしている場合、これは適切な選択肢です。これは、JCBC接続をオープンするためのデフォルトの動作、JDBC結果セットを作成するためのサブクラスを指定したSQL問合せの発行、データベースへのレコード総数のカウントの問合せを含みます。

次の3つの抽象メソッドを実装する必要があります。

- buildBaseSelect()。データの読取りに使用するSQL問合せを返します。ORDER BY文は含めないでください。スーパークラスがgetOrderByField()の実装を使用してORDER BY文を追加します。

- getOrderByField()。問合せのソート対象のデータベース・フィールドの名前を返します。通常、日付フィールドになります。

- buildNextRecord()。JDBC結果セットの1つ以上のレコードをロード可能なデータ・レコードに変換します。

スーパークラスにはprotectedフィールドが用意されており、前述の抽象クラスを実装する際に必要になります。最も重要なメソッドはresultSetで、JDBC結果セットを参照します。hasMoreRecords()をコールしてtrueが返された場合、resultSetが有効な状態にあり、現行のレコードを指していることが保証されます。また、buildNextRecord()を実装する際には、resultSetが有効な状態にあり、現行のレコードを指しているとみなしても問題ありません。

ユーザーが知っておく必要のあるその他のフィールドは接続とコントローラです。接続は、リモート・データベースに対するJDBCを指しています。コントローラはRiskAnalyzerのインスタンスで、現行のOAAMオフライン・ジョブに関するコンテキスト情報を含みます。

デフォルトの動作が要件に合わない場合にオーバーライドできるその他のメソッドは、buildConnection()、buildSelectCountStatement()、getTotalNumberToProcess()およびbuildSelectStatement()です。

リモートJDBC接続のインスタンス化の方法を変更する場合、override buildConnection()を実行します。

読取り対象とするレコードの数をカウントするSQLを変更する場合、buildSelectCountStatement()をオーバーライドします。

読取り対象とするレコードの数を戻すアルゴリズムを置き換えたい場合、getTotalNumberToProcess()をオーバーライドします。これは、buildSelectCountStatement()をオーバーライドしても必要な動作が得られなかった場合にのみ実行します。

最後に、リモート・データベースからレコードを読み取るSQLを変更する場合(ORDER BY句の適用方法の変更など)、buildSelectStatement()をオーバーライドします。

第22.5.2項 AbstractRiskAnalyzerDataSourceの拡張

AbstractJDBCRiskAnalyzerDataSourceが適切でない場合は、かわりにAbstractRiskAnalyzerDataSourceを拡張する必要があります。たとえば、バイナリ・ファイルを読み取る場合や、カスタム再生モードのデータソースの実装中にTopLinkを使用してOAAMオフライン・データベースから読取りを行う場合に、その必要があります。

コンストラクタを使用して、データを反復できる状態にクラスを準備しておく必要があります。次の4つの抽象メソッドを実装する必要があります。

getTotalNumberToProcess()。特定のセッション・セット定義の条件を満たす、データソース内のレコードの総数を返します。

hasMoreRecords()。処理が必要なレコードが存在する場合にtrueを返し、必要に応じてレコード・ポインタを次の使用可能なレコードに移動します。シグナル用のnextRecordIsReadyというフラグも存在します。スーパークラスは、次の使用可能なレコードを使用した後でこのフラグをfalseに設定します。hasMoreRecords()の実装は、nextRecordIsReadyフラグの値を確認して、このフラグの値がfalseの場合にのみポインタを次のレコードに移動する必要があります。ポインタが次のレコードに正常に移動した後は、フラグの値をtrueに変更する必要もあります。このパラダイムに従う場合、nextRecordIsReadyがtrueのときにhasMoreRecords()の実装がコールされたときは、どのレコード・ポインタの状態も変更せずにtrueを戻す必要があります。

buildNextRecord()。AbstractTransactionRecordの必須のサブクラスの新しいインスタンスを返します。

close()。すべてのレコードの処理を終了したときにコールされます。必要なクリーンアップ処理は、ここで実行する必要があります。

テキスト・ファイルからのロード

ファイル・ベースのカスタム・ローダーを使用する必要がある場合は、AbstractRiskAnalyzerDataSourceを拡張してカスタム・クラスを実装します。それには、AbstractTextFileRiskAnalyzerDataSourceの動作を確認してそのコードをAbstractTextFileRiskAnalyzerDataSourceからコピーします。

22.6 RunModeの実装

ロード動作または再生動作のカスタマイズされたクラスを作成した場合、AbstractLoadLoginsRunMode、AbstractLoadTransactionsRunModeまたはPlaybackRunModeのカスタマイズされたサブクラスを要件に応じて作成する必要があります。

最も重要なRunModeメソッドはacquireDataSourceとbuildObjectLoaderです。

acquireDataSource(RiskAnalyzer)は、プロセスの実行に必要なRiskAnalyzerDataSourceのインスタンスを返します。RiskAnalyzerパラメータには、RunModeでデータソース・オブジェクトのインスタンス化に使用できるコンテキスト情報が含まれます。

buildObjectLoader(RiskAnalyzer)は、プロセスの実行に必要なAbstractRiskAnalyzerLoaderのインスタンスを返します。RiskAnalyzerパラメータには、RunModeでオブジェクト・ローダーのインスタンス化に使用できるコンテキスト情報が含まれます。

RunModeを実装する際には、オブジェクト・ローダーがデータソースと互換性があることを確認してください。つまり、返されるデータソースによって、オブジェクト・ローダーが期待する特定のタイプのロード可能なオブジェクトが生成されることを確認してください。

chooseStartDateRange(VCryptDataAccessMgr, RunSession)メソッドは、OAAMオフライン・ジョブの開始日範囲を判別するために使用されます。RunModeのすべてのインプリメンタには、このメソッドのデフォルトの実装が含まれます。デフォルトの動作は次のとおりです。ジョブの初回実行時の場合、実行セッションのセッション・セットから開始日(存在する場合)を戻すか、データソース内の最も早い日付よりも確実に早い任意の日付(セッション・セットに開始日が存在しない場合)を返します。再開されたジョブの場合は、実装に従って、ジョブ再開時にどのレコードから処理を開始するかを決めます。

22.6.1 AbstractLoadLoginsRunModeの拡張

ログイン・データのロード中にカスタム・データソースが必要な場合、これは適切な選択肢です。acquireDataSource(RiskAnalyzer)メソッドを実装して、カスタム・データソースの新しいインスタンスを戻す必要があります。AbstractRiskAnalyzerLoaderのカスタム実装が必要な場合は、この実装を戻すようにbuildObjectLoader(RiskAnalyzer)をオーバーライドできます。

AbstractLoadLoginsRunModeでは、再開時のログイン日付を判別するロジックが次のように実装されます。スーパークラス・メソッドretrieveLowerBoundDateFromQueryは、BharosaDBQueryを戻す抽象メソッドbuildQueryToRetrieveLowerBoundをコールします。このクラスのbuildQueryToRetrieveLowerBoundの実装は、最新のVCryptTrackerUserNodeLog.createTimeを選択します。

必要に応じて、この動作をオーバーライドする必要があります。buildQueryToRetrieveLowerBoundをオーバーライドして、問合せに追加の基準を追加したり、問合せ全体を置き換えることができます。唯一の要件は、問合せが単一の日付型の結果を戻すことです。かわりに、retrieveLowerBoundDateFromQueryやchooseStartDateRangeの各メソッドをオーバーライドして、このアルゴリズムを置き換えたり拡張することもできます。

22.6.2 AbstractLoadTransactionsRunModeの拡張

カスタム・データソースが必要なため、トランザクション・データをロードする場合、これは適切な選択肢です。acquireDataSource(RiskAnalyzer)メソッドを実装して、カスタム・データソースの新しいインスタンスを戻す必要があります。AbstractRiskAnalyzerLoaderのカスタム実装が必要な場合は、この実装を戻すようにbuildObjectLoader(RiskAnalyzer)をオーバーライドできます。

AbstractLoadTransactionsRunModeでは、再開時のログイン日付を判別するロジックが次のように実装されます。スーパークラス・メソッドretrieveLowerBoundDateFromQueryは、BharosaDBQueryを戻す抽象メソッドbuildQueryToRetrieveLowerBoundをコールします。このクラスのbuildQueryToRetrieveLowerBoundの実装は、最新のVTransactionLog.createTimeを選択します。

必要に応じて、この動作をオーバーライドする必要があります。buildQueryToRetrieveLowerBoundをオーバーライドして、問合せに追加の基準を追加したり、問合せ全体を置き換えることができます。唯一の要件は、問合せが単一の日付型の結果を戻すことです。かわりに、retrieveLowerBoundDateFromQueryやchooseStartDateRangeの各メソッドをオーバーライドして、このアルゴリズムを置き換えたり拡張することもできます。

22.6.3 PlaybackRunModeの拡張

デフォルトの再生データソースまたは処理動作の置換を必要とする要件の場合、これは適切な選択肢です。実装される抽象メソッドはありませんが、スーパークラス・メソッドをオーバーライドして要件を満たすことができます。

カスタム・データソースが必要な場合は、このデータソースを戻すようにacquireDataSource(RiskAnalyzer)をオーバーライドできます。AbstractRiskAnalyzerLoaderのカスタム実装が必要な場合は、この実装を戻すようにbuildObjectLoader(RiskAnalyzer)をオーバーライドできます。

PlaybackRunModeでは、再開時のログイン日付を判別するロジックが次のように実装されます。chooseStartDateRangeメソッドは、次の選択肢から最新の日付を選択します。セッション・セットの開始日(NULLでない場合)、実行セッションの最終処理日(NULLでない場合)、およびデータソース内の最も早い日付よりも確実に早い任意の日付です。3つ目のオプションは、最初の2つがNULLの場合にのみ選択されます。

23 OAAM Oracle BI Publisherレポートの作成

この章では、OAAMデータベース・スキーマ内のデータでOracle BI Publisherレポートを作成する方法について説明します。

この章は次の項で構成されています:

- 第23.1項「OAAMデータベース・スキーマ内のデータでのOracle BI Publisherレポートの作成」

- 第23.2項「OAAMトランザクション・レポートの作成」

23.1 OAAMデータベース・スキーマ内のデータでのOracle BI Publisherレポートの作成

Oracle Adaptive Access ManagerデータベースからOAAMレポートを作成する方法については、次の各項を参照してください。コード・リストでは、OAAM表とフィールドの名前は太字および斜体になっています。

23.1.1 データ・モデルの作成

新しいレポートの作成手順については、『Oracle Business Intelligence Publisherレポート・デザイナーズ・ガイド』を参照してください。

23.1.2 ユーザー定義列挙の数値型コードと読取り可能な名前のマップ

多くの表のいくつかのフィールドは、OAAMユーザー定義列挙に対応する数値型コードです。OAAMのユーザー定義列挙の詳細は、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。この項では、これらの型コードを読取り可能な名前にマップする方法について説明します。

これらの名前を解決する方法は2つあり、どちらを使用するかは、英語のみで表示するか、国際化した文字列で表示するかにより決まります。

23.1.2.1 結果表示

レポート出力に型コード値ではなく読取り可能な文字列を表示するには、ユーザー定義列挙を保持する表に結合を追加し、select句にフィールドを追加する必要があります。

23.1.2.2 英語のみのユーザー定義列挙の結果表示

次のSQLコードは、問合せに結合基準を追加する方法を示しています。

SELECT …
FROM …
LEFT OUTER JOIN (
SELECT enumElement.num_value, enumElement.label
FROM v_b_enum enum
INNER JOIN v_b_enum_elmnt enumElement ON on enum.enum_id =
enum_element.enum_id
WHERE enum.prop_name = 'enum name') alias
ON table.type_field = alias.num_value
…

このコード中のtable.type_fieldは、文字列に置き換える型コード値を格納するフィールドです。aliasは、内部select句に渡す名前です。最後に、enum_nameは、ユーザー定義列挙のプロパティ名です。

レポートに表示するには、select句にalias.labelを追加する必要があります。

23.1.2.3 国際化したユーザー定義列挙の結果表示

次のSQLコードは、問合せに結合基準を追加する方法を示しています。

SELECT …
FROM …
LEFT OUTER JOIN (
SELECT t0.config_value, element.num_value
FROM v_b_config_rb t0
INNER JOIN (
SELECT enum_element.num_value, enum_element.str_value, enum.prop_name
FROM v_b_enum enum
INNER JOIN v_b_enum_elmnt enum_element ON enum.enum_id =
enum_element.enum_id
WHERE enum.prop_name = 'enum name') element
ON t0.config_name=element.prop_name || '.' || element.str_value ||
'.name'
WHERE t0.locale_id = (
SELECT locale_id FROM v_b_locale
WHERE language = substr(:xdo_user_ui_locale, 1, 2)
AND country = substr(:xdo_user_ui_locale, 4, 2)
AND (substr(:xdo_user_ui_locale, 1, 2) in ('de', 'en', 'es',
'fr', 'it', 'ja', 'ko')
OR (substr(:xdo_user_ui_locale, 1, 2) = 'pt' AND
substr(:xdo_user_ui_locale, 4, 2) = 'BR')
OR (substr(:xdo_user_ui_locale, 1, 2) = 'zh' AND
substr(:xdo_user_ui_locale, 4, 2) IN ('CN', 'TW')))
UNION SELECT locale_id FROM v_b_locale
WHERE language = substr(:xdo_user_ui_locale, 1, 2)
AND NOT EXISTS(SELECT locale_id FROM v_b_locale
WHERE language = substr(:xdo_user_ui_locale, 1, 2)
AND country = substr(:xdo_user_ui_locale, 4, 2))
AND country IS NULL
AND (substr(:xdo_user_ui_locale, 1, 2) in ('de', 'en',
'es', 'fr', 'it', 'ja', 'ko')
OR (substr(:xdo_user_ui_locale, 1, 2) = 'pt' AND
substr(:xdo_user_ui_locale, 4, 2) = 'BR')
OR (substr(:xdo_user_ui_locale, 1, 2) = 'zh' AND
substr(:xdo_user_ui_locale, 4, 2) IN ('CN', 'TW')))
UNION SELECT locale_id FROM v_b_locale
WHERE language = 'en'
AND NOT (substr(:xdo_user_ui_locale, 1, 2) in ('de', 'en',
'es', 'fr', 'it', 'ja', 'ko')
OR (substr(:xdo_user_ui_locale, 1, 2) = 'pt' AND
substr(:xdo_user_ui_locale, 4, 2) = 'BR')
OR (substr(:xdo_user_ui_locale, 1, 2) = 'zh' AND
substr(:xdo_user_ui_locale, 4, 2) IN ('CN', 'TW'))))
ORDER BY t0.config_name) alias
ON table.type_field = alias.num_value
…

このコード中のtable.type_fieldは、文字列に置き換える型コード値を格納するフィールドです。aliasは、内部select句に渡す名前です。最後に、enum_nameは、ユーザー定義列挙のプロパティ名です。

レポートに表示するには、select句にalias.config_valueを追加する必要があります。

23.1.3 値リストの追加

ユーザーがレポートと対話して目的のデータをデータ・セットから指定できるよう、レポート定義にパラメータを追加します。

型コードを表す読取り可能な文字列のリストから選択できるようにするには、ユーザー定義列挙の表に対する問合せによって値リスト(LOV)を作成し、列挙名でフィルタ処理する必要があります。

23.1.3.1 値リストとしてユーザー定義列挙を使用したフィルタ処理 - 英語のみ

次のリストは、値リストにデータを移入するための問合せを作成する方法を示しています。

SELECT enumElement.label, enumElement.num_value
FROM v_b_enum enum
INNER JOIN v_b_enum_elmnt enumElement ON on enum.enum_id =
enumElement.enum_id
WHERE enum.prop_name = 'enum name'
ORDER BY enumElement.label

次のリストは、このLOVに基づいてレポートをフィルタ処理する方法を示しています。

WHERE …
AND (:parameter IS NULL OR :parameter = table.type_field)

これらのリスト中のenum_name、table.type_fieldおよびparameterは、それぞれユーザー定義列挙のプロパティ名、文字列に置き換える型コード値を格納するフィールドおよび名前付きパラメータです。レポート・パラメータの作成と設定の詳細は、Oracle BI Publisherユーザーズ・ガイドを参照してください。

23.1.3.2 値リストとしてユーザー定義列挙を使用したフィルタ処理 - 国際化

次のリストは、値リストにデータを移入するための問合せを作成する方法を示しています。

SELECT t0.config_value, element.num_value
FROM v_b_config_rb t0
INNER JOIN (
SELECT enum_element.num_value, enum_element.str_value, enum.prop_name
FROM v_b_enum enum
INNER JOIN v_b_enum_elmnt enum_element ON enum.enum_id =
enum_element.enum_id
WHERE enum.prop_name = 'enum name') element
ON t0.config_name=element.prop_name || '.' || element.str_value || '.name'
WHERE t0.locale_id = (
SELECT locale_id FROM v_b_locale
WHERE language = substr(:xdo_user_ui_locale, 1, 2)
AND country = substr(:xdo_user_ui_locale, 4, 2)
AND (substr(:xdo_user_ui_locale, 1, 2) in ('de', 'en', 'es', 'fr',
'it', 'ja', 'ko')
OR (substr(:xdo_user_ui_locale, 1, 2) = 'pt' AND substr
(:xdo_user_ui_locale, 4, 2) = 'BR')
OR (substr(:xdo_user_ui_locale, 1, 2) = 'zh' AND substr(:xdo_
user_ui_locale, 4, 2) IN ('CN', 'TW')))
UNION SELECT locale_id FROM v_b_locale
WHERE language = substr(:xdo_user_ui_locale, 1, 2)
AND NOT EXISTS(SELECT locale_id FROM v_b_locale
WHERE language = substr(:xdo_user_ui_locale, 1, 2)
AND country = substr(:xdo_user_ui_locale, 4, 2))
AND country IS NULL
AND (substr(:xdo_user_ui_locale, 1, 2) in ('de', 'en', 'es',
'fr', 'it', 'ja', 'ko')
OR (substr(:xdo_user_ui_locale, 1, 2) = 'pt' AND
substr(:xdo_user_ui_locale, 4, 2) = 'BR')
OR (substr(:xdo_user_ui_locale, 1, 2) = 'zh' AND
substr(:xdo_user_ui_locale, 4, 2) IN ('CN', 'TW')))
UNION SELECT locale_id FROM v_b_locale
WHERE language = 'en'
AND NOT (substr(:xdo_user_ui_locale, 1, 2) in ('de', 'en', 'es',
'fr', 'it', 'ja', 'ko')
OR (substr(:xdo_user_ui_locale, 1, 2) = 'pt' AND substr(:xdo_
user_ui_locale, 4, 2) = 'BR')
OR (substr(:xdo_user_ui_locale, 1, 2) = 'zh' AND substr(:xdo_
user_ui_locale, 4, 2) IN ('CN', 'TW'))))
ORDER BY t0.config_name

フィルタ処理の方法は、英語のみの場合と同じです。

23.1.4 地理的位置データの追加

OAAMデータベース・スキーマには、IPアドレス範囲と位置データ(市町村、都道府県、国など)をマップする表が含まれています。関連する表は、VCRYPT_IP_LOCATION_MAP、VCRYPT_CITY、VCRYPT_STATEおよびVCRYPT_COUNTRYです。多くの表にIPアドレスが含まれており、VCRYPT_IP_LOCATION_MAPには、VCRYPT_CITY、VCRYPT_STATEおよびVCRYPT_COUNTRYのそれぞれに対応する外部キーが含まれています。

OAAMでは、IPアドレスは長い数値として格納されます。次のリストは、IPアドレスを含む表をVCRYPT_IP_LOCATION_MAPに結合する方法を示しています。

SELECT ...
FROM vcrypt_tracker_usernode_logs logs
INNER JOIN vcrypt_ip_location_map loc ON (
logs.remote_ip_addr >= loc.from_ip_addr AND logs.remote_ip_addr <=
loc.from_ip_addr
)

ユーザー入力や表示目的では、一般に4つの要素で構成される標準IPアドレスを使用します。次のリストは、数値IPアドレスを標準IPとして表示する方法を示しています。ipFieldは、表示する数値IPアドレスを含むフィールドまたはパラメータです。

…
to_char(to_number(substr(to_char(ipField, 'XXXXXXXX'), 1, 3), 'XX')) || '.' ||
to_char(to_number(substr(to_char(ipField, 'XXXXXXXX'), 4, 2), 'XX')) || '.'
||
to_char(to_number(substr(to_char(ipField, 'XXXXXXXX'), 6, 2), 'XX')) || '.'
||
to_char(to_number(substr(to_char(ipField, 'XXXXXXXX'), 8, 2), 'XX'))
...

次のリストは、標準IPアドレスを長い数値フォーマットに変換する方法を示しています。

…
to_number(substr(ipField, 1, instr(ipField, '.')-1))*16777216 +
to_number(substr(ipField, instr(ipField, '.', 1, 1)+1, instr(ipField, '.',
1, 2)-instr(ipField, '.', 1, 1)-1))*65536 +
to_number(substr(ipField, instr(ipField, '.', 1, 2)+1, instr(ipField, '.',
1, 3)-instr(ipField, '.', 1, 2)-1))*256 +
to_number(substr(ipField, instr(ipField, '.', 1, 3)+1))

23.1.5 セッションおよびアラートの追加

セッションおよびアラートは、それぞれVCRYPT_TRACKER_USERNODE_LOGS表およびVCRYPT_ALERT表に存在します。これらはREQUEST_IDフィールドを介して相互に結合され、それぞれVCRYPT_IP_LOCATION_MAP表を使用してBASE_IP_ADDRフィールドを介して地理的位置データに結合されます。

23.1.5.1 型コードの参照

セッション表とアラート表には、ユーザー定義列挙を名前で参照して読取り可能なテキストに変換できる型コード・フィールドがいくつか含まれています。

表23-1に、型コードの各フィールドと、VCRYPT_TRACKER_USERNODE_LOGSのユーザー定義列挙の名前を示します。

表23-1 VCRYPT_TRACKER_USERNODE_LOGS

フィールド名

ユーザー定義列挙の名前

AUTH_STATUS

auth.status.enum

AUTH_CLIENT_TYPE_CODE

auth.client.type.enum

表23-2に、型コードの各フィールドと、VCRYPT_ALERTのユーザー定義列挙の名前を示します。

表23-2 VCRYPT_ALERT

フィールド名

ユーザー定義列挙の名前

ALERT_LEVEL

alert.level.enum

ALERT_TYPE

alert.type.enum

ALERT_STATUS

alert.status.enum

RUNTIME_TYPE

profile.type.enum

23.1.6 例

このレポートには、ユーザーID、ログインID、認証ステータスおよび位置で構成されるセッション・リストが表示されます。最初に、fromDateとtoDateの2つの日付パラメータを作成する必要があります。問合せは次のようになります。

SELECT s.request_id, s.user_id, s.user_login_id, auth.label, country.country_name,
state.state_name,
city.city_name
FROM vcrypt_tracker_usernode_logs s
INNER JOIN vcrypt_ip_location_map loc ON s.base_ip_addr = loc.base_ip_addr
INNER JOIN vcrypt_country country ON loc.country_id = country.country_id
INNER JOIN vcrypt_state loc ON loc.state_id = country.state_id
INNER JOIN vcrypt_city city ON loc.city_id = city.city_id
LEFT OUTER JOIN (
SELECT enumElement.num_value, enumElement.label
FROM v_b_enum enum
INNER JOIN v_b_enum_elmnt enumElement ON on enum.enum_id =
enum_element.enum_id
WHERE enum.prop_name = 'auth.status.enum') auth
ON s.auth_status = auth.num_value
WHERE (:fromDate IS NULL OR s.create_time >= :fromDate)
AND (:toDate IS NULL OR s.create_time <= :toDate)
ORDER BY s.create_time DESC

23.1.7 レポート定義へのレイアウトの追加

BI Publisherには、レポート用のテンプレートを設計するための各種オプションが用意されています。テンプレートの設計手順については、『Oracle Business Intelligence Publisherレポート・デザイナーズ・ガイド』を参照してください。

23.2 OAAMトランザクション・レポートの作成

この項では、トランザクション・レポートを作成する方法について説明します。内容は次のとおりです。

- エンティティおよびトランザクション情報の取得

- エンティティ・データのマッピング情報の取得

- トランザクション・データのマッピング情報の取得

- レポートの作成

23.2.1 エンティティおよびトランザクション情報の取得

トランザクション定義キーとエンティティ定義キーを取得するには、次の手順を実行します。

1. OAAM管理にログインし、「トランザクション」メニューに移動して、目的のトランザクション定義を検索します。

2. 「一般」タブに移動し、トランザクションの「定義キー」を書き留めます。これがトランザクションのトランザクション定義キーです。

3. トランザクションの「エンティティ」タブに移動し、一意のリストの「エンティティ名」でエンティティ名を書き留めます。

4. 「エンティティ」メニュー・オプションを選択してエンティティを検索し、各エンティティの「キー」を書き留めます。これがエンティティのエンティティ定義キーです。

23.2.2 エンティティ・データのマッピング情報の取得

レポートの作成時に必要になるエンティティ・データのマッピング情報を取得するには、この項の手順に従ってください。

23.2.2.1 データ型に関する情報

参考までに、表23-3に数値データ型を示します。

表23-3 データ型に関する情報

データ型

説明

1

文字列データを表します。

2

数値データを表します。格納されるデータは(元の値 * 1000)と等しくなります。

3

日付型のデータです。データは'YYYY-MM-DD HH24:MI:SS TZH:TZMフォーマットで格納および取得されます。

4

ブール型のデータです。文字列として格納されます。「True」はTRUEを表し、「False」はFALSEを表します。

23.2.2.2 エンティティ・データの詳細(データ型、行および列のマッピングなど)の取得

レポートの作成時に必要になるエンティティ・データの詳細を取得するには、次の手順を実行します。

1. OAAM管理コンソールでエンティティ定義を確認して、エンティティ定義キーを取得します。

2. SQL問合せを使用して、エンティティ・データのマッピングの詳細を取得します。

SELECT label,
data_row,
data_col,
data_type
FROM vt_data_def_elem
WHERE status =1
AND data_def_id =
(SELECT data_def_id
FROM vt_data_def_map
WHERE relation_type   ='data'
AND parent_obj_type   =3
AND parent_object_id IN
(SELECT entity_def_id
FROM vt_entity_def
WHERE entity_def_key=<Entity Definition Key>
AND status =1
)
)
ORDER BY data_row ASC,
data_col ASC;

23.2.2.3 エンティティ・データのSQL問合せおよびビューの作成

前述のSQL問合せを使用すると、エンティティのデータ・フィールドとしてデータ型、行位置および列位置が一覧表示されます。その情報からエンティティを指定し、そのエンティティの次のデータに基づくSQL問合せを作成します。指定したエンティティのデータを表すビューを作成する場合も、このSQL問合せを基準にすることをお薦めします。

注意:

EntityRowNは、エンティティ・データの行を表します。前述の問合せによりエンティティの3つの異なるdata_row値が取得された場合は、3つのEntityRowを扱い、別名をEntityRow1、EntityRow2のようにし、同様に、次に示すように、対応する結合を処理します。

SELECT ent.ENTITY_ID,
ent.EXT_ENTITY_ID,
ent.ENTITYNAME,
ent.ENTITY_KEY,
ent.ENTITY_TYPE,
EntityRowN<row>.DATA<col> <column_name>,
(EntityRowN<row>.NUM_DATA<col>/ 1000.0) <numeric_column_name>,
to_timestamp_tz(EntityRowN<row>.DATA<col>, 'YYYY-MM-DD HH24:MI:SS TZH:TZM')
<date_column_name>,
ent.CREATE_TIME,
ent.UPDATE_TIME,
ent.EXPIRY_TIME,
ent.RENEW_TIME
FROM
VT_ENTITY_DEF entDef,
VT_ENTITY_ONE ent
LEFT OUTER JOIN VT_ENTITY_ONE_PROFILE EntityRowN
ON (EntityRowN.ENTITY_ID    = ent.ENTITY_ID
AND EntityRowN.ROW_ORDER    = <row>
AND EntityRowN.EXPIRE_TIME IS NULL)
LEFT OUTER JOIN VT_ENTITY_ONE_PROFILE EntityRowN+1
ON (EntityRowN+1.ENTITY_ID    = ent.ENTITY_ID
AND EntityRowN+1.ROW_ORDER    = <row+1>
AND row1.EXPIRE_TIME IS NULL)
WHERE
ent.ENTITY_DEF_ID      = entDef.ENTITY_DEF_ID and
entDef.ENTITY_DEF_KEY=<Entity Definition Key>

23.2.3 トランザクション・データのマッピング情報の取得

レポートの作成時に必要になるトランザクション・データのマッピング情報を取得するには、この項の手順に従ってください。

23.2.3.1 トランザクション・データの詳細(データ型、行および列のマッピングなど)の取得

レポートの作成時に必要になるエンティティ・データの詳細を取得するには、次の手順を実行します。

1. 次のSQLを使用して、エンティティ定義のマッピングIdに対するトランザクションのリストを取得します。

SELECT map_id
FROM
vt_trx_ent_defs_map,
vt_trx_def
WHERE
vt_trx_ent_defs_map.trx_def_id = vt_trx_def.trx_def_id
AND vt_trx_def.trx_def_key  =<Transaction Definition Key>

2. 次のSQL問合せを使用して、すべてのトランザクション・データ・フィールド、データ型、行および列のマッピングの詳細を取得します。

SELECT label,
data_row,
data_col,
data_type
FROM vt_data_def_elem
WHERE status    =1
AND data_def_id =
(SELECT data_def_id
FROM vt_data_def_map
WHERE relation_type   ='data'
AND parent_obj_type   =1
AND parent_object_id IN
(SELECT trx_def_id
FROM vt_trx_def
WHERE trx_def_key='mayo_pat_rec_acc'
AND status       =1
)
)
ORDER BY data_row ASC,
data_col ASC;

23.2.3.2 トランザクション・データのSQL問合せおよびビューの作成

前の項の情報を使用して、次のトランザクション・データを表すSQL問合せを作成します。

注意: レポートの作成が容易になるよう、この問合せを基準にしてビューを作成することをお薦めします。エンティティおよびトランザクションのビューの作成方法については、第23.2.5項「エンティティおよびトランザクションのデータベース・ビューの生成」を参照してください。

SELECT trx.LOG_ID,
trx.USER_ID,
trx.REQUEST_ID,
trx.EXT_TRX_ID,
trx.TRX_TYPE,
trx.STATUS,
trx.SCORE,
trx.RULE_ACTION,
trx.TRX_FLAG,
trx.POST_PROCESS_STATUS,
trx.POST_PROCESS_RESULT,
TxnDataRowN<row>.DATA<col> <data_column_name>,
(TxnDataRowN<row>.NUM_DATA<col>/ 1000.0) <numeric_column_name>,
to_timestamp_tz(TxnDataRowN<row>.DATA<col>, 'YYYY-MM-DD HH24:MI:SS TZH:TZM')
<date_column_name>,
(SELECT entTrxMap.MAP_OBJ_ID
FROM VT_ENT_TRX_MAP entTrxMap
WHERE entTrxMap.DEF_MAP_ID = <Transaction to Entity Mapping Id of
Entity1_Name>
AND entTrxMap.TRX_ID       = trx.LOG_ID
) <EntityN_Name>,
(SELECT entTrxMap.MAP_OBJ_ID
FROM VT_ENT_TRX_MAP entTrxMap
WHERE entTrxMap.DEF_MAP_ID = <Transaction to Entity Mapping Id of
Entity2_Name>
AND entTrxMap.TRX_ID       = trx.LOG_ID
) <EntityN+1_Name>,
trx.CREATE_TIME,
trx.UPDATE_TIME,
TRUNC(trx.create_time, 'HH24') created_hour,
TRUNC(trx.create_time, 'DDD') created_day,
TRUNC(trx.create_time, 'DAY') created_week,
TRUNC(trx.create_time, 'MM') created_month,
TRUNC(trx.create_time, 'YYYY') created_year
FROM VT_TRX_DEF trxDef,
VT_TRX_LOGS trx
LEFT OUTER JOIN VT_TRX_DATA TransactionDataRowN
ON (TransactionDataRowN.TRX_ID         = trx.LOG_ID
AND TransactionDataRowN.ROW_ORDER      = <rowN>)
LEFT OUTER JOIN VT_TRX_DATA TransactionDataRowN+1
ON (TransactionDataRowN+1.TRX_ID         = trx.LOG_ID
AND TransactionDataRowN+1.ROW_ORDER      = <rowN+1>)
WHERE trx.TRX_DEF_ID      = trxDef.TRX_DEF_ID  and
trxDef.TRX_DEF_KEY=<Transaction Definition Key>

23.2.4 レポートの作成

エンティティおよびトランザクションのレポートを作成するには、この項の手順に従ってください。

23.2.4.1 エンティティ・データ・レポートの作成

23.2.2.3項「エンティティ・データのSQL問合せおよびビューの作成」の説明に従って作成したSQL問合せまたはビューを使用してください。

23.2.4.2 トランザクション・データ・レポートの作成

23.2.3.2項「トランザクション・データのSQL問合せおよびビューの作成」の説明に従って作成したSQL問合せまたはビューを使用してください。

23.2.4.3 エンティティ・データ表およびトランザクション・データ表の結合

疑似列<EntityN_Name>によって指定するVT_ENT_TRX_ MAP.MAP_OBJ_IDを使用すると、作成したトランザクション・データ・ビューとエンティティ・データ・ビューを結合できます。

23.2.5 エンティティおよびトランザクションのデータベース・ビューの生成

OAAMでは、エンティティ・データとトランザクション・データがデータベースに永続化されます。OAAMには、SQLスクリプト・ファイルを生成するためのコマンドライン・ツールが用意されています。このスクリプト・ファイルには、OAAMのエンティティおよびトランザクション用にビューを作成するためのSQL文が含まれます。

これらのビューを使用すると、特定の表の詳細を問い合せるのと比較して、データベース内のトランザクション関連データやエンティティ関連データをより簡単に表示できます。現在データベースで使用できるエンティティやトランザクションの包括的な状況に加えて、それらの関係性(トランザクションとエンティティの間、エンティティ間)に関する情報も表示されるからです。

23.2.5.1 SQLスクリプト・ファイルの生成

generateTrxEntityViewsSQLスクリプトが作成するSQLファイルを実行すると、データベース内に存在するトランザクションおよびエンティティ関連の定義とデータを表示するデータベース・ビューが作成されます。

このスクリプトでは、データベース内に存在するトランザクション定義やエンティティ定義に基づくSQLスクリプトが生成されます。

23.2.5.1.1 前提条件

スクリプトを実行する前に、OAAM CLI環境が設定されていることを確認します。CLI環境の設定手順については、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

- Oracle Enterprise Manager Fusion Middleware Control(<host>:<port>/em)を使用して、次の情報をCSFまたは資格証明ストアに追加する必要があります。
OAAMデータベース・ユーザー名とパスワード(マップoaamの下でキー名としてoaam_db_keyを指定)。

- 表23-4に、ビューを生成する前に、oaam_cli.propertiesファイルで設定する必要があるプロパティを示します。

表23-4 generateTrxEntityViewSQLを実行する前に設定するプロパティ

プロパティ

値

oaam.db.url

OAAMメタデータ・リポジトリ用のJDBC URL。

oaam.trxentityview.filename

生成されたSQLスクリプトが保存されるファイル名。デフォルト値はcreateTrxEntityViews.sqlです。

23.2.5.1.2 SQLスクリプトの生成

SQLスクリプト・ファイルを生成するには、OAAM CLIフォルダでgenerateTrxEntityViewsSQLスクリプトを実行します。

生成されるデフォルトのファイルはcreateTrxEntityViews.sqlです。このファイルには、各トランザクション定義またはエンティティ定義のビューを作成または更新するための作成と更新の問合せが含まれます。

23.2.5.2 エンティティおよびトランザクションのデータベース・ビューの作成

次の手順に従って、OAAMデータベース内に格納されているエンティティとトランザクションのデータベース・ビューを作成します。

1. OAAMデータベースのスキーマ・ユーザーとしてデータベースにログインします。

2. OAAMデータベースのスキーマ・ユーザーに対してGRANT CREATE VIEW権限を付与します。

3. OAAMデータベースのスキーマ・ユーザーとしてデータベースに接続します。
例: sqlplus DEV_OAAM/PASSWORD

4. createTrxEntityViews.sqlを実行します。
このスクリプトにより、OAAMデータベース内で定義されているエンティティおよびトランザクションごとにデータベース・ビューが作成されます。

23.2.5.3 エンティティ・ビューの詳細

OAAMで定義されているエンティティごとに、oaam_ent_entity_keyという名前のビューが作成されます。entity_keyは、OAAMで定義されているエンティティのキーに置き換えられます。作成されたビューには、エンティティで定義されているデータごとに1つの列が存在します。これらのデータ列に加えて、作成されたビューには次の列が含まれます。

- ENTITY_ID: エンティティ・インスタンスの一意の識別子

- CREATE_TIME: エンティティの作成時

- UPDATE_TIME: エンティティの最終更新時

23.2.5.4 トランザクション・ビューの詳細

OAAMで定義されているトランザクションごとに、oaam_trx_transaction_keyという名前のビューが作成されます。transaction_keyは、OAAMで定義されているトランザクションのキーに置き換えられます。作成されたビューには、トランザクションで定義されているデータごとに1つの列が存在します。

作成されたビューには、トランザクションで参照されているエンティティごとに1つの列が存在します。ここに、参照されたエンティティのentity_idが格納されます。たとえば、oaam_ent_entity_keyビューのentity_id列があります。インスタンス名に含まれるスペースは、列名では下線に置き換えられます。

- LOG_ID: トランザクションの一意の識別子

- USER_ID: トランザクションの実行ユーザー

- REQUEST_ID: このトランザクションが実行されたセッション

- EX_TRX_ID: このトランザクションの外部ID

- STATUS: トランザクションのステータス

- CREATE_TIME: エンティティが作成された時間

- UPDATE_TIME: エンティティの最終更新時間

- CREATED_HOUR: 最も近い時間に切り捨てた時間を作成します

- CREATED_DAY: 最も近い日に切り捨てた時間を作成します

- CREATED_WEEK: 最も近い週に切り捨てた時間を作成します

- CREATED_MONTH: 最も近い月に切り捨てた時間を作成します

- CREATED_YEAR: 最も近い年に切り捨てた時間を作成します

23.2.5.5 識別子

Oracleデータベースでは、表名、ビュー名、列名などの識別子の長さが30文字に制限されます。スクリプトで生成したビューがこの要件に準拠するように、次の識別子の制限に従ってエンティティ、トランザクションおよびデータフィールドの名前を付けてください。

- entity: 21 (ビューの名前は"oaam_ent_" + <entity_key>になる)

- トランザクション: 21 (ビューの名前は"oaam_trx_" + <transaction_key>になる)

- datafield: 28 (列の名前は"d_" + <data_element_name>になる)

- entity-ref: 20 (列の名前は<relationship_name> + "_entity_id"になる)

スクリプトでは、上の制限値よりも長い名前の識別子がトリミングされます。作成されたビューに対するSQL問合せを書き込む際には、トリミングされた列名やビュー名に注意してください。

名前に含まれるスペース、ダッシュ(-)およびピリオド(.)は、下線に置き換えられます。

23.2.5.6 ビューを作成するSQL問合せの例

エンティティ定義Addressに基づいてビューを作成する、一般的なSQL問合せを次に示します。このSQL問合せでは、oaam_ent_ADDRESSというビューが作成されます。

create or replace
force view oaam_ent_ADDRESS
as
(select
(ent.ENTITY_ID, ent.EXT_ENTITY_ID, ent.ENTITYNAME, ent.ENTITY_KEY,
ent.ENTITY_TYPE,ent.CREATE_TIME, ent.UPDATE_TIME, ent.EXPIRY_TIME,
ent.RENEW_TIME
from
VT_ENTITY_DEF entDef, VT_ENTITY_ONE ent left outer join
VT_ENTITY_ONE_PROFILE row0 on
(row0.ENTITY_ID = ent.ENTITY_ID
and row0.ROW_ORDER = 0
and row0.EXPIRE_TIME is null)
where entDef.ENTITY_DEF_KEY='Address'
and ent.ENTITY_DEF_ID = entDef.ENTITY_DEF_ID);

表23-5に、このビューで使用されている表を示します。

表23-5 エンティティ・ビューのエンティティ表

表

説明

VT_ENTITY_DEF

この表には、あらゆるエンティティの定義が含まれます。

VT_ENTITY_ONE

この表には、エンティティ・キー、名前、一意のIDおよび有効期限が含まれます。

VT_ENTITY_ONE_PROFILE

この表には、エンティティ・データが格納されています。

ビューは、特定のトランザクション定義やエンティティ定義に関する全情報、およびそれらの定義に関連付けられているすべてのデータを表示する単一のビューを提供します。スクリプトの実行後は、ビュー内のデータをいつでも必要に応じて参照できます。このビューを使用すると、様々な表からデータをマッピングするかわりに、1つの場所にまとめた統合ビューでデータを参照できます。表23-6に、oaam_ent_ADDRESSビューを示します。

表23-6 oaam_ent_ADDRESS

フィールド名

DB型

説明

ENTITY_ID

BIGINT

エンティティのID

EXT_ENTITY_ID

VARCHAR

外部エンティティID(クライアント提供)

ENTITYNAME

TEXT

エンティティの名前(エンティティ定義に従ってnamegenスキームで生成されたエンティティの名前)。

ENTITY_KEY

TEXT

エンティティのキー(エンティティ定義に従ってkeygenスキームで生成されたエンティティのキー)。このキーは、DB内に対象エンティティが存在するかどうかを調べる参照を実行する際に使用されます。

ENTITY_TYPE

INT

エンティティのタイプ

CREATE_TIME

DATETIME

オブジェクトが作成された日時

UPDATE_TIME

TIMESTAMP

日付値

EXPIRY_TIME

DATETIME

有効期限値。事前構成されたプロパティに従って設定されます(リクエスト時間からの日数)。

RENEW_TIME

DATETIME

更新日付値。この時間を過ぎてもエンティティが使用されている場合は、有効期限とrenew_timeが延長されます。

ROW_ORDER

INT

行順序(どんな数値データにも対応できるように0から始まります。10列をすべて使用し尽くした場合は、row_order 1の別のレコードが挿入されます。)

EXPIRE_TIME

DATETIME

プロファイルの有効期限が切れる日時

ENTITY_DEF_KEY

TEXT

エンティティのキー。住所、企業名などの情報です。

ENTITY_DEF_ID

BIGINT

エンティティ定義のID

24 構成可能なアクションの開発

Oracle Adaptive Access Managerには、構成可能なアクションが用意されています。ユーザーはこの機能を使用することにより、チェックポイント実行後に結果アクションまたはリスク・スコアリングあるいはその両方に基づいてトリガーされる新しい補足アクションを作成できます。この項では、構成可能なアクションをOracle Adaptive Access Managerソフトウェアに統合する方法について説明します。

この章では、次の内容を説明します。

- 第24.1項「新しい構成可能なアクションの追加」

- 第24.2項「構成可能なアクションの特定の順序での実行およびデータ共有」

- 第24.3項「構成可能なアクションのトリガーのテスト方法」

- 第24.4項「サンプルのJUnitコード」

- 第24.5項「構成アクション用のサンプルのJavaコード」

24.1 新しい構成可能なアクションの追加

新しい構成可能なアクションを追加するには、次のタスクを実行します。

1. Javaインタフェースcom.bharosa.vcrypt.tracker.dynamicactions.intf.DynamicActionを実装して、構成可能なアクションを開発します。

注意:

この手順では、実装とは、Javaインタフェースcom.bharosa.vcrypt.tracker.dynamicactions.intf.DynamicActionで指定されている規定に基づいてJavaコードを記述することです。

Javaインタフェースcom.bharosa.vcrypt.tracker.dynamicactions.intf.DynamicActionの実装時には、次の2つのメソッドをコーディングする必要があります。

- getParameters(): このメソッドでは、構成可能なアクションで使用されるパラメータを戻すためのコードを記述する必要があります。返されるパラメータ配列のサイズが、パラメータの数と同じであることを確認してください。

- execute(): このメソッドでは、構成可能なアクションで必要とされるロジックを実行するコードを記述する必要があります。構成可能なアクションのパラメータ値は、actionParamValueMapで渡されます。ここで、パラメータ名はキーで、RuntimActionParamValueオブジェクトは値になります。適切なgetXXXValue()メソッドを使用して、パラメータ値を取得します。

2. JARファイルを$ORACLE_IDM_HOME\oaam\cli\libフォルダからビルド・クラスパスに追加して、Oracle Adaptive Access Managerクラスを拡張または実装するカスタムJavaクラスをコンパイルします。

3. 構成可能なアクションの実装を詳細にテストします。
構成可能なアクションはスタンドアロンJavaクラスであるため、JUnitフレームワークのユニット・テスト方法を使用してテストできます。

構成可能なアクションをテストするためのサンプルJUnitコードについては、第24.4項「サンプルJUnitコード」を参照してください。

4. Javaクラスをコンパイルし、コンパイル済クラス・ファイルのJARファイルを作成します。

5. Oracle Adaptive Access Managerを拡張またはカスタマイズして、カスタムJARファイルを追加します。Oracle Adaptive Access ManagerへのカスタムJARファイルの追加手順については、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。

6. OAAMサーバーとOAAM管理サーバーを再起動します。

7. OAAM管理にログインし、新しくデプロイされた構成可能なアクションのアクション定義エントリを作成します。

8. 構成可能なアクションに必要なすべてのパラメータがユーザー・インタフェースに表示されていることを確認します。

9. 新しく使用可能になった構成可能なアクションを必要なチェックポイントに追加して使用します。構成可能なアクションの構成方法については、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

24.2 構成可能なアクションの特定の順序での実行およびデータ共有

構成可能なアクションを使用してチェーンを実装する際には、

- それらのアクションが特定の順序で実行され、

- アクション間でデータが共有されるようにできます。

注意:

構成可能なアクション間でデータを共有するにはJavaコードを記述する必要があるため、単純な構成作業よりも労力を要します。

構成可能なアクションを特定の順序で実行してデータを共有する手順は次のとおりです。

1. 構成可能なアクションを同期アクションとして構成し、昇順で実行されるようにします。

注意:

構成可能なアクションは、トリガー基準が満たされる場合にのみ実行されます。そのため、トリガー基準が間違っていないことを確認してください。

2. データを共有するには、構成可能なアクションのexecute()メソッドのactionContextMapパラメータに対象データを挿入します。actionContextMapはMapであるため、共有されるデータを表すキーと値のペアが必要になります。

注意:

実装者は次の点に留意する必要があります。

- データ挿入に重複するキーが使用されていないこと。

- この共有データを別の構成可能なアクションからアクセスする場合でも同じキーが使用されること。

3. actionContextMapにキーが存在しないケースもコードで処理されることを確認します。他のアクションがactionContextMapに値を挿入しない場合にエラーまたはNullPointerExceptionが発生しないよう、この手順を実行する必要があります。

24.3 構成可能なアクションのトリガーのテスト方法

構成可能なアクションがトリガーしていることをテストする手順は次のとおりです。

1. 構成可能なアクションのコードの実行を識別する方法があることを確認します。ログ・ファイルまたはデータベースの1つのエントリを参照するという単純な確認で十分です。

2. OAAMサーバーで、oracle.oaamロガーに対してデバッグ・レベルのログを有効にします。

3. 特定の構成可能なアクションのアクション・テンプレートを作成します。

4. 認証前チェックポイントにアクションを追加します。この際、トリガー基準を0から1000のスコアとして指定します。

5. OAAMサーバーにユーザーとしてのログインを試みます。

6. OAAMサーバーのログで、エントリEnter: executeAction(): Executing Action Instanceを確認します。

7. エラーがない場合は、Exit: executeAction(): Action Instanceのような関連するログ文が表示されます。

8. エラーがある場合は、Error: executeAction()のようなログ文が表示されます。

9. さらに、構成可能なアクションによって作成されたログ・エントリやデータベース・エントリを確認します。

24.4 サンプルのJUnitコード

動的アクションをテストするためのサンプルJUnitコードを次に示します。

public class TestDynamicActionsExecution extends TestCase {
static Logger logger = Logger.getLogger(TestDynamicActionsExecution.class);
private DynamicAction caseCreationAction = null;

public void setUp()throws Exception {
caseCreationAction = new CaseCreationAction();
}

public void testDynamicAction() {

//RequestId
String requestId = "testRequest";

//Request Time
Date requestTime = new Date();

//Map that contains values passed to the rule/model execution
Map ruleContextMap = new HashMap();

//Result from rule execution
VCryptRulesResultImpl rulesResult = new VCryptRulesResultImpl();
rulesResult.setResult("Allow");
rulesResult.setRuntimeType(new Integer(1));

//Configurable action's parameter values
Map actionParamValueMap = new HashMap();
RuntimeActionParamValue caseTypeParamValue = new
RuntimeActionParamValue();
caseTypeParamValue.setIntValue(CaseConstants.CASE_AGENT_TYPE);

RuntimeActionParamValue caseSeverityParamValue = new
RuntimeActionParamValue();
caseSeverityParamValue.setIntValue(1);

RuntimeActionParamValue caseDescriptionParamValue = new
RuntimeActionParamValue();
caseDescriptionParamValue.setStringValue("Testing CaseCreation
Action");

//ActionContext Map for passing data to/from the dynamic action
execution
Map actionContextMap = new HashMap();

//Execute the action
try {
caseCreationAction.execute(requestId, requestTime,
ruleContextMap, rulesResult, actionParamValueMap, actionContextMap);
}catch(Exception e) {
Assert.fail("Exception occurred while executing dynamic
action");
logger.error("Exception occcurred while executing dynamic
action", e);
}

//Write appropriate asserts to check if the configurable action
has executed properly
}

public void tearDown() throws Exception {

}
}

24.5 構成アクション用のサンプルのJavaコード

この項では、構成可能なアクション用のサンプル・コードを示します。

public class HelloWorldAction implements DynamicAction {

private UserDefEnum valueTypeEnum = UserDefEnum.getEnum("value.type.enum");

public boolean execute(String sessionId, Date requestTime,

Map ruleContextMap, VCryptRulesResult ruleResult,

Map actionParamValueMap, Map actionContextMap) throws Exception {

// TODO Auto-generated method stub

System.out.println("Hello World!!");

return false;

}

public DynamicActionParamInfo[] getParameters() {

DynamicActionParamInfo params[] = new DynamicActionParamInfo[3];

String paramName = "Sample Integer Parameter";

String description = "Integer Parameter Description";

String notes = "Integer Parameter Notes";

String promptLabel = "Integer Parameter";

int valueType = valueTypeEnum.getElementValue("int");

String defaultValue = "1";

params[0] = new DynamicActionParamInfo();

params[0].setParamName(paramName);

params[0].setPromptLabel(promptLabel);

params[0].setNotes(notes);

params[0].setDescription(description);

params[0].setValueType(valueType);

params[0].setDefaultValue(defaultValue);

paramName = "Sample String Parameter";

description = "String Parameter Description";

notes = "String Parameter Notes";

promptLabel = "String Parameter";

valueType = valueTypeEnum.getElementValue("string");

defaultValue = "Sample String value";

params[1] = new DynamicActionParamInfo();

params[1].setParamName(paramName);

params[1].setPromptLabel(promptLabel);

params[1].setNotes(notes);

params[1].setDescription(description);

params[1].setValueType(valueType);

params[1].setDefaultValue(defaultValue);

paramName = "Sample Boolean Parameter";

description = "Boolean Parameter Description";

notes = "Boolean Parameter Notes";

promptLabel = "Boolean Parameter";

valueType = valueTypeEnum.getElementValue("boolean");

defaultValue = "true";

params[2] = new DynamicActionParamInfo();

params[2].setParamName(paramName);

params[2].setPromptLabel(promptLabel);

params[2].setNotes(notes);

params[2].setDescription(description);

params[2].setValueType(valueType);

params[2].setDefaultValue(defaultValue);
return params;

}

}

25 チェックポイントおよび最終アクションの作成

チェックポイントは、Oracle Adaptive Access Managerがセッション内でルール・エンジンを使用してセキュリティ・データを収集および評価する特定のポイントです。

プロパティ・エディタを使用すると、新しいチェックポイントを追加したり、既存のチェックポイント・プロパティを変更できます。

この章では、新しいチェックポイントの作成方法と構成方法、および既存のチェックポイントの変更方法について説明します。この章の内容は次のとおりです。

- 第25.1項「新しいチェックポイントの作成」

- 第25.2項「チェックポイントの例の作成」

- 第25.3項「新しいアクション」

- 第25.4項「最終アクション」

25.1 新しいチェックポイントの作成

チェックポイントを作成するには、プロパティ・エディタを使用します。

次の参照用のチェックポイントの列挙が用意されています。

profile.type.enum.nameofcheckpoint=Checkpoint_Value
profile.type.enum.nameofcheckpoint.name=Checkpoint_Name
profile.type.enum.nameofcheckpoint.description=Checkpoint_Description
profile.type.enum.nameofcheckpoint.ruleTypes=user,device,location
profile.type.enum.nameofcheckpoint.listTypes=vtusers
profile.type.enum.nameofcheckpoint.finalactionrule=process_results.rule
profile.type.enum.nameofcheckpoint.isPreAuth=true

チェックポイント値は一意の値である必要があります。他のチェックポイントがこの識別子を使用していないことを確認してください。このIDは、データベース用語における主キーのような働きをします。たとえば、1001です。

チェックポイント名は、ユーザーが識別できる意味のある名前にする必要があります。この名前をOracle Adaptive Access Managerで使用します。

チェックポイントを正常に作成したら、「プロパティ」ボックスの「新規追加」ボタンをクリックして、適切なプロパティを追加します。

チェックポイントの必須プロパティは次のとおりです。

- finalactionrule=process_results.rule
finalactionruleプロパティは、最終アクションを決定するルール・ファイルを指定します。ルール・エンジンによってチェックポイントのポリシーが処理される際には、そのスコアとアクションのリストが決定されます。最終アクションのリストは、ルールの実行時に最終決定されたアクションのリストです。どのアクションを最終アクションに指定するかを決めるためにルール・ファイルが参照されます。これが最終アクションかどうかわからない場合は、他のチェックポイントと同様の値を設定してください。ほとんどのアクションは、即時利用可能なprocess_results.ruleファイルを使用しても十分実行できます。

ルール・ファイルの例については、第25.4項「最終アクション」を参照してください。

- listTypes= vtusers
listTypesは、必ずvtusersに設定します。

ポリシーは、onlyユーザー・グループにリンク付けできます。

- ruleTypes= user,device,location,in_session
ruleTypesプロパティは、チェックポイント時にサポートされるルール・タイプのリストを定義します。チェックポイントのコンテキストに応じて、user、device、locationおよびin_sessionを指定できます。複数の値はコンマを使用して区切ります。このチェックポイントでは、コンマで区切られたタイプのすべてのルールを使用できます。

たとえば、ruleTypesを「user,location」に設定した場合、このチェックポイントでは、userおよびlocationタイプのルールが使用でき、このチェックポイントのユーザー情報と位置情報が提供されます。

別の例として、Cancel OrderチェックポイントでruleTypesに「user,device,location」を指定した場合、userルール・タイプでは、Cancel Orderチェックポイント中にユーザー情報の提供が期待されます。Cancel Orderチェックポイント時にユーザー情報を提供しない場合は、このリストにuserを含めないでください。

追加できるその他のプロパティは次のとおりです。

- isPreAuth
Trueは、このチェックポイントが認証前チェックポイントであることを示します。OAAM管理は、認証前スコアと認証前アクションでユーザー詳細を更新します。isPreAuthのデフォルトの値はfalseです。このフラグをtrueに設定した2つのチェックポイントは存在できません。また、同じチェックポイントはpostAuthとpreAuthの両方としてマークできません。

- isPostAuth
Trueは、このチェックポイントが認証後チェックポイントであることを示します。OAAM管理は、認証後スコアと認証後アクションでユーザー詳細を更新します。isPostAuthのデフォルトの値はfalseです。このフラグをtrueに設定した2つのチェックポイントは存在できません。また、同じチェックポイントはpostAuthとpreAuthの両方としてマークできません。

チェックポイントを作成したら、サーバーを再起動する必要があります。

25.2 チェックポイントの例の作成

addressChangeチェックポイントの作成例を次に示します。

profile.type.enum.addressChange=88
profile.type.enum.addressChange.name=Address Change
profile.type.enum.addressChange.description=Address Change checkpoint
profile.type.enum.addressChange.ruleTypes=user,device,location
profile.type.enum.addressChange.listTypes=vtusers
profile.type.enum.addressChange.finalactionrule=process_results.rule
profile.type.enum.addressChange.isPreAuth=true

ここでは、finalactionruleに「process_results.rule」が指定されています。ルール評価時における特定のチェックポイントの最終アクションは、このルール・ファイルによって決定されるからです。process_results.ruleファイルは即時利用可能なため、追加手順の実行は不要です。

25.3 新規アクション

新規アクションは、アクション・グループを定義してアクションを追加するときにOAAM管理で定義できます。ここで、アクションの作成を選択できます。また、rule.action.enumに要素を追加して、アクションを作成することもできます。

25.4 最終アクション

定義する新規アクションがチェックポイントの最終アクションである場合、次の手順を実行する必要があります。

1. そのチェックポイントのruleファイルを検索するか、そのファイルを定義します(新しいチェックポイントを作成する場合)。このファイルは、ルールの実行時に、最終であるはずのアクションが最終アクションのリストに含まれていることを保証します。
デフォルトのファイルを使用しない場合は、次の例を参考にして、このファイルの内容を確認してください。ルール・ファイルは、OAAMサーバーのクラスパスにあるOAAM拡張ライブラリに含めます。

==
<rule name="Block" no-loop="true" salience="100">
<parameter identifier="actionList">
<class>java.util.List</class>
</parameter>
.
<java:condition>actionList.contains("Block")</java:condition>
.
<java:consequence>
if (logger != null){
logger.debug("Executing Block condition");
}
.
finalAction.append("Block");
drools.clearAgenda();  <!-- This stops any other rules from being
evaluated -->
</java:consequence>
</rule>

2. そのチェックポイントのfinalactionruleプロパティを検索するか、そのプロパティを作成します。
たとえば、チェックポイントXのプロパティは、次のようになります。

profile.type.enum.X.finalactionrule=some_file_name.rule

3. 共有ライブラリにルール・ファイルを追加して、そのライブラリをOAAMサーバーに対して使用可能にします。OAAM_extensionsライブラリはサーバーで使用可能なため、そのライブラリにファイルをパッケージ化できます。

前述の例では、最終アクションのリストにBlockアクションが含まれていました。独自のチェックポイントを定義する場合は、前述の手順を実行した後で、作成したファイルを指すようにfinalactionruleプロパティを設定できます。前述のruleファイルは、サーバーのクラスパスに含めてください。この情報をoaam_serverおよびoaam_offlineサーバーが使用できるようにするためです。ルール・ファイルの定義または作成が終了したら、各サーバーを再起動する必要があります。

第VI部

ライフサイクル管理

第VI部の構成は次のとおりです。

- 第26章「ライフサイクル管理変更の処理」

26 ライフサイクル管理変更の処理

Oracle Adaptive Access Managerを他のアプリケーションや、Oracle Virtual Directory、Oracle Identity Manager、Oracle Access Management Access Manager、Oracle Internet Directoryなどと統合してデプロイし、これらのアプリケーションで構成変更を行うと、Oracle Adaptive Access Managerで様々な構成変更が必要になります。これらの項では、このようなタイプの構成変更を処理するための指示について説明します。

- 第26.1項「Oracle Virtual Directory (OVD)のホスト、ポートおよびSSL有効化の変更」

- 第26.2項「Oracle Identity Manager (OIM)のURL変更」

- 第26.3項「Oracle Access Management Access Managerのホストとポートの変更」

- 第26.4項「Oracle Internet Directory (OID)のホストとポートの変更およびSSL有効化」

- 第26.5項「データベースのホストとポートの変更」

- 第26.6項「Oracle Adaptive Access Managerの新しい本番環境への移行」

- 第26.7項「Oracle Adaptive Access Managerの既存の本番環境への移行」

Oracle Adaptive Access Managerのテスト環境から本番環境への移行方法を示すドキュメントも紹介されます。

- Oracle Adaptive Access Managerの新しい本番環境への移行

- Oracle Adaptive Access Managerの既存の本番環境への移行

26.1 Oracle Virtual Directory (OVD)のホスト、ポートおよびSSL有効化の変更

Oracle Virtual Directoryのホスト、ポートおよびSSL有効化を変更する手順は次のとおりです。

1. Oracle Adaptive Access Managerサーバー関連の管理対象サーバーを起動します。

2. 「OAAM管理」に移動します。

http://OAAM_Managed_Server_Host:OAAM_Admin_Managed_Server_Port/oaam_admin

3. OAAMプロパティ・エディタにアクセス可能なユーザーとしてログインします。

4. OAAMプロパティ・エディタを開き、パラメータを編集します。

- パスワード認証プロバイダをLDAPに変更します。

- 既存のOracle Adaptive Access ManagerをOracle Virtual Directoryのホスト名でリワイヤリングします。

- 既存のOracle Adaptive Access ManagerをOracle Virtual Directoryのポート変更でリワイヤリングします。

- 既存のOracle Adaptive Access ManagerをOracle Virtual DirectoryのSSL有効化でリワイヤリングします(Oracle Adaptive Access ManagerとOracle Virtual Directoryとのワイヤリングに、プレーン・テキスト通信のかわりにSSLを使用する)。

表26-1 Oracle Directory Managerのプロパティ値の構成

プロパティ名

プロパティ値

bharosa.uio.default.password.auth.provider.classname

com.bharosa.vcrypt.services.LDAPOAAMAuthProvider

oaam.uio.ldap.host

OVD_host

例: host.oracle.com

oaam.uio.ldap.port

OVD_port

oaam.uio.ldap.userdn.template

User_Search_DN

例: uid= {USER_ID}, cn=user,dc=us,dc=oracle,dc=com

oaam.uio.ldap.isSSL

false

Oracle Adaptive Access Managerでのプロパティの設定方法については、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

5. Oracle Adaptive Access Managerサーバー関連の管理対象サーバーを再起動します。

26.2 Oracle Identity Manager (OIM)のURL変更

Oracle Adaptive Access Managerの既存のデプロイメントをOracle Identity Managerでリワイヤリングする手順は次のとおりです。

1. Oracle Adaptive Access Managerサーバー関連の管理対象サーバーを起動します。

2. 「OAAM管理」に移動します。

http://OAAM_Managed_Server_Host:OAAM_Admin_Managed_Server_Port/oaam_admin

3. プロパティ・エディタにアクセス可能なユーザーとしてログインします。

4. Oracle Adaptive Access Managerのプロパティ・エディタを開いて、次のようにパラメータを変更します。

- 既存のOracle Adaptive Access Managerをパスワード・フローでリワイヤリングします。

- 既存のOracle Adaptive Access Managerを他のリダイレクションでリワイヤリングします。

表26-2 Oracle Identity Managerのプロパティ値の構成

プロパティ名

プロパティ値

oaam.oim.url

t3://OIM_Managed_Server:OIM_Managed_Port

例:t3://host.oracle.com:14000

bharosa.uio.default.signon.links.enum.selfregistration.url

http://<OIM Managed Server>:<OIM Managed Port>/oim/faces/pages/USelf.jspx?E_TYPE=USELF&OP_TYPE=SELF_REGISTRATION&backUrl=<OAAM Login URL for OIM>

ここで、<OAAM Login URL for OIM>はhttp://<OHS host>:<OHS port>/oim/faces/pages/Self.jspxまたは(IDMDOMAINAgentの場合は)http://<OIM host>:<OIMport>/oim/faces/pages/Self.jspxです。

OHS設定は、Oracle Access Management Access ManagerとOracle Identity Managerとの間の統合中に実行されています。

bharosa.uio.default.signon.links.enum.trackregistration.url

http://<OIM Managed Server>:<OIM Managed Port>/oim/faces/pages/USelf.jspx?E_TYPE=USELF&OP_TYPE=UNAUTH_TRACK_REQUEST&backUrl=<OAAM Login URL for OIM>

ここで、<OAAM Login URL for OIM>はhttp://<OHS host>:<OHS port>/oim/faces/pages/Self.jspxまたは(IDMDOMAINAgentの場合は)http://<OIM host>:<OIMport>/oim/faces/pages/Self.jspxです。

OHS設定は、Oracle Access Management Access ManagerとOracle Identity Managerとの間の統合中に実行されています。

Oracle Adaptive Access Managerでのプロパティの設定方法については、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

5. Oracle Adaptive Access Managerサーバー関連の管理対象サーバーを再起動します。

26.3 Oracle Access Management Access Managerのホストとポートの変更

Oracle Access Management Access ManagerをOracle Adaptive Access Managerのホスト名とポートの変更でリワイヤリングする方法については、『Oracle Fusion Middleware Oracle Access Management管理者ガイド』を参照してください。

26.4 Oracle Internet Directory (OID)のホストとポートの変更およびSSL有効化

Oracle Adaptive Access Managerの既存のデプロイメントで、Oracle Internet Directoryのホスト、ポートおよびSSL有効化を変更する手順は次のとおりです。

1. Oracle Adaptive Access Managerサーバー関連の管理対象サーバーを起動します。

2. 「OAAM管理」に移動します。

http://OAAM_Managed_Server_Host:OAAM_Admin_Managed_Server_Port/oaam_admin

3. プロパティ・エディタにアクセス可能なユーザーとしてログインします。

4. Oracle Adaptive Access Managerのプロパティ・エディタを開いて、次のようにパラメータを変更します。

- パスワード認証プロバイダをLDAPに変更します。

- 既存のOracle Adaptive Access ManagerをOracle Internet Directoryのホスト名でリワイヤリングします。

- 既存のOracle Adaptive Access ManagerをOracle Internet Directoryのポート変更でリワイヤリングします。

- 既存のOracle Adaptive Access ManagerをOracle Internet DirectoryのSSL有効化でリワイヤリングします(Oracle Adaptive Access ManagerとOracle Internet Directoryとのワイヤリングに、プレーン・テキスト通信のかわりにSSLを使用する)。

表26-3 Oracle Directory Managerのプロパティ値の構成

プロパティ名

プロパティ値

bharosa.uio.default.password.auth.provider.classname

com.bharosa.vcrypt.services.LDAPOAAMAuthProvider

oaam.uio.ldap.host

OID host

例: host.oracle.com

oaam.uio.ldap.port

OID port>

oaam.uio.ldap.userdn.template

User Search DN

例: uid= {USER_ID}, cn=user,dc=us,dc=oracle,dc=com

oaam.uio.ldap.isSSL

false

Oracle Adaptive Access Managerでのプロパティの設定方法については、『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

5. Oracle Adaptive Access Managerサーバー関連の管理対象サーバーを再起動します。

26.5 データベースのホストとポートの変更

Oracle Adaptive Access Managerをインストールした後で、データベースのホストまたはポート番号に変更がある場合は、次の手順を実行します。

1. データベースのORACLE_HOMEに移動します。

2. ORACLE_HOME /network/admin/listener.oraのポート番号を変更します。

3. Oracleリスナーをいったん停止してから再起動します。

4. Oracle WebLogic管理コンソールのデータソース画面で、データベース・ポインタを変更します。

データソースを変更する手順は次のとおりです。

1. Oracle WebLogic管理コンソールで、「サービス」に移動し、「JDBC」→「データ・ソース」→「oaamDS」を選択します。

2. 「oaamDS」をクリックして、ホスト名/ポートまたはユーザー名/パスワードを編集します。

26.6 Oracle Adaptive Access Managerの新しい本番環境への移行

Oracle Adaptive Access Managerを新しい本番環境へ移行する方法については、『Oracle Fusion Middleware管理者ガイド』を参照してください。

26.7 Oracle Adaptive Access Managerの既存の本番環境への移行

Oracle Adaptive Access Managerを既存の本番環境へ移行する方法については、『Oracle Fusion Middleware管理者ガイド』を参照してください。

第VII部

トラブルシューティング

この部の構成は、次のとおりです。

- 第27章「FAQ/トラブルシューティング」

27 FAQ/トラブルシューティング

この章では、トラブルシューティングのヒントとよくある質問に対する答えについて説明します。この項の内容は、次のとおりです。

- 第27.1項「My Oracle Supportを使用したその他のトラブルシューティング情報」

- 第27.2項「複雑な問題を解決するための手法」

- 第27.3項「トラブルシューティング・ツール」

- 第27.4項「構成可能なアクション」

- 第27.5「デバイスのフィンガープリント処理」

- 第27.6項「デバイス登録」

- 第27.7項「失敗カウンタ」

- 第27.8項「ナレッジベース認証」

- 第27.9項「ローカライズ」

- 第27.10項「Man-in-the-Middle/Man-in-the-Browser」

- 第27.11項「ワンタイム・パスワード」

- 第27.12項「OAAM UIOプロキシ」

- 第27.13項「仮想認証デバイス」

27.1 My Oracle Supportを使用したその他のトラブルシューティング情報

Oracle Fusion Middlewareの問題の解決にMy Oracle Support(以前のMetaLink)を使用できます。My Oracle Supportには、次のような有用なトラブルシューティング・リソースが含まれています。

- ナレッジ・ベース記事

- コミュニティ・フォーラムとディスカッション

- パッチとアップグレード

- 動作保証情報

注意:

サービス・リクエストを登録する場合にMy Oracle Supportを使用することもできます。

My Oracle Supportにはhttps://support.oracle.comからアクセスできます。

27.2 複雑な問題を解決するための手法

この項では、複雑な問題をより簡単に解決するためのプロセスについて説明します。内容は次のとおりです。

- 簡単な手法

- 分断攻略

- 厳密な分析

- 分析のプロセス・フロー

27.2.1 簡単な手法

問題の解決を目指して、いくつかの簡単なトラブルシューティング手法を順に実施できます。

手順

説明

経験

以前にもこの問題を経験しているか、問題の解決策がわかっています。

フォーラムへの投稿

これは最初の手順ではありません。基本的な手順を適用した後、第2の意見が必要である場合にのみ有効です。厳密な分析中に行うのが妥当であり、分析前に行うのは適切ではありません。

直感的な飛躍(推測)

問題から単純に原因を推測できます。勘で問題またはその原因がわかります。これは場合によっては非常に効率的であり、すばやい解決につながりますが、適切な確認を怠ると、症状が長引き、真の原因を解決できないことがあります。

基本的な診断の確認

ログでエラーおよびフローを確認します。フロー(HTTPヘッダー、ネットワーク・パケット・トレース、SQLトレース、strace)を確認します。フローを実行し、文書化します。構成詳細を照合してチェックし、予想したとおりのフローであることを確認します。

エラー・メッセージの確認

エラーおよびフローの情報を確認することにより、大きな手がかりを得ることができます。コンポーネントの動作に関するナレッジと合せることにより、理解を深めることができます。常に、ナレッジ(Oracleおよび検索エンジン)に一致する事例がないか確認してください。エラーが重大かどうかを判断するために必要な診断を実行します。エラーが複数ある場合は、どのエラーが原因であり、どのエラーが単なる結果であるかを調べます。

比較

ログおよびフローを稼働中のシステムと比較します。テスト・ケースを実行します。エラーが特定のサイトのみで発生する場合は、違いを比較します。

分断

問題を分割します。

27.2.2 分断攻略

この項では、問題を切り分けて管理可能な単位にする手順を示します。

プロセス

説明

問題の単純化

問題を可能なかぎり単純にします。

不要なコンポーネントの削除

ほとんどの問題には、複雑なコンポーネントおよび各コンポーネント間の結合が関連しています。また、サード・パーティのコンポーネントが関連していることがほとんどです。このため、可能であれば、まずサード・パーティのコンポーネントを削除し、次にできるだけ多くのコンポーネントおよびカスタム・コンポーネントを削除します(たとえば、コマンドラインはアプリケーションでないか、SQLPLUSはアプリケーションでないか)。

複雑さの軽減

症状は同じでより単純な問題が存在するかどうかを調べるテストを実施します(たとえば、複雑な選択のコンポーネントをまたは検索フィルタ削除し、1つのリクエストまたは数件のリクエストで十分かどうかを確認します)。

たとえるのであれば漏れ穴のある埋設管の修理

複雑な構成を、漏れ穴のある埋設管として考えます。どこかがおかしいことを知っています(漏れ穴があるのは知っていますが、どこにあるのかはわかりません)。

コンポーネントの列記

各コンポーネントを枠で囲み、次のコンポーネントと結び付ける線を引きます。これらを結合する際のプロトコルに注意してください。

両端の確認

入れたものと出てくるものは同じである必要があります。出入りするデータに問題が生じる場合、問題があるのはどちらかの端です。フローが予想どおりではない場合、問題はその途中にあります。

横向きのY

構成内のポイントをテストし、逸脱が生じている場所を見つけます。1つの構成部分が予想どおりに動作することが(確実に)わかれば、その部分は無視できます。

繰返し

このループを繰り返して、問題を突き止めます。

ヘルプ

サード・パーティのコンポーネントが問題に関連している場合は、他社からのサポートを受け、協力して問題を解決します。

27.2.3 厳密な分析

次のような場合、プロセスの全部または一部を適用する必要があります。

- 問題が複雑な場合

- 問題が大幅に拡大した場合

- 最初の試行で問題が解決しなかった場合

- 問題を制御できなくなってきた場合

- 問題を制御できなくなる可能性がある場合

27.2.4 分析のプロセス・フロー

分析のプロセス・フローは次のとおりです。

1. 問題を記述します。

2. 問題を詳述します。
次のものに基づいて、考えられる原因を展開します。

1. 知識と経験

2. 差異と変更

3. 考えられる原因を詳述書に対してテストします。

4. 最も可能性の高い原因を特定します。

5. 解決策を検証します。

27.2.4.1 問題の記述

問題を記述することは、問題を解決するために最も重要な手順です。

手順

説明

明確かつ正確な問題記述を確実に行う

問題の記述は最も重要な手順です。このことは無視されることが多いか、または少なくとも問題記述があることが前提になっています。問題記述を行わずに問題を解決しようとしても、意味がありません。そうでなければ、実際に何を解決しようとしているのかがあいまいになります。問題の本質がわからなければ、問題の解決方法もわかりません。

記述された問題を説明できるかどうかを考察する

説明できる場合は問題記述ではありません。問題記述が説明可能な場合は前に戻って、より正確な問題記述を作成してください。他の人の問題解決を支援する場合は、ここからコミュニケーションを開始します。直接的な質問をして問題を絞り込むか、電話で担当者と話して真の問題を明確にします。問題が多数ある場合は、それらを個別の問題として書き留めます。

あいまいな記述で妥協しない

「パフォーマンスが悪い」、「何かがクラッシュする」などのあいまいな問題記述は無意味であり、問題が長引き制御がきかなくなる原因となります。

複数の問題を1つの記述にまとめない

対処する問題は常に1つにします。1つにまとめられた問題を受け入れないでください。1つにまとめられた問題は、別々の問題が複数存在するか、一部の問題が実際には症状であるかのどちらかです。

27.2.4.2 問題の詳述

問題を詳述し、明確な質問をして関連情報を収集します。

手順

説明

問題を詳述する

これらは問題の症状です。

まず質問をする

何が、どこで、いつ、どの程度といった質問をします。

何が

「何が」は明確な質問であり、通常は事実と症状(何が予測から逸脱しているか)のリストになります。

どこで

「どこで」は関連しない場合もありますが、重要であることが多いのに見過ごされることも多いため、価値のある質問です。

いつ

パターンを特定したり、どの変更によって問題が発生したかを判断するうえで時系列が役立つため、「いつ」は重要な質問です。

どの程度

「どの程度」または「どれだけの数量」は、考えられる原因を特定するうえで非常に有用です。たとえば、システム全体であれば、システム全体が影響を受けるどうかを確認するか、テスト・ケースを試行します。「どれくらいの頻度で」は、非常に重要です。1週間に1回と1秒に複数回では大きな違いがあり、どのような種類の問題であるかを把握する大きな手がかりとなります。

症状と事実を列記する

症状と事実、およびそれらの重要度を列記します。

何が変更されたか

何かが変更されたことは確かですが、問題が最初から常にあった場合は除きます。これは特殊なケースです。

想定

提供されたデータを検証し、競合や矛盾がないかを確認します。

必ず、想定がないかを確認します。検証されておらず想定でしかない情報を、注意深く特定してください。実際に、これは特に技術的な経験が豊富なアナリストにありがちな誤りです。しかし、経験の少ないアナリストが自分より知識があると思われる人から詳細情報を得るような場合にも多く起こることです。その想定がどれほど些細なものに見えても、その実証と確認は怠らないでください。

27.2.4.3 最初から機能していなかった要素

コンポーネントが前から機能していなかった場合、次の手順を実行します。

考慮事項

説明

パフォーマンス問題の場合、動作と期待を考慮する

ある要素が最初から正常に機能したことがない場合は、まず、正常な動作とは何か、それが合理的であるかを判断する必要があります。これによって、最初から適切な期待を明確にできます。これは特に、パフォーマンスの問題に該当します。

誤解がないことを確認する

要件が合理的かどうかを判断します。

リンゴとみかんを比較しない

具体的な目標について合意します。その問題のみに取り組みます。

関連するすべてのコンポーネントを考慮する

関連するすべてのコンポーネントについて考慮します。

- ソフトウェアのみでない

- ハードウェアの速度は十分か

認識を変えるだけが解決策かどうかを考慮する

問題があると思った理由は何ですか。

- 人的な要因

- 認識

27.2.4.4 「である」および「でないが、かもしれない」

何が問題であって、何が問題でないか、何が問題である可能性があるかを考慮します。

手順

説明

「である」および「でないが、かもしれない」

事実または症状ごとに、「である」か、「でないが、かもしれない」かという質問をします。

比較を提供する

多くの場合、テスト・ケースが問題を比較するための手段となります。

問題が再現された場合、ここでの問題分析には役立たなかったことになりますが、問題の修正にあたる次のチームに問題を引き継ぐ際に非常に有用です。また、可能性のある修正策や解決策(回避策)をすばやくテストすることもできます。もちろん、経験の蓄積にもつながります。

比較がない場合はテスト・ケースを作成する

問題が再現されない場合、問題のシステムと比較する対象となり、場合によっては潜在的な回避策となることもあります。

27.2.4.5 考えられる原因の展開

問題を解決するには、考えられる原因を展開することが必要です。

展開

説明

知識と経験

知識と経験を使用して、考えられる原因を認識できます。

- 以前に発生したことがある

- 文書化されている

- サポート・ノートまたは検索エンジンによる検索

差異と変更

差異と変更のリストを作成して、原因を絞り込むことができます。

- このサイトのみか、1つのプラットフォームのみか

- アップグレード直後

- 負荷が大きくなったとき

- 木曜日のみ

各症状と比較の調査

それぞれの事実を考慮し、事実どうしが関連していること、および競合していないことを確認します。

27.2.4.6 考えられる各原因の詳述書に対するテスト

考えられる各原因を詳述書に対してテストします。

- 考えられる各原因は、詳述書のすべてのアイテムと合致している必要があります。

- 原因なしという結果になった場合は、戻ってプロセスを調整します。

- 原因は、「である」と「でないが、かもしれない」の両方を説明している必要があります。

- 最も可能性の高い原因を特定します。

- 合致する原因は無視しないでください。

27.2.4.7 原因の確定

アクション・プランを考案できるように、原因を確定します。

次のことを行えます。

- 考えられる原因をテストする方法の考案

- 観察

- 想定のテスト

- 試験

- 解決策のテストおよび監視

理論を実証または反証するためのアクション・プランを考案することが主要な点です。各アクション・プランの理由を伝達することが重要です。反証テスト(何かが真ではないことを証明するためのテスト)を実施する場合は、特にそうです。すべてのアクション・プランは問題を解決するためのものだと考えていて、正しい方向に進んでいないと思われるものには抵抗を示す人がいます。

27.2.4.8 失敗

ある解決策が失敗した場合、最初に戻ってそのアプローチを再び適用しますが、その際、新しい結果で更新したものを適用します。問題が非常に複雑な場合は、何度かの反復が必要になることがあります。

プロセスにまったく誤りがないわけではありません。

失敗の主な原因は次のとおりです。

- 問題記述が不十分または不適切

- 情報が不正確またはあいまい

- 「である」と「でない」に大きな差異がない

- 判断を阻害する想定がある

- 広範なスキル・セットの関与がない

27.3 トラブルシューティング・ツール

この項では、システムの問題の調査とトラブルシューティングに使用できるツールおよびプロセスに関する情報を示します。

表27-1に、問題のトラブルシューティングに使用できる汎用ツールとOAAM固有のツールを示します。

表27-1 トラブルシューティング・ツール

カテゴリ

説明

汎用ツール

- Oracle Enterprise Manager Fusion Middleware Control

- Database Enterprise Manager

- DMSの監視データ

- 監査データ

- Ping/ネットワーク・チェック・ツール

OAAM固有のツール

- ダッシュボード

- 監視データ

- ログ・ファイル

表27-2に、システムをトラブルシューティングする際に確認するアイテムを示します。

表27-2 トラブルシューティングのヒント

ヒント

理由

オペレーティング・システムの確認

プラットフォームに固有の問題もあります。たとえば、IBM以外のプラットフォームで作成されたJavaキーストアはIBMプラットフォームでは動作しません。

WebLogic Server・バージョンの確認

OAAMが11gで動作保証済のWebLogic Serverにインストールされていることを確認します。

JDK (SunまたはJRockit)の確認

JDKがIdentity Management 11g Suiteで動作保証されていることを確認します。

Oracle Enterprise Manager Fusion Middleware Controlを使用したロギング構成の変更

トレースおよびデバッグの前に、ログ・レベルが適切に変更されていることを確認します。

Oracle Enterprise Manager Fusion Middleware Controlを使用したログ・メッセージの検索

スクリプトの実行方法に関して知っておくと役立つまたは重要と思われるログ・メッセージ・レコード情報。

実行コンテキストIDを使用したログ・メッセージの検索

ECIDは、個々のイベントを同じリクエスト実行フローの一部として相互に関連付けるために使用される一意の識別子です。

Oracle WebLogic管理コンソールを使用したデータベース接続プールの監視

Oracle WebLogic管理コンソールを使用して、接続プールの状態を確認します。

表27-3に、問題およびそのトラブルシューティングと解決のために実行できるチェックをまとめます。

表27-3 問題およびヒント

問題

実行できるチェック

一般的なトラブルシューティング・ユース・ケース

- ほとんどの操作が遅い

- サーバーでメモリー不足の例外がスローされる

- サーバーで暗号化関連の例外がスローされる

- サーバー起動時に接続プールに関連するエラーが発生する

- 11.1.1.4から11.1.2にアップグレードした後、管理対象サーバーの起動中にエラーが発生する

- OAAM CLIスクリプトの問題

- SOAPコールの問題

- ネイティブ統合の問題

ほとんどの操作が遅い

- OAAMポリシーのパフォーマンスを確認します。

- ダッシュボードを使用して、ルールのパフォーマンスを確認します。

- 必要な場合、ルールまたはそのパラメータをチューニングします。

- Oracle Enterprise Manager Fusion Middleware Controlを使用してデータベースを確認し、遅い問合せがないか確認します。推奨索引の追加に関する推奨事項については、『Oracle Fusion Middlewareパフォーマンスおよびチューニング・ガイド』を参照してください。

- アプリケーション・サーバーのCPUが高くなっているかどうかを確認します。
可能な場合、スレッド・ダンプを取得します。

- アプリケーション・サーバーとデータベース間の接続およびネットワークのスピードを確認します。

- データソース設定でデータベース・マシンのIPを使用します。

サーバーでメモリー不足の例外がスローされる

- OAAMのWebLogic Serverドメインの構成を確認します。

- すべてのOAAM Webアプリケーションが同じ管理対象サーバーにデプロイされているかどうかを確認します。

- 管理対象サーバーのヒープ・サイズを大きくします。

接続プール・エラー

- データベース・リスナーが実行されていることを確認します。

- JDBC URLには名前ではなくIPアドレスを使用します。

- データベース・サービス名が正しいことを確認します。

- 接続プールが大きくなりすぎていないか確認します。
同じデータベースにアクセスする管理対象サーバーの数が多すぎないかどうかを確認します。

アップグレード後の管理対象サーバーの起動中のエラー

- 暗号化キーが適切にコピーされていることを確認します。

- アップグレードのドキュメントに示されているすべての手動手順に従ってください。

- Oracle WebLogic管理コンソールで、すべてのWebアプリケーションが適切に管理対象サーバーのターゲットになっていることを確認します。

OAAM CLIスクリプトの問題

- JAVA_HOME環境変数が、11gのIdentity Management Suiteに対して動作保証済のJDKに設定されていることを確認します。

- oaam_cli.propertiesファイル内にCLI関連のプロパティが設定されていることを確認します。

SOAPコールの問題

- SOAPGenericImpl内のタイムアウトに関連する既知の問題があります。

- Oracle Web Services Manager (OWSM)がデフォルトで有効化されているため、SOAPを使用する前にOWSMポリシーを設定する必要があります。

- ポート番号を含むSOAPサーバーURLが有効であることを確認します。

ネイティブ統合の問題

- 適切なバージョンのOAAM拡張共有ライブラリが使用されていることを確認します(WARファイルではWARファイル・バージョンを、EARファイルではEARファイル・バージョンを使用する必要があります)。

- OAAMデータソースが作成されており、JNDI名が正しい(OAAMサーバーのJNDI名と一致している)ことを確認します。

- OAAM管理およびOAAMサーバーにより使用されているキーと同じキーがネイティブ・アプリケーションで使用されていることを確認します。

- 暗号化キーに関連する問題

- すべての管理対象サーバーが同じWebLogic Serverドメイン上にあることを確認し、そうでない場合はキーを各ドメインにコピーします。

- 11g以外のサーバーを使用している場合は、Javaキーストアを使用します。

- 同じサーバー上での多数のアプリケーションによる共有ライブラリの使用
現在、同じ管理対象サーバー上で複数のアプリケーションによりOAAM拡張共有ライブラリを使用することはできません。

27.4 構成可能なアクション

構成可能なアクションのテスト環境から本番環境への移行

質問/問題: テスト環境でカスタムの構成可能なアクションを定義しましたが、今度はカスタム・アクション・テンプレートをテストから本番へと移行したいと思います。

回答/解決策: そのためには、次の手順を実行します。

1. Oracle Adaptive Access Manager拡張共有ライブラリを使用して、JARファイルをパッケージ化します。

2. JARファイルをoaam-extensions\WEB-INF\libフォルダに追加します。

3. oracle.oaam.extensions.warを再パッケージ化します。

4. JARファイルをデプロイします。

詳細は、第7章「OAAM拡張共有ライブラリの使用によるOAAMのカスタマイズ」を参照してください。

27.5 デバイスのフィンガープリント処理

失効したCookie

質問/問題: Flash CookieとセキュアなCookieが失効した場合、OAAMではどのように処理されますか。

回答/解決策: 『Oracle Fusion Middleware Oracle Adaptive Access Manager管理者ガイド』を参照してください。

- 永続化されているCookieが無効化された場合
Oracle Adaptive Access Managerでは、あるマシンに関する様々な情報を使用して、デバイス・フィンガープリントを生成します。永続化されているCookieが無効化された場合でも、Oracle Adaptive Access Managerでは、マシンの識別にその他の情報を使用できます。

それぞれの機能自体は、セッションのセキュリティを確保するうえで不十分ですが、デバイス・フィンガープリント、IP、位置情報、時間、動作分析、過去の動作に関連付けた動作分析などを組み合せればセキュリティを確保できます。

- セキュアなCookieが削除された場合
Oracle Adaptive Access Managerのフィンガープリント処理テクノロジは、1つの要素にのみ依存しているわけではありません。Oracle Adaptive Access Managerでは、数多くの属性を使用して、通常ログインに使用されるデバイスの認識とフィンガープリント処理を行うことによって、機関のカスタマ基盤の対応範囲を拡大します。セキュアなCookieが欠落したり無効化されている場合、Oracle Adaptive Access Managerでは、デバイスの識別にFlashオブジェクトやHTTPヘッダーなどの、他の要素を使用します。

- Flashが有効化されていない場合
Oracle Adaptive Access Managerのフィンガープリント処理テクノロジは、1つの要素にのみ依存しているわけではありません。Oracle Adaptive Access Managerでは、数多くの属性を使用して、通常ログインに使用されるデバイスの認識とフィンガープリント処理を行うことによって、機関のカスタマ基盤の対応範囲を拡大します。Flashが有効化されていない場合、Oracle Adaptive Access Managerでは、デバイスの識別にセキュアなCookieやHTTPヘッダーなどの、他の要素を使用します。

27.6 デバイス登録

デバイス登録

質問/問題: ユーザーは、チャレンジ質問登録ページで次のオプションを選択してデバイスを登録できます。

「現在、安全なデバイスとして使用しているデバイスの登録を確認します」

登録フロー中にユーザーがこれをスキップした場合、その後「ユーザー・プリファレンス」ページにオプションが表示されません。これを有効にする方法はありますか。

回答/解決策: デバイス登録は、登録中とチャレンジ中にユーザーにデバイスの登録を求めるように設定されています。

これを有効にするには、ユーザー・プリファレンスの「質問の登録」ページで次のように設定します。

bharosa.uio.default.userpreferences.questions.registerdevice.enabled=true

現在、中央のユーザー・プリファレンスのページでのみデバイスを登録解除できます。

ユーザーは登録中にデバイスを登録できますが、チャレンジを受けているときにデバイスを登録することもできます。

質問/問題: 登録フローでデバイスの登録が表示されません。デバイスIDポリシーはOAAM管理にインポートされています。

回答/解決策: デバイス登録はデフォルトでは有効になっていません。デバイス登録を有効にするには、bharosa.uio.default.registerdevice.enabledをtrueに設定する必要があります。

27.7 失敗カウンタ

失敗カウンタの自動増分が機能するには、updateAuthStatusのクライアント・タイプを9に設定する必要があります(質問/回答)。

27.8 ナレッジベース認証

2つのチャレンジ質問の回答をユーザーに求める

質問/問題: ユーザーが新しいデバイスからのログオンを試みるときに、2つのチャレンジ質問への回答をユーザーに求めたいと思います。これは、どうすれば可能ですか。質問はランダムに選択されるため、同じ質問が2回提示される可能性はないでしょうか。

回答/解決策: OAAMでは、意図的に「一度に1つの質問」フローが採用されています。1つの質問を提示し、ユーザーがチャレンジ質問に正しく答えた場合にのみ次の質問を表示する手法は、2つの質問を提示するよりも優れたセキュリティ手法です。これにより、フィッシングのために質問が収集される事態を防げます。また、OAAMでは、ユーザーが質問の回答を何度も試みることが許可されており、ユーザーが何回間違った回答を入力したかも記録しておく必要があります。複数の質問が一度に表示された場合、この記録を維持するのは困難になり、エンド・ユーザーにとってわかりにくいものになるでしょう。複数の質問でユーザーにチャレンジするときは、それらの質問を順番に表示された別個の画面で提示する必要があります。OAAMでは、複数の質問を一度に使用した認証がサポートされていません。

27.9 ローカライゼーション

仮想デバイスのカスタマイズとローカライズ

質問/問題: カスタマイズを生成して、仮想認証デバイスをローカライズできますか。

回答/解決策: 仮想認証デバイスは使用を選択できるサンプルとして提供されています。これらのサンプルは、英語のみで提供されています。ソース画像とドキュメントは、ユーザーが独自のカスタム仮想認証デバイスのフレーム、キー、パーソナライズされたイメージおよびフレーズを開発するために提供されています。ローカライゼーションは、これらのカスタマイズに含まれます。カスタム開発はサポートされていません。KeyPadのローカライゼーションでは、問題が発生する可能性があります。すべての言語で同じ文字数が存在するわけではないからです。たとえば、ポルトガル語には英語にはない特殊文字があります。これらの文字キーを追加すると、キー・レイアウトは少々異なる可能性があります。レイアウトにキーを追加する際には、ジッターが機能するための十分な空白をキーの周りに確保しておくことが重要です。一般的なベスト・プラクティスは、キーをジッター領域の中心に配置したとして、そのキーの周縁部を単一のキーで囲んだ分の空白を確保することです。ソース画像には、この領域のピクセル・サイズを示すメモが含まれます。

これらのサンプルの変更は、カスタム開発と見なされます。

パッドのフレームとキー・イメージ

フレームとキーのサンプルは、英語のみで提供されています。仮想認証デバイスのフレームとキーのマスター・ファイル、また各部の説明は、必要に応じて提供されています。独自のカスタム・フレームとキー・イメージを作成して、本番ドキュメントに従ってデプロイできます。これらのイメージや対応するプロパティに対する変更は、カスタム開発とみなされます。特に注意を要するのは、テキスト、ホット・スポットおよびキー・サイズに関する問題です。これらは、提供サンプルよりもサイズを小さくしないでください。

バックグラウンド・イメージおよびフレーズ・テキスト

Oracle Adaptive Access Managerには、一連のサンプル・イメージが同梱されています。これらのイメージは、仮想認証デバイスのみでの使用を目的としています。セキュリティ上の理由から、仮想認証デバイスのコンテキスト以外でエンド・ユーザーに使用可能にしないでください。あらゆるユーザーを対象にした迅速なダウンロードを可能にするために、その内容、ファイル・サイズおよびその他の属性が最適化されています。パッケージでは、各サポート言語用のサンプル・フレーズ・テキストが提供されています。これらのイメージやテキストに対する変更は、カスタム開発とみなされます。イメージを編集するときには、そのイメージの物理的寸法を拡大したり、サンプル・イメージのアスペクト率を変更したりしないでください。そのイメージがゆがんでしまうからです。また、デプロイメントで使用されている仮想認証デバイスごとに同じ名前のイメージが存在している必要があります。

登録時に表示されるイメージ

質問/問題: ユーザー登録前に表示されるページの各イメージが、ロケール言語ではなく英語で表示されます。

回答/解決策: グローバル化された仮想認証デバイスのイメージ・ファイル(認証登録フローを含む)が提供されていません。デプロイメント・チームによる開発が必要です。

27.10 Man-in-the-Middle/Man-in-the-Browser

質問/問題: SMSを介したOTPを使用する際に、モバイル・トランザクション認証番号を使用して各トランザクションに署名しています。SMSのコストは高くつきます。Oracle Adaptive Access Managerはどのように役立ちますか。また、Man-in-the-Middle (MiTM)攻撃やMan-in-the-Browser (MiTB)攻撃に対する保護を提供するソリューションも必要としています。

回答/解決策:

1. Oracle Adaptive Access Managerを使用してリスクを評価し、mTANなどのセカンダリ認証をリスクが高いトランザクションのみで使用します。そうすることで、SMSはすべてのトランザクションに送信されずに、中から高リスクのトランザクションにのみ送信されるようになります。

2. MiTMやMiTBから保護するための最善の方法の1つに、トランザクション・リスク分析の実行があります。たとえば、ユーザーが特定の口座を以前に使用したことがあるかどうか、またはそのユーザーが指定の金額を超える送金を行ったことがあるかどうかが検証されます。本日のトランザクションの分析をリアルタイムで実行するには、Webアプリケーションとのネイティブ統合が必要です。

3. 対象となる口座番号の入力にはPinPadを使用してください。これにより、セッションがハイジャックされた場合でも、ユーザーが入力した口座番号は容易には変更できなくなります。この口座番号はネットワーク上には送信されないため、MiTMまたはMiTBは容易には変更できません。

4. HTTPSを介した通信には、KeyPadやPinPadなどの仮想認証デバイスを必ず使用することをお薦めします。仮想認証デバイスでは、エンド・ユーザーのマシンで生成された一度かぎりのランダム・データ(マウス・クリックの座標で識別される)がサーバーに送信されます(ここで、デコードされる)。HTTPSでは、従来の暗号化による保護も提供されます。セキュリティ上の脅威となり得るクライアント・ソフトウェアやロジックは、エンド・ユーザーのマシンに存在しません。

5. Oracle Adaptive Access Managerを使用すると、非常に危険性の高い送金を完全にブロックできます。危険性の高い送金をブロックすることで、使用する認証方式に関係なく、不正行為の発生を減らすことができます。

27.11 ワンタイム・パスワード

数字や英数字およびプラガブルなランダム・アルゴリズムがサポートされているかどうか

質問/問題: OTPでは、数字や英数字およびプラガブルなランダム・アルゴリズムがサポートされていますか。

回答/解決策: OTPは、次の2種類のプロパティで構成できます。

# Length of the Pin bharosa.uio.otp.generate.code.length = 5
# Characters to use when generating the Pin bharosa.uio.otp.generate.code.characters = 1234567890

インテグレータはベース・クラス(AbstractOTPChallengeProcessor)のPIN生成メソッドを使用して、generateCodeメソッドをオーバーライドできます。

27.12 OAAM UIOプロキシ

UIO ISAプロキシ

OAAM UIOプロキシのWeb公開における問題をトラブルシューティングする手順は次のとおりです。

- .NET2.0フレームワークがインストールおよび有効化されており、BharosaプロキシのDLLを正常に登録できる状態にあることを確認します。

- フラッド攻撃やワームの伝播を防止するフラッドの防止設定が有効化されている場合、信頼できるIP(ルーターIPなど)に対してIP例外を定義します。

- デフォルトのインバウンド・ルールとアウトバウンド・ルールで、HTTPまたはHTTPSトラフィックのOAAMサーバーへの転送(またはOAAMサーバーからの転送)が許可されていることを確認します。

- ルールの順序(優先順位)を調べ、デフォルトのルールdenyの優先順位が高くないことを確認します。優先順位が高い場合は、すべてのルールがブロックされてしまいます。このルールの優先順位が一番低い場合、すべてのルールが実行されます。

- OAAMサーバー・ルールでは、次のことを確認してください。

- 外部IPまたは外部名が内部IPまたは内部名にマップされていること。

- 外部ポートが、OAAMサーバーがリスニングしている内部ポートにマップされていること。

- OAAMサーバー・パスが公開されていること。

UIOプロキシの構成時の問題をトラブルシューティングするには、ファイルに対するトレースを有効化し、トレース・レベルを0x8008fに設定します。そうすることで、詳細なインターセプタ評価と実行情報がログ・ファイルに出力されます。

UIO Apacheプロキシ

この項では、UIO Apacheプロキシの問題をトラブルシューティングするためのヒントについて説明します。

- httpdの起動時に、mod_uio.soのロード・エラーが発生します。mod_uio.soとすべてのライブラリが適切なディレクトリにあることを確認します。Linuxでは、lddコマンドを使用して、mod_uio.soが依存先のすべての動的ライブラリをロードできることを確認します。Windowsでは、Dependency Walkerを使用して、欠落しているDLLを見つけます。場合によっては、MicrosoftのWebサイトからMicrosoft Visual C++ 2005再頒布可能パッケージをインストールする必要があります(これらのライブラリがサーバーでインストール済でない場合)。

- すべてがうまくいかない場合は(ログが存在しないなど)、httpdユーザーにuioディレクトリに対する読取り権限が与えられていることを確認します。通常、httpdはデーモン・ユーザーとして実行します。そのデーモン・ユーザーに、ログ・ディレクトリに対する書込み権限が与えられていることを確認します。

- UIO_Settings.xmlまたは構成XMLに解析エラーが含まれる場合、httpdのログ・ディレクトリにUIO_Settings.xml.logという名前のエラー・ログが作成されます。

- エラーについては、uio.logを参照してください。本番用の使用ではエラーのログ・レベルを使用します。また、詳細情報はinfoを、デバッグの問題はdebugを、冗長ログはtraceを使用して取得できます。

- 構成XMLと設定XMLがRNGデータベース・スキーマに準拠することを確認します。任意のXMLエディタでUIO_Settings.rngとUIO_Config.rngを開いて、UIO_Settings.xmlファイルおよびアプリケーション構成XMLファイルを編集できます。

- Apacheのhttpdログ・レベルをテスト用のデバッグに変更したり情報提供用にとどめることで、ログ・ファイルのサイズを削減できます。Apacheのhttpdログは、UIO Apacheのプロキシ・ログとは別のものです。

- UIO Apacheプロキシで使用するISAの構成XMLを移行するには、次の手順を実行します。

1. 使用するXMLファイルのヘッダーを変更します。

<?xml version="1.0" encoding="utf-8"?><BharosaProxyConfig xmlns="http://bharosa.com/">

2. libxml2のxmllintユーティリティを使用して、構成XMLファイルを実行します。
Windowsの場合、次のサイトから最新のlibxml2-2.x.x.win32.zipファイルをダウンロードします。

http://www.zlatkovic.com/libxml.en.html

解凍します。

Linuxの場合、libxml2がインストール済であればxmllintコマンドを使用できるはずです。Linuxシステムの管理者に問い合せてください。

UIO Apacheプロキシ・ディストリビューションからUIO_Config.rngファイルをコピーして、次のコマンドを実行します。

xmllint --noout --relaxng UIO_Config.rng your_config_xml_file

報告されるエラーがあれば修正します。

- UIO Apacheプロキシが動作していない場合やリクエストをインターセプトしている場合
問題: 次のエラーが表示されます。

Failed to create session in memcached, err = 70015(Could not find specified
socket in poll list.) proxy - Failed to create session, cannot process this
request distsessions - memcache server localhost create failed 111

考えられる解決策:

- memcacheのインストールと構成が済んでいることを確認してください。

- セッションの作成前にmemcacheプロセスが起動しており実行中であることを確認してください。

Oracle Adaptive Access Managerデバッグ・モード

デバッグ・モードでは、どの変数の値(ユーザー名、パスワードおよびその他の情報)も表示されません。取得モードでは、HTTPトラフィックが表示されます。そのため、本番では取得モードを使用しないでください。

セッション中/トランザクション分析

UIOプロキシは、ログイン・セキュリティのみの解決策です。セッション中の機能はサポートしていません。考えられる要件に応じて、次のオプションが用意されています。

- パッケージ化アプリケーションを使用していて、UIOプロキシまたはOracle Access Management Access Managerを変更したり、それらに統合する権限がない場合は、リアルタイムまたはインラインのユースケースを対象にしたオプションがあります。たとえば、マルウェアやフィッシング防止の機能、ログイン・フローにおけるリスクベース認証などがあります。

- アプリケーションへの統合が可能で、セッション中またはトランザクションのユースケースが必要な場合は、ネイティブ統合の導入を検討してください。この場合、これが最も柔軟なオプションです。

- セッション中またはトランザクションのユースケースが必要でも、アプリケーションへの統合が不可能な場合は、Oracle Adaptive Access Managerオフライン10gまたはリスナー付きのOracle Adaptive Access Managerを使用することで、カスタム・オプションが利用可能になることがあります。

11gのプロキシに変更はない

質問/問題: 10gと11gの間にUIOプロキシの変更はありますか。

回答/解決策: 10gと11gの間にプロキシの変更はありません。OHSへの依存性はありません。ユーザーは、Apache 2.2.8のみを使用する必要があります。

HTTPヘッダーへのappidの追加

質問/問題: TestConfig.xmlでは、PSFT URLと/asa/ URLの両方のHTTPヘッダーでappidを追加する必要があるでしょうか。

回答/解決策: いいえ、/asa/ URLのみに追加してください。app-idはPSFT URLでは必要ないため、/asa/ URLのみに追加する必要があります。

「次を含む」一致

質問/問題: 完全一致の場合、「次を含む」の条件は一致しますか。

回答/解決策: はい。

リクエストURL

質問/問題: リクエストURLは部分URLとして指定できますか。(URLの最初の部分のみを指定するなど)

回答/解決策: いいえ。URLはそのまま記述する必要があり、問合せパラメータ(?に続く文字列など)はURLの一部とはみなされません。そのため、これらのパラメータは条件の一部として指定して、URLの一部には含めないでください。

27.13 仮想認証デバイス

OAAM 11gのカスタマイズ機能のヒントおよびトラブルシューティング手順

第8章「OAAM Webアプリケーション・ページのカスタマイズ」のガイドラインは次のとおりです。

質問/問題: プロパティ・ファイルに次のエントリを追加することにより、registerQuestionのかわりにregisterQuestionHTMLを使用しようと思います。oaam_custom.propertiesファイルとclient_resource.propertiesファイルの両方に追加しましたが、値が有効なようには見えません。bharosa.uio.default.RegisterQuestions.authenticator.device = DeviceHTMLControl bharosa.uio.default.ChallengeQuestion.authenticator.device=DeviceHTMLControl。

回答/解決策: 前述のプロパティは、プロパティ・ファイルに記述されているとおり、AuthentiPadチェックポイントがオフにされた場合にのみ使用されます。Authentipadチェックポイントのプロパティは、bharosa.uio.default.use.authentipad.checkpoint=trueです。または(推奨)、Authentipadチェックポイントのポリシーを変更して、ページ上に期待されるデバイス結果を表示できます。

ヒント: ユーザー表示の文字列はすべて、client_resource.propertiesまたはそのロケール固有のバリエーション(client_resource_es.propertiesなど)でカスタマイズする必要があります。

ヒント: カスタム・ユーザー・インタフェース文字列はWEB-INF/classes/client_resource.propertiesに配置します。カスタム・フレーム・ファイル・イメージをWEB-INF/classes/bharosa_properties/pad_imagesに配置します(クラスパス上に存在する必要があるため)。フレーム・ファイルのプロパティをWEB-INF/classes/client_resource.propertiesに配置し、フレーム・ファイルの値を更新します(pad_images/authenticator_pad.pngなど)。

ヒント: カスタムJSPのキャッシュの問題: Oracle WeblogicではカスタムJSPがキャッシュされるようです。そのため、JSPと一緒にWARファイルがデプロイされると、追加された変更を確認するのは困難です。この問題を回避するための実証された方法として、ファイル名(およびプロパティ値)の変更と、Oracle Weblogicで使用されているデプロイメント・ディレクトリの消去があります。(DefaultDomain/servers/DefaultServer/tmpおよびo.j2ee/drs)。

OAAM認証パッドの無効化

質問: カスタム拡張WARファイルが使用されている場合、OAAM認証パッドを無効にする方法はありますか。

OAAMサーバーには次の 2 つのオプションがあります。

- 認証パッド・ポリシーを変更し、常に「OAAM HTML Pad」を返すようにします。

- OAAMサーバーの次のプロパティを設定します。

bharosa.uio.default.use.authentipad.checkpoint=false
bharosa.uio.default.Password.authenticator.device=DeviceHTMLControl
bharosa.uio.default.Password.authenticator.device.upgraded=DeviceHTMLControl
bharosa.uio.default.ChallengeQuestion.authenticator.device=DeviceHTMLControl
bharosa.uio.default.RegisterQuestions.authenticator.device=DeviceHTMLControl
bharosa.uio.default.ChallengeSMS.authenticator.device=DeviceHTMLControl
bharosa.uio.default.ChallengeEmail.authenticator.device=DeviceHTMLControl

別の方法として、11.1.2では、次のプロパティを使用してログイン・ページを1つのページに統合できます。

注意:

チャレンジを有効にするには、前述のオプションのいずれかを実行する必要があります。

bharosa.uio.default.login.auth.enabled=true
bharosa.uio.default.credentials.enum.password.enabled=true
bharosa.uio.default.signon.links.enum.wherepassword.enabled=false

仮想認証デバイスのアクセス可能なバージョン

質問/問題: アシスティブ・テクノロジを使用してアクセスするユーザーは、仮想認証デバイスのアクセシビリティ対応バージョンを使用する必要があります。これらのバージョンはどのように有効化すればよいでしょうか。

回答/解決策: デフォルトでは、TextPad、QuestionPad、KeyPadおよびPinPadのアクセシビリティ対応バージョンは有効化されていません。デプロイメントでアクセシビリティ対応バージョンが必要な場合は、OAAM管理のプロパティ・エディタを使用するか、Oracle Adaptive Access Manager拡張共有ライブラリを使用して有効化できます。

アクセシビリティ対応バージョンの仮想認証デバイスには、スクリーン・リーダーおよびその他のアシスティブ・テクノロジを使用したナビゲーションで必要なタブ、使用方法およびALTテキストが含まれます。

oaam_custom.propertiesを変更する必要があります。

これらのバージョンを有効にするには、is ADA compliantフラグをtrueに設定します。

ネイティブ統合では、次のプロパティで仮想認証デバイスを制御します。

desertref.authentipad.isADACompliant

Oracle Adaptive Access Managerの即時利用可能な機能では、次のプロパティで仮想認証デバイスを制御します。

bharosa.uio.default.authentipad.is_ada_compliant

表示されるテキスト入力またはパスワード(非表示)の入力設定

質問/問題: チャレンジ回答を非表示のテキストとして入力できるようにQuestionPadを構成するにはどうすればよいでしょうか。

回答/解決策: 次のプロパティをoaam_custom.propertiesに追加します。このプロパティにより、QuestionPadに表示されるテキスト入力が設定されるか、それともパスワード(非表示)入力が設定されるかが決定されます。

bharosa.authentipad.questionpad.datafield.input.type

有効な値はtextおよびpasswordです。

ユーザーが使用するデバイスの数をOAAMで制限できるかどうか

質問/問題: ユーザーが使用するデバイスの数をいくつか(たとえば、5つか6つ)に制限するように構成し、その特定のユーザーに対して構成したデバイス・リストにないデバイスからのアクセスをブロックする方法はありますか。

回答/解決策: ユーザビリティとセキュリティ上の理由から、OAAMでは、ユーザーからのアクセスを特定の数のデバイスに制限する機能はサポートされていません。また、適切なセキュリティを実装するうえで、この動作は不要です。OAAMでは、使用するデバイスを含め、ユーザーの動作がプロファイリングされるためです。デバイス数の合計は、リスク測定における適切な測定値であるとはいえません。一部のエンド・ユーザーは、通常の動作の一環として多くのデバイスを使用するからです。OAAMでは、かわりにユーザーが特定のデバイスをどれだけ頻繁に使用するかを追跡します。また、その同一デバイスを過去に使用した他のユーザーとその使用頻度も追跡します。これらは、アクセス・リクエストに付随するリスク・レベルを把握するうえでより効果的な評価値です。

KBAチャレンジにKeyPadまたはPinPadを使用できるかどうか

質問/問題: KBAチャレンジにKeyPadまたはPinPadを使用できますか。

回答/解決策: KBAは、QuestionPadまたはプレーンHTMLでの使用を目的に設計されています。KeyPadまたはPinPadは使用しないでください。それらの利用シナリオに、KBA質問は含まれていないからです。

仮想認証デバイスがユーザーをスクリーン・キャプチャ・マルウェアから保護する方法

質問/問題: 仮想認証デバイスは、ユーザーをスクリーン・キャプチャ・マルウェアからどのように保護しますか。

回答/解決策: この攻撃に対しては、現在手動による対応が必要です。各ユーザーは、キャプチャされたビデオやイメージを参照して、PINやパスワードを判別する必要があります。仮想デバイスは主に、数多くのカスタマに影響を与える自動化された攻撃の回避を目的としています。トロイの木馬にOCRテクノロジが採用されている場合でも、KeyPadやPinPadでクリックされた文字の判別はその他の画面キーボード・タイプでの判別よりも困難になります。Oracle Adaptive Access Managerのキーは半透明であるため、バックグラウンド・イメージが透けて見えるからです。また、セッションごとにキーの形状をランダムに変化させる機能も存在します。

また、ジッターにより、判別作業がさらに困難になります。仮想認証デバイスは、大規模なデプロイメントにおいてセキュリティとユーザビリティのバランスをとるためのよい方法です。すでに使用されている認証を保持しながら、その上層にセキュリティ・レイヤーを配置できるからです。パスワードの解読が可能なマルウェアが開発されたとしても、不正行為が発生するとはかぎりません。仮想認証デバイスは、完全なソリューションのうちの1つのコンポーネントにすぎません。不正者がPINやパスワードを知っていたとしても、リアルタイムの動作、イベント、トランザクションからなる分析や、セカンダリ認証を通過する必要があります。Oracle Adaptive Access Managerでは、このような認証とは別に、ユーザー、デバイス、位置の活動がリアルタイムに追跡、プロファイリングおよび評価されます。Oracle Adaptive Access Managerでは、高リスクの状況を検知した場合に、不正行為を防止するためのプロアクティブなアクションがとられます。このように、アプリケーションから標準形式(パスワードやPINまたはその他の方法の)の認証が排除された場合でも、不正行為を防止できます。

カスタム・バックグラウンド・イメージの作成

仮想認証デバイスに対してカスタム・バックグラウンド・イメージを作成するには、次の手順を実行する必要があります。

1. 使用するパッドごとに、イメージを正しい解像度に処理します。

2. 次に、仮想認証デバイスごとにイメージを正しいディレクトリに追加する必要があります。TextPadイメージはTextPadディレクトリに、のように配置する必要があります。ディレクトリは、bharosa.image.dirlist= {oracle.oaam.home}/oaam_imagesという形式になります。これは、"/scratch/user/Oracle/Middleware/Oracle_IDM1/oaam/oaam_images"に解決されます。このディレクトリ内には、keypad、questionpad、textpadという3つのサブディレクトリがあります。

.Net内のAuthentipadイメージに表示される日時スタンプの無効化

1. 日時スタンプを無効化するには、次の行をコメントアウトします。

CreateAuthentiPad API
AuthPad.TimeStampText = DateTime.Now.ToString();
CreateQuestionPad API
TimeStampText = DateTime.Now.ToString();

2. タイムスタンプを表示します。
例1 (ユーザー定義文字列を表示):

ret.AuthPad.TimeStampText = "monster";
ret.TimeStampText = "muppet";

例2 (現在の時刻を表示):

AuthPad.TimeStampText = DateTime.Now.ToString();
TimeStampText = DateTime.Now.ToString();

パスワードの文字制限の変更

OAAMサーバーに入力するパスワードの文字制限を変更するには、oaam_cli.propertiesファイル内の次のプロパティの値を更新してください。

bharosa.authentipad.textpad.datafield.maxLength

Access ManagerとOAAMの既存の統合デプロイメントの場合、このプロパティの値は、OAAM管理コンソールまたは共有ライブラリを使用して更新できます。

KeyPadのトラブルシューティング

質問/問題: KeyPadで問題が発生しています。この問題をトラブルシューティングするためにはどうすればよいでしょうか。

回答/解決策: 次のリストを参照してください。

KeyPadが表示されない。

- oaam_custom.propertiesの次のプロパティを確認します。

bharosa.authentipad.image.url=kbimage?action=kbimage&

- クライアント・アプリケーションが正しいサーバー・アプリケーションを指し示していることを確認します。

ボタンのジッターが停止する。

- 他のユーザーがKeyPad設定を変更しました。サーバーの担当者にプロパティを変更していないか確認してください。

すべてのユーザーに同じイメージが表示される。

- プロパティ・ファイルを調べて、バックグラウンド・フォルダ設定が正しいことを確認します。

パッドの背景にイメージが表示されない。

- ブラウザで、ユーザーがイメージを無効化した可能性があります。

- ユーザーのイメージがバックグラウンド・フォルダから削除された可能性があります。

- プロパティ・ファイルを調べて、バックグラウンド・フォルダ設定が正しいことを確認します。

- システムでパーソナライズ用のイメージの割当てが構成されていることを確認します。

第VIII部

用語集

この部は、用語集で構成されています。

用語集

アクセス認証

HTTPトランザクションのコンテキストにおける基本的なアクセス認証の方法は、Webブラウザや他のクライアント・プログラムでリクエストを行うときに、資格証明をユーザー名とパスワードの形式で提供できるように設計されています。

アクション

セキュリティ・プロファイルの登録の強制、KBAチャレンジ、アクセスのブロック、PINやパスワードの要求など、ユーザーに影響を与える可能性があるルール結果。

Adaptive Risk Manager

Oracle Adaptive Access Managerの機能のカテゴリです。ビジネス分析とリスク分析、不正調査およびカスタマ・サービス・ツールはAdaptive Risk Managerカテゴリに属します。

Adaptive Strong Authenticator

Oracle Adaptive Access Managerの機能のカテゴリです。エンド・ユーザーが使用するインタフェース、フローおよび認証方式はすべて、Adaptive Strong Authenticatorのカテゴリに属します。

ASP.NET

ASP.NETは、プログラマが動的なWebサイト、WebアプリケーションおよびWebサービスを構築できるWebアプリケーション・フレームワークです。OAAMには、OAAM .NET開発キット(SDK)が用意されています。OAAM .NET SDKは、ASP.NETアプリケーションとOAAMとの統合に使用します。その中のOAAM .NET APIは、OAAM .NETライブラリ、OAAMサンプル.NETアプリケーション、OAAMフラッシュ・ムービー・ページ、および.NETのネイティブ統合に必要なその他のファイルによって公開されています。任意のASP.NET言語で作成されているASP.NETアプリケーションでは、OAAM .NET APIを使用してOracle Adaptive Access Managerをコールできます。

アラート

特定のタイプのOracle Adaptive Access Managerユーザーを対象とするメッセージを含むルール結果です。

API

Application Programming Interfaceは、ソフトウェアベースのサービスへのアクセス方法を定義します。Oracle Adaptive Access Managerでは、デバイスのフィンガープリント処理、認証ログとトランザクション・ログの収集、セキュリティ・ルールの実行、事前登録された質問に対するユーザーからの正しい回答を求めるチャレンジ、KeyPad、TextPad、QuestionPadなどの仮想認証デバイスの生成を可能にするAPIが提供されます。

属性

属性は、追跡中のアクティビティに関連付けられた特定の情報です。例としてログイン時刻をあげることができます。パターンによって、メンバーに関するデータが収集されます。メンバー・タイプがユーザーである場合、パターンによってユーザーに関するデータが収集されます。

認証

ユーザー、デバイスおよびアプリケーションのアイデンティティを確認するプロセスです。認証によって、誰が特定のサービスへのアクセスを試行しているかが識別されます。

認証ステータス

認証ステータスはセッションのステータスです(ログイン試行またはトランザクション試行のたびに、新規セッションが作成されます)。

次に例を示します。

- ユーザーが初めてログインして登録処理を実行し、その登録処理を完了しないでログアウトした場合、このユーザー・セッションの認証ステータスは「アクティブ化保留中」に設定されます。

- ユーザーが異なるデバイスまたは場所からログインした場合、そのユーザーはチャレンジを受けます。ユーザーはチャレンジ質問への回答を3回試みてすべて失敗し、このセッションの認証ステータスは「不正なパスワード」に設定されます。

- ユーザーがログインし、最後のトランザクション・ページまたは成功ページまで到達した場合、その特定のセッションの認証ステータスは「成功」に設定されます。

- ユーザーが不正でブロックされた場合、そのセッションのステータスは「ブロック」に設定されます。

認可

認可によって、どのコンポーネントから提供されるどのリソースに誰がアクセスできるかが識別されます。

認証ユーザー

認証データベースのユーザーです。

自動学習

自動学習は、動作をリアルタイムで動的にプロファイリングする、Oracle Adaptive Access Managerの一連の機能です。ユーザー、デバイスおよび場所の動作が記録され、現在の動作のリスクを評価するために使用されます。

ブラックリスト

ブロックされるユーザー、デバイス、IPアドレス、ネットワーク、国などを示す特定のリストです。特定のメンバーからの攻撃をレポートに表示し、その攻撃を管理者の判断でブラックリストに手動で追加できます。

ブロック済

ユーザーが「ブロック済」になるのは、ポリシーの特定の条件がtrueになり、そのポリシーがこのような条件にブロック・アクションで応答するように設定されている場合です。該当する条件が変更されると、ユーザーは「ブロック済」ではなくなる場合があります。「ブロック済」ステータスは必ずしも永続的なものではないため、解決に管理者のアクションを必要としない場合があります。たとえば、ユーザーがブロックされた原因が、ブロックされる国からログインしたことである場合、出国後は「ブロック済」ではなくなる可能性があります。

ボット

インターネットを経由して、セキュリティが損なわれたPC上で自動化または編成されたタスクを実行するソフトウェア・アプリケーションです。編成されたボットは、ボット・ネットまたはゾンビ・ネットワークとして知られています。

ブラウザのフィンガープリント処理

ユーザーがシステムにアクセスすると、OAAMによってコンピュータに関する情報が収集されます。サイトでそのようなデータがすべて組み合され、ユーザーのブラウザのフィンガープリントが作成されます。このフィンガープリントによって、ユーザーを一意に識別できる場合があります。ブラウザのフィンガープリントを構成する情報には、ブラウザ・タイプ、インストールされた拡張機能、システム・フォント、オペレーティング・システムの構成およびバージョン情報、コンピュータでCookieを受け入れるかなどがあります。

ブラウザとFlashのフィンガープリントは別々に追跡されます。フィンガープリントはセッション・リストと詳細ページから使用でき、各詳細ページを開くとフィンガープリントの詳細を確認できます。したがって、両方のフィンガープリントを使用可能にできますが、ユーザーがFlashをインストールしていない場合、デジタル・フィンガープリント(Flash)はNULLに設定されます。

キャッシュ・データ

指定した時間枠における履歴データの情報です。

ケース

ケースによって、カスタマ・サービスの問題を追跡および解決するツールが提供されます。

ケースは、カスタマおよびカスタマの様々なアカウント・アクティビティをサポートするためにCSRが実行するすべてのアクションの記録です。各ケースには、一意のケース識別番号であるケース番号が割り当てられます。

チャレンジ質問

チャレンジ質問は、セカンダリ認証に使用される有限の質問リストです。

登録中、ユーザーにはいくつかの質問メニューが提示されます。たとえば、3つの質問メニューが提示される場合があります。登録中、ユーザーはメニューごとに質問を1つ選択し、その回答を入力する必要があります。質問メニューごとに1つのみ質問を登録できます。これらの質問は、ユーザーの登録済質問になります。

OAAM管理内のルールによってチャレンジ質問がトリガーされると、OAAMサーバーでは、チャレンジ質問を表示し、ユーザーにとってセキュアな方法で回答を受け入れます。質問はQuestionPad、TextPadおよびその他のパッドで提示でき、この場合、チャレンジ質問はオーセンティケータのイメージまたは簡単なHTMLに埋め込まれます。

チャレンジ・タイプ

チャレンジのタイプの構成(ChallengeEmail、ChallengeSMS、ChallengeQuestion)です。

チェックポイント

チェックポイントは、Oracle Adaptive Access Managerがセッション内でルール・エンジンを使用してセキュリティ・データを収集および評価する特定のポイントです。

チェックポイントの例を次に示します。

- 認証前 - ルールはユーザーが認証プロセスを完了する前に実行されます。

- 認証後 - ルールはユーザーが正常に認証された後に実行されます。

構成可能なアクション

構成可能なアクションによって、ルールの実行後に発生する補足アクションをユーザーが作成できるようになります。

完了した登録

登録を完了したユーザーのステータスです。ユーザーは自身を登録するために、パーソナライズ(イメージおよびフレーズ)、チャレンジ質問/回答および電子メール/携帯電話の登録をすべて完了することが必要になる場合があります。

条件

条件は、履歴および実行時データの評価に使用される構成可能な評価文です。

Cookie

Cookieは少量のテキストやデータからなる文字列で、ユーザーのコンピュータに格納されます。Oracle Adaptive Access Managerでは、2つのタイプのCookieを使用してデバイス識別を実行します。1つはブラウザCookie(セキュアなCookieとも呼ばれます)であり、もう1つはFlash Cookie(デジタルCookieとも呼ばれます)です。ブラウザCookie値は、ブラウザのユーザー・エージェント文字列を使用して作成されます。Flash Cookie値は、OAAMのFlash動画データを使用して作成されます。

CSR

カスタマ・サービス担当は、カスタマからの問合せに基づいてカスタマの低リスクの問題を解決します。CSRによるOAAM管理へのアクセスは制限されています。

- ログインまたはトランザクションがブロックされた理由の表示

- エスカレーションを支援するための、重大度フラグとアラート・ステータスの表示

- カスタマが使用する一時許可の発行などのアクションの完了

CSRマネージャ

CSRマネージャは、CSRタイプ・ケースの全体的な管理を担当します。CSRマネージャには、CSRのすべてのアクセス権と責任、およびより機密性の高い操作へのアクセス権があります。

ダッシュボード

集計とトレンドを通じてアクティビティをリアルタイムで表示します。

データ・マイニング

データ・マイニングとは、大量に保管されているデータを自動的に検索して、単純な分析では得られないパターンや傾向を見つける手続きです。データ・マイニングでは高度な数学的アルゴリズムを使用して、データを分割し、将来のイベントの発生確率を判断します。データ・マイニングは、データからの知識発見(KDD)としても知られています。データ・マイニングを行うと、単純な問合せや報告技術では解決できない問題を解決できます。

データ型

データの種類と構造を表すデータ属性です。Stringなどが該当します。

配信チャネル

ユーザーへのOTPの送信に使用される配信メカニズムです。電子メール、SMS、IMなどが配信チャネルです。

デバイス

ユーザーが使用するコンピュータ、PDA、携帯電話、キオスクおよびその他の機器を指します。

デバイスのフィンガープリント処理

デバイスのフィンガープリント処理と識別は、OAAMでアクセス・リクエストまたはトランザクションのリスクを評価するために利用される、数多くの属性の中の1つです。OAAMでは、完全なレイヤー化セキュリティ・ソリューションが提供されます。デバイスのフィンガープリント処理と識別は、それらのレイヤーのうちの1つのみを表します。

OAAMでは、純粋なWeb環境におけるブラウザ・ベースのフィンガープリント処理が提供されます。これは、クライアント・ソフトウェアが不要であることを意味します。これにより、大勢の多様なユーザーを対象としたソリューションのデプロイメントが管理可能になります。また、クライアント側にロジックを配置しないことで、ロジックの改ざんを防げます。Javaアプレットやネイティブ・モバイル・アプリケーションなどのクライアント・ソフトウェアをデプロイする場合は(またはデプロイが必要な場合は)、OAAMでは、クライアントによって収集された追加デバイスのフィンガープリント・データ(IMEI、MACなど)を受け入れることができます。ハードウェア・ベースの一意の識別子などの追加データを提供すると、フィンガープリント処理の適性は向上します。

ブラウザ・ベースのフィンガープリント処理を使用するときには、各ブラウザに固有のデバイスIDが割り振られます。これは、同一のラップトップ上にインストールされているInternet ExplorerとFirefoxが、それぞれOAAMコンソールの別々のデバイスIDとして表示されることを意味します。これは意図的なもので、OAAMが提供するセキュリティ・レベルに影響はありません。OAAMでは、デプロイメントで使用されるすべてのデバイスIDのプロファイリングが、ユーザーに関連付けて実行される場合や別個に実行される場合があるからです。Firefoxを使用するユーザーが、時にはInternet Explorerを使用することはめずらしくありません。OAAMでは、これをプロファイルの一部として追跡します。

OAAMブラウザのフィンガープリント処理ロジックでは、ブラウザ・ユーザー・エージェント文字列データのみでなく、セッション中に使用可能なその他のコンテキスト・データも使用されます。その他のデータには、1回かぎり使用されるセキュアなCookieやFlash共有オブジェクトも含まれます(存在する場合)。ユーザーがCookieやFSOを削除してしまった場合やそれらを有効化していない場合、デバイスのフィンガープリント処理ロジックが自動的に対応します。OAAMは、短期間の間(3回のログイン)新しいIDを割り当てます。その後、ユーザーの動作が変わらない場合は(同一のユーザーが同一のIPを使用している場合など)、以前のIDに戻します。デバイスのフィンガープリント処理では、オペレーティング・システムやブラウザのアップグレードなど、デバイス・データの一般的な変更も考慮されます。

デバイス識別

登録処理中、ユーザーは任意で自身のデバイスをシステムに登録できます。登録済デバイスからユーザーがログインを試行すると、アプリケーションはそのデバイスが安全かつセキュアであることを認識しているため、ユーザーにトランザクションの続行を許可します。このプロセスはデバイス識別とも呼ばれます。

デバイス登録

デバイス登録は、ユーザーが安全なデバイスとして使用しているデバイス(コンピュータ、携帯電話、PDAなど)にフラグを付けることができる機能です。カスタマはその後、登録済デバイスからアクセスしていないユーザーへのチャレンジに使用するルールを構成できます。

一度機能を有効化すると、そのユーザーのデバイスに関する情報が収集されます。収集した情報を活用するには、ポリシーを作成および構成する必要があります。たとえば、登録済デバイスからログインしていないユーザーへのチャレンジに使用するルールを含むポリシーを作成できます。

暗号化

特別な知識がある人を除いて判読できない形式に加工された情報です。

エンティティ

エンティティ構造は、最適化のために複数の関連するデータ・ポイントを組み込むことで作成されます。エンティティは、そのエンティティの新しいインスタンスを作成することで、複数のトランザクションで再使用できます。エンティティはどのトランザクションにも関連付けられておらず、依存もしていません。

たとえば、shipping addressおよびbilling addressインスタンスは、Addressエンティティの2つの異なるトランザクション用に作成できます。住所エンティティには、データ・ポイントとしてstreet number、street name、apartment number、city、state、postal codeおよびcountryを含めることができます。

環境

構成システムのプロパティおよびスナップショット用のツールです。

有効期限日

CSRケースの有効期限が切れる日付です。デフォルトでは、ケースの有効期限が切れるまでの時間は24時間です。24時間後、ステータスが現在のステータスから「有効期限切れ」に変化します。ケースは有効期限が切れるとき、保留中やエスカレーション済のステータスになっている場合があります。ケースの有効期限が切れた後、ユーザーはそのケースを開くことができなくなりますが、CSRマネージャは開くことができます。ケースの有効期限が切れるまでの時間は構成可能です。

実行タイプ

構成可能なアクションには、次の2つの実行タイプがあります。

- 同期 - 同期アクションは、昇順の優先度に従って実行されます。たとえば、ユーザーがケースを作成し、そのケースIDを含む電子メールを送信する必要がある場合、ユーザーは同期アクションを選択します。同期アクションは即時にトリガー(実行)されます。
アクションが順次実行されており、順序内のアクションの1つがトリガーされない場合でも、その他のアクションはトリガーされます。

- 非同期アクションは実行用のキュー内に配置されますが、特定の順序には従いません。たとえば、電子メールを送信するかアクションを実行するときに、即時実行せず、実行順序にこだわらない場合は、非同期アクションを選択します。

列挙

ユーザー定義列挙は、アイテムのリストを表すプロパティの集合です。リスト内の各要素には、複数の異なる属性が含まれている場合があります。ユーザー定義列挙の定義はキーワード.enumで終わるプロパティで始まり、ユーザー定義列挙の使用を記述する値が続きます。各要素定義は、列挙と同じプロパティ名に要素名が追加されたもので始まり、IDである一意の整数の値が続きます。要素の属性も同じパターンに従い、要素のプロパティ名で始まり、その後に属性名がその属性の適切な値とともに示されます。

OAAMサーバー実装のログイン画面に表示される、列挙定義資格証明の例を次に示します。

bharosa.uio.default.credentials.enum = Enum for Login Credentials
bharosa.uio.default.credentials.enum.companyid=0
bharosa.uio.default.credentials.enum.companyid.name=CompanyID
bharosa.uio.default.credentials.enum.companyid.description=Company ID
bharosa.uio.default.credentials.enum.companyid.inputname=comapanyid
bharosa.uio.default.credentials.enum.companyid.maxlength=24
bharosa.uio.default.credentials.enum.companyid.order=0
bharosa.uio.default.credentials.enum.username=1
bharosa.uio.default.credentials.enum.username.name=Username
bharosa.uio.default.credentials.enum.username.description=Username
bharosa.uio.default.credentials.enum.username.inputname=userid
bharosa.uio.default.credentials.enum.username.maxlength=18
bharosa.uio.default.credentials.enum.username.order=1

ファット・フィンガリング

このアルゴリズムでは、標準キーボードのキーの近接による回答の誤入力を処理します。

Flashのフィンガープリント処理

Flashのフィンガープリント処理は、ブラウザのフィンガープリント処理に似ていますが、サーバーでFlash動画を使用してCookieを設定またはユーザーのマシンから取得することによって、特定の情報の組合せがブラウザとFlashから取得されるようにします。Flashがクライアント・マシンにインストールされている場合、Flashフィンガープリントが唯一の情報になります。

フィンガープリントは別々に追跡されます。フィンガープリントはセッション・リストと詳細ページから使用でき、各詳細ページを開くとフィンガープリントの詳細を確認できます。したがって、両方のフィンガープリントを使用可能にできますが、ユーザーがFlashをインストールしていない場合、デジタル・フィンガープリント(Flash)はNULLに設定されます。

不正調査担当者

不正調査担当者は主に、カスタマ・サービスまたはOracle Adaptive Access Managerのアラートから直接エスカレーションされた疑わしい状況を調査します。エージェントはすべてのカスタマ・ケア機能にアクセスできるだけでなく、セキュリティ管理とBI Publisherレポートの読取り専用権限もあります。

不正調査マネージャ

不正調査マネージャには、調査担当者のすべてのアクセス権と職務、およびすべてのケースを管理する責任があります。調査マネージャは定期的に有効期限の切れたケースを検索し、保留中のケースを残さないようにする必要があります。

不正シナリオ

不正シナリオは、企業のオンライン・アプリケーションを標的にした悪意のある行為など、発生する可能性がある、または実際に発生している不正な状況です。

たとえば、月曜日にオフィスに到着し、OAAM管理にログインしたとします。そこで、数人のユーザーが「不正なパスワード」および「無効なユーザー」ステータスで何回もログインしていることに気付きます。このうち何人かは国外、何人かは同じ地域からログインしたようです。不正チームから、一部のアカウントのセキュリティが損なわれていることを知らせる電話が入ります。このようなトランザクションを識別してブロックできる一連のルールを用意する必要があります。

グループ

同様のアイテムの集合です。次のようなグループがあります。

- ルール条件内で使用されるグループ

- ポリシーをユーザー・グループにリンクするグループ

- アクションおよびアラート・グループ

In-Proc統合

この統合では、アプリケーションにOracle Adaptive Access Managerの処理エンジンが埋め込まれるため、基礎となるデータベースを処理に直接活用することが可能になります。このシナリオでは、アプリケーションにサーバーのJARファイルと構成されたプロパティを適宜含める必要があります。

HTTP

ハイパーテキスト転送プロトコル

IPアドレス

インターネット・プロトコル(IP)・アドレス

ジョブ

ジョブは、OAAMで実行できるタスクの集合です。データのロード、リスク評価の実行、監視データのロールアップなど、様々なジョブを実行できます。

KBA電話チャレンジ

ユーザーは、登録済のチャレンジ質問を使用して電話で認証できます。このオプションは、未登録ユーザーまたはKBAを使用していないデプロイメントでは使用できません。

KeyPad

パスワードやクレジット・カード番号などの入力に使用する仮想キーボードです。KeyPadによって、トロイの木馬やキーロギングからの保護が提供されます。

キーストローク・ロガー

ユーザーのキーストロークを取得するソフトウェアです。キーロギング・ソフトウェアは、ユーザーのコンピュータ上で入力された機密データを収集するために使用されます。

ナレッジベース認証(KBA)

OAAMナレッジベース認証(KBA)は、登録済チャレンジ質問に基づくユーザー・チャレンジ・インフラストラクチャです。登録ロジック、チャレンジ・ロジックおよび回答ロジックを処理します。

ロケーション

トランザクション・リクエストが発生した市区町村、都道府県、国、IP、ネットワークIDなど。

ロック済

「ロック済」は、ユーザーがKBAまたはOTPチャレンジに失敗した場合にOracle Adaptive Access Managerによって設定されるステータスです。「ロック済」ステータスが使用されるのは、KBAまたはワンタイム・パスワード(OTP)機能が使用中の場合のみです。

- OTP: 構成済の配信方法を使用してOTPからユーザーにワンタイムPINまたはパスワードが送信され、そのユーザーによるOTPコードの入力試行回数が一定数を超えた場合、アカウントは「ロック済」になります。

- KBA: オンライン・チャレンジの場合、オンライン・カウンタが最大失敗回数に達したときに、カスタマはセッションからロックアウトされます。電話チャレンジの場合、失敗の最大数に達し、それ以上チャレンジ質問が残っていない場合に、カスタマがロックアウトされます。

ロックアウトされた後、再度そのアカウントを使用してユーザーがシステムにログインするには、カスタマ・サービス担当がステータスを「ロック解除」にリセットする必要があります。

マルウェア

マルウェアは、所有者に情報を提供して同意を得ることなく、コンピュータ・システムに潜入して損害を与えるように設計されたソフトウェアです。マルウェアには、キー・ロガーやその他のタイプの悪意のあるコードが含まれる場合があります。

中間者攻撃(プロキシ攻撃)

不正行為者が、二者間のリンクのセキュリティが損なわれていることをいずれの当事者にも知られることなく、二者間のメッセージの読取り、挿入および変更を自由に行うことができる攻撃です。

マルチファクタ認証

マルチファクタ認証(MFA)は、複数の認証形式を実装してトランザクションの正当性を検証するセキュリティ・システムです。一方、単一ファクタ認証(SFA)ではユーザーIDとパスワードのみが使用されます。

マルチプロセス・モジュール(MPM)

Apache httpdにはいくつかのマルチプロセス・モジュール(MPM)が付属しています。これらのモジュールは、マシン上のネットワーク・ポートへのバインド、リクエストの受入れ、およびリクエストを処理するための子のディスパッチを行います。

相互認証

相互認証または双方向認証とは、二者間で互いを適切に認証することを指します。技術的には、いずれの当事者にも相手のアイデンティティが保証される方法で、クライアントまたはユーザーが自身をサーバーに対して認証し、そのサーバーが自身をユーザーに対して認証することを指します。

ネイティブ統合

ネイティブ統合では、アプリケーションをカスタマイズして、ログイン・プロセスの各ステージでOAAM APIコールを含めます。アプリケーションでは、Oracle Adaptive Access Managerを直接起動することで、アプリケーション自体で認証フローとチャレンジ・フローを管理します。

- SOAPサービス・ラッパーAPI: アプリケーションは、Oracle Adaptive Access Managerネイティブ・クライアントAPI (SOAPサービス・ラッパーAPI)またはWebサービスを使用してOracle Adaptive Access Managerと通信します。アプリケーションでは、Oracle Adaptive Access Managerとの対話にSOAPコールが使用されます。

- 静的リンク: Oracle Adaptive Access Manager (OAAMライブラリ)の処理エンジンがアプリケーションに埋め込まれます。基礎となるデータベースが処理に直接利用されます。

OAAM管理

すべての環境およびAdaptive Risk ManagerとAdaptive Strong Authenticatorの機能を対象とした管理用Webアプリケーションです。

OAAMサーバー

ネイティブ統合を除くすべてのデプロイメント・タイプで使用される、Adaptive Risk ManagerとAdaptive Strong Authenticatorの機能、Webサービス、LDAP統合およびユーザーWebアプリケーションです。

ワンタイム・パスワード認証(OTP)

ワンタイム・パスワード認証(OTP)は、アウト・オブ・バンド認証形式の1つであり、セカンダリ資格証明として使用され、事前に構成されたチェックポイントで構成済のポリシーに基づいて生成されます。

OTP Anywhere

OTP Anywhereは、リスク・ベースのチャレンジ・ソリューションであり、構成済のアウト・オブ・バンド・チャネルを経由してエンド・ユーザーに送信されるサーバー生成のワンタイム・パスワードから構成されます。サポートされるOTP配信チャネルには、ショート・メッセージ・サービス(SMS)、電子メール、インスタント・メッセージングなどがあります。OTP Anywhereは、KBAチャレンジを補完するために、またはKBAのかわりに使用できます。また、OTP AnywhereとKBAは、いずれも、デプロイメント内で他に必要となる、実質的にすべての認証タイプとともに使用できます。Oracle Adaptive Access Managerでは、チャレンジ・プロセッサ・フレームワークも提供されます。このフレームワークを使用すると、サード・パーティ認証製品またはサービスをOAAMリアルタイム・リスク評価と組み合せた、リスク・ベースのカスタム・チャレンジ・ソリューションを実装できます。

Oracle Adaptive Access Manager

企業とそのカスタマをオンラインで保護するための製品です。

Oracle Adaptive Access Manager

- マルチファクタ認証セキュリティを提供します。

- 複数のデータ型を評価してリアルタイムでリスクを特定します。

- オフライン環境における不正ポリシーの調査と作成に役立ちます。

- アクセス管理アプリケーションと統合されます。

Oracle Adaptive Access Managerは、OAAMサーバーおよびOAAM管理という2つの主要コンポーネントから構成されます。

Oracle Data Mining (ODM)

Oracle Database EEのオプションであるOracle Data Miningでは、強力なデータ・マイニング機能が提供されます。

組織ID

ユーザーが属する組織の一意のIDです。

アウト・オブ・バンド認証

同時に動作する2つの異なるネットワークを使用してユーザーを認証することです。たとえば、電子メール、SMS、電話などがあります。

パターン

パターンは管理者によって構成され、アクセス・データのダイジェストを作成することによって、システムにアクセスするユーザー、デバイスおよび場所の動作を記録します。ダイジェストまたはプロファイル情報は、その後履歴データ表に格納されます。ルールによってパターンが評価され、動的にリスク・レベルが査定されます。

パーソナライズ・アクティブ

アクティブなイメージ、フレーズおよび質問を持つユーザーのステータスです。パーソナライズは個人バックグラウンド・イメージおよびフレーズから構成されます。サーバーによってタイムスタンプが生成され、再利用を防ぐために、1回のみ使用できるイメージに埋め込まれます。各オーセンティケータ・インタフェースは、1回のみ使用するためにユーザーに提供される単一イメージです。

ファーミング

ファーミングは、Webサイトのトラフィックを別の偽Webサイトにリダイレクトすることを目的とした攻撃です。

フィッシング

ソーシャル・エンジニアリングの技法を使用してユーザーをだまし、偽Webアプリケーションにアクセスさせる犯罪行為です。フィッシングの攻撃者は、信頼できるエンティティを装い、ユーザー名、パスワード、クレジット・カードの詳細などの機密情報を不正に取得しようとします。多くの場合、フィッシング行為は、だまされやすいユーザーを誘い込むための電子メールから始まります。

PinPad

数値PINを入力するための認証入力デバイスです。

プラグイン

プラグインは、特定の、通常は非常に特殊な機能をオンデマンドで提供するために、ホスト・アプリケーション(Webブラウザや電子メール・クライアントなど)とやり取りするコンピュータ・プログラムから構成されます。

ポリシー

ポリシーには、各チェックポイントでリスクのレベルを評価するために使用される、セキュリティ・ルールおよび構成が含まれます。

ポリシー・セット

ポリシー・セットは、現在構成されているすべてのポリシーの集合であり、トラフィックを評価して潜在的なリスクを識別するために使用されます。ポリシー・セットには、スコアリング・エンジンとアクション/スコア・オーバーライドが含まれます。

ポリシー・ステータス

ポリシーには、オブジェクトの状態またはビジネス・プロセスに対する可用性を定義する3つのステータスがあります。

- アクティブ

- 無効

- 削除済

「削除済」は使用されません。

ポリシーを削除すると、そのポリシーはデータベースから完全に削除されます。

デフォルトでは、新しく作成されたすべてのポリシーのステータスは「アクティブ」になります。

コピーされたすべてのポリシーのデフォルト・ステータスは「無効」になります。

認証後

ルールはユーザー・パスワードが認証された後に実行されます。認証後チェックポイントによって返される共通アクションには、次のものが含まれます。

- 許可: ユーザーが次に進むことを許可します。

- ブロック: ユーザーが次に進むことをブロックします。

- チャレンジ: ユーザーにチャレンジします。

認証前

ルールはユーザーが認証される前に実行されます。認証前チェックポイントによって返される共通値には、次のものが含まれます。

- 許可: ユーザーが次に進むことを許可します。

- ブロック: ユーザーが次に進むことをブロックします。

予測分析

予測分析では、将来のイベントを予測するために、統計、データ・マイニングおよびゲーム理論の様々な技術を利用して、現在のファクトと履歴ファクトを分析します。

アクティブな質問

登録が完了し、回答するチャレンジ質問が存在するユーザーのステータスです。

質問セット

チャレンジ質問の登録時にカスタマが選択できる質問の合計数です。

QuestionPad

ユーザーが機密タスクを実行する前に回答するチャレンジ質問を提示するデバイスです。このデータ入力方法は、セッション・ハイジャックからの防御に役立ちます。

登録

カスタマがログイン・プロセスに加えて、チャレンジ質問、シークレット・イメージ、テキスト・フレーズ、ワンタイム・パスワードなどを登録することでセキュリティの別のレイヤーを追加する登録プロセスです。

登録済質問

カスタマの登録済質問は、カスタマが登録またはリセット中に選択および回答した質問です。質問メニューごとに1つのみ質問を登録できます。

登録ロジック

KBA登録処理を制御するロジックの構成です。

リスク・スコア

チェックポイントに関連付けられた数値リスク・レベルです。

ルール条件

条件は、セキュリティ・ポリシーの基本構築ブロックです。

ルール

ルールはユーザー・アクティビティの評価に使用される条件の集合です。

サンプル

OAAMサンプル・アプリケーションは、参照用として提供されています。独自のアプリケーションにAPIを統合する前に、OAAMサンプル・アプリケーションをダウンロードしてください。それは、製品APIをコールする方法を示しています。ドキュメントの形式で提供されています。OAAMサンプル・アプリケーションは、本番環境での使用を目的としたコードではありません。

スコア

スコアとは、特定の状況に関連付けたリスク・レベルの評価に使用される数値スコアリングを指します。ポリシーの結果はスコアです。

スコアリング・エンジン

Oracle Adaptive Access Managerでは、スコアリング・エンジンを使用して、アクセス・リクエスト、イベントおよびトランザクションに関連付けられたリスクを計算します。

スコアリング・エンジンは、ポリシーおよびポリシー・セット・レベルで使用されます。ポリシー・スコアリング・エンジンは、ポリシーに含まれる様々なルールによって生成されるスコアを計算します。ポリシー・セット・スコアリング・エンジンは、ポリシーのスコアに基づく最終的なスコアを計算します。

数値入力が存在する場合、スコアリングではそのような様々なポイントをすべてまとめて、判断基準として使用可能なスコアを生成できます。

セキュアなCookie

OAAMによってクライアントのブラウザに格納されるセキュアなCookieは、追跡のために使用されるCookieで、次の特徴を備えています。

- ユーザーに関する情報は格納しません。

- デバイスを識別するためにユーザーがこのブラウザに以前にログインしたことがある場合にのみ、追跡に使用されます。

- 単一ユーザーに対してのみ有効です。

OAAMがこのCookieをブラウザで見つけた場合、このCookieを予想される値と比較します。これら2つの値が一致する場合、以前に使用したデバイスからリクエストが行われたことを意味するため、デバイスIDが再使用されます。一致しなかった場合は、Cookieが失効しているまたは変更されている可能性があるため、OAAMはそれを無視します。ブラウザにCookieが存在しない場合、これは新しいリクエストです。いずれにせよ、このCookieは廃棄され、新しいCookieが生成されます。

Security Assertion Markup Language (SAML)

Security Assertion Markup Language (SAML)は、認証データと認可データをセキュリティ・ドメイン間、つまりアイデンティティ・プロバイダ(アサーションのプロデューサ)とサービス・プロバイダ(アサーションのコンシューマ)との間で交換するためのXMLベースのオープン・スタンダードです。

セキュリティ・トークン

セキュリティ・トークン(ハードウェア・トークン、ハード・トークン、認証トークン、USBトークン、暗号トークンとも呼ばれます)は、自身のIDを電子的に証明する(カスタマが銀行口座にアクセスするときなど)ために使用されます。トークンは、カスタマが身分を証明するために、パスワードに加えて、またはパスワードで使用されます。トークンは、何かにアクセスするための電子キーのように動作します。

重大度レベル

ケースの重大度をケース担当に伝えるマーカーです。重大度レベルは、ケースの作成者が設定します。使用可能な重大度レベルには、「高」、「中」および「低」があります。カスタマが不正を疑っている場合、割り当てられる重大度レベルは「高」になります。たとえば、カスタマが異なるイメージを必要としている場合、割り当てられる重大度レベルは「低」になります。重大度レベルは、必要に応じてエスカレーションまたはエスカレーション解除できます。

セッション・ハイジャック

セッション・ハイジャックとは、有効なコンピュータ・セッション(セッション・キーとも呼ばれます)を悪用して、コンピュータ・システム内の情報やサービスに不正アクセスすることを指します。

スナップショット

スナップショットは、Oracle Adaptive Accessポリシー、依存コンポーネント、およびバックアップ、障害時リカバリおよび移行の構成を含むZIPファイルです。スナップショットをデータベースに保存して高速リカバリに使用したり、ファイルに保存して環境とバックアップとの間の移行に使用できます。スナップショットのリストアは、差異の内容と、競合の解決に必要なアクションを目に見える形で正確に把握できるプロセスです。

SOAP

SOAP(当初はSimple Object Access Protocolとして定義されました)は、コンピュータ・ネットワーク内のWebサービスの実装において構造化された情報を交換するためのプロトコル仕様です。メッセージ形式としてはExtensible Markup Language (XML)が使用され、メッセージのネゴシエーションと送信には、通常、他のアプリケーション・レイヤー・プロトコル(中でもリモート・プロシージャ・コール(RPC)とHTTP)を使用します。SOAPはWebサービス・プロトコル・スタックの基本レイヤーであり、Webサービスの構築基盤として使用できる基本的なメッセージング・フレームワークを提供します。

SOAPサービス・ラッパーAPI

SOAPサービス・ラッパーAPIでは、SOAPオブジェクトを作成してSOAPコールを起動したり、SOAPのWeb Service Definition Language (WSDL)やその他のWebサービス詳細をアプリケーション・コードから抽象化できます。このAPIのライブラリは、Java、.NETおよびC++で提供されています。

この統合では、クライアント・ライブラリへの軽量クライアント・ライブラリ(JARまたはDLLファイル)の追加が必要になります。

ソーシャル・エンジニアリング

ソーシャル・エンジニアリングは、人々を操って行動を起こしたり機密情報を不正行為者に漏えいするために使用される技法の集合です。

なりすまし攻撃

ネットワーク・セキュリティとの関連において、なりすまし攻撃は、ある個人またはプログラムが、データを偽造して違法に利用することによって、別の個人またはプログラムを装うことに成功した状況です。

スパイウェア

スパイウェアは、ユーザーとコンピュータとのやり取りを捕捉または一部制御するために、ユーザーに情報を提供して同意を得ることなく、パーソナル・コンピュータに不正にインストールされるコンピュータ・ソフトウェアです。

厳密認証

認証要素は、セキュリティ制約に従ってアクセスをリクエストする個人または他のエンティティのIDを認証または検証するために使用される、情報やプロセスです。2つの要素による認証(T-FA)は、2つの異なる要素を組み合せて認証に使用するシステムです。要素を1つではなく2つ使用すると、一般的に、認証の保証のレベルが高まります。

複数の要素を使用することを厳密認証と呼ぶ場合があります。

一時許可

ログインまたはトランザクションを実行できないカスタマに付与される一時的なアカウント・アクセスです。

TextPad

通常のキーボードを使用してパスワードまたはPINを入力するためのパーソナライズされたデバイス。このデータ入力方法は、フィッシングからの防御に役立ちます。大規模なデプロイメントでは、TextPadがすべてのユーザーのデフォルトとしてデプロイされることが多く、その後、各ユーザーが必要に応じて個別に別のデバイスにアップグレードできます。ユーザーが登録した個人イメージおよびフレーズは、ユーザーが有効なサイトにログインするたびに表示され、ユーザーとサーバーとの間の共有シークレットとして機能します。

トランザクション

トランザクションは、アプリケーションのイベント/トランザクション分析をサポートするデータ構造およびマッピングを定義します。

トランザクション・データ

抽象アイテムであるかそれ自体では属性を持たないデータ、どのエンティティにも当てはまらないデータ、およびそれ自体で存在するか一意であるデータは、トランザクション・データとして定義されます。

エンティティに当てはまらないアイテムは、スタンドアロン・データとして分類されます。

代表的な例には、数量やコードがあります。

トランザクション定義

トランザクションの監視とプロファイリングを開始するには、トランザクション定義を使用してアプリケーション・データをマップします。Oracle Adaptive Access Managerによって処理される各トランザクション・タイプには、別々のトランザクション定義が必要です。

トランザクション・キー

このキー値は、クライアントまたは外部トランザクション・データをOAAMサーバー内のトランザクションにマップします。

トリガー

評価結果がtrueになるルールです。

トランザクション・タイプ

認証、請求書の支払、電信送金など、この特定のインストール内で構成されたトランザクション定義です。

トロイの木馬

他の処理の実行を装って悪意のあるソフトウェアをインストールするプログラムです。

ユーザー

トランザクションの実行を認可された企業、個人、クレジット・カードなどを指します。

検証

KBA質問登録およびチャレンジ処理で使用される回答検証です。

仮想認証デバイス

パスワードまたはPINを入力するためのパーソナライズされたデバイス、または認証資格証明を入力するためのデバイスです。仮想認証デバイスでは、認証資格証明の入力と送信のプロセスを強化し、エンド・ユーザーが有効なアプリケーションに対して認証していることを検証します。

索引
A  B  C  D  E  F  G  H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W

A

省略形ファイル, 追加, 10.4

AbstractChallengeProcessor, 16.2

アプリケーションID, 8.3

ASP.NETアプリケーション統合, 3

authenticateQuestion, 2.3.19

オーセンティケータ/AuthentiPad, 20.1.1

オーセンティケータ・フレーム, 20.2.1

自動学習, 用語集

B

[Back Space]キーのホットスポット

KeyPad, 20.2.4.4

PinPad, 20.2.4.2

bharosa_pad.js, 3.4.6.2 bharosa_server.properties, 8.1, 20.1.3.1 bharosa.cipher.client.key, 3.3.2 BharosaClient.getAuthentiPad(), 3.4.6.1 BharosaUtil.exe, 3.3.2 BharosaUtils.exe, 3.3.2 一括トランザクション, 作成および更新, 3.4.3.2

C

cancelAllTemporaryAllows, 4.5.4

[Caps Lock]キーの状態

KeyPad, 20.2.4.4

チャレンジ失敗カウンタ, リセット, 3.4.5 チャレンジ・プロセッサ, 16.2 チャレンジ質問, ユーザーの検証, 3.4.4 ユーザーへのチャレンジ(S6), 2.3.18

KBA, 2.3.18

OTP, 2.3.18

Challenge.jsp, 2.3.18 ChallengeProcessorIntf, 16.2 チャレンジに対する回答のチェック(C3)

KBA, 2.3.19

OTP, 2.3.19

ユーザーの登録のチェック, 2.3.13 clearSafeDeviceList, 4.5.5 client_resource_locale.properties, 8.1 client_resource.properties, 20.1.3.1 com.bharosa.vcrypt.tracker.dynamicactions.intf.DynamicAction javaインタフェース, 24.1 構成可能なアクション

順序での実行およびデータ共有, 24.2

統合, 24

JUnitのコード例, 24.4

デバイス識別のCookie, 2.3.2 createAuthentiPad, 2.3.5, 2.3.6, 2.3.7, 2.3.18 createPersonalizedAuthentiPad, 2.3.5, 2.3.6, 2.3.7, 2.3.18 createTransaction, 4.5.8 カスタム・チャレンジ・プロセッサ, 開発, 21.5 OAAMオフラインのカスタム・ローダー, 開発, 22 カスタム・ログイン・ページ, 2.3.1 Oracle Adaptive Access Managerカスタマイズ, 7

D

仮想認証デバイスの入力のデコード(P4), 2.3.8

decodeKeyPadCode, 2.3.8

decodePadInput, 2.3.8

デフォルトのユーザー・グループ, 決定, 8.3.2

開発者ガイド, 概要, 1

デバイスのフィンガープリントのフロー(F2), 2.3.2

デバイスのフィンガープリント処理, 12.1

デバイスID, ルール・エンジンの戻り値, 3.4.3.1

デバイス識別のクライアント・サイド・プラグイン, 13.2.2.1

デバイス識別, 拡張, 13

デバイス登録, 有効化, 14

TextPadおよびKeyPadのフローの表示(S4およびS5), 2.3.7

E

encryptImageToStream, 2.3.7

[Enter]キーのホットスポット

KeyPad, 20.2.4.4

PinPad, 20.2.4.2

QuestionPad, 20.2.4.3

TextPad, 20.2.4.1, 20.4.2

登録フローの入力(P6), 2.3.15 列挙定義, 3.3.3 拡張共有ライブラリ, 7.2

F

FAQ/トラブルシューティング, 27

構成可能なアクション, 27.4

ローカライズ, 27.9

Man-in-the-Middle/Man-in-the-Browser, 27.10

ワンタイム・パスワード, 27.11

Universal Installation Optionのプロキシ, 27.12

仮想認証デバイス, 27.13

デバイスのフィンガープリント処理, 2.3.2 フラッシュ・フィンガープリント処理, 12

変数とパラメータの定義, 12.2

フォワード・プロキシ, 6.1.1

G

パーソナライズされたTextPadまたはKeyPadの生成フロー(P3), 2.3.6

汎用TextPad, 2.3.5

getActionCount, 4.5.11

getAuthentiPad, 2.3.4, 2.3.14

getFinalAuthStatus, 4.5.13

getHTML, 2.3.5, 2.3.6, 2.3.7, 2.3.18

getRulesData, 4.5.15

getSecretQuestions, 2.3.18

getUserByLoginId, 2.3.5, 2.3.6, 2.3.7, 4.5.18

H

handleChallenge.jsp, 2.3.16, 2.3.19

handleFlash.jsp, 2.3.2

handleJump.jsp, 2.3.2, 2.3.3

handlePassword.jsp, 2.3.8, 2.3.8, 2.3.9, 2.3.9, 2.3.10, 2.3.10, 2.3.12

handleTransactionLog, 4.5.20

HTMLコントロール, 20.2.1

I

IBharosaProxy.createTransactions(), 3.4.3.2

IBharosaProxy.updateTransactions(), 3.4.3.2

imageToStream, 2.3.7

統合

ネイティブ, 2

統合オプション

仮想認証デバイスおよびKBAのシナリオ, 2.3

J

ジッター, 20.1.1

K

kbimage.jsp, 2.3.4, 2.3.7

キーのランダム化, 20.1.1

KeyPad, 2.3.6, 20.1.2.2

KeyPadのオーセンティケータのプロパティ, 20.2.3.4

KeyPadのビジュアル要素, 20.2.4.4

ナレッジベース認証(KBA), 2.3, 2.3, 2.3, 2.3

L

ランディングまたはスプラッシュ・ページ, 2.3.21

ライフサイクル管理変更, 26

ロックアウト・ページ, 2.3.20

M

markDeviceSafe, 4.5.22

マスキング, 20.1.1

マルチファクタ・オーセンティケータ, 追加, 6.7

マルチテナント, 8.3

N

ネイティブ統合, 2

.NET, 4

SOAPサービス・ラッパーAPI, 2.1.2

.NETのネイティブ統合

構成プロパティ・ファイル, 3.3

プロパティ値の暗号化, 3.3.2

SDKのインストール, 3.2

ルール・エンジン, 3.4.3

トラブルシューティング, 3.4.8

仮想認証デバイス, 3.4.6

.NET API, 4 .NET API, トレース・メッセージ, 3.4.8

O

OAAM Oracle BI Publisherレポート, 作成, 23

OAAMサーバー, 6.1.1

ユーザー・インタフェース・ブランドのカスタマイズ, 8.4

デフォルト・ユーザー・グループの決定, 8.3.2

プロパティ, カスタマイズ, 8.3.3

OAAMサーバー・インタフェース, プロキシ, 6.5.3 OAAM Server Webアプリケーション, カスタマイズ, 8 OAAMトランザクション・レポート, 作成, 23.2 oaam_native_dot_net.zip, 3.2 オフセット, 20.1.1 ワンタイム・パスワード認証(OTP), 16.2 Oracle User Messaging Service (UMS)でのワンタイム・パスワード認証(OTP), 16.1 Oracle Adaptive Access Manager API, 4.5 Oracle Adaptive Access ManagerのUniversal Installation Option, 6 組織ID, 8.3.2 OTP

UMSサーバーURLおよび資格情報の構成, 16.5.1

チャレンジ・パッドの構成, 16.10

OTP電子メール・メッセージのカスタマイズ, 16.12.2.1

OTP IMメッセージのカスタマイズ, 16.12.2.2

OTP Anywhereのデータ・ストレージのカスタマイズ, 16.11

電子メール入力の定義, 16.12.1.1

IM入力の定義, 16.12.1.4

オプトアウトの定義, 16.6.6

電話入力の定義, 16.12.1.2

電子メール登録, 16.12.1.1, 16.12.1.2, 16.12.1.4

プロファイル登録の有効化, 16.5.3

電子メール・チャレンジ・プロセッサの登録, 16.12.3.1

IMチャレンジ・プロセッサの登録, 16.12.3.2

チャレンジ・タイプの作業を実行するプロセッサの登録, 16.7

ご使用条件, 16.6.2

OTP統合, 21.5.1 OTPのユーザー情報プロパティ, 21.5.4 UMSを配信方法として使用するOTP, 16.4

P

パスワードのステータス・フロー(C1), 2.3.11

password.jsp, 2.3.4, 2.3.6, 2.3.6, 2.3.7, 2.3.7, 2.3.14, 2.3.14

パーソナライズ, 20.1.1

パーソナライズされたイメージ, 20.2.1

パーソナライズされたKeyPad, 2.3.6

パーソナライズされたTextPad, 2.3.6

フレーズ(キャプション)

KeyPad, 20.2.4.4

PinPad, 20.2.4.2

QuestionPad, 20.2.4.3

TextPad, 20.2.4.1, 20.4.2

PinPad, 20.1.2.2 PinPadのオーセンティケータのプロパティ, 20.2.3.2 PinPadのビジュアル要素, 20.2.4.2 認証前ルール, 2.3.3 認証前ルールのフロー(R1), 2.3.3 processPatternAnalysis, 4.5.23 processRules, 2.3.3, 2.3.4, 2.3.12, 2.3.14, 2.3.15, 2.3.16, 2.3.19, 4.5.24 アプリケーションのプロパティ, 拡張, 8.3.4 プロキシ

アプリケーション検出, 6.6

get-serverアクション, 6.5.1.7

グローバル変数, 6.5.1.8

インターセプション・プロセス, 6.5.2

OAAMサーバー・インタフェース, 6.5.3

post-serverアクション, 6.5.1.7

事前定義済リクエスト変数, 6.5.1.8

redirect-clientアクション, 6.5.1.7

リクエスト変数, 6.5.1.8

シナリオ, 6.6.3

send-to-clientアクション, 6.5.1.7

send-to-serverアクション, 6.5.1.7

セッション変数, 6.5.1.8

プロキシ条件, 6.5.1.2 プロキシ構成, 6.5 プロキシ・フィルタ, 6.5.1.3 Apacheのプロキシ, 6.2

ConfigFile, 6.2.6.1

GlobalVariable, 6.2.6.1

httpdの要件, 6.2.2

log4j.xml, 6.2.6.1

Memcache, 6.2.6.1

UIO_log4j.xml, 6.2.6.2

UIO_Settings.xml, 6.2.6

Apache設定のプロキシ, 6.2.6.1 プロキシのインターセプタ, 6.5.1.1 プロキシ変数, 6.5.1.8

Q

質問のテキスト

QuestionPad, 20.2.4.3

QuestionPad, 20.1.2.3 QuestionPadのオーセンティケータのプロパティ, 20.2.3.3 QuestionPadのビジュアル要素, 20.2.4.3

R

resetChallengeFailureCounters(), 3.4.5

resetUser, 4.5.25

リバース・プロキシ, 6.1.1

認証ルールの実行(R6), 2.3.17

チャレンジのルールの実行(R5), 2.3.16

チャレンジのルールの実行フロー(R5), 2.3.16

認証後ルールの実行(R3), 2.3.12

登録必須ルールの実行(R4), 2.3.14

仮想認証ルールの実行フロー(R2), 2.3.4

runPostAuthRules, 2.3.12

runPreAuthRules, 2.3.3

実行時

作成例, 25.2

S

スコアリング・エンジン, 用語集

setTemporaryAllow, 4.5.30

SOAPの資格証明, 3.4.7

SOAPサービス・ラッパーAPI (Javaまたは.NETアプリケーション用), 2.1.1

SOAPサービス, 2.1.5

soap_key.file, 4.3.4

Javaアプリケーションの静的リンク付けされたライブラリ, 2.1.1

system_soap.keystore, 4.3.4

T

TextPad, 2.3.6, 20.1.2.1

TextPadのオーセンティケータのプロパティ, 20.2.3.1

TextPadのビジュアル要素, 20.2.4.1

タイムスタンプ

KeyPad, 20.2.4.4

PinPad, 20.2.4.2

QuestionPad, 20.2.4.3

TextPad, 20.2.4.1, 20.4.2

タイムスタンプ, 20.1.1 タイムスタンプ、フレーズおよびKeyset, 20.2.1 トランザクション詳細を収集するAPI, 3.4.2 一時ページ, 2.3.1

U

Universal Installation Option, 6.1.1

認証ステータスの更新フロー(P5), 2.3.10

updateAuthStatus, 2.3.10, 2.3.19, 4.5.31

updateLog, 2.3.2, 4.5.32

updateStatus, 2.3.10

データベース内のユーザーの詳細, 格納, 3.4.1

ユーザー・グループ, 8.3

ユーザー・インタフェース・ブランド, カスタマイズ, 8.4

ユーザーのログイン情報, 取得, 3.4.2

ユーザーのログイン・ステータス, 取得, 3.4.2

ユーザー名のページ(S1)フロー, 2.3.1

ユーザー・セッションの属性, 取得, 3.4.2

V

ユーザーとパスワードの検証フロー(CP1), 2.3.9

validateAnswer, 2.3.16, 2.3.19

VCryptAuth, 2.1.5

VCryptCC, 2.1.5

VCryptCommon, 2.1.5

VCryptObjectResponse, 5.1.2

VCryptResponse, 4.4

VCryptRulesEngine, 2.1.5

VCryptTracker, 2.1.5

仮想認証デバイス

アクセシビリティ対応バージョン, 20.6

背景イメージ, 20.2.2

カスタマイズ手順, 20.3

表示, 20.5

ドイツ語のロケールの使用例, 20.8.2

KeySet, 20.2.5

ローカライズ, 20.8

タイプ, 20.1.2

ユーザーの検証, 3.4.6.3

表示されるテキスト入力またはパスワード(非表示)の入力設定, 20.2.4.3

仮想認証デバイス・プロパティ, 20.1.3 仮想認証デバイスのプロパティ・ファイル, 20.1.3.1 仮想認証デバイス, 埋込み, 3.4.6.2 仮想認証デバイス

構成, 20.2.1

作成, 3.4.6.1

Webページへの埋込み, 3.4.6.2

KeyPad, 20.1.2.2

PinPad, 20.1.2.2

QuestionPad, 20.1.2.3

TextPad, 20.1.2.1

仮想認証デバイス, ASP.NETアプリケーション, 3.4.6 仮想Keypad/キーボード, 20.1.1

W

web.configファイル, 3.4.7

オラクル社の法律上の注意点について

コピーライトについて

Copyright © 1994-2013, Oracle and/or its affiliates.All rights reserved.

商標と登録商標について

OracleおよびJavaはOracle Corporationおよびその関連企業の登録商標です。その他の名称は、それぞれの所有者の商標または登録商標です。

Intel、Intel Xeonは、Intel Corporationの商標または登録商標です。すべてのSPARCの商標はライセンスをもとに使用し、SPARC International, Inc.の商標または登録商標です。AMD、Opteron、AMDロゴ、AMD Opteronロゴは、Advanced Micro Devices, Inc.の商標または登録商標です。UNIXは、The Open Groupの登録商標です。

ライセンス制約の保証と結果的に生じる損害の免責

このソフトウェアおよび関連ドキュメントの使用と開示は、ライセンス契約の制約条件に従うものとし、知的財産に関する法律により保護されています。ライセンス契約で明示的に許諾されている場合もしくは法律によって認められている場合を除き、形式、手段に関係なく、いかなる部分も使用、複写、複製、翻訳、放送、修正、ライセンス供与、送信、配布、発表、実行、公開または表示することはできません。このソフトウェアのリバース・エンジニアリング、逆アセンブル、逆コンパイルは互換性のために法律によって規定されている場合を除き、禁止されています。

保証免責

ここに記載された情報は予告なしに変更される場合があります。また、誤りが無いことの保証はいたしかねます。誤りを見つけた場合は、オラクル社までご連絡ください。

制限付権利

このソフトウェアまたは関連ドキュメントを、米国政府機関もしくは米国政府機関に代わってこのソフトウェアまたは関連ドキュメントをライセンスされた者に提供する場合は、次の通知が適用されます。

U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and agency-specific supplemental regulations.As such, use, duplication, disclosure, modification, and adaptation of the programs, including any operating system, integrated software, any programs installed on the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to the programs.No other rights are granted to the U.S. Government.

危険な用途への使用について

このソフトウェアもしくはハードウェアは様々な情報管理アプリケーションでの一般的な使用のために開発されたものです。このソフトウェアもしくはハードウェアは、危険が伴うアプリケーション（人的傷害を発生させる可能性があるアプリケーションを含む）への用途を目的として開発されていません。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用する際、安全に使用するために、適切な安全装置、バックアップ、冗長性（redundancy）、その他の対策を講じることは使用者の責任となります。このソフトウェアもしくはハードウェアを危険が伴うアプリケーションで使用したことに起因して損害が発生しても、オラクル社およびその関連会社は一切の責任を負いかねます。

第三者のコンテンツ、製品、サービスに対する免責事項

このソフトウェアまたはハードウェア、そしてドキュメントは、第三者のコンテンツ、製品、サービスへのアクセス、あるいはそれらに関する情報を提供することがあります。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスに関して一切の責任を負わず、いかなる保証もいたしません。オラクル社およびその関連会社は、第三者のコンテンツ、製品、サービスへのアクセスまたは使用によって損失、費用、あるいは損害が発生しても一切の責任を負いかねます。

ドラフトのアルファ版およびベータ版ドキュメントについて

このドキュメントが試作版の場合:

このドキュメントは試作版であり、デモおよび暫定使用のみを目的としたものです。このソフトウェアを使用するハードウェアに限定するものではありません。オラクル社およびその関連会社は、このドキュメントに関して一切の責任を負わず、いかなる保証もいたしません。また、このドキュメントを使用したことによって損失、費用、あるいは損害が発生しても、一切の責任を負いかねます。