第11章 認証および承認
11.1. Kerberos および SPNEGO 統合 リンクのコピーリンクがクリップボードにコピーされました!
11.1.1. Kerberos および SPNEGO 統合 リンクのコピーリンクがクリップボードにコピーされました!
Kerberos および SPNEGO 統合
一般的なセットアップでは、ユーザーは Active Directory ドメインによって管理されるデスクトップにログインします。その後、ユーザーは Firebox または Internet Explorer の web ブラウザーを使用して、JBoss EAP でホストされる JBoss Negotiation を使用する web アプリケーションにアクセスします。Web ブラウザーはデスクトップサインオン情報を Web アプリケーションに転送します。JBoss EAP は、Active Directory または Kerberos サーバーでバックグラウンドの GSS メッセージを使用し、ユーザーを検証します。これにより、ユーザーは web アプリケーションへのシームレスな SSO を実現することができます。
11.1.2. SPNEGO を使用したデスクトップ SSO リンクのコピーリンクがクリップボードにコピーされました!
- セキュリティードメイン
- システムプロパティー
- Web アプリケーション
手順11.1 SPNEGO を使用したデスクトップ SSO の設定
セキュリティードメインの設定
サーバーのアイデンティティーを表現し、Web アプリケーションをセキュアにするようにセキュリティードメインを設定します。例11.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>システムプロパティーの設定
必要な場合は、ドメインモデルでシステムプロパティーを設定できます。例11.2 システムプロパティーの設定
<system-properties> <property name="java.security.krb5.kdc" value="mykdc.mydomain"/> <property name="java.security.krb5.realm" value="MY_REALM"/> </system-properties>Web アプリケーションの設定
オーセンティケーターをオーバーライドすることはできませんが、web アプリケーションを設定するためにNegotiationAuthenticatorを jboss-web.xml 記述子にバルブとして追加することもできます。注記バルブには、セキュアなリソースを決定するために使用されるため、security-constraintおよびlogin-configが web.xml ファイルに定義する必要があります。ただし、選択したauth-methodはこのオーセンティケーターによって上書きされます。例11.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>web アプリケーションでは、JBoss Negotiation クラスを配置できるようにMETA-INF/MANIFEST.MFに依存関係を定義する必要もあります。例11.4
META-INF/MANIFEST.MFへの依存関係の定義Manifest-Version: 1.0 Build-Jdk: 1.6.0_24 Dependencies: org.jboss.security.negotiation
11.1.3. Microsoft Windows ドメインでの JBoss Negotiation の設定 リンクのコピーリンクがクリップボードにコピーされました!
{hostname} と呼ばれます。レルムは {realm} と呼ばれ、ドメインは {domain} と呼ばれ、JBoss EAP インスタンスをホストするサーバーは {machine_name} と呼ばれます。
手順11.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}
EAP JBoss がインストールされているサーバーに、ユーザーのキータブをエクスポートします。
以下のコマンドを実行してキータブktab -k service.keytab -a HTTP/{hostname}@{realm}をエクスポートします。注記このコマンドは、HTTP/{hostname} プリンシパルのチケットをキータブservice.keytabにエクスポートします。キータブは、JBoss でホストセキュリティードメインを設定するために使用されます。- セキュリティードメイン内で以下のようにプリンシパルを定義します。
<module-option name="principal">HTTP/{hostname}@{realm}</module-option>
11.1.4. PicketLink IDP の Kerberos 認証 リンクのコピーリンクがクリップボードにコピーされました!
手順11.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
手順11.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 を通過していることを確認します。
手順11.5 PicketLink IDP の設定
idp.warへの変更
提供されている例では、idp.war アーカイブと employee.war アーカイブを使用し、PicketLink Quickstarts リポジトリーに配置します。以下のように 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 サーバーセットアップにより、プリンシパルに追加された security-role を
$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>- IDP を実行しているサーバーのホスト名に一致するように
IdentityURLを変更します。 Trustを、アイデンティティープロバイダーが信頼するドメイン名が含まれるように変更します。employee.warを変更します。Kerberos サーバーセットアップにより、プリンシパルに追加された security-roles を$JBOSS_HOME/standalone/deployments/employee.war/WEB-INF/web.xmlに追加または変更します。$JBOSS_HOME/standalone/configuration/standalone.xmlファイルのセキュリティードメイン設定を変更します。ロールマッピング設定は、通常のセキュリティードメイン設定と同じです。<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>
手順11.6 PicketLink IDP の Kerberos 認証設定の確認
- $JBOSS_HOME/bin/standalone.sh を使用して JBoss EAP サーバーを起動します。
- Firefox などのブラウザーを Kerberos を使用するように設定します。「 https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/5/html/Deployment_Guide/sso-config-firefox.html」に記載の手順に従ってください。
- 上記のように設定した Firefox から
http://YOUR_DOMAIN:8080/employeeにアクセスできることを確認します。
11.1.5. PicketLink IDP で証明書でログイン リンクのコピーリンクがクリップボードにコピーされました!
SSL をサポートする IDP の設定
PicketLink IDP が SSL をサポートするように設定できます。以下の手順は、SSL クライアント認証をサポートする IDP として Web アプリケーションを設定する方法を実証する例です。ユーザーを認証するように IDP を設定する方法は 2 つあります。
- SSL が使用されている場合、サーバーはクライアントに証明書を要求し、この証明書を使用してユーザーを認証するようにします。
- クライアントが証明書を提供していない場合は、フォームベースの認証が実行されます。
11.1.5.1. JBoss EAP 6 の SSL 設定 リンクのコピーリンクがクリップボードにコピーされました!
手順11.7 サーバーの証明書、キーストア、およびトラストストアの作成
サーバー用の証明書の作成
以下のコマンドを使用してサーバーの証明書を作成します。システムは、追加情報を求めるプロンプトを出します。必要に応じて値を指定する必要があります。証明書の CN 名は DNS サーバー名と同じである必要があります。たとえば、ローカルホストの場合は、以下のコマンドを使用できます。keytool -genkey -alias server -keyalg RSA -keystore server.keystore -storepass change_it -validity 365keytool -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.truststoreJBoss EAP 6 Server インストールを 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>
通常の式のユーザー名のログインモジュール
Certificate Login Modules の後に Regular Expression User Name Login モジュールを使用すると、ロールが LDAP から取得できるようにプリンシパル名からユーザー名、UID その他フィールドを抽出できます。モジュールには regex という名前のオプションがあります。プリンシパル名に適用される正規表現、後続のログインモジュールに渡される結果を指定します。
UID=007, EMAILADDRESS=something@something, CN=James Bond, O=SpyAgency の入力プリンシパル名である UID=007 が出力されます。
例11.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 の http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html クラスドキュメント を参照してください。