Shibboleth-IdP冗長化環境構築手順書(Stateless Clustering編)
...
- 下記URLの"Ohio State Custom Login Handler"
https://wiki.shibboleth.net/confluence/display/SHIB2/Contributions#Contributions-IdentityProviderExtensions
アンカー | ||||
---|---|---|---|---|
|
...
web.xmlにカスタムサーブレットをインストールして実行するサブモジュールを宣言します。
書式設定済み # vi /usr/java/tomcat/webapps/idp/WEB-INF/web.xml
web.xmlに下記を追加します。コード ブロック xml xml <context-param> <param-name>contextConfigLocation</param-name> <param-value>file:///opt/shibboleth-idp/conf/internal.xml; file:///opt/shibboleth-idp/conf/service.xml; file:///opt/shibboleth-idp/conf/osuext.xml;</param-value> </context-param>
web.xmlに下記を追加します。コード ブロック xml xml <!-- Servlet for doing stateless cookie-based authentication --> <servlet> <servlet-name>StatelessAuthHandler</servlet-name> <servlet-class>edu.osu.ocio.shibboleth.idp.authn.provider.StatelessLoginServlet</servlet-class> <load-on-startup>5</load-on-startup> <init-param> <param-name>dataSealerRef</param-name> <param-value>shibboleth.SSODataSealer</param-value> </init-param> <init-param> <param-name>submodules</param-name> <param-value>shibboleth.LDAPLoginSubmodule shibboleth.VelocityFormLoginSubmodule</param-value> </init-param> <init-param> <param-name>errorContext</param-name> <param-value>/</param-value> </init-param> <init-param> <param-name>errorPage</param-name> <param-value>/stale.html</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>StatelessAuthHandler</servlet-name> <url-pattern>/Authn/Stateless</url-pattern> </servlet-mapping>
設定ファイル(osuext.xml)を新規に追加します。
書式設定済み # vi /opt/shibboleth-idp/conf/osuext.xml
以下の内容を追加します。パネル <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-2.0.xsd" >
<bean id="shibboleth.SSODataSealer"
class="edu.internet2.middleware.shibboleth.common.util.DataSealer"
depends-on="shibboleth.LogbackLogging" init-method="init">
<!-- 2.3章で作成したkeyStoreを設定します。 -->
<property name="keystorePath" value="/opt/shibboleth-idp/credentials/secret.jks" />
<property name="keystorePassword" value="secret" />
<property name="cipherKeyAlias" value="secret" />
<property name="cipherKeyPassword" value="secret" />
</bean>
<bean id="shibboleth.SSOVelocityEngine"
class="org.springframework.ui.velocity.VelocityEngineFactoryBean"
depends-on="shibboleth.LogbackLogging">
<property name="overrideLogging" value="true"/>
<property name="velocityProperties">
<props>
<prop key="runtime.log.logsystem.class">
edu.internet2.middleware.shibboleth.common.util.Slf4JLogChute
</prop>
<prop key="resource.loader">file</prop>
<prop key="file.resource.loader.class">
org.apache.velocity.runtime.resource.loader.FileResourceLoader
</prop>
<prop key="file.resource.loader.path">/opt/shibboleth-idp/conf</prop>
<prop key="file.resource.loader.cache">false</prop>
</props>
</property>
</bean>
<bean id="shibboleth.LDAPLoginSubmodule"
class="edu.osu.ocio.shibboleth.idp.authn.provider.JAASLoginSubmodule">
<constructor-arg value="file:///opt/shibboleth-idp/conf/login.config "/>
<property name="jaasConfigName"
value="ShibUserPassAuth" /> ←login.configにかかれているものと同じにします。
<property name="authnMethods">
<set>
<value>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</value>
</set>
</property>
<property name="unknownUsernameErrors">
<list>
<value>Cannot authenticate dn, invalid dn</value>
</list>
</property>
<property name="invalidPasswordErrors">
<list>
<value>AcceptSecurityContext error, data 52e</value>
<value>[LDAP: error code 49 - Invalid Credentials]</value>
</list>
</property>
</bean>
<bean id="shibboleth.VelocityFormLoginSubmodule"
class="edu.osu.ocio.shibboleth.idp.authn.provider.VelocityFormLoginSubmodule"
depends-on="shibboleth.LogbackLogging">
<property name="templateName" value="login.vt" />
<property name="velocityEngine" ref="shibboleth.SSOVelocityEngine" />
</bean>
<bean id="shibboleth.OSUServletAttributeExporter"
class="edu.internet2.middleware.shibboleth.common.config.service.ServletContextAttributeExporter"
depends-on="shibboleth.SSODataSealer shibboleth.LogbackLogging shibboleth.LDAPLoginSubmodule shibboleth.VelocityFormLoginSubmodule"
↑半角の空白スペースで区切ります
init-method="initialize" >
<constructor-arg>
<list>
<value>shibboleth.SSODataSealer</value>
<value>shibboleth.LDAPLoginSubmodule</value>
<value>shibboleth.VelocityFormLoginSubmodule</value>
</list>
</constructor-arg>
</bean>
</beans>
※端末のサイズによっては表記がずれる可能性がございます。画面を広くしてご覧ください。
handler.xmlを変更します。
書式設定済み # vi /opt/shibboleth-idp/conf/handler.xml
3行目付近を編集します。コード ブロック xml xmlパネル <ph:ProfileHandlerGroup
xmlns:ph="urn:mace:shibboleth:2.0:idp:profile-handler"
{codehighlightstring}xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
{codehighlightstring}xmlns:osu="urn:mace:osu.edu:shibboleth:idp-ext"
classpath:/schema/xsi:schemaLocation="urn:mace:shibboleth:2.0:idp:profile-handler
{codehighlightstring}classpath:/schema/shibboleth-2.0-idp-profile-handler.xsd
urn:mace:osu.edu:shibboleth:idp-ext
{codehighlightstring}classpath:/schema/idp-osu-ext.xsd
">
※ダブルクォート(")の位置に注意
以下を追加します。パネル コード ブロック xml xml {codehighlightstring} <!--
追加する部分 ここから
{codehighlightstring} {codehighlightstring}-->
<ph:LoginHandler
xsi:type="osu:Stateless"
{codehighlightstring} {codehighlightstring}<ph:AuthenticationMethod>{codehighlightstring} {codehighlightstring}authenticationServletURL="/Authn/Stateless">
{codehighlightstring} {codehighlightstring}<ph:AuthenticationMethod>
urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
{codehighlightstring} {codehighlightstring}</ph:AuthenticationMethod>
{codehighlightstring} {codehighlightstring}</ph:LoginHandler>
<!--
追加する部分 ここまで
>{codehighlightstring}--
>
</ph:ProfileHandlerGroup>
以下をコメントアウトします。パネル コード ブロック xml xml {codehighlightstring}
{codehighlightstring}<!--
<ph:LoginHandler
xsi:type="ph:UsernamePassword"
jaasConfigurationLocation="file:///opt/shibboleth-idp/conf/login.config">
<ph:AuthenticationMethod>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport
</ph:AuthenticationMethod>
{codehighlightstring}</ph:LoginHandler>
{codehighlightstring}-->
attribute-resolver.xmlを変更します。
書式設定済み # vi /opt/shibboleth-idp/conf/attribute-resolver.xml
<resolver:AttributeDefinition>タグの並びに以下を追加します。コード ブロック xml xml <resolver:AttributeDefinition id="cryptoTransientId" xsi:type="ad:CryptoTransientId" xmlns:ad="urn:mace:shibboleth:2.0:resolver:ad" dataSealerRef="shibboleth.SSODataSealer" lifetime="PT3M"> <resolver:AttributeEncoder xsi:type="encoder:SAML1StringNameIdentifier" xmlns:encoder="urn:mace:shibboleth:2.0:attribute:encoder" nameFormat="urn:mace:shibboleth:1.0:nameIdentifier"/> <resolver:AttributeEncoder xsi:type="encoder:SAML2StringNameID" xmlns:encoder="urn:mace:shibboleth:2.0:attribute:encoder" nameFormat="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/> </resolver:AttributeDefinition>
<resolver:PrincipalConnector>タグの並びに以下を追加します。コード ブロック xml xml <resolver:PrincipalConnector id="shibCryptoTransient" xsi:type="pc:CryptoTransient" xmlns:pc="urn:mace:shibboleth:2.0:resolver:pc" dataSealerRef="shibboleth.SSODataSealer" nameIDFormat="urn:mace:shibboleth:1.0:nameIdentifier"/> <resolver:PrincipalConnector id="saml2CryptoTransient" xsi:type="pc:CryptoTransient" xmlns:pc="urn:mace:shibboleth:2.0:resolver:pc" dataSealerRef="shibboleth.SSODataSealer" nameIDFormat="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
以下の resolver:PrincipalConnector はコメントアウトします。パネル コード ブロック xml xml {codehighlightstring}
{codehighlightstring}<!--
<resolver:PrincipalConnector
xsi:type="pc:Transient"
id="shibTransient"
nameIDFormat="urn:mace:shibboleth:1.0:nameIdentifier"/>
<resolver:PrincipalConnector
xsi:type="pc:Transient"
id="saml1Unspec"
nameIDFormat="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"/>
<resolver:PrincipalConnector
xsi:type="pc:Transient"
id="saml2Transient"
{codehighlightstring}nameIDFormat="urn:oasis:names:tc:SAML:2.0:nameid-format:transient"/>
{codehighlightstring}-->
attribute-filter.xmlを変更します。
書式設定済み # vi /opt/shibboleth-idp/conf/attribute-filter.xml
<afp:AttributeRule>タグの並びに以下を追加します。また、attributeID="transientId" のタグをコメントアウトします。パネル コード ブロック xml xml {codehighlightstring}
{codehighlightstring}<!--
<afp:AttributeRule
attributeID="transientId">
<afp:PermitValueRule
xsi:type="basic:ANY"/>
{codehighlightstring}</afp:AttributeRule>
{codehighlightstring} {codehighlightstring}-->
<!--
追加する部分 ここから
{codehighlightstring} {codehighlightstring}-->
<afp:AttributeRule
{codehighlightstring} {codehighlightstring}attributeID="cryptoTransientId">
<afp:PermitValueRule
{codehighlightstring} {codehighlightstring}xsi:type="basic:ANY"/>
{codehighlightstring} {codehighlightstring}</afp:AttributeRule>
<!--
追加する部分 ここまで
{codehighlightstring}-->
ログインファイル(login.vt)を新規に追加します。
書式設定済み # vi /opt/shibboleth-idp/conf/login.vt
以下の内容を追加します。コード ブロック html html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http{codehighlightcolonescape}://www.w3.org/TR/REC-html401/loose.dtd"> <html lang="ja"> <head> <META http-equiv="Content-Type" content="text/html;charset=UTF-8"> </head> <body> <!-- excerpt of the interesting bits --> <div id="loginForm"> #if ($authnInfo.isAccountLocked()) <blockquote style="font-weight:bold; text-align:left"> <p style="color:#cc0000">Login failed. Your Ohio State Username account is locked.</p> </blockquote> #elseif ($authnInfo.isExpiredPassword()) <blockquote style="font-weight:bold; text-align:left"> <p style="color:#cc0000">Login failed. The password associated with your Ohio State Username account has expired.</p> </blockquote> #elseif ($authnInfo.isInvalidPassword()) <blockquote style="font-weight:bold; text-align:left"> <p style="color:#cc0000">Login failed. The password you entered is incorrect.</p> </blockquote> #elseif ($authnInfo.isUnknownUsername()) <blockquote style="font-weight:bold; text-align:left"> <p style="color:#cc0000">Login failed. The username you entered cannot be identified.</p> </blockquote> #elseif ($authnInfo.getLoginException()) <blockquote style="font-weight:bold; text-align:left"> <p style="color:#cc0000">An error occurred during login: $encoder.encodeForHTML($authnInfo.getLoginException().getMessage())</p> </blockquote> #elseif ($authnInfo.getAuthnException()) <blockquote style="font-weight:bold; text-align:left"> <p style="color:#cc0000">An error occurred during login: $encoder.encodeForHTML($authnInfo.getAuthnException().getMessage())</p> </blockquote> #end <form name="login" method="POST" action="$servletPath"> <fieldset> <legend>Identify Yourself</legend> <div> <label for="userid"> Enter your Username </label> <br/> <input type="text" class="text" id="userid" name="j_username" size="50"/> </div> </fieldset> <fieldset> <legend>Password <span class="smallOr">or</span> Passcode</legend> <div> <label for="password"> Enter your account password.<br/> </label> <br/> <input type="password" class="text" id="password" name="j_password" size="50"/> </div> </fieldset> <input type="hidden" name="j_continue" value="1"/> <input id="submit" class="submit" type="submit" value="Login"/> </form> </div> </body> </html>
...
velocityを利用できるようにhttpd.confを編集します。
書式設定済み # vi /etc/httpd/conf/httpd.conf
DefaultType text/plainを以下のように変更します。
パネル DefaultType text/html
アンカー | ||||
---|---|---|---|---|
|
...