經過測試後發現使用FreeRadius+pam_pop3模組,依預設值的話只能針對一部mail server進行pop3的認證,問題來了,因為認證時可能會同時使用到兩部mail server,所以必須進行程式修改。
在網路上找到了資料,發現交通大學的"北台灣社區網路建置及分析"計劃已有相同的做法,但是沒有source code可供參考 >"<,只好自己挖糞塗牆了。 需要修改的部份有兩個,就是FreeRadius和pam_pop3,雖然交大的文件上說只要修改FreeRadius就可以符合需求,但測了半天覺得兩個都要改到,反正沒source code所以還是用自己的方法吧!
- FreeRadius
- 作業系統FreeBSD-6.2-RELEASE
> cd /usr/ports/net/freeradius
>make install - 解開原始檔進行修改
> tar xvfj /usr/ports/distfiles/freeradius-xx.tar.bz2 - 修改rlm_pam.c
> cd freeradius-xx/src/modules/rlm_pam
> vi rlm_pam.c
找到以下字樣的下面那段code把mark掉/*
* FreeBSD 3.x doesn't have account and session management
* functions in PAM, while 4.0 does.
*/
if !defined(__FreeBSD_version) || (__FreeBSD_version >= 400000) - 把修改過的FreeRadius重新包裝起來放回/usr/ports/distfiles把原檔覆蓋掉,再用port直接安裝省得麻煩
> tar cvfj freeradius-xxx.tar.bz2 freeradius-xxx
> cp freeradius-xxx.tar.bz2 /usr/ports/distfiles/freeradius-xxx.tar.bz2
> cd /usr/ports/net/freeradius
> make deinstall
> make NO_CHECKSUM=yes install clean - 修改radius的相關設定
- 作業系統FreeBSD-6.2-RELEASE
- pam_pop3
- 一樣使用port安裝並使用已經過patch的code來修改
> cd /usr/ports/security/pam_pop3/
> make install
> cd ~
> cp -r /usr/ports/security/pam_pop3/work/pam_pop3 . - 修正 pam_pop3.c
> cd pam_pop3
> vi pam_pop3.c
找到 char *pwprompt="Password: "; 在下面插入一行char delim[]="@";
找到以下的codeif (username==NULL)
在下面接著以下這兩行
{
if (pam_get_user(pamh,(const char **)&username,NULL)!=PAM_SUCCESS)
{
syslog(LOG_ERR,"Could not get username from libpam !");
return result;
}username=strtok(username,delim);
這樣就可以把xxx@mail.abc.com.tw的格式正確的導到正確的伺服器囉!
hostname=strtok(NULL,delim); - 手動compiler後再把原先安裝的pam_pop3.so檔覆蓋
> make clean
> cc -O2 -fno-strict-aliasing -pipe -march=pentiumpro -fpic -DPIC -Wall -c pam_pop3.c -o pam_pop3.o
> ld -x --shared -o pam_pop3.so pam_pop3.o -lpam -lcrypt
> cp pam_pop3.so /usr/local/lib/pam_pop3.so - 在/etc/pam.d/ 新增一個檔名字叫radius,內容如下
auth required /usr/local/lib/pam_pop3.so info pwprompt=Passwort: timeout=20
- 一樣使用port安裝並使用已經過patch的code來修改
沒有留言:
張貼留言