2008-02-17(Sun) [長年日記]
_ Windowsでmod_auth_sspiでリバースプロキシで構成するときにREMOTE_USERって効かないよね?
HikiとかtdiaryとかCGIで直接使う場合は、REMOTE_USERにログイン名が入るから簡単なんだが、RailsでリバースプロキシでNTLM認証かけたい場合、環境変数ってセットされませんよね?あくまでリクエストのパラメータに入ってこないといかんのだけど普通はセットされてないみたい。
ぐぐってみた感じでは、mod_rewrite使ってURLに含める手法とか、mod_headersでヘッダに追記する手法とかがあるみたいなんだが、手元ではうまくいってない。パラメータにはここでいうtype-3 messageはセットされているみたいなので、ここから user-string が取り出せたらいいんじゃね?とか思った。
こういうのって誰かプラグイン作ってないのかしら...
_ mod_auth_sspiの設定ができた
自宅環境でApache2.2.8にあげる必要があったので、ついでにmod_auth_sspi+reverse proxyでRails接続の環境を作ってみた。
LoadModule sspi_auth_module modules/mod_auth_sspi.so ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass /t http://192.168.0.25:3000/t ProxyPassReverse /t http://192.168.0.25:3000/t <Location /t> AuthName "Windows" AuthType SSPI SSPIAuth On SSPIAuthoritative On Require valid-user </Location>
Railsでテスト用のコントローラと.rhtmlをでっちあげる
<h1>Test#index</h1> <ul> <% request.env.sort.each do |k,v| %> <li><%=k%> = <%=v%></li> <% end %> </ul>
結果
GATEWAY_INTERFACE = CGI/1.2 HTTP_ACCEPT = */* HTTP_ACCEPT_ENCODING = gzip, deflate HTTP_ACCEPT_LANGUAGE = ja HTTP_AUTHORIZATION = NTLM TlRMTVNTUAADAAAAAAAAAEg...(ここにこんな感じでbase64エンコードされたtype-3メッセージが入ってる) HTTP_CONNECTION = Keep-Alive HTTP_HOST = 192.168.0.25:3000 HTTP_USER_AGENT = Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) HTTP_VERSION = HTTP/1.1 HTTP_X_FORWARDED_FOR = 127.0.0.1 HTTP_X_FORWARDED_HOST = localhost HTTP_X_FORWARDED_SERVER = 192.168.0.51 PATH_INFO = /test REMOTE_ADDR = 192.168.0.51 REQUEST_METHOD = GET REQUEST_PATH = /t/test REQUEST_URI = /t/test SCRIPT_NAME = /t SERVER_NAME = 192.168.0.25 SERVER_PORT = 3000 SERVER_PROTOCOL = HTTP/1.1 SERVER_SOFTWARE = Mongrel 1.1.3
_ うーん。なんか違う。
自宅の環境だとHTTP_AUTHORIZATIONにちゃんと値が入ってないみたいだ。そもそもAD環境下で試したときと文字列の長さが違いすぎる。
ApacheのAccessLogにはきちんと記録はされてるようなんだけど。
mod_auth_sspi用の設定もまあ微妙に違うのでそのあたりなのかも。
ちなみにテストコードの断片はこんなの(うまくいかない例):
<h1>ntlm</h1> <% keys = %w(header lm_resp_len lm_resp_off nt_resp_len nt_resp_off dom_len dom_off user_len user_off host_len host_off msg_len rest) ntlm_param = request.env['HTTP_AUTHORIZATION'].unpack('x5 m*')[0] vals = ntlm_param.unpack('a12 x2ssx2 x2ssx2 x2ssx2 x2ssx2 x2ssx2 x4 s a*') ntlm = Hash[*keys.zip(vals).flatten] %> <ul> <% ntlm.sort.each do |k, v| %> <li><%=k %>= <%=v.inspect%></li> <% end %> </ul>
dom_len= 0 dom_off= 72 header= "NTLMSSP\000\003\000\000\000" host_len= 0 host_off= 72 lm_resp_len= 0 lm_resp_off= 72 msg_len= 72 nt_resp_len= 0 nt_resp_off= 72 rest= "\000\000\005ˆ\242\005\001(\n\000\000\000\017" user_len= 0 user_off= 72
_ mod_rewriteで引き渡す方法がうまくいった。
http://www.ruby-forum.com/topic/83067#151189 の方法でうまくいった。
ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass /t http://192.168.0.25:3000/t ProxyPassReverse /t http://192.168.0.25:3000/t <Location /t> AuthName "Windows" AuthType SSPI SSPIAuth On SSPIAuthoritative On Require valid-user SSPIOmitDomain On SSPIUsernameCase upper RewriteEngine On RewriteCond %{LA-U:REMOTE_USER} (.+) RewriteRule . - [E=RU:%1] RequestHeader add X-Forwarded-User %{RU}e </Location>
... HTTP_X_FORWARDED_SERVER = 192.168.0.51 HTTP_X_FORWARDED_USER = LOGO\KOG PATH_INFO = /test .....
やはりmod_rewriteはちゃんと理解したほうがよさそうだ。