...
LDAPを利用したID/パスワード認証の他に、様々な認証方法を利用することが可能です。以下では、クライアント証明書を利用した認証の設定方法を示します。
この例では、
...
- クライアント証明書を発行するキャンパス認証局のCA証明書=Camp-CA.crt
...
- クライアント証明書のサブジェクト”O”の値=“Test_University_A”
- クライアント証明書のサブジェクト"CN"の値と一致するuidを持つLDAPエントリとして認証される
として設定を行い、クライアント証明書が有効な証明書であり、かつ、上記の条件を満たす場合に認証を行う設定としています。
また、eduPersonPrincipalNameをキーとして、クライアント証明書のサブジェクト“CN”の値によりLDAPから各属性を取得してい ます。そのため、クライアント証明書のサブジェクト”CN”の値を、LDAPのeduPersonPrincipalNameに格納しておくことが必要で す。
こちらの手順は、RemoteUserを使いクライアント証明書での認証を行えるような設定となります。
・RemoteUserを有効にする
4.1.0以降では同意機能はモジュール化されており、利用するには有効化操作が必要です。以下のコマンドを実行してください。(当該モジュールがすでに有効化されているかを確認し、有効化されていない場合に有効化するものです)
パネル | ||||||
---|---|---|---|---|---|---|
| ||||||
|
・/opt/shibboleth-idp/conf/authn/
...
クライアント証明書を用いた認証のためにhandler.xml ファイルを変更します。
authn.properties の変更
クライアント証明書を用いた認証のために authn.properties ファイルを変更します。
パネル | ||||||
---|---|---|---|---|---|---|
| ||||||
|
このままだとRemoteUserが証明書認証とみなされないので、以下の設定も加える。
パネル | ||||||
---|---|---|---|---|---|---|
| ||||||
<!-- Login Handlers -->
<!-- --> ←コメントアウトを閉じて、こちらを有効にします
<LoginHandler xsi:type="RemoteUser">
<AuthenticationMethod>urn
|
...
|
・/etc/httpd/conf.d/ssl.confへの追加(赤文字の個所を追加)
※SSLVerifyClientがrequireのため問題ないはずだが、万が一証明書認証に失敗してもIdPに到達した場合REMOTE_USERヘッダに"(null)"が入ってくるため、フェイルセーフとしてrewriteの条件を入れている。
...
パネル | ||||||
---|---|---|---|---|---|---|
| ||||||
</Location> (省略) </VirtualHost> |
・/opt/shibboleth-idp/conf/attribute-resolver.xmlの修正1
また、クライアント証明書のサブジェクト“CN”の値をedupersonPrincipalNameに設定して、これをキーとしてLDAPから属性を取得するため、下記の設定を行います。
パネル | ||||||
---|---|---|---|---|---|---|
| ||||||
※「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" /> ←追加 |
|
...
|
...
|
・/opt/shibboleth-idp/edit-webapp/WEB-INF/web.xmlに対象ヘッダREMOTE_USERを追加
パネル | ||||||
---|---|---|---|---|---|---|
| ||||||
※「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> <!-- --> |
・${CATALINA_HOME}/webapp/idp/WEB-INF/web.xmlへの追加(赤文字の箇所を追加)web.xmlに以下の内容を追加します。
パネル | ||||||
---|---|---|---|---|---|---|
| ||||||
|
...
|
以下を実行して、反映させます。
パネル | ||||||
---|---|---|---|---|---|---|
| ||||||
|
...
|
...
|
...
|
複数の認証手段を使うのでなければ必須ではありませんが、デフォルトの認証手段を指定しておきましょう。またApacheとJettyも再起動します。
パネル | ||||||
---|---|---|---|---|---|---|
| ||||||
※「DefaultRelyingParty」を検索し、場所を特定してください。 <rp:DefaultRelyingParty provider="https://idp.example.ac.jp/idp/shibboleth" defaultSigningCredentialRef="IdPCredential" ↑前行の末尾の > の直前で改行し、↓を追加 defaultAuthenticationMethod="urn:oasis:names:tc:SAML:2.0:ac:classes:TLSClient"> |
|
複数の認証手段を使う場合
複数の認証手段を使うのでなければ以上で完了です。
複数の認証手段(ログインフロー)を使う(冒頭のidp.authn.flows
に Password|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