カテゴリー別アーカイブ: OpenAM

OpenIG自習室(第11回:OpenAM連携 Vol.4)

takaです。

前回はOpenIGとOpenAMを連携させるためのエージェントアプリケーションをインストールしました。

今回はいよいよ、OpenIGとOpenAMの連携動作を確認します。

検証作業は、以下の環境で実施しています。
(同一ハードウェア上で複数サーバを起動しています)

OS :Ubuntu 12.04 LTS
CPU:Intel Celeron 2.20GHz
MEM:2GB

検証サーバ: www.example.com (192.168.0.10)
アプリケーションサーバ(Apache2+PHP:ポート80)
OpenIGサーバ(Tomcat6:ポート8080)
OpenAMサーバ(Tomcat6:ポート18080)


1. OpenIGのconfig.jsonを編集

OpenIGの設定を変更して、OpenAMから送信されたログイン情報を代理認証に使うようにします。
第6回で使った config.json を元に内容を変更します。

変更のポイントは、CryptoHeaderFilterを使ってOpenAMから送信されたログインパスワードを復号化する箇所です。
keyの値には、第9回2-6 で取得した復号化キーをセットします。

{   
    "name": "CryptoHeaderFilter",
    "type": "CryptoHeaderFilter",
    "config": {
        "messageType":"REQUEST",
        "operation":"DECRYPT",
        "algorithm":"DES/ECB/NoPadding",
        "key":"xxxxxxxxxxxx",
        "keyType":"DES",
        "charSet":"utf-8",
        "headers": ["password"],
    }
},

また、LoginRequestFilterのクレデンシャル(ログイン情報)はヘッダーから取得するようになっています。

参考までに、OpenAM連携用のconfig.jsonを全文掲載しておきます。

{
    "heap": {
        "objects": [
            {
                "name": "HandlerServlet",
                "type": "HandlerServlet",
                "config": {
                    "handler": "DispatchHandler",
                    "baseURI": "http://192.168.0.10:80"
                }
            },
            {
                "name": "DispatchHandler",
                "type": "DispatchHandler",
                "config": {
                    "bindings": [
                        {
                            "condition": "${exchange.request.uri.path == '/sample/login.php'}",
                            "handler": "LoginChain",
                        },
                        {
                            "handler": "ClientHandler",
                        }
                    ]
                }
            },
		    {   
		        "name": "CryptoHeaderFilter",
		        "type": "CryptoHeaderFilter",
		        "config": {
		            "messageType":"REQUEST",
		            "operation":"DECRYPT",
		            "algorithm":"DES/ECB/NoPadding",
		            "key":"xxxxxxxxxxxx",
		            "keyType":"DES",
		            "charSet":"utf-8",
		            "headers": ["password"],
		         }
		    },
            {
                "name": "LoginChain",
                "type": "Chain",
                "config": {
                    "filters": ["CryptoHeaderFilter","LoginRequestFilter"],
                    "handler": "ClientHandler"
                }
            },
		    {   
		        "name": "LoginRequestFilter",
		        "type": "StaticRequestFilter",
		        "config": {
		            "method": "POST",
		            "uri": "http://192.168.0.10:80/sample/login.php",
		            "form": {
		                "userid": ["${exchange.request.headers['username'][0]}"],
		                "password": ["${exchange.request.headers['password'][0]}"],
						"action": ["login"]
		            }   
		        }   
		    },
            {
                "name": "ClientHandler",
                "type": "ClientHandler",
                "config": {
                }
            }
        ]
    },
    "servletObject": "HandlerServlet",
}

2. 連携動作の検証

連携動作を確認する前に、OpenIGが稼働するWebアプリケーションコンテナを再起動します。
再起動後、Webブラウザでターゲットアプリケーションを閲覧します。
※簡易認証アプリの場合、http://www.example.com:8080/sample/admin.php を開きます。

正常であれば、ターゲットアプリケーションからOpenAMのログイン画面にリダイレクトされます。
OpenAMのログイン画面で、登録済みのアカウントを使ってログインすると、ターゲットアプリケーションにログイン済みの状態でリダイレクトされます。

もしも正常に動作しない場合、いくつかの切り分けポイントがあります。

