uApprove.jp (uApproveを機能拡張しました)は、 エンドユーザに利用するサービスに送信する属性の表示の選択を提供するアプリケーションです。
本ガイドでは Shibboleth Identity Provider (IdP)のための uApprove.jp のインストールおよび設定方法を説明します。
IdP プラグインおよび uApprove.jp viewer のインストール方法と、 ストレージとしてファイルもしくは SQL データベースを用いた設定方法を示します。
このガイドでは例として以下の設定値を使用します。
idp.example.org
/opt/uApprove
/opt/uApprove/conf
/opt/shibboleth-identityprovider-2.x
install.sh
が存在するディレクトリ)/opt/shibboleth-idp
${CATALINA_HOME}
/usr/java/tomcat
)uApprove.jp のインストールと設定の前に、以下の前提条件が揃っていることを確認してください。
uApprve.jp をダウンロードして unzip してください:
|
|
ライブラリファイルと設定ファイルをコピーしてください:
|
uApprove.jp は二つのソフトウェアから成り立っています。 IdP コンテクストの中で動作する IdP プラグインと IdP コンテクストから独立した uApprove.jp viewer アプリケーションです。
どちらも共通のデータストレージとその操作のためのライブラリを使用します。
最初にどちらのストレージを使用するか決めなければなりません:
ファイルベースストレージの設定は /opt/uApprove/conf/common.properties で行います:
|
最初にデータベースとユーザを作成します:
|
次に、テーブルを作成します:
|
以下のテーブルはuApprove.jp-2.2.1で追加しました。
以下のテーブルはuApprove.jp-2.2.1cで追加しました。
|
簡単にデータベースの設定が正しいかを確認するためには、下記コマンドを利用できます:
|
データベースを利用する設定は /opt/uApprove/conf/common.properties で行います:
|
uApprove.jp は BoneCP ライブラリにより提供される JDBC コネクションプーリングサービスをサポートしています。 |
データベース固有の設定すべては /opt/uApprove/conf/database.properties で行います:
|
MySQL 以外の SQL サーバを使用する場合は上記の値を使用する SQL サーバに合わせる必要があります。 |
termsOfUse=/opt/uApprove/conf/terms-of-use.xml |
含まれている |
IdP プラグインは Shibboleth IdP web アプリケーション /opt/shibboleth-identityprovider-2.x/src/main/webapp/WEB-INF/web.xml で有効にする必要があります:
|
Shibboleth IdP を再デプロイします:
|
idp.war
ファイルを${CATALINA_HOME}/webapps
にコピーします:
cp /opt/shibboleth-idp/war/idp.war ${CATALINA_HOME}/webapps/ |
SP ブラックリストはユーザの同意対象から除外するリソースを定義します。
SP ブラックリストはオプションで設定は /opt/uApprove/conf/idp-plugin.properties で行います:
spBlacklist=/opt/uApprove/conf/sp-blacklist |
sp-blacklist
中の各行ではブラックリスト対象のリソースを表す正規表現の定義を行います:
# 例 1: 特定のリソース https://sp\.example\.org/shibboleth # 例 2: SP に存在するすべてのアプリケーション https://sp\.example\.org/.* # 例 3: 特定ドメインにあるすべての SP https://.*\.example\.org/.* |
属性リストの順序を定義できます。さらに、必要ならば属性の隠蔽もできます。属性リストの設定はオプションで、 /opt/uApprove/conf/idp-plugin.properties で行います:
attributeList=/opt/uApprove/conf/attribute-list |
attribute-list
は下記のようになります:
# 属性の順序を定義 surname givenName postalAddress ... # 隠す属性 !persistentId !transientId |
データベースを使用する場合は各プロバイダのアクセスに対して記録を残すことが可能で、 これはすべての属性の送信がデータベースに保存されていることを意味します。
IdP プラグイン は monitoring only mode で実行することも可能で、 これはすべてのプロバイダのアクセスを記録しますが、ユーザの同意のためのやりとりは行いません。
viewer web アプリケーションを使用する場合、 IdP プラグインは viewer web アプリケーションのデプロイ先を知っている必要があります。
IdP プラグインに、isPassiveリクエストに関して考慮の必要があることを伝えることができます。
設定は /opt/uApprove/conf/idp-plugin.properties で行います:
logProviderAccess=false |
uApprove.jp webapp のための tomcat のデプロイの記述を ${CATALINA_HOME}/conf/Catalina/localhost/uApprove.xml で定義します:
<Context docBase="/opt/uApprove/war/uApprove.war" privileged="true" antiResourceLocking="false" antiJARLocking="false" unpackWAR="false" /> |
設定ディレクトリに従って、viewer アプリケーション の設定を修正します。 変更は/opt/uApprove/viewer-2.2.1c/webapp/WEB-INF/web.xml で行います:
<web-app> ... <context-param> <param-name>Config</param-name> <param-value> /opt/uApprove/conf/viewer.properties; /opt/uApprove/conf/common.properties; </param-value> </context-param> ... <web-app> |
必要であれば、ロゴやナビゲーションメニューを変更します。 ロゴは/opt/uApprove/viewer-2.2.1c/webapp/images以下のイメージファイルやURLを 使うことができます。
設定は/opt/uApprove/viewer-2.2.1c/webapp/header.jspで行います:
<body class="switchaai"> <div class="box-aai" style="width: 650px;"> <img src="images/GakuNin_logo.png" alt="GakuNin-logo" class="switchaai" height="32" width="162"> |
uApprove webapp をデプロイします:
cd /opt/uApprove/viewer-2.2.1c/ ant deploy -Duapprove.deployment=/opt/uApprove/war |
viewer web アプリケーションは属性名や説明といった静的なテキストと動的なテキストに対して多言語対応です。
静的なテキストは次の言語が対応しています: 英語(en), ドイツ語(de), フランス語(fr), イタリア語(it), ポルトガル語(pt), 日本語(ja)
ローカライズされた属性名と説明は /opt/shibboleth-idp/conf/attribute-resolver.xml (Shibboleth IdP resolver) から取得します。ローカライズされた属性名や説明は変更や追加ができます:
... <resolver:AttributeDefinition id="postalAddress" xsi:type="Simple" xmlns="urn:mace:shibboleth:2.0:resolver:ad" sourceAttributeID="postalAddress"> <resolver:Dependency ref="myLDAP" /> <resolver:DisplayName xml:lang="en">Business postal address</resolver:DisplayName> <resolver:DisplayName xml:lang="de">Geschäftsadresse</resolver:DisplayName> <resolver:DisplayName xml:lang="fr">Adresse Professionnelle</resolver:DisplayName> <resolver:DisplayName xml:lang="it">Indirizzo professionale</resolver:DisplayName> <resolver:DisplayName xml:lang="ja">所属組織住所</resolver:DisplayName> <resolver:DisplayDescription xml:lang="en">Business postal address: Campus or office address</resolver:DisplayDescription> <resolver:DisplayDescription xml:lang="de">Adresse am Arbeitsplatz</resolver:DisplayDescription> <resolver:DisplayDescription xml:lang="fr">Adresse de l'institut, de l'universite</resolver:DisplayDescription> <resolver:DisplayDescription xml:lang="it">Indirizzo professionale: Indirizzo dell'istituto o dell'ufficio</resolver:DisplayDescription> <resolver:DisplayDescription xml:lang="ja">所属組織(大学、会社など)の住所</resolver:DisplayDescription> <resolver:AttributeEncoder xsi:type="SAML1String" xmlns="urn:mace:shibboleth:2.0:attribute:encoder" name="urn:mace:dir:attribute-def:postalAddress" /> <resolver:AttributeEncoder xsi:type="SAML2String" xmlns="urn:mace:shibboleth:2.0:attribute:encoder" name="urn:oid:2.5.4.16" friendlyName="postalAddress" /> </resolver:AttributeDefinition> ... |
SWITCHaai 属性については |
ユーザが包括的な属性送信同意を与えることができます。これはユーザが二度と uApprove から送信する属性を問われないということです。 ユーザが異なるリソースのアクセスに対してそれぞれ同意を行うようにするためには /opt/uApprove/conf/viewer.properties に より機能を無効にできます:
globalConsentPossible=true |
viewer web アプリケーションは Shibboleth IdP のように LogBack (リファレンス)を使用します。
logback の設定ファイルは /opt/uApprove/conf/viewer.properties で定義します:
loggingConfig=/opt/uApprove/conf/logging.xml |
ログファイルは logging.xml
で設定します。 Tomcat から書き込みできることを確認してください:
<configuration> ... <appender class="ch.qos.logback.core.FileAppender" name="RootFileAppender"> <file>/opt/uApprove/logs/uApprove.log</file> ... </appender> ... </configuration> |
Apache HTTPd を tomcat のフロントエンドに使用している場合は、viewer web アプリケーション にプロキシーする設定を /etc/httpd/conf.d/ssl.conf で行います:
<VirtualHost idp.example.org:443> ... <Location /uApprove> Allow from all ProxyPass ajp://localhost:8009/uApprove </Location> ... </VirtualHost> |
Apache HTTPd を再起動してください:
/sbin/service httpd restart |
uApprove.jpはAttribute QueryのSAML応答メッセージの属性のリストをユーザーの同意内容に応じて生成します。
プロファイルハンドラファイル(例えば、/opt/shibboleth-idp/conf/handler.xml)内に このプラグインのためにネームスペース宣言を追加する必要があります。以下のように行います:
<ProfileHandlerGroup>
ルート要素のxmlns:xsi
属性の前に xmlns:uajpph="http://www.gakunin.jp/ns/uapprove-jp/profile-handler"
属性を追加xsi:schemaLocation
属性の値のリストの最後に下記を追加http://www.gakunin.jp/ns/uapprove-jp/profile-handler classpath:/schema/shibboleth-2.0-idp-profile-handler-uapprovejp.xsd
|
Attribute Queryプロファイルハンドラを変更する必要があります。以下のように行います:
xsi:type
属性の値を ph:SAML1AttributeQuery
から uajpph:SAML1AttributeQueryUApprove
に変更xsi:type
属性の値を ph:SAML2AttributeQuery
から uajpph:SAML2AttributeQueryUApprove
に変更
|
uApprove.jpはSPのメタデータ内の <RequestedAttribute>
要素 (2. Shibboleth Service Providerの設定を参照ください)と IdP の属性フィルターポリシーファイル内の<AttributeFilterPolicy>
要素を 理解することで、属性が必須であるかオプショナルであるかを決定します。
属性フィルターポリシーファイル(例えば、/opt/shibboleth-idp/conf/attribute-filter.xml)内に このプラグインのためにネームスペース宣言を追加する必要があります。以下のように行います:
<AttributeFilterPolicyGroup>
ルート要素のxmlns:xsi
属性の前に xmlns:uajpmf="http://www.gakunin.jp/ns/uapprove-jp/afp/mf"
属性を追加xsi:schemaLocation
属性の値のリストの最後に下記を追加http://www.gakunin.jp/ns/uapprove-jp/afp/mf classpath:/schema/shibboleth-2.0-afp-mf-uapprovejp.xsd
|
uApprove.jp-2.2.1a 以降はネームスペースの URI が変更になりました。
|
uApprove.jpはPolicy RequirementルールとAttribute RulesのPermit/Deny Valueルールを拡張します:
<afp:PolicyRequirementRule xsi:type="uajpmf:AttributeUapprove">
要素によって定義されます。 そして、SPのメタデータ内に<AttributeConsumingService>
要素が存在する場合に適用されます。Attribute RuleのPermit/Deny Value Rule
このルールは下記のオプショナルな属性を持つ <afp:PermitValueRule xsi:type="uajpmf:AttributeUapprove"/>
要素と <afp:DenyValueRule xsi:type="uajpmf:AttributeUapprove"/>
要素両方によって定義されます。
isApproved (オプショナル)
ユーザによってSPへ送信を許可された属性を示すブーリアン値です。
デフォルト値: true
しかし、もし SPのメタデータ内の<AttributeConsumingService>
要素内の <RequestedAtrribute>
要素で isRequired="true"
となっている属性は、必須属性として扱われ、常にSPに送信されます。
requestedOnly (オプショナル)
SPのメタデータで定義された属性のみを表示するか否かを示すブーリアン値です。
デフォルト値: false
xsi:type="uajpmf:AttributeUapprove"
を持たない許可された属性は必須属性として扱われます。
uajpmf:AttributeUapprove Matchファンクションを用いたPermit Valueルールの例を示します:
<!-- ================================================================================== case 1: メタデータ内に AttributeConsumingService 要素を持つSPにマッチします。 eduPersonPrincipalName 属性はオプショナル属性で、ユーザは送信するか否かを選択できます。 eduPersonAffiliation 属性は必須属性で、常に送信されます。 ================================================================================== --> <afp:AttributeFilterPolicy id="PolicyforSPwithAttributeConsumingService"> <afp:PolicyRequirementRule xsi:type="uajpmf:AttributeUapprove" /> <afp:AttributeRule attributeID="eduPersonPrincipalName"> <afp:PermitValueRule xsi:type="uajpmf:AttributeUapprove" /> </afp:AttributeRule> <afp:AttributeRule attributeID="eduPersonAffiliation"> <afp:PermitValueRule xsi:type="basic:ANY" /> </afp:AttributeRule> ... </afp:AttributeFilterPolicy> <!-- ================================================================================== case 2: メタデータ内に AttributeConsumingService 要素を持たないSPにマッチします。 eduPersonPrincipalName 属性 および eduPersonAffiliation 属性共に必須属性です。 ================================================================================== --> <afp:AttributeFilterPolicy id="PolicyforSPwithoutAttributeConsumingService"> <afp:PolicyRequirementRule xsi:type="basic:NOT"> <basic:Rule xsi:type="uajpmf:AttributeUapprove"/> </afp:PolicyRequirementRule> <afp:AttributeRule attributeID="eduPersonPrincipalName"> <afp:PermitValueRule xsi:type="basic:ANY" /> </afp:AttributeRule> <afp:AttributeRule attributeID="eduPersonAffiliation"> <afp:PermitValueRule xsi:type="basic:ANY" /> </afp:AttributeRule> ... </afp:AttributeFilterPolicy> <!-- ================================================================================== case 3: 全てのSPにマッチします。 eduPersonPrincipalName 属性 および eduPersonAffiliation 属性はオプショナル属性です。 ================================================================================== --> <afp:AttributeFilterPolicy id="PolicyforAnyone"> <afp:PolicyRequirementRule xsi:type="basic:ANY" /> <afp:AttributeRule attributeID="eduPersonPrincipalName"> <afp:PermitValueRule xsi:type="uajpmf:AttributeUapprove" /> </afp:AttributeRule> <afp:AttributeRule attributeID="eduPersonAffiliation"> <afp:PermitValueRule xsi:type="uajpmf:AttributeUapprove" /> </afp:AttributeRule> ... </afp:AttributeFilterPolicy> |
list-approvalsアプリケーションを使用する場合は設定しないでください。 |
オプションである reset-approvals は以下の二通りの方法で操作可能です:
In-Flow の reset-approvals アプリケーションを有効にするには、Shibboleth の UsernamePassword ログインフォーム ${CATALINA_HOME}/webapps/idp/login.jsp にチェックボックスの追加で対応可能です。
in-flow の reset-approvals アプリケーションの設定は提供されている JAAS UsernamePassword ログインハンドラのためのものです。 他のログインハンドラ(例えば RemoteUser)を使用している場合は GET パラメータが IdP プラグインに送信されることを確かめてください。 |
|
Standalone モードのためには、JSP はコンテナ管理による認証、もしくは REMOTE_USER
を提供する Shibboleth Service Provider のどちらかで JSP が保護されている必要があります。
standalone JSP は下記のように呼ばれます。この際パラメータ standalone-next-url
が設定される必要があります。
https://idp.example.org/uApprove/reset-approvals.jsp?standalone-next-url=http://go.here.org/after/reset
reset-approvalsアプリケーションを使用する場合は設定しないでください。 以前のバージョンでreset-approvalsアプリケーションを使用するように設定している場合は、その設定を削除してから以下の設定を行ってください。 |
オプションである list-approvals はStandalone モードで使用します。 REMOTE_USER
を提供するShibboleth Service Provider で JSP が保護されている必要があります。
/etc/shibboleth/shibboleth2.xmlで uid を REMOTE_USERに設定します。
<!-- The ApplicationDefaults element is where most of Shibboleth's SAML bits are defined. --> <ApplicationDefaults entityID="https://idp.example.jp/shibboleth" REMOTE_USER="uid eppn persistent-id targeted-id"> |
/etc/shibboleth/attribute-map.xmlに IdP から uid を受取る設定を追加します。
<Attribute name="urn:mace:dir:attribute-def:uid" id="uid"/> <Attribute name="urn:oid:0.9.2342.19200300.100.1.1" id="uid"/> |
/etc/httpd/conf.d/ssl.conf で以下のように設定します。
... <LocationMatch /uApprove/list-approvals.jsp> AuthType shibboleth ShibRequestSetting requireSession 1 require valid-user </LocationMatch> ... |
下記のように実行します。
https://idp.example.org/uApprove/list-approvals.jsp
Tomcat を再起動してください:
/sbin/service tomcat6 stop && sleep 10 && /sbin/service tomcat6 start |
IdP プラグインは Shibboleth IdP web アプリケーション中で動作するため IdP logger を使用します。IdP logger の設定は /opt/shibboleth-idp/conf/logging.xml で行います:
... <logger name="ch.SWITCH.aai" level="DEBUG"> |
uApprove.jp viewer のログは 1.4.3 で説明したように設定します。log level を DEBUG
に変更します。
uApprove.jp は JDK1.5 を対象に提供されています。あなたの Tomcat がバージョン 1.5 以上の JDK で実行していたとしても Jasper エンジンは実行中の JSP を別ターゲット(例 1.3)向けにコンパイルしている可能性があります。 以下の ${CATALINA_HOME}/conf/web.xml の設定は JSP のコンパイルターゲットを指定するものです:
<servlet> ... <init-param> <param-name>compilerSourceVM</param-name> <param-value>1.5</param-value> </init-param> <init-param> <param-name>compilerTargetVM</param-name> <param-value>1.5</param-value> </init-param> ... </servlet> |
SPは <SPSSODescriptor>
要素内の <AttributeConsumingService>
要素内の <RequestedAttribute>
要素を用いて SP が必須とする、もしくは希望する属性を定義できます。 <RequestedAttribute>
要素は下記の属性を持ちます:
<RequestedAttribute>
要素に以下の属性を記述して、属性の説明文を定義できます。定義した説明文は、uApprove.jp の viewer アプリケーションによって表示されます。
<uajpmd:RequestedAttributeExtension>
要素を用いると、複数の言語で説明文を定義することができます。 <uajpmd:RequestedAttributeExtension>
要素の定義は uajpmd:description
属性の定義に優先します。 <uajpmd:RequestedAttributeExtension>
要素は <SPSSODescriptor>
要素の子要素 <Extensions>
に記述します。
<uajpmd:RequestedAttributeExtension>
要素には以下の属性が必要です。
<RequestedAttribute>
要素のFriendlyName
属性の値と同じ値を記述します。説明文は <uajpmd:Description>
要素に記述します。<uajpmd:RequestedAttributeExtension>
要素は一つ以上の <uajpmd:Description>
要素をもつことができます。
<uajpmd:Description>
要素には以下の属性が必要です。
<RequestedAttribute>
要素のFriendlyName
属性の値と同じ値を記述します。<AttributeConsumingService>
要素の例を下記に示します:
|