sambaのコンパイル
sambaを改造してpam経由でslapdにアクセスしてNTLM認証をするようにします。
slapdはNTLM認証対応に改造しておいてください。
% 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がかかったら最新のソースで再コンパイルして入れ替えるのを忘れずに。
sambaの設定
sambaはアカウント情報をpam経由で取得するのでpamの設定も必要です。
# 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_pass
sambaはパスワードをいくつか試すので、
authのpam_unix.soにnodelayを設定しておかないとログインやファイルアクセスに数秒の時間がかかることになります。
あるいはauthからpam_unixそのものを取り除いてもいいでしょう。
以上です。/etc/samba/smb.confにsambaのその他の設定をして
Windows2000等からsambaに接続してみましょう。
なお、pam経由でNTLMの認証に失敗した場合は
/etc/samba/smbpassの項目が参照されます。