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の項目が参照されます。