Wednesday, December 17, 2014

Alfresco 5.0とActive DirectoryでNTLM SSOを設定する

こんにちは。おおたにです。今回はActive Directory(以下AD)と連携してAlfrescoでSSOを実現する方法を紹介したいと思います。


何が実現できるのか


AlfrescoとADのSSO設定を行うと、ADで管理された端末からユーザID/パスワードを入力することなくAlfrescoにアクセスできるようになります。

端末上のWindowsにログインする際に利用した認証情報(ADによって管理されているユーザに関するもの)を利用し、Alfrescoへのアクセス時に自動的に認証を行います。認証方法としてはNTLM v1とKerberosの2種類がありますが、以下ではNTLM v1を使ったSSOの設定手順を説明します。


必要なもの


以下の説明での前提条件、事前に準備が必要なものは以下のとおりです。なお、筆者はAlfresco 5.0.b、Windows Server 2012 (AD)、Windows 7 Professional (Client)という構成で動作確認を行いました。
  • Alfresco 5.0 (3.2以上であれば基本的に同様の手順で設定可能です)
  • Active Directoryサーバ
    • サーバ名もしくはサーバIP (ここでは kate とします)
    • ドメイン名 (ここでは aegif.local とします)
    • LDAPサービスでユーザ/グループ情報の取得権限を持つユーザ名 (ここではAdministrator を使います)
    • 上記ユーザのパスワード (ここでは thepassword とします)
    • ユーザ情報格納先のベースDN (ここでは cn=Users,dc=aegif,dc=local とします)
    • グループ情報格納先のベースDN (ここでは cn=Users,dc=aegif,dc=local とします)
    • ドメインに所属するクライアントPC(テストに利用します)

Alfrescoの設定


まずAlfrescoをダウンロード、インストールします。インストーラが提供されているのでインストール自体はそんなに難しくありませんが、こちらの記事が参考になると思います。インストールが完了したら、 ブラウザで http://localhost:8080/share にアクセスし、adminユーザでログインできることを確認しておいてください。

Alfrescoが正しくインストールされたら、alfresco-global.propertiesに以下の設定を追記します。

<tomcat_dir>/shared/classes/alfresco-global.properties :
authentication.chain=passthru1:passthru,ldap-ad1:ldap-ad,alfrescoNtlm1:alfrescoNtlm
ntlm.authentication.sso.enabled=true

ldap.authentication.active=false
ldap.authentication.userNameFormat=%s@aegif.local
ldap.authentication.java.naming.provider.url=ldap://kate:389

ldap.synchronization.active=true
ldap.synchronization.java.naming.security.principal=Administrator@aegif.local
ldap.synchronization.java.naming.security.credentials=thepassword
ldap.synchronization.groupSearchBase=cn\=Users,dc\=aegif,dc\=local
ldap.synchronization.userSearchBase=cn\=Users,dc\=aegif,dc\=local
synchronization.import.cron=0 0 * * * ?

passthru.authentication.useLocalServer=false
passthru.authentication.domain=aegif.local
passthru.authentication.servers=aegif.local\\kate
passthru.authentication.defaultAdministratorUserNames=Administrator

ドメイン名、サーバ名、LDAP認証情報、ベースDN等は環境に合わせて設定してください。以下、上記設定の説明です。
  • authentication.chain でAlfrescoログインのための認証チェーンを指定します。passthruがSSO認証、ldap-adがAD認証(ユーザ/パスワード入力タイプ)、alfrescoNtlmがAlfrescoが管理するユーザ情報での認証です。認証チェーンとは、複数の認証方式を連鎖させるもので、ここでは、SSO→AD認証→Alfresco認証の順に認証をトライします。
  • ntlm.authentication.sso.enabled=true でNTLM SSOが有効になります。
  • ldap.authentication.active=false でldap-adの認証機能を無効化し、ldap.synchronization.active=true でldap-adのユーザ/グループ同期機能を有効化します。
    • ここではAD認証自体は行わず、AD上のユーザ/グループ情報をAlfrescoに同期させる(定期的に差分情報をインポートする)ことのみを行います。
  • synchronization.import.cron で同期周期を設定します。デフォルトでは1日1回0時に実行されます(上記例では毎時0分に実行されます)。
  • passthru.authentication.useLocalServer でADサーバ上でAlfrescoが稼働しているか否かを指定します。falseの場合は passthru.authentication.domain, passthru.authentication.servers を指定する必要があります。
  • passthru.authentication.defaultAdministratorUserNames にAlfrescoの管理者権限を与えたいユーザ名を列挙します。

