比較バージョン

キー

  • この行は追加されました。
  • この行は削除されました。
  • 書式設定が変更されました。

認証方法の変更、設定(証明書による認証)

Shibboleth IdPではLDAPを利用したID

...

/パスワード認証の他に、様々な認証方法を利用することが可能です。以下では、クライアント証明書を利用した認証の設定方法を示します。

この例では、

...

  • クライアント証明書を発行するキャンパス認証局のCA証明書=Camp-CA.crt

...

  • クライアント証明書のサブジェクト”O”の値=“Test_University_A”
  • クライアント証明書のサブジェクト"CN"の値と一致するuidを持つLDAPエントリとして認証される

として設定を行い、クライアント証明書が有効な証明書であり、かつ、上記の条件を満たす場合に認証を行う設定としています。
また、eduPersonPrincipalNameをキーとして、クライアント証明書のサブジェクト“CN”の値によりLDAPから各属性を取得してい ます。そのため、クライアント証明書のサブジェクト”CN”の値を、LDAPのeduPersonPrincipalNameに格納しておくことが必要で す。

こちらの手順は、RemoteUserを使いクライアント証明書での認証を行えるような設定となります。

・(過去のバージョンのShibboleth IdPの場合)RemoteUserモジュールを有効にする

Shibboleth IdPのバージョンが4.1.0以降かつ5.0.0未満では以下で利用するRemoteUserログインフロー機能はモジュール化されており、利用するには有効化操作が必要でした。該当するバージョンをお使いの場合は以下のコマンドを実行してください。(当該モジュールがすでに有効化されているかを確認し、有効化されていない場合に有効化するものです)

パネル
borderColor#cccccc
bgColor#eeeeee
borderStylesolid

# /opt/shibboleth-idp/bin/module.sh -t idp.authn.RemoteUser || /opt/shibboleth-idp/bin/module.sh -e idp.authn.RemoteUser

・/opt/shibboleth-idp/conf/authn/authn.properties の変更 

クライアント証明書を用いた認証のために authn.properties handler.xml の変更(IdPインストール直後の状態に戻す)クライアント証明書を用いた認証のためにhandler.xml ファイルを変更します。

パネル
borderColor#cccccc
bgColor#eeeeee
borderStylesolid

# Regular expression matching login flows to enable, e.g. IPAddress|Password
#idp.authn.flows = Password
idp.authn.flows = RemoteUser

このままだとRemoteUserが証明書認証とみなされないので、以下の設定も加える。

...

パネル
borderColor#cccccc
bgColor#eeeeee
borderStylesolid

#### RemoteUser ####
(省略)
#idp.authn.RemoteUser.checkHeaders =
idp.authn.RemoteUser.checkHeaders = REMOTE_USER
idp.authn.RemoteUser.supportedPrincipals = \

saml2/urn

<!-- Login Handlers --> <!-- --> ←コメントアウトを閉じて、こちらを有効にします     <LoginHandler xsi:type="RemoteUser">         <AuthenticationMethod>urn

:oasis:names:tc:SAML:2.0:ac:classes:

TLSClient</AuthenticationMethod>                      TLSクライアント証明書認証であることをSPに対して明示する↑     </LoginHandler>    <!-- --> ←コメントアウト <!--  Username/password login handler --> <!-- ← コメントアウト <LoginHandler xsi:type="UsernamePassword"            jaasConfigurationLocation="file:///opt/shibboleth-idp-2.0.0/conf/login.config">         <AuthenticationMethod>urn:

X509, \
saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:

PasswordProtectedTransport</AuthenticationMethod>     </LoginHandler>     --> ← コメントアウト

   ※端末のサイズによっては表記がずれる可能性がございます。画面を広くしてご覧ください。

TLSClient, \
saml1/urn:ietf:rfc:2246

・/etc/httpd/conf.d/ssl.confへの追加(赤文字の個所を追加)

※SSLVerifyClientがrequireのため問題ないはずだが、万が一証明書認証に失敗してもIdPに到達した場合REMOTE_USERヘッダに"(null)"が入ってくるため、フェイルセーフとしてrewriteの条件を入れている。

...

パネル
borderColor#cccccc
bgColor#eeeeee
borderStylesolid

(省略)

(省略)

<VirtualHost

_default_:443>

(省略) ProxyPass /idp ajp


(省略)
ProxyPass /idp/ http://localhost:

8009

8080/idp

<Location

/ connectiontimeout=5 timeout=15

<Location /idp/Authn/RemoteUser>

  SSLCACertificateFile /opt/shibboleth-idp/credentials/Camp-CA.crt


SSLVerifyClient

require

SSLVerifyDepth

3

SSLRequireSSL


# SSLOptions

+ExportCertData

+StdEnvVars

SSLUserName

SSL_CLIENT_S_DN_CN

    

SSLRequire

%{SSL_CLIENT_S_DN_O}

eq

"Test_University_A"

 </Location>
(省略)
</VirtualHost>

 

・/opt/shibboleth-idp/conf/attribute-resolver.xmlの修正1

また、クライアント証明書のサブジェクト“CN”の値をedupersonPrincipalNameに設定して、これをキーとしてLDAPから属性を取得するため、下記の設定を行います。