ターゲットアプリケーションからOpenAMにリダイレクトされない場合、エージェントをインストールする際の設定に誤りがあるかもしれません。
エージェントをインストールしたディレクトリ(Agent_000というディレクトリが生成されます)にログが出力されますので、参考になるかと思います。
エージェントのログにエラーがなければ、OpenAM側のエージェント設定が原因かもしれません。

OpenAMからターゲットアプリケーションにリダイレクトされない場合、OpenAM側かOpenIG側かの切り分けが必要です。
OpenAMが稼働するWebアプリケーションコンテナのログファイルを確認します。
また、OpenAM管理画面でのエージェント設定内容を再度見直してみましょう。

OpenAM側で問題がなさそうな場合、OpenIGのキャプチャーログ(第4回を参照)を取得して、アカウント情報が正常にPOSTされているかを確認します。

これでOpenIGとOpenAMの連携が確認できました。
実際の運用では複数アプリケーションに対して連携することで、シングルサインオン(SSO)が実現できます。

また、簡易認証アプリでは実装していませんが、ログアウト機能によってシングルサインアウトも可能となります。
複数のアプリケーションを使って、シングルサインオン、シングルサインアウトのテストもできると思います。

(ひとまず)終わりに

11回にわたってOpenIGの勉強をしてきましたが、いかがだったでしょうか。
少しでも、皆様の参考となっていれば幸いです。

ForgeRock社のドキュメントでは、どちらかというとエージェントの利用が推奨されているように書かれています。
エージェントはOpenAMで集中管理できますし、ターゲットアプリケーションと同一サーバ上で稼働することができます。
OpenIGは、ターゲットアプリケーションと(原則的には)別サーバですし、設定はローカル管理なので煩雑になるというデメリットがあります。
リバースプロキシですから、ボトルネックとなるリスクも伴います。

とはいえ、SAMLなどフェデレーション機能を持たない「レガシー」なアプリケーションがまだまだ存在する中で、OpenIGを導入するメリットはあると考えております。
代理認証はエージェントだけで実装することができませんので、OpenIG+エージェントの組み合わせをうまく活用して既存の「レガシー」アプリも含めた、シングルサインオン環境の構築にチャレンジしてみてはいかがでしょうか。

ForgeRock社のコミュニティでは非常に活発なやりとりが行われていますので、わからないことがあれば積極的に活用してみてください。


(参考サイト)

ForgeRock社のOpenIGドキュメントを参考にさせていただきました。

OpenIG自習室(第10回:OpenAM連携 Vol.3)

takaです。

前回はOpenIGとOpenAMを連携させるための設定を行いました。

今回はOpenIGとOpenAMを連携させるためのエージェントアプリケーションをインストールします。
エージェントアプリケーションのインストール先は、本来であればアクセス保護をかけるアプリケーション(WordPressや簡易認証アプリ)が稼働するサーバですが、OpenIGを使った代理認証を行う場合にはOpenIGが稼働するWebアプリケーションコンテナへインストールします。

検証作業は、以下の環境で実施しています。
(同一ハードウェア上で複数サーバを起動しています)

OS :Ubuntu 12.04 LTS
CPU:Intel Celeron 2.20GHz
MEM:2GB

検証サーバ: www.example.com (192.168.0.10)
アプリケーションサーバ(Apache2+PHP:ポート80)
OpenIGサーバ(Tomcat6:ポート8080)
OpenAMサーバ(Tomcat6:ポート18080)


1. エージェントのダウンロード

ForgeRock社のダウンロードページより、J2EE Policy Agentsの中のTomcat v6.0 & v7.0をダウンロードします。
2013年9月時点での最新安定バージョンは、3.1.0です。
(ダウンロードには、事前のユーザー登録が必要です)

2. パスワードファイルの作成

第9回1. エージェント設定 でエージェントの名前とパスワードを登録しました。
そこで登録したパスワードがエージェントインストールの際に必要となるのですが、外部テキストファイルを参照する仕様となっています。
インストーラが参照するためのパスワードファイルを事前に作成します。

# echo エージェントのパスワード > /tmp/pwd.txt
# chmod 400 /tmp/pwd.txt

3. エージェントのインストール

ダウンロードしたZIPファイルを展開してインストールします。

# unzip tomcat_v6_agent_3.1.0-Xpress.zip
# cd j2ee_agents/tomcat_v6_agent/
# ./bin/agentadmin --install

