ページ

2012年3月6日

Linux/ApacheでNTLM認証


NTLM認証っていうのはWindowsのドメイン認証情報をつかっていろんなシステムにシングルサインオンする仕組みです。設定によってはWindowsにログインすれば、社内のシステムに個別にログインせずにアクセスできるっていうシロモノですね。ブラウザはIEしか対応していないって思っていたのですが、FirefoxやChromeでも動きました。今回はクライアントはブラウザからアクセスして、Webアプリケーションにシングルサインオンするまでのお話です。

このNTLM認証ですが、WebサーバがWindowsで動いていればIISでやるのが楽です。でも、ここは茨の道なのでWebサーバはApacheで、OSはLinuxです。というかUbuntuです。Windowsの話は、そのうちするかも。

Linux + ApacheでNTLM認証を行うために mod_auth_ntlm_winbind を使います。モジュールの名前から想像できるようにwinbindのコマンドを利用して認証を行います。とりあえず、必要なソフトをインストールします。

# apt-get install samba winbind libapache2-mod-auth-ntlm-winbind

まずはsambaの設定です。ドメインに参加させます。ドメインは今回は、domain.example.comにします。/etc/samba/smb.confでglobalセクションに次のように設定します。大文字小文字が区別されるような気がするので、気をつけたほうがいいかも。

workgroup = DOMAIN
security = ads
realm = DOMAIN.EXAMPLE.COM
password server = domain.example.com
winbind use default domain = yes

次に/etc/nsswitch.confを次のように書き換えます。

passwd:         files winbind
group:          files winbind
shadow:         files winbind

/etc/kbr5.confでそれぞれのセクションに次のように追加。ケースセンシティブです。

[libdefaults]
   default_realm = DOMAIN.EXAMPLE.COM

[realms]
  DOMAIN.EXAMPLE.COM = {
       kdc = domain.example.com
       admin_server = domain.example.com
  }
[domain_realm]
  .domain.example.com = DOMAIN.EXAMPLE.COM
  domain.example.com = DOMAIN.EXAMPLE.COM

それから、あとでよくわかないエラーがでることがあるので、自分のサーバ名がmywebserver.example.comなら次のように/etc/hostsに設定します。IついでにADのサーバ名が解決できない時があったので、それも書いておきます。

xxx.xxx.xxx.xxx  mywebserver.example.com

/etc/resolv.confも書き換えたほうがいいって言う情報もありましたが、僕は設定せずに動いたので、きっと大丈夫でしょう。

これで/etc/init.d/winbind restartします。winbindさえ動いていればsamba自体は動いていなくても大丈夫です。これでwbinfo -tして動いていることを確認します。wbinfo -uでADの中のユーザが表示されれば、大体大丈夫らしい。


では、apacheの設定です。mod_auth_ntlm_winbidをまず、有効にします。今回は、バックエンドにtomcatがいてmod_proxy_ajpで接続しています。tomcatへのリクエストだけ、ntlm認証の対象にします。

ProxyRequests Off
ProxyPass /aqua ajp://localhost:8009/hoge
<location /hoge>
    NTLMAuth  on
    NegotiateAuth off
    NTLMBasicAuth off

    NTLMBasicAuthoritative off
    NTLMBasicRealm "REALM"
 
    NTLMAuthHelper "/usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp"
    AuthType NTLM
    require valid-user
</location>

それから、実際に動かすと/var/run/samba/winbindd_privilegedへのアクセス権限が不十分だってエラーがでます。なので、起動のたびにchgrp www-data /var/run/samba/winbindd_privilegedってしてあげないと動かないです。

tomcatはserver.xmlのコネクタの設定を次のようにして、tomcatで認証のハンドリングを行わないようにします。

<connector port="8009" protocol="AJP/1.3" redirectport="8443" tomcatauthentication="false">

これで、TomcatのServlet上からは、request.getRemoteUser()でApacheが認証したユーザ情報が取得できます。

ブラウザからhttp://localhost/hogeにアクセスすると、認証画面がでたり、環境によってはすでに認証済みだったり。

めでたしめでたし。

0 件のコメント: