% apt-get source samba % cd samba-2.2.3a % vi source/smbd/password.c ... (関数password_ok) /* if 24 bytes long assume it is an encrypted password */ uchar challenge[8]; if (!last_challenge(challenge)) { DEBUG(0,("Error: challenge not done for user=%s\n", user)); return False; } if(pwlen==24) { const char b64[]= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; char pass[6+44+1]; int i, e0, e1, e2; char *p; uchar *c; memcpy(pass, "{NTLM}", 6); p= pass+6; c= password; for(i= 0; i<32; i+=3) { if(i==24) c= challenge; e0= c[0]; e1= i+1<32?c[1]:0; e2= i+2<32?c[2]:0; *p++= b64[e0>>2]; *p++= b64[e0<<4&0x30|e1>>4]; *p++= i+1<32?b64[e1<<2&0x3c|e2>>6]:'='; *p++= i+2<32?b64[e2&0x3f]:'='; c+= 3; } *p= 0; ret= pass_check(user, pass, strlen(pass), pwd, NULL); if(ret) return True; } ret = pass_check_smb(user, global_myworkgroup, challenge, (uchar *)password, (uchar *)password, pwd); ...修正はこれだけです。コンパイルしてインストールします。
# dpkg-buildpackage (この時に出るコンパイルに必要なパッケージ群はapt-get installで取ってきます。) # cd .. # dpkg -i samba-common_2.2.3a-xxx.deb # dpkg -i samba_2.2.3a-xxx.deb入れ替えるのは/usr/sbin/smbdだけなので、ふつうにsambaを入れてから、
# /etc/init.d/samba stop # cd source/bin # strip smbd; cp smbd /usr/sbin/smbd # /etc/init.d/samba startとかします。 いずれにせよapt-get upgradeされないようにdselect等で sambaをhold-stateにしておくか、 upgradeがかかったら最新のソースで再コンパイルして入れ替えるのを忘れずに。
# vi /etc/pam.d/samba auth sufficient pam_ldap.so account sufficient pam_ldap.so session sufficient pam_ldap.so password sufficient pam_ldap.so auth required pam_unix.so nullok use_first_pass nodelay account required pam_unix.so session required pam_unix.so password required pam_unix.so try_first_passsambaはパスワードをいくつか試すので、 authのpam_unix.soにnodelayを設定しておかないとログインやファイルアクセスに数秒の時間がかかることになります。 あるいはauthからpam_unixそのものを取り除いてもいいでしょう。