第13章 認証および承認
13.1. Kerberos と SPNEGO の統合
13.1.1. Kerberos と SPNEGO の統合
通常の設定では、アクティブディレクトリードメインによって制御されるデスクトップにユーザーがログインします。ユーザーは Web ブラウザー (Firefox または Internet Explorer) を使用して、JBoss EAP 上でホストされる JBoss Negotiation を使用する Web アプリケーションへアクセスします。Web ブラウザーは、デスクトップのサインオン情報を Web アプリケーションへ転送します。JBoss EAP は、アクティブディレクトリーまたは Kerberos サーバーを用いてバックグラウンドの GSS メッセージを使用し、ユーザーを検証します。これにより、ユーザーは Web アプリケーションへのシームレスな SSO を実現できます。
13.1.2. SPNEGO を使用したデスクトップ SSO
- セキュリティードメイン
- システムプロパティー
- Web アプリケーション
手順13.1 SPNEGO を使用するデスクトップ SSO の設定
セキュリティードメインの設定
セキュリティードメインを設定して、サーバーのアイデンティティーを表し、Web アプリケーションをセキュアにします。例13.1 セキュリティードメインの設定
<security-domains> <security-domain name="host" cache-type="default"> <authentication> <login-module code="Kerberos" flag="required"> <module-option name="storeKey" value="true"/> <module-option name="useKeyTab" value="true"/> <module-option name="principal" value="host/testserver@MY_REALM"/> <module-option name="keyTab" value="/home/username/service.keytab"/> <module-option name="doNotPrompt" value="true"/> <module-option name="debug" value="false"/> </login-module> </authentication> </security-domain> <security-domain name="SPNEGO" cache-type="default"> <authentication> <login-module code="SPNEGO" flag="requisite"> <module-option name="password-stacking" value="useFirstPass"/> <module-option name="serverSecurityDomain" value="host"/> </login-module> <!-- Login Module For Roles Search --> </security-domain>
システムプロパティーの設定
必要な場合は、システムプロパティーをドメインモデルに設定できます。例13.2 システムプロパティーの設定
<system-properties> <property name="java.security.krb5.kdc" value="mykdc.mydomain"/> <property name="java.security.krb5.realm" value="MY_REALM"/> </system-properties>
Web アプリケーションの設定
オーセンティケーターは上書きできませんが、NegotiationAuthenticator
をバルブとして jboss-web.xml 記述子に追加し、Web アプリケーションを設定できます。注記
セキュア化するリソースの決定に使用されるため、security-constraint
およびlogin-config
が web.xml ファイルに定義されている必要があります。しかし、選択されたauth-method
はこのオーセンティケーターによって上書きされます。例13.3 Web アプリケーションの設定
<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 2.4//EN" "http://www.jboss.org/j2ee/dtd/jboss-web_4_0.dtd"> <jboss-web> <security-domain>SPNEGO</security-domain> <valve> <class-name>org.jboss.security.negotiation.NegotiationAuthenticator</class-name> </valve> </jboss-web>
また、JBoss Negotiation クラスの場所を特定できるようにするため、Web アプリケーションはMETA-INF/MANIFEST.MF
に定義された依存関係を必要とします。例13.4
META-INF/MANIFEST.MF
での依存関係の定義Manifest-Version: 1.0 Build-Jdk: 1.6.0_24 Dependencies: org.jboss.security.negotiation
13.1.3. Microsoft Windows ドメインでの JBoss Negotiation の設定
{hostname}
、レルムは {realm}
、ドメインは {domain}
、JBoss EAP インスタンスをホストするサーバーは {machine_name}
を使用します。
手順13.2 Microsoft Windows ドメインでの JBoss Negotiation の設定
既存のサービスプリンシパルマッピングの消去
Microsoft Windows ネットワークでは、一部のマッピングが自動作成されます。自動的に作成されたマッピングを削除し、ネゴシエーションが適切に行われるようにサーバーのアイデンティティーをサービスプリンシパルへマップします。マッピングにより、クライアントコンピューター上の Web ブラウザーがサーバーを信頼し、SPNEGO の実行を試みます。クライアントコンピューターは、HTTP{hostname}
形式のマッピングに対し、ドメインコントローラーを検証します。既存のマッピングを削除する手順は次のとおりです。- コマンド
setspn -L {machine_name}
を使用して、コンピューターに対してドメインに登録されたマッピングをリストします。 - コマンド
setspn -D HTTP/{hostname} {machine_name}
およびsetspn -D host/{hostname} {machine_name}
を使用して、既存のマッピングを削除します。
- ホストユーザーアカウントを作成します。
注記
ホストユーザー名には{machine_name}
以外の名前を使用してください。これ以降では、ホストユーザー名として{user_name}
を使用します。 {user_name}
と{hostname}
の間のマッピングを定義します。- コマンド
ktpass -princ HTTP/{hostname}@{realm} -pass * -mapuser {domain}\{user_name}
を実行し、サービスプリンシパルマッピングを設定します。 - 入力を要求されたら、ユーザー名のパスワードを入力します。
注記
ユーザー名のパスワードをリセットします。これはキータブをエクスポートするために必要です。 - コマンド
setspn -L {user_name}
を実行し、マッピングを検証します。
ユーザーのキータブを、JBoss EAP がインストールされているサーバーへエクスポートします。
コマンドktab -k service.keytab -a HTTP/{hostname}@{realm}
を実行し、キータブをエクスポートします。注記
このコマンドは、HTTP/{hostname} プリンシパルのチケットを、JBoss 上でホストセキュリティードメインを設定するために使用されるキータブservice.keytab
へエクスポートします。- セキュリティードメイン内のプリンシパルを次のように定義します。
<module-option name="principal">HTTP/{hostname}@{realm}</module-option>
13.1.4. PicketLink IDP の Kerberos 認証
手順13.3 JBoss EAP 6 のインストールと Kerberos の設定
- JBoss EAP 6 をダウンロードし、インストールします。インストールガイド のインストール手順を参照してください。
- Oracle Java または IBM Java の使用に関わらず、無制限の JCE を使用する必要があります。無制限の JCE を使用しないと、JBoss サーバーが適切な SPNEGO メカニズムタイプでネゴシエートできません (
GSS_IAKERB_MECHANISM
である 1.3.6.1.5.2.5 を使用)。 - 以下の例を使用して、希望の Java バージョンを使用するよう JBoss を設定します。
export JAVA_HOME=JDK/JRE_directory
手順13.4 JBoss Negotiation Toolkit を使用した Kerberos 設定のテスト
- Github の JBoss Negotiation Toolkit を使用します。
- 設定ファイルを編集し、
mvn clean install
コマンドを使用してプロジェクトを構築します。 - ファイル
jboss-negotiation-toolkit/target/jboss-negotiation-toolkit.war
を$JBOSS_HOME/standalone/deployments/
へコピーします。 - 3 つのセクションがすべて JBoss Negotiation Toolkit を通過することを検証します。
手順13.5 PicketLink IDP の設定
idp.war
への変更
この例では、PicketLink Quickstarts リポジトリーにある idp.war
および employee.war
アーカイブを使用します。idp.war
のファイルを以下のように変更します。
- IDP は JBoss Negotiation モジュールを使用するため、
org.jboss.security.negotiation
モジュールを$JBOSS_HOME/standalone/deployments/idp.war/META-INF/jboss-deployment-structure.xml
に追加します。<jboss-deployment-structure> <deployment> <!-- Add picketlink module dependency --> <dependencies> <module name="org.picketlink" /> <module name="org.jboss.security.negotiation" /> </dependencies> </deployment> </jboss-deployment-structure>
- SPNEGO の追加バルブ
org.jboss.security.negotiation.NegotiationAuthenticator
を$JBOSS_HOME/standalone/deployments/idp.war/WEB-INF/jboss-web.xml
に追加します。 - 以下のとおり、
$JBOSS_HOME/standalone/deployments/idp.war/WEB-INF/jboss-web.xml
のsecurity-domain
をidp
からSPNEGO
に変更します。<jboss-web> <security-domain>SPNEGO</security-domain> <context-root>idp</context-root> <valve> <class-name>org.picketlink.identity.federation.bindings.tomcat.idp.IDPWebBrowserSSOValve</class-name> <param> <param-name>passUserPrincipalToAttributeManager</param-name> <param-value>true</param-value> </param> </valve> <valve> <class-name>org.jboss.security.negotiation.NegotiationAuthenticator</class-name> </valve> </jboss-web>
- Kerberos サーバー設定によってプリンシパルに追加されたセキュリティーロールを
$JBOSS_HOME/standalone/deployments/idp.war/WEB-INF/web.xml
に追加または変更します。 - 次のように、ファイル
$JBOSS_HOME/standalone/deployments/idp.war/WEB-INF/picketlink.xml
を変更します。<PicketLink xmlns="urn:picketlink:identity-federation:config:2.1"> <PicketLinkIDP xmlns="urn:picketlink:identity-federation:config:2.1"> <IdentityURL>${idp.url::http://localhost:8080/idp/}</IdentityURL> <Trust> <Domains>redhat.com,localhost,amazonaws.com</Domains> </Trust> </PicketLinkIDP> <Handlers xmlns="urn:picketlink:identity-federation:handler:config:2.1"> <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2IssuerTrustHandler" /> <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2LogOutHandler" /> <Handler class="org.picketlink.identity.federation.web.handlers.saml2.SAML2AuthenticationHandler" /> <Handler class="org.picketlink.identity.federation.web.handlers.saml2.RolesGenerationHandler" /> </Handlers> <!-- The configuration bellow defines a token timeout and a clock skew. Both configurations will be used during the SAML Assertion creation. This configuration is optional. It is defined only to show you how to set the token timeout and clock skew configuration. --> <PicketLinkSTS xmlns="urn:picketlink:identity-federation:config:1.0" TokenTimeout="5000" ClockSkew="0"> <TokenProviders> <TokenProvider ProviderClass="org.picketlink.identity.federation.core.saml.v1.providers.SAML11AssertionTokenProvider" TokenType="urn:oasis:names:tc:SAML:1.0:assertion" TokenElement="Assertion" TokenElementNS="urn:oasis:names:tc:SAML:1.0:assertion" /> <TokenProvider ProviderClass="org.picketlink.identity.federation.core.saml.v2.providers.SAML20AssertionTokenProvider" TokenType="urn:oasis:names:tc:SAML:2.0:assertion" TokenElement="Assertion" TokenElementNS="urn:oasis:names:tc:SAML:2.0:assertion" /> </TokenProviders> </PicketLinkSTS> </PicketLink>
IdentityURL
を変更し、IDP が実行されているサーバーのホスト名と同じになるようにします。Trust
を変更し、アイデンティティープロバイダーが信頼するドメイン名が含まれるようにします。employee.war
を変更します。Kerberos サーバー設定によってプリンシパルに追加されたセキュリティーロールを$JBOSS_HOME/standalone/deployments/employee.war/WEB-INF/web.xml
に追加または変更します。$JBOSS_HOME/standalone/configuration/standalone.xml
ファイルのsecurity domain
設定を編集します。ロールマッピング設定は、通常のセキュリティードメイン設定のものと同じです。<security-domain name="host" cache-type="default"> <authentication> <login-module code="Kerberos" flag="required"> <module-option name="principal" value="HTTP/something.com@yourdomain.COM"/> <module-option name="storeKey" value="true"/> <module-option name="useKeyTab" value="true"/> <module-option name="doNotPrompt" value="true"/> <module-option name="keyTab" value="/root/keytab"/> </login-module> </authentication> </security-domain> <security-domain name="SPNEGO" cache-type="default"> <authentication> <login-module code="SPNEGO" flag="required"> <module-option name="serverSecurityDomain" value="host"/> </login-module> </authentication> </security-domain> <security-domain name="sp" cache-type="default"> <authentication> <login-module code="org.picketlink.identity.federation.bindings.jboss.auth.SAML2LoginModule" flag="required" /> </authentication> </security-domain>
注記
jboss.security.disable.secdomain.option
を true
に設定する必要があります。詳細は「セキュリティードメインでの認証の設定」を参照してください。次のようにログインモジュールを更新します。
<login-module code="Kerberos" flag="required"> <module-option name="principal" value="HTTP/something.com@yourdomain.COM"/> <module-option name="credsType" value="acceptor"/> <module-option name="useKeytab" value="file:///root/keytab"/> </login-module>
手順13.6 PicketLink IDP の Kerberos 認証設定の検証
$JBOSS_HOME/bin/standalone.sh
を使用して JBoss EAP サーバーを起動します。- Kerberos を使用するようブラウザー (Firefox など) を設定します。次の手順に従ってください: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/5/html/Deployment_Guide/sso-config-firefox.html
- 上記のとおりに設定された Firefox から
http://YOUR_DOMAIN:8080/employee
にアクセスできることを確認します。
13.1.5. PicketLink IDP での証明書を用いたログイン
SSL をサポートするよう PicketLink IDP を設定できます。次の手順は、SSL クライアント認証をサポートする IDP として Web アプリケーションを設定する方法の例になります。ユーザーを認証するために IDP を設定する方法は 2 つあります。
- SSL が使用されている場合、サーバーはクライアントに対して証明書を要求し、その証明書を使用してユーザーを認証します。
- クライアントによって証明書が提供されなかった場合、フォームベース認証が実行されます。
13.1.5.1. JBoss EAP 6.3 での SSL 設定
手順13.7 サーバーの証明書、キーストア、およびトラストストアの作成
サーバーの証明書の作成
以下のコマンドを使用して、サーバーの証明書を作成します。keytool -genkey -alias server -keyalg RSA -keystore server.keystore -storepass change_it -validity 365
追加情報を入力するよう要求され、これらの値を入力する必要があります。証明書の CN 名は DNS サーバー名と同じでなければなりません。たとえば、ローカルホストの場合では以下のコマンドを使用できます。keytool -genkey -alias server -keystore server.keystore -storepass change_it -keypass password -dname "CN=localhost,OU=QE,O=example.com,L=Brno,C=CZ"
クライアント証明書の作成
SSL を介してリソースにアクセスするときに、この証明書を使用してサーバーに対して認証を行います。keytool -genkey -alias client -keystore client.keystore -storepass change_it -validity 365 -keyalg RSA -keysize 2048 -storetype pkcs12
トラストストアの作成
クライアントの証明書をエクスポートし、この証明書をインポートしてトラストストアを作成します。keytool -exportcert -keystore client.keystore -storetype pkcs12 -storepass change_it -alias client -keypass change_it -file client.keystore keytool -import -file client.keystore -alias client -keystore client.truststore
JBoss EAP 6.3 サーバーインストールの変更による SSL の有効化
以下のコネクターを Web サブシステムに追加して、SSL を有効にします。<connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" enable-lookups="false" secure="true"> <ssl name="localhost-ssl" key-alias="server" password="change_it" certificate-key-file="${jboss.server.config.dir}/server.keystore" protocol="TLSv1" verify-client="want" ca-certificate-file="${jboss.server.config.dir}/client.truststore"/> </connector>
サーバーの再起動
サーバーを再起動し、https://localhost:8443 で応答することを確認します。証明書の信用
サーバー証明書を信用するよう要求されます。
アプリケーションにアクセスする前に、client.keystore
をブラウザーにインポートする必要があります。このファイルにはクライアント証明書が含まれています。アプリケーションにアクセスすると、サーバーとの認証に使用する必要がある証明書を選択するよう要求されます。適切な証明書を選択します。
以下のセキュリティードメインをサーバーインストールに追加します。スタンドアロンモードを使用している場合は、JBOSS_HOME/standalone/configuration/standalone.xml
に追加する必要があります。
<security-domain name="idp" cache-type="default"> <authentication> <login-module code="CertificateRoles" flag="optional"> <module-option name="password-stacking" value="useFirstPass"/> <module-option name="securityDomain" value="idp"/> <module-option name="verifier" value="org.jboss.security.auth.certs.AnyCertVerifier"/> </login-module> <login-module code="org.picketlink.identity.federation.bindings.jboss.auth.RegExUserNameLoginModule" flag="optional"> <module-option name="regex" value="CN=(.*?),"/> </login-module> <login-module code="UsersRoles" flag="required"> <module-option name="password-stacking" value="useFirstPass"/> <module-option name="usersProperties" value="users.properties"/> <module-option name="rolesProperties" value="roles.properties"/> </login-module> </authentication> <jsse keystore-password="change_it" keystore-url="${jboss.server.config.dir}" truststore-password="change_it" truststore-url="${jboss.server.config.dir}" client-auth="true"/> </security-domain>上記の設定例は、提供された証明書を検証します。証明書が提供されなかったり、認証に失敗したりした場合は、手順はユーザー/パスワードベースの認証にフォールバックします。
正規表現ユーザー名ログインモジュールを証明書ログインモジュールの後に使用すると、LDAP からロールを取得するためにプリンシパル名からユーザー名、UID、またはその他のフィールドを取得できます。このモジュールには、regex
というオプションがあります。このオプションはプリンシパル名に適用される正規表現を指定し、その結果は後続のログインモジュールへ渡されます。
UID=007, EMAILADDRESS=something@something, CN=James Bond, O=SpyAgency
というプリンシパル名が入力されると、結果として UID=007
が出力されます。
例13.5 正規表現ユーザー名ログインモジュールの例
<login-module code="org.picketlink.identity.federation.bindings.jboss.auth.RegExUserNameLoginModule" flag="required"> <module-option name="password-stacking" value="useFirstPass"/> <module-option name="regex" value="UID=(.*?),"/> </login-module>
java.util.regex.Pattern
クラスのドキュメントを参照してください。