パネル
borderColor#cccccc
bgColor#eeeeee
borderStylesolid
※「eduPersonPrincipalName」を検索し、場所を特定してください。  
    <resolver:AttributeDefinition id="eduPersonPrincipalName" xsi:type="Scoped" xmlns="urn:mace:shibboleth:2.0:resolver:ad"
        scope="nii.ac.jp" sourceAttributeID="eduPersonPrincipalName">
        <resolver:Dependency ref="remoteUser" /> ←変更
 
        <resolver:AttributeEncoder xsi:type="SAML1ScopedString" xmlns="urn:mace:shibboleth:2.0:attribute:encoder"
            name="urn:mace:dir:attribute-def:eduPersonPrincipalName" />
 
        <resolver:AttributeEncoder xsi:type="SAML2ScopedString" xmlns="urn:mace:shibboleth:2.0:attribute:encoder"
            name="urn:oid:1.3.6.1.4.1.5923.1.1.1.6" friendlyName="eduPersonPrincipalName" />
    </resolver:AttributeDefinition>
 
 <resolver:AttributeDefinition xsi:type="PrincipalName" xmlns="urn:mace:shibboleth:2.0:resolver:ad"  id="remoteUser" /> ←追加

 

RequestHeader set REMOTE_USER %{REMOTE_USER}s
RewriteEngine On
RewriteCond %{SSL:REMOTE_USER} =""
RewriteRule .* - [E=REMOTEUSERNULL]
RequestHeader unset REMOTE_USER env=REMOTEUSERNULL
</Location>
SSLCACertificateFile /opt/shibboleth-idp/

...

credentials/

...

cacert.

...

pem

パネル
borderColor#cccccc
bgColor#eeeeee
borderStylesolid
※「LDAP Connector」を検索し、場所を特定してください。
    <!-- Example LDAP Connector -->
    <!-- --> 
    <resolver:DataConnector id="myLDAP" xsi:type="LDAPDirectory" xmlns="urn:mace:shibboleth:2.0:resolver:dc"
        ldapURL="ldap://localhost" baseDN="o=test_o,dc=ac,c=JP" principal="cn=olmgr,o=test_o,dc=ac,c=JP"
        principalCredential="csildap">   
        <FilterTemplate>
            <![CDATA[
                (eduPersonPrincipalName=$requestContext.principalName)  ←変更
            ]]>
        </FilterTemplate>
    </resolver:DataConnector>
    <!-- -->

 

(省略)

#SSLProtocol all -SSLv3
#SSLProxyProtocol all -SSLv3
SSLProtocol all -SSLv3 -TLSv1.3 

(省略)

</VirtualHost>


ApacheとJettyを再起動します。・${CATALINA_HOME}/webapp/idp/WEB-INF/web.xmlへの追加(赤文字の箇所を追加)

パネル
borderColor#cccccc
bgColor#eeeeee
borderStylesolid
(省略)
    <!-- Servlet protected by container used for RemoteUser authentication -->
    <servlet>
        <servlet-name>RemoteUserAuthHandler</servlet-name>
        <servlet-class>edu.internet2.middleware.shibboleth.idp.authn.provider.RemoteUserAuthServlet</servlet-class>
        <load-on-startup>3</load-on-startup>

        <init-param>
            <param-name>authnMethod</param-name>
            <param-value>urn:oasis:names:tc:SAML:2.0:ac:classes:TLSClient</param-value>
        </init-param>

    </servlet>
(省略)

 

・/opt/shibboleth-idp/conf/relying-party.xmlの修正

複数の認証手段を使うのでなければ必須ではありませんが、デフォルトの認証手段を指定しておきましょう。

パネル
borderColor#cccccc
bgColor#eeeeee
borderStylesolid
※「DefaultRelyingParty」を検索し、場所を特定してください。  
    <rp:DefaultRelyingParty provider="https://idp.example.ac.jp/idp/shibboleth" defaultSigningCredentialRef="IdPCredential"
            ↑前行の末尾の > の直前で改行し、↓を追加
        defaultAuthenticationMethod="urn:oasis:names:tc:SAML:2.0:ac:classes:TLSClient">

 

# systemctl restart httpd

# systemctl restart jetty

複数の認証手段を使う場合

複数の認証手段を使うのでなければ以上で完了です。

複数の認証手段(ログインフロー)を使う(冒頭のidp.authn.flowsPassword|X509 のように複数記述する)場合で、デフォルトのログインフロー(SPからの認証要求時に認証手段についての指定がない場合に遷移するログインフロー)を指定したい場合には、4.1以降の場合は、各ログインフロー idp.authn.*.order プロパティを調整してください。数字を指定し、小さいものが高優先度となります。
4.0.xおよびそれ以前の場合は、conf/authn/general-authn.xmlのbeanの順序を変更してください。上にあるものが優先的に選択されます。例えば3.4.0の初期設定では authn/X509 のbeanが authn/Password のbeanより上にあるため、証明書認証が優先されます。

さらに、一部の条件で(例えば特定のSPに対して)証明書認証以外を利用させたくない場合は、relying-party.xmlのshibboleth.RelyingPartyOverrides設定で p:authenticationFlows="#{{'X509'}}" のように利用可能な認証手段を指定してください。

トラブルシューティング

Tomcatを使っている場合で、Apacheではクライアント証明書が認識されているがその情報がTomcatに伝わっていない場合、/usr/share※Apacheではクライアント証明書が認識されているがその情報がTomcatに伝わっていない場合、/usr/java/tomcat/conf/server.xmlの8009番ポートConnectorにtomcatAuthentication="false"が設定されているこ とを確認してください。が設定されていることを確認してください。
参考: jdk6、tomcat6をインストールする参考URL(証明書認証の別実装): https://wiki.shibboleth.net/confluence/display/SHIB2/X.509+Login+Handler jdk 8、tomcat 7をインストールする

参考

IdPv3の証明書認証の詳細: Shibboleth Wiki: X509AuthnConfiguration