次に、share-config-custom.xmlの設定を変更します。デフォルトでは以下のSSO向けの設定がコメントアウトされていますので、コメントアウトのタグを外して設定を有効にします。

<tomcat_dir>/shared/classes/alfresco/web-extension/share-config-custom.xml :
   <config evaluator="string-compare" condition="Remote">
      <remote>
         <keystore>
             <path>alfresco/web-extension/alfresco-system.p12</path>
             <type>pkcs12</type>
             <password>alfresco-system</password>
         </keystore>
         
         <connector>
            <id>alfrescoCookie</id>
            <name>Alfresco Connector</name>
            <description>Connects to an Alfresco instance using cookie-based authentication</description>
            <class>org.alfresco.web.site.servlet.SlingshotAlfrescoConnector</class>
         </connector>
         
         <connector>
            <id>alfrescoHeader</id>
            <name>Alfresco Connector</name>
            <description>Connects to an Alfresco instance using header and cookie-based authentication</description>
            <class>org.alfresco.web.site.servlet.SlingshotAlfrescoConnector</class>
            <userHeader>SsoUserHeader</userHeader>
         </connector>

         <endpoint>
            <id>alfresco</id>
            <name>Alfresco - user access</name>
            <description>Access to Alfresco Repository WebScripts that require user authentication</description>
            <connector-id>alfrescoCookie</connector-id>
            <endpoint-url>http://localhost:8080/alfresco/wcs</endpoint-url>
            <identity>user</identity>
            <external-auth>true</external-auth>
         </endpoint>
      </remote>
   </config>

以上でAlfrescoの設定は終わりです。設定を反映させるため、Alfrescoを再起動します。


Active Directoryサーバの設定


次に、ADサーバ上での設定を行います。AlfrescoのNTLM SSOはNTLMv1だけでNTLMv2に対応していないため、AD配下のクライアントのLAN Manager認証レベルを変更する必要があります(セキュリティレベルを落としたくない場合はKerberos認証の利用をお勧めします)。

まずは、Win+R を押して gpmc.msc を実行します。「グループポリシーの管理」コンソールが起動するので、目的のドメインのデフォルトグループポリシーを編集します。


以下のエディタが表示されるので、コンピューターの構成→ポリシー→Windowsの設定→セキュリティの設定→ローカルポリシー→セキュリティオプションをクリックし、「ネットワークセキュリティ:LAN Manager認証レベル」をダブルクリックします。


以下のダイアログが表示されるので、「このポリシーの設定を定義する」にチェックを入れて、「LMとNTLMを送信する(ネゴシエートした場合NTLMv2セッションセキュリティを使う)」を選択してOKをクリックします。


以上でADサーバ上での設定は完了です。


クライアントPCの設定


以下の設定は全てのクライアントPCで設定する必要があります。クライアントのログイン情報をAlfrescoに渡すためには、AlfrescoのURLがイントラネットゾーン判定される必要があるため、インターネットオプションのセキュリティ設定にAlfrescoのURLを追加します。

Internet Explorerのインターネットオプションを開き、ローカルイントラネットにAlfrescoのURLを追加します。HTTPでアクセスする場合は「このゾーンは…」のチェックを外します。



テストしてみよう


では、ADユーザでログインしたクライアントPCを利用し、Alfrescoにアクセスしてみましょう。先ほどイントラネットゾーンに追加したURLを使ってアクセスしてください(先のスナップショットの例ですと、http://alfresco.aegif.jp:8080/share となります)。ログイン画面が表示されず、直接ダッシュボード画面が表示されればテスト成功です。


トラブルシューティング



うまくいかない場合は以下のことを試してみてください。
  • alfresco.log, catalina.out等に出力されているExceptionを確認してみる
  • ユーザ/グループの同期が正常に行われているか(AD上のユーザ/グループがAlfresco上にも生成されているか)を確認してみる
  • LDAPクライアントを使ってユーザ/グループの検索ベースDNを実際に確認してみる
  • passthru.authentication.domain, passthru.authentication.servers あたりのプロパティ値から.localを省略してみる

今回の紹介は以上です。AD環境がある場合は是非ADとの連携、SSO設定を試してみてください。

No comments: