samba4 ntlm_auth を修正した その2

samba4 ntlm_auth がいろいろ残念なことになっていたので、いろいろ修正した。
前回は samba3 のソースから発生させたが、今回は samba4 のソースから派生させた。
そのため、NTLMSSP も動作するよ。(制限あり)

一体何が残念なんですか?

samba4 の ntml_auth の一体何が残念なんですか?
認証ルーチンなのに、認証部分のソースがないことだよ。

source4/utils/ntlm_auth.c

/* Authenticate a user with a plaintext password */

static bool check_plaintext_auth(const char *user, const char *pass, 
				 bool stdout_diagnostics)
{
        return (strcmp(pass, opt_password) == 0);
}

修正1 ntlm_authの残念なソースを修正した

がんばった。

修正2 コンソールから認証が通るようにした。

ふつーに認証できるはず。

ntlm_auth --username rti

修正3 --require-membership-of を動作するようにした。

samba3 とかには、特定のグループに所属していることという --require-membership-of って機能があるが、samba4 の実装から抜け落ちている様子。
なぜ抜け落ちさせたし。
仕方ないので、 wbinfo のソースをコピペってきて、エミュレーションするルーチンを ntlm_auth 側に作成した。
本来は、samba4 の問題なので、samba4 本体の修正が正しいんだけど、話しが大きくなるのが嫌だったので、ntlm_auth だけで完結させた。
samba4 の pam_winbind でも --require-membership-of が動かない問題があるみたいだけど、多分、samba4 の実装の問題だと思う。
samba3 でいう check_info3_in_group 相当のルーチンを実装すればいいんだろうけど、コードがすごく置き換わっているので実装は楽ではないだろうな。

ntlm_auth --username rti3 --require-membership-of=S-1-5-21-2558067586-3132001088-1936578106-1110

()

--helper-protocol の動作確認

とりあえず --helper-protocol=ntlm-server-1 と --helper-protocol=squid-2.5-ntlmsspの動作確認を行った。
問題なく動作している様子。

ソースとか遊び方

wget http://ftp.samba.org/pub/samba/samba4/samba-4.0.0alpha15.tar.gz
tar zxvf samba-4.0.0alpha15.tar.gz
cd samba-4.0.0alpha15

#バックアップ
cd source4/utils/
mv ntlm_auth.c ntlm_auth_old.c_

#置換
wget http://rtilabs.net/files/2011_05_10/ntlm_auth.c
cd ../..

./configure
make
make install

#setuid ビットをとりあえず立ててください。理由は説明します。
chmod +s /usr/local/samba/bin/ntlm_auth

なんでsetuid ビットがいるんですか?

ntlm_auth は apache のような非特権ユーザからも呼び出されます。
この時、権限周りの不思議な事象をたくさん引き起こします。


最初は適切にフォルダ等に権限をつけたりと処理していたのですが、あまりにたくさんあるので諦めました。

まず最初に遭遇したのが /usr/local/samba/private/smbd.tmp/msg/ に権限がない問題でした。

-bash-3.2$ /usr/local/samba/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
YR TlRMTVNTUAABAAAAB4IIogAAAAAAAAAAAAAAAAAAAAAGAbAdAAAADw==
Unable to setup messaging listener for '/usr/local/samba/private/smbd.tmp/msg/msg.0.193676647.0':NT_STATUS_ACCESS_DENIED

static void manage_gensec_request(enum stdio_helper_mode stdio_helper_mode, 
				  struct loadparm_context *lp_ctx,
				  char *buf, int length, void **private1,
				  unsigned int mux_id, void **private2) 

		case SQUID_2_5_NTLMSSP:
		{
			const char *winbind_method[] = { "winbind", NULL };
			struct auth_context *auth_context;

			msg = messaging_client_init(state, lpcfg_messaging_path(state, lp_ctx), ev);
			if (!msg) {
				talloc_free(mem_ctx);
MYLOG(">>ERROR");
MYLOG( "messaging_client_init faild!" );
				exit(1);
			}

次に出会ったのが、 BH Failed to retrive session info NT_STATUS_INTERNAL_DB_CORRUPTIONでした。

BH Failed to retrive session info NT_STATUS_INTERNAL_DB_CORRUPTION@ mod_auth_ntlm_winbind.c:
789(process_msg)

で、setuid ビット付けたらすべて解決したのでもうゴールしてもいいよね。って感じで、、、まぁ誰か直してよ! samba3 じゃ動いていたんだから、なんとかなるんぢゃなイカ
個人的には、setuid ビットでいいじゃんって思ってますけど。


追記
スティッキービットぢゃなくて、setuid ビットだろうとツッコミをもらったので直しました。