Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Warning

Shibboleth IdP 4.1以降では本体にTOTPプラグインがモジュールとして提供されておりますので、そちらの使用をお勧めします。本ページは本来4.0.x向けのものであり、4.1にて動作するように設定手順を修正したものです。

1. はじめに

Google Shibboleth IdPでの認証において、Google Authenticatorなど、TOTPに対応したデバイス/アプリのワンタイムパスワードを追加で必要とするように変更します。

動作確認にはTOTPに対応したデバイスもしくはアプリが必要です。

Warning

本ページで紹介したプラグインのより新しいバージョン(fork)が以下で公開されております。v3.4に対応しMFAログインフローと組み合わせられますので、こちらの利用もご検討ください。
https://github.com/joeFischetti/Shibboleth-IdP3-TOTP-Auth


Note

本IdPプラグインの添付されたバージョンでは登録できるデバイスの数を1個のみに制限し二要素認証としての効力を確保するものとなります。登録手続きにはIPアドレス等による制限はかかりません。

このままでの運用に不都合がある場合は、登録手続きにアクセス制限をかけた上で個数制限を緩和することをご検討ください。


Note

本TotpフローをExtendedフローの中で使用しようとしてもうまくいきません(Totpを選択してもID・パスワード欄が表示されません)。認証フローを組み合わせたい場合はMFAフローをご検討ください。

Info

ldap.propertiesにLDAPの情報が記述されていると思いますが、LDAPのbindDNの権限で読み込みに加えて書き込みもできることを確認しておいてください。seedの保存をLDAPに対して行います。

...

2. 実習セミナーでは

以下の手順で作業を進めてください。

「3.手順書」記載のページのreleasesタブから 添付の totpauth-impl-NNN0.5.1oncepatch-bin.zip をダウンロード、展開。 をマシンにダウンロード、展開。(参考まで、添付のパッケージとオリジナルの差分はこちら

conf/, edit-webapp/, flows/, views/ の内容をディレクトリ構造を保持したまま/opt/shibboleth-idp/以下に配置。

idpconf/authn/authn.propertiesのidp.authn.flowsに "| Totp "を追加。を指定。

Code Block
languagediff
-idp.authn.flows = Password
+idp.authn.flows = Password|Totp


conf/authn/general-authn.xmlの <util:list id="shibboleth.AvailableAuthenticationFlows"> の子要素として以下を挿入します。TOTPの優先順位を高くするためには先頭に挿入してください。global.xmlの末尾(</beans>の上)に以下を挿入します。

Code Block
languagexml
        <bean id="authn/Totp" parent="shibboleth.AuthenticationFlow"
                p:passiveAuthenticationSupported="true"
                p:forcedAuthenticationSupported="true">
            <property name="supportedPrincipals">
                <util:list>
                    <bean parent="shibboleth.SAML2AuthnContextClassRef"
                        c:classRef="urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken" />
                </util:list>
            </property>
        </bean>

conf/authn/totp-authn-beans.xmlにLDAPの情報を記述します。ldap.propertiesに記述している場合は以下のように修正してください。LDAPのbindDNの権限で読み込みに加えて書き込みもできることを確認しておいてください。

Code Block
languagediff
@@ -37,10 +37,10 @@<!--
        </bean>            <bean idparent="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
-shibboleth.SAML2AuthnContextClassRef"
               <property name="url" value="LDAP_SERVER_URL" /> -               <property name="base" value="BASE_DN" />
-c:classRef="urn:mace:gakunin.jp:idprivacy:ac:classes:Level2" />
               <property name="userDn" value="MANAGERS DN" /> -               <property name="password" value="PASSWORD" />
+<bean parent="shibboleth.SAML2AuthnContextClassRef"
                 <property name="url" value="%{idp.attribute.resolver.LDAP.ldapURL}" /> +               <property name="base" value="%{idp.attribute.resolver.LDAP.baseDN}c:classRef="urn:mace:gakunin.jp:idprivacy:ac:classes:Level1" />
+-->
              <property name="userDn" value="%{idp.attribute.resolver.LDAP.bindDN}" />
+ </util:list>
               <property name="password" value="%{idp.attribute.resolver.LDAP.bindDNCredential}" /></property>
        </bean>
 
        <bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate">

以下は3.3向け修正。

flows/authn/Totp/Totp-flow.xmlに登録のための遷移が宣言されていないので追加します。

Code Block
languagediff
@@ -26,6 +26

※ 他の活用編メニューにてLevel1/Level2の認証強度の設定を実施済みの場合は、コメントアウトを解除してTOTPをLevel2相当としてください。


conf/authn/authn.propertiesにパスワードを持ち回る必要があるため以下の行を修正します。

Code Block
@@ -42,7 +42,7 @@
 # Override this and removeAfterValidation to require all validators to succeed
                    result="viewScope.custom" />
                </on-render>
 
+                <transition on="RegisterToken" to="RegisterToken" />
                <transition on="proceed" to="ExtractTotpFromForm" />
        </view-state>
 

conf/authn/password-authn-config.xmlにパスワードを持ち回る必要があるため以下の行を追加します。

Code Block
@@ -23,6 +23,8 @@
     <bean id="shibboleth.authn.Password.PasswordFieldName" class="java.lang.String" c:_0="j_password" />
     <bean id="shibboleth.authn.Password.SSOBypassFieldName" class="java.lang.String" c:_0="donotcache" />
 
+    <util:constant id="shibboleth.authn.Password.RemoveAfterValidation" static-field="java.lang.Boolean.FALSE"/>
+
     <!-- Simple transforms to apply to username before validation. -->
     <util:constant id="shibboleth.authn.Password.Lowercase" static-field="java.lang.Boolean.FALSE"/>
     <util:constant id="shibboleth.authn.Password.Uppercase" static-field="java.lang.Boolean.FALSE"/>

...

#idp.authn.Password.requireAll = false
 # Override to keep the password around
-#idp.authn.Password.removeAfterValidation = true
+idp.authn.Password.removeAfterValidation = false
 # Override to store password in Java Subject
 #idp.authn.Password.retainAsPrivateCredential = false
 # Simple username transforms before validation


/opt/shibboleth-idp/bin/build.shを実行し、WARファイル再作成およびデプロイします。
最後にJettyの再起動を行います。

Panel
borderColor#cccccc
bgColor#eeeeee
borderStylesolid

# /opt/shibboleth-idp/bin/build.sh
Buildfile: /opt/shibboleth-idp/bin/build.

...

xml
build-war:
Installation Directory: [/opt/shibboleth-idp] ?
[Enter] ←入力なし

# systemctl restart jetty



...

3. 手順書

以下は、利用するTOTPプラグインの開発元のURLです。手順の詳細にご興味がある方はご参照ください。以下は、利用するTOTPプラグインの開発元のURLです。詳細にご興味がある方はご参照ください。
Shibboleth IdPバージョン3.2対応のものであるため、3.3以降に対応するためには上記の追加手順が必要となります。2対応のものであるため、4以降で実行するためには上記のパッケージおよび手順が必要となります。


参考: https://github.com/korteke/Shibboleth-IdP3-TOTP-Auth

...

  1. 接続確認用SPから各自が使用するIdPを選択します。(どのSPからの認証要求でもTOTP認証フローが実行されます)
  2. 第一画面は通常と変わりませんので、通常のUsername/Passwordを入力して次に進みます。
  3. "Token code"というワンタイムパスワードを入力する画面になりますが、まだ登録していませんので下のというワンタイムパスワードを入力する画面になりますが、まだ登録していませんので、画面に指示のある通り任意の6桁の数字を入力し「Login」ボタンを押してください。
  4. 同じ画面の下に"Register a new Token"ボタンをクリックします。ボタンが現れますのでクリックします。そうすると登録のためのQRコードが表示されます。
  5. TOTP対応アプリ(例: Google Authenticator)を起動します。
  6. 「設定を開始」をタップします。
    Image Added
  7. 「バーコードをスキャン」をタップします。
    Image Added
  8. 登録画面に表示されているQRコードを読み取ります。
    Image Added
  9. 登録後に数字6桁のワンタイムパスワードが表示されますので、IdPのQRコードの下にある"Token code"欄に入力し"Register"ボタンをクリックします。
    Image Added

以下が動作確認手順です。

  1. 上記登録直後はワンタイムパスワード入力画面になりますが、入力せずに、再度接続確認用SPから各自が使用するIdPを選択します。
  2. 第一画面は通常と変わりませんので、通常のUsername/Passwordを入力して次に進みます。
  3. "Token code"というワンタイムパスワードを入力する画面になりますので、TOTP対応アプリ/デバイスに表示されている数字6桁のワンタイムパスワードを入力して次に進みます。
  4. 通常通り送信属性同意画面および属性受信の確認ページが表示されれば動作確認完了です。
  5. Image Added
  6. 通常通り送信属性同意画面および属性受信の確認ページが表示されます。
  7. ページ下部の「セッション情報」をクリックして、以下のように認証手段がパスワード認証時と異なることを確認してください。

    Panel

    Authentication Context Class: urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken

    (もしくは他の活用編メニューを実施していればLevel1ないしLevel2)