CAS-3.4.2を使ったGoogleAppsのシングルサインオン設定


CASサーバを使ったGoogleAppsのシングルサインオン設定について日本語で書かれた分かりやすいページが意外と見あたらなかったので作ってみました。 英語の情報についてはJasigのページに一通り書いてあるのですが、設定情報の具体例が一部欠けていたりしますので設定ファイルのサンプルも掲載しておきます。


0.はじめに

    tomcat(今回はtomcat6.0を利用)の動作環境を準備

    動作確認環境:

        CASサーバ:CAS 3.4.2
        tomcat:FreeBSD7.2+tomcat6.0+diablo-jdk-1.6.0
        Apache:FreeBSD7.2+Apache2.2.9+mod_proxy_ajp+mod_ssl

        Apacheのみを外部に公開
        Apacheと(tomcat上の)CASサーバで同一の公開鍵ペアを使用

1.CASサーバ用の公開鍵ペア・X509証明書を準備

    #鍵ペアを作成
    openssl genrsa -out private.key 1024

    #private.keyファイルから公開鍵情報を取り出し(-pubout)
    openssl rsa -pubout -in private.key -out public.key -inform PEM -outform DER

    #秘密鍵情報の保存フォーマットをPKCS#8形式に変換
openssl pkcs8 -topk8 -inform PER -outform DER -nocrypt -in private.key -out private.p8

    #自己署名証明書を作成(-x509)
    openssl req -new -x509 -key private.key -out x509.pem -days 365

        COMMON NAMEには外部からCASサーバにアクセスする時の
        FQDN名を指定する

    上で作った鍵ペア・証明書類を適当なディレクトリ(以下、$CERT)に
    まとめておく

参考ページ:

    http://www.ja-sig.org/wiki/display/CASUM/SAML+2.0+%28Google+Accounts+Int...

2.CASサーバの設定
   
2-1.JA-SIGのページ(http://www.jasig.org/cas)からCAS 3.4.2をダウンロード

    cas-server-webapp-3.4.2.warをダウンロード

2-2.CASサーバのwarファイルを展開

    cd $HOME
    mkdir cas-server-webapp-3.4.2
    cd cas-server-webapp-3.4.2
    jar xvf ../cas-server-webapp-3.4.2.war

2-3.CASサーバで利用する鍵ファイルの配置

    cd $HOME
    cd cas-server-webapp-3.4.2/WEB-INF/classes
    cp $CERT/private.p8 .
    cp $CERT/public.key .

2-4.GoogleAccount連携用設定をCASサーバの設定ファイルに追加

    cd $HOME/cas-server-webapp-3.4.2/WEB-INF
    vi spring-configuration/argumentExtractorsConfiguration.xml

    以下の設定を追加

    ------ここから-----
        <bean
                id="googleAccountsArgumentExtractor"
                class="org.jasig.cas.web.support.GoogleAccountsArgumentExtractor"
                p:privateKey-ref="privateKeyFactoryBean"
                p:publicKey-ref="publicKeyFactoryBean"
                p:httpClient-ref="httpClient" />

        <bean
                id="privateKeyFactoryBean"
                class="org.jasig.cas.util.PrivateKeyFactoryBean"
                p:location="classpath:endeavour-private.p8"
                p:algorithm="RSA" />

        <bean
                id="publicKeyFactoryBean"
                class="org.jasig.cas.util.PublicKeyFactoryBean"
                p:location="classpath:endeavour-public.key"
                p:algorithm="RSA" />

    ------ここまで-----

    注:参考ページにあるサンプルではp:httpClient-ref="httpClient"の
        記述がないが、これがないとエラーになる

    同ファイルの以下の箇所にgoogleAccountsArgumentExtractorの
    エントリを追加する

    ・変更前

        <util:list id="argumentExtractors">
                <ref bean="casArgumentExtractor" />
                <ref bean="samlArgumentExtractor" />
        </util:list>

   
    ・変更後

        <util:list id="argumentExtractors">
                <ref bean="casArgumentExtractor" />
                <ref bean="samlArgumentExtractor" />
                <ref bean="googleAccountsArgumentExtractor" />
        </util:list>

2-5.SAML ResponseがPOSTされない問題への対応

     CAS 3.4.2でspring webflow 2.xに移行した際に発生した不具合の模様
     #2010/5/22時点で修正パッチ無し。CAS 3.5で修正(?)

     以下の要領でページ遷移設定ファイルを変更する必要がある

     cd $HOME/cas-server-webapp-3.4.2/WEB-INF
     vi login-webflow.xml

     (1)<action-state id="redirect">の項目を修正

     ・修正前
    <action-state id="redirect">
        <evaluate expression="flowScope.service.getResponse(requestScope.serviceTicketId)" result-type="org.jasig.cas.authentication.principal.Response" result="requestScope.response" />
        <transition on="requestScope.response" to="postView" />
        <transition to="redirectView" />
    </action-state>

     ・修正後

   <action-state id="redirect">
        <evaluate expression="flowScope.service.getResponse(requestScope.serviceTicketId)" result-type="org.jasig.cas.authentication.principal.Response" result="requestScope.response" />
        <transition to="postRedirect"/>
    </action-state>

     (2)<end-state id="postView" view="postResponseView">の項目を修正

     ・修正前

    <end-state id="postView" view="postResponseView">
        <output name="viewScope.parameters" value="requestScope.response.attributes" />
        <output name="viewScope.originalUrl" value="flowScope.service.id" />
    </end-state>

     ・修正後

    <end-state id="postView" view="postResponseView">
        <on-entry>
            <set name="flowScope.parameters" value="requestScope.response.attributes"/>
            <set name="flowScope.originalUrl" value="flowScope.service.id" />
        </on-entry>
    </end-state>

参考ページ:

    http://www.ja-sig.org/wiki/display/CASUM/SAML+2.0+%28Google+Accounts+Int...

    http://www.ja-sig.org/issues/browse/CAS-868;jsessionid=0045DD6B8C56D49DF...

    SAML Protocol with Attribute Release   
    http://www.ja-sig.org/wiki/display/CASC/phpCAS+examples

2-6.ユーザ認証データベースの設定

    LDAPの参照設定などを必要に応じて行う

2-7.tomcatでCASサーバを起動

    以下の手順はホットデプロイを有効にしてあるtomcatの場合

    cd $HOME/cas-server-webapp-3.4.2
    jar cvf ../cas-server-webapp-3.4.2.war *
    cp $HOME/cas-server-webapp-3.4.2.war $CATALINA_HOME/webapps

    ホットデプロイしていない場合は適宜tomcatを再起動
    例:
        tomcat.sh stop
        cp -rp $HOME/cas-server-webapp-3.4.2 $CATALINA_HOME/webapps
        tomcat.sh start

3.GoogleAppsの設定

    補足:シングルサインオンを有効にした後でも、管理者権限をもつユーザは
        管理者画面からログインできる

3-1.シングルサインオン設定の登録

    管理者権限でGoogleAppsにログイン
    https://www.google.com/a/yourdomain.com/

    SSO設定画面へ移動
    https://www.google.com/a/cpanel/yourdomain.com/SetupSSO

3-2.CASサーバ情報の登録

    ログイン ページの URL
        https://your.casserver.com/cas-server-webapp-3.4.2/login

    ログアウト ページ URL
        https://your.casserver.com/cas-server-webapp-3.4.2/logout

    パスワードの URL を変更
        https://somewhere/appropriate

    1.で作った証明書($CERT/x509.pem)をアップロード

    「シングルサインオンを有効にする」にチェックを入れる

    シングルサインオンの送信元を制限する場合は
    ネットワークマスクを適宜設定

    変更を保存

3-3.GoogleAppsにユーザを登録

    https://www.google.com/a/cpanel/yourdomain.com/CreateUser

    シングルサインオンするユーザについては
    「次回ログイン時にパスワードの変更を要求する」
    の設定はなくてよい。

    この設定が残っていると、シングルサインオンした後で
    パスワード変更画面が表示されてしまう。

3-4.GoogleAppsの各アプリにシングルサインオン

    .メール - http://gml.yourdomain.com
    .カレンダー - http://cal.yourdomain.com
    .ドキュメント - http://doc.yourdomain.com
    など

    CASでユーザuserの認証に成功すると、GoogleApps側で
    ユーザuser@yourdomain.comとしてログインが完了する

参考ページ:

    Google Apps 用 SAML シングル サインオン (SSO) サービス
    http://code.google.com/intl/ja/apis/apps/sso/saml_reference_implementati...

         SSOに関するFAQ
         http://code.google.com/intl/ja/googleapps/faq.html

     Google Apps 管理者用ヘルプ
    http://www.google.com/support/a/bin/answer.py?hl=jp&answer=60224

    GoogleApps との SAML でのシングルサインオン
    http://wikis.sun.com/pages/viewpage.action?pageId=67866335
        GoogleApps側(サービスプロバイダ側)の設定はここに書いてある