最初に利用規約への同意を求められます。
その後、いくつかの項目について入力します。
入力の際、第9回1. エージェント設定 で登録した内容が必要です。

Tomcat Server Config Directory       : Tomcatのconfディレクトリのパスを指定します(例)/usr/local/tomcat6/conf
OpsnSSO server URL                   : OpenAMのURLを指定します(例)http://www.example.com:18080/openam
$CATALINA_HOME environment variable  : CATALINA_HOMEのパスを指定します(例)/usr/local/tomcat6
Tomcat global web.xml filter install : "true" を入力(またはEnter)
Agent URL                            : エージェントのURLを指定します(例)http://www.example.com:8080/agentapp
Agent Profile name                   : エージェントの名前を指定します(例)SAMPLE
Agent Profile password file name     : パスワードファイルのパスを指定します(例)/tmp/pwd.txt

最後に 1 を入力(またはEnter)するとインストールが実行されます。

処理が終わった後、エージェントアプリケーションをWebアプリケーションコンテナにデプロイします。

# cp ./etc/agentapp.war $CATALINA_HOME/webapps/

これでエージェントのインストールは完了です。
次回は、OpenIGとOpenAM連携の動作検証を行います。


(参考サイト)

ForgeRock社のOpenIGドキュメントを参考にさせていただきました。

OpenIG自習室(第9回:OpenAM連携 Vol.2)

takaです。

前回はOpenAMのインストールを行いました。
OpenIGだけではターゲットアプリケーションのアカウント管理や認証を行うことができませんので、OpenAMとの連携が必要となります。

今回はOpenIGとOpenAMを連携させるための設定を行います。

検証作業は、以下の環境で実施しています。
(同一ハードウェア上で複数サーバを起動しています)

OS :Ubuntu 12.04 LTS
CPU:Intel Celeron 2.20GHz
MEM:2GB

検証サーバ: www.example.com (192.168.0.10)
アプリケーションサーバ(Apache2+PHP:ポート80)
OpenIGサーバ(Tomcat6:ポート8080)
OpenAMサーバ(Tomcat6:ポート18080)


1. エージェント設定

1-1. OpenAMにamAdminでログインし、アクセス制御 > /(最上位のレルム)> エージェント > J2EE を開いて “エージェント”表の【新規…】ボタンをクリックします。

