«前の日記(2008-02-11(Mon)) 最新 次の日記(2008-02-18(Mon))» 編集

これ日記なん?


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&#136;\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はちゃんと理解したほうがよさそうだ。