ページ

2012年3月13日

Windows/ApacheでNTLM認証

前回の「Linux/ApacheでNTLM認証」の続きです。前回はLinuxの話でしたが、今回はWindowsとApacheでのNTLM認証です。WindowsならIISが楽ですが、人間、楽ばかりしていてはいけません。

まず、Apacheを動かすWindowsサーバをADのドメインに参加させます。僕は、ドメインに参加済みのマシンをもらったので、どうやって参加させるか知りません。きっとWindowsなので簡単なんだと信じています。

モジュールのインストール

Linuxではmod_auth_ntlm_winbindを使いましたが、Windowsではmod_auth_sspiを使います。これ、Apache2.2用のモジュールでそれ以外のバージョンだと、自前でビルドしないといけないかも。最新版をダウンロードして展開します。

展開したファイルのINSTALLを読めばわかりますが、binディレクトリにあるファイルをApacheをインストールしたディレクトリのmodulesにコピーします。

Apacheの設定ファイル

次にApacheの設定ファイルを変更します。今回もバックエンドのTomcatに接続することを前提にします。まずは、モジュールをロードします。

LoadModule sspi_auth_module modules/mod_auth_sspi.so

そして、/hogeへのアクセスで認証されるようにします。


<Location /hoge >
  ProxyPass ajp://localhost:8009/hoge status=I
  ProxyPassReverse ajp://localhost:8009/hoge
  AuthName "Windows NTLM Authentication Test"
  AuthType SSPI
  SSPIAuth On
  SSPIAuthoritative On
  SSPIOmitDomain On
  require valid-user
</Location>


SSPIOmitDomainをOnにすると、Tomcatからはrequest.getRemoteUser()でユーザIDだけが取得できます。Off(デフォルト)だと、ドメイン名\\ユーザIDの形式でTomcatから認証ユーザの情報が取得できます。Linuxのmod_auth_ntlm_winbindと合わせるためにSSPIOmitDomainをOnにしています。

Tomcatの設定


Linuxと同じようにTomcatのserver.xmlのコネクターの設定でtomcatAuthenticationをfalseに設定します。
<connector port="8009" protocol="AJP/1.3" redirectport="8443" tomcatAuthentication="false">
これで、Tomcatからはrequest.getRemoteUser()でApacheが認証したユーザの情報が取得できます。

終わりに

Linuxと違ってWindowsは簡単ですね。ちなみに、mod_auth_sspiの設定の中にはSSPIMSIE3Hackとかあって、IE3って…。


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にアクセスすると、認証画面がでたり、環境によってはすでに認証済みだったり。

めでたしめでたし。

2012年3月2日

pythonのwebsocket-client 0.6のリリース

あんまり大きな変更はないけど、一応リリースしました。
変更点としては、
  • WebSocketAppクラスでmaskキーのgenerationをカスタマイズできるようになった
  • コマンドラインツール、wsdump.pyがついた。
wsdump.pyはサンプルアプリ的でもあり、テスト・デバッグ用でもあったりします。サーバに接続してテキストベースのデータのやりとりを行えます。詳しくはWebページかREADME.rstを見るとして、こんな感じに使います。
$ wsdump.py ws://echo.websocket.org/
Press Ctrl+C to quit
> Hello, WebSocket
< Hello, WebSocket
> How are you?
< How are you?

echo.websocket.orgにつないでる例です。どんなデータがやりとりできるか見えます。-vをつけるとテキストデータ以外のデータも見えるようになるかもしれません。-vvをつけると、ネットワーク上に流れる生データが見えます。
それから、Windowsでは動かしていないので、動くかどうか知りません。

$ wsdump.py ws://echo.websocket.org -vv
Press Ctrl+C to quit
> hello
send: '\x81\x85I\xb9\xba\x0b!\xdc\xd6g&'
> recv: '\x81\x05hello'
< text: hello
> 

でわでわ