1-2. 新しいエージェントを登録します。名前とパスワードは任意で構いません。
“設定”は 集中 を選択します。
“サーバーURL” には、OpenAMサーバのURL(ここでは http://www.example.com:18080/openam)を入力します。
“エージェントURL”には、エージェントのインストール先URL(ここでは http://www.example.com:8080/agentapp)を入力します。

(注記)
エージェントのインストールは次回行います。
検証環境でのエージェントインストール先は、OpenIGサーバが稼働するWebアプリケーションコンテナとなります。
なお、エージェントをインストールする際には上記設定内容が必要となりますので、忘れないように控えておきましょう。

入力が終わったら【作成】ボタンをクリックします。

1-3. “エージェント”表に作成したエージェント名が表示されているので、エージェント名のリンクをクリックします。

1-4. グローバル の “一般”リンクをクリックし、”エージェントフィルタモード” の “対応するマップ値” に SSO_ONLY と入力して【追加】ボタンをクリックします。(”マップキー”は空欄のままで結構です)

1-5. “エージェントフィルタモード” のリストから ALL を選択し、【削除】ボタンをクリックします。

1-6. 画面の最上部に戻って 【保存】ボタンをクリックします。

1-7. アプリケーション タブをクリックし、”セッション属性処理”リンクをクリックします。

1-8. “セッション属性フェッチモード”で HTTP_HEADER を選択し、”セッション属性マッピング”に以下の2項目を追加します。

マップキー:UserToken
対応するマップ値:username

マップキー:sunIdentityUserPassword
対応するマップ値:password

1-9. 画面の最上部に戻って 【保存】ボタンをクリックします。

1-10. SSO タブをクリックし、”クロスドメイン SSO”リンクをクリックします。

1-11. “クロスドメイン SSO” の 有効 にチェックを入れます。

1-12. 画面の最上部に戻って 【保存】ボタンをクリックします。

この作業は、エージェントが増えた場合(つまり保護するアプリケーションが増えた場合)にはほぼ同様の作業が必要となります。
エージェント毎に設定内容が多少異なる可能性がありますのでご注意ください。

2. SSO設定

2-1. 【メインページに戻る】ボタンをクリックして、認証 タブをクリックします。

2-2. “コア”の【すべてのコア設定…】ボタンをクリックします。

2-3. 画面を下にスクロールして、“ポスト認証プロセス” > “認証ポストプロセスクラス” の “新しい値” に com.sun.identity.authentication.spi.ReplayPasswd と入力して【追加】ボタンをクリックします。

2-4. 画面の最上部に戻って 【保存】ボタンをクリックします。

2-5. 一旦管理画面から離れ、OpenAMが稼働しているサーバのコンソールを開きます。

2-6. コンソールで以下のコマンドを実行します。
なお、以下は Ubuntu 環境上のパスですので、ご利用環境に合わせて変更してください。

# cd /var/lib/tomcat6/webapps/openam/WEB-INF/lib

バージョンにより少々コマンドが異なるのでご注意ください。
(ここでは、バージョン10.1.0を使っています)

■10.1.0の場合

# java -classpath openam-core-10.1.0-Xpress.jar:openam-shared-10.1.0-Xpress.jar com.sun.identity.common.DESGenKey

■10.2.0の場合

# java -classpath openam-core-10.2.0-SNAPSHOT.jar:openam-shared-10.2.0-SNAPSHOT.jar com.sun.identity.common.DESGenKey

コマンドを実行すると Key ==> XXXXXXXXXXXX という復号化キーの値が表示されます。
この「XXXXXXXXXXXX」の部分をコピーするなどして控えておいてください。

2-7. 再びOpenAMの管理画面に戻って トップページ > 設定 > サーバーおよびサイト を開き、”サーバー”表にあるサーバー名のリンクをクリックします。

2-8. 高度 タブをクリックし “拡張プロパティー”表の【追加】ボタンをクリックします。

2-9. 表の一番下に入力フィールドが追加されますので、以下の項目を追加します。

プロパティー名:com.sun.am.replaypasswd.key
プロパティー値:2-6で控えた復号化キーの値

2-10. 【保存】ボタンをクリックして保存します。その際、
「サーバープロファイルが更新されました。識別されないプロパティー com.sun.am.replaypasswd.key です。」
という警告が表示されますが、動作上は問題ありません。(現在のところは・・・ですが)

3. 対象設定

3-1. トップページ > アクセス制御 > /(最上位のレルム)> 対象 を開き、”ユーザー”表の【新規…】ボタンをクリックします。

3-2. 新しい ユーザー画面のフォームに利用者ユーザーの情報を登録します。
ここでは、簡易認証アプリで設定したユーザーアカウント情報を入力します。
入力が終わったら【了解】ボタンをクリックします。

3-3. ユーザー画面に戻ります。
他にも必要があれば同様の手順でユーザーを登録してください。

4. ポリシー設定

4-1. トップページ > アクセス制御 > /(最上位のレルム)> ポリシー を開き、”ポリシー”表の【新規ポリシー…】ボタンをクリックします。

4-2. 新規ポリシー画面が開きますので、”一般” の “名前” に任意の名前を入力します。

4-3. “ルール”表の【新規…】ボタンをクリックします。

4-4. “ステップ 1/2: ルールのサービスタイプを選択”画面で、”サービスタイプ”を URL ポリシーエージェント(リソース名あり) にして【次へ】ボタンをクリックします。

4-5. “ステップ 2/2: 新規ルール”画面で、以下の項目を入力します。

名前:任意の名前で結構です。
リソース名:保護したいアプリケーションのURLを入力します。該当アプリケーションのドキュメントルート(ここでは /sample/)に「*」を追加した形で入力します。
(例)http://www.example.com:80/sample/*
アクション:”GET”と”POST”の両方にチェックを入れ、値はどちらも 許可 にします。

項目の入力が終わったら【終了】ボタンをクリックします。

4-6. 新規ポリシー画面に戻りますので、再度”ルール”表の【新規…】ボタンをクリックします。

4-7. 4-4と同様に URLポリシーエージェント(リソース名あり) を選択して【次へ】ボタンをクリックします。

4-8. 4-5とほぼ同様ですが、”名前”は4-5と別の内容にします。
また、”リソース名”はアプリケーションURLの最後を「*」ではなく「*?*」とします。
(例)http://www.example.com:80/sample/*?*

入力が終わったら【終了】ボタンをクリックします。

4-9. 新規ポリシー画面に戻りますので、”対象”表の【新規…】ボタンをクリックします。

4-10. “ステップ 1/2: 対象タイプを選択”で、”タイプ”を OpenAM アイデンティティー対象 にして【次へ】ボタンをクリックします。

4-11. “ステップ 2/2: 新規対象 - OpenAM アイデンティティー対象”画面で、以下の項目を入力します。

名前:任意の名前で結構です。
フィルタ:ユーザー を選択して【検索】ボタンをクリックします。

“選択可能:”リストに、3.対象設定 で登録したユーザー名が表示されますので、該当ユーザーを選択して【追加 >】ボタンをクリックします。終わったら【終了】ボタンをクリックします。

4-12. 新規ポリシー画面に戻るので、【了解】ボタンをクリックします。

4-13. “(最上位のレルム)- ポリシー”画面に戻ります。登録した内容が表示されていることを確認してください。

これでOpenAM側での設定は完了です。
次回は、J2EEエージェントのインストールを行います。


(参考サイト)

ForgeRock社のOpenIGドキュメント、および以下のサイトを参考にさせていただきました。

OpenAM 10.2.0-SNAPSHOT Administration Guide
http://openam.forgerock.org/openam-documentation/openam-doc-source/doc/admin-guide/index.html

OpenAMによるシングルサインオン(2)リバースプロキシー編
http://tech-sketch.jp/2013/06/openam-1.html

OpenIG自習室(第8回:OpenAM連携 Vol.1)

takaです。

第3回から第6回まで、OpenIGを使った代理認証機能について検証しました。

OpenIGはあくまでリバースプロキシなので、ログインアカウントを管理するわけではありません。
従って実際の運用環境では、シングルサインオンのアカウントは別システムで管理することになります。
そこで今回から、ForgeRock社が提供するアイデンティティ管理システム OpenAM とOpenIGとの連携について検証します。

まず今回はOpenAMのインストールを行います。
OpenAMのインストールや設定については以下のサイトも参考になりますので、ぜひご覧ください。

シングルサインオンとOpenAM – OpenAMで始めるシングルサインオン(2)
http://codezine.jp/article/detail/6319

OpenAMによるシングルサインオン(1)エージェント編
http://tech-sketch.jp/2013/06/openam.html

また、OpenAM関連情報は以下が参考になると思います。
セミナーや勉強会も開催されているので、興味のある方はいかがでしょうか。

OpenSSO & OpenAMコンソーシアム
http://www.openam.jp/

OpenStandia OpenAM最新情報(野村総合研究所)
http://openstandia.jp/oss_info/openam/

オープンソース・ソリューション・テクノロジ株式会社
http://www.osstech.co.jp/

検証作業は、以下の環境で実施しています。
前回、1サーバ上に環境をまとめました)

OS :Ubuntu 12.04 LTS
CPU:Intel Celeron 2.20GHz
MEM:2GB

検証サーバ: www.example.com (192.168.0.10)
アプリケーションサーバ(Apache2+PHP:ポート80)
OpenIGサーバ(Tomcat6:ポート8080)
OpenAMサーバ(Tomcat6:ポート18080)


1. 必要構成

OpenAMをインストールするにあたり、ForgeRock社のドキュメントには推奨構成が記載されています。
空きメモリ(OSや他のアプリケーションで使っている分とは別)が1GB以上、ハードディスク容量は特に言及されていません。

サーバの詳細な要件についてはOpenAM Administration Guide の Tuning OpenAMが参考になります。

JDKは1.5または1.6と書かれていますが、1.6が望ましいようです。
なおForgeRock社は、Oracle Java SE JDKで検証しています。

Webアプリケーションコンテナは、Apache Tomcat、GlassFishなどがサポートされています。
また、データストア(設定やアカウントの保存先)として、ForgeRock社のOpenDJ、MicrosoftのActive Directoryなどがサポートされています。

2. 事前準備(確認事項)

OpenAMをインストールするサーバは、ホスト名をFQDNで名前解決できる必要があります。
インストール前にOSの設定を行ってください。
なお、検証環境であればDNSではなくhostsファイルでの定義で十分です。
ファイアウォールは無効にしておくか、必要なポートを開放するようにしてください。

3. JDKのインストール

JDKのインストール方法については割愛します。
PATHおよび環境変数(JAVA_HOME、CLASSPATH)の設定を忘れずに行ってください。

4. Tomcatのインストール

Tomcatのインストール方法についても割愛します。
第7回も参考になるかと思います)
インストール後、環境変数(CATALINA_HOME、JAVA_OPTS)を設定します。
ここでは CATALINA_HOME(Tomcatのインストールディレクトリ)を /usr/share/tomcat6 とします。
JAVA_OPTS では、OpenAMの起動に必要なパラメータを設定します。

# export CATALINA_HOME="/usr/share/tomcat6"
# export JAVA_OPTS="-Xmx1024m -XX:MaxPermSize=256m"

5. OpenAMのダウンロードと設置

ForgeRock社のダウンロードページよりOpenAMのzipまたはwarファイルをダウンロードします。
現時点(2013年8月)の最新安定版は10.1.0となっています。
なお、最新安定版のダウンロードにはユーザー登録が必要となります。

ダウンロード後は必要に応じて解凍し、Tomcatの場合 $CATALINA_HOME/webapps/ にwarファイルをコピーします。
コピー後、Tomcatを起動します。

6. OpenAMインストール

Tomcatを起動したら、http://www.example.com:18080/openam/ をブラウザで開きます。

初期設定画面が表示されるので、カスタム設定 の 新しい設定の作成 をクリックします。
OpenAMインストール - 初期設定画面

6-1. 一般
デフォルトユーザー(amAdmin)のパスワードを8文字以上で設定します。
amAdminはOpenAMの管理者ユーザーです。
設定が終わったら「次へ」ボタンをクリックします。
OpenAMインストール - 一般

6-2. サーバー設定
デフォルトで設定が入力されています。
サーバーURLとCookieドメインが合っているか確認して「次へ」ボタンをクリックします。
なお、プラットフォームロケールは en_US のままで構いません。
OpenAMインストール - サーバー設定

6-3. 設定データストア設定
最初のインスタンス を選択して「次へ」ボタンをクリックします。
OpenAMインストール - 設定データストア設定

6-4. ユーザーデータストア設定
OpenAMのユーザーデータストア を選択して「次へ」ボタンをクリックします。
外部データストア(OpenDJ、OpenLDAPなど)をお使いの方は、そちらを利用されても結構です。
なお、本番環境では外部データストアの利用が推奨されています。(サポートされていません、とありますが使うことは可能です)
OpenAMインストール - ユーザーデータストア設定

6-5. サイト設定
ロードバランサは使いませんので いいえ のままで「次へ」をクリックします。
OpenAMインストール - サイト設定

6-6. デフォルトのポリシーエージェントユーザー
次回触れますが、OpenAMではポリシーエージェントという外部プログラムを利用します。
この画面では、ポリシーエージェントのパスワードを設定します。
amAdminのパスワードとは別の文字列を設定して「次へ」をクリックします。
OpenAMインストール - デフォルトのポリシーエージェントユーザー

6-7. 設定ツールの概要と詳細
設定内容が表示されますので、内容を確認して「設定の作成」をクリックします。
OpenAMインストール - 設定ツールの概要と詳細

設定中の処理内容が表示されますので、しばらくそのまま待ちます。
OpenAMインストール - 設定中

設定が完了しました、と表示されますので、「ログインに進む」をクリックします。
OpenAMインストール - 設定完了

OpenAMのログイン画面が表示されます。
ユーザー名:amadmin、パスワード:先ほど設定したパスワード、でログインしてみましょう。
OpenAMログイン画面

これでOpenAMのインストール、および初期設定は完了です。

次回はOpenAMの詳細設定について触れます。
OpenIGとOpenAMを連携させるための設定を行い、ターゲットアプリケーションの認証をOpenAMで実施するようにします。


(参考サイト)

ForgeRock社のOpenIGドキュメント、および以下のサイトを参考にさせていただきました。

OpenAM 10.2.0-SNAPSHOT Installation Guide
http://openam.forgerock.org/openam-documentation/openam-doc-source/doc/install-guide/index.html

シングルサインオンとOpenAM – OpenAMで始めるシングルサインオン(2)
http://codezine.jp/article/detail/6319