FreeRadius v1.x pop3認證程式(加入pop3 ssl認證判斷)
2010-10-07
這次把ssl判斷也加上去囉…
這樣就可以對只能用pop3s協定的主機做認證了
使用前…perl必須先安裝兩個模組
#cpan cpan[1]>install Mail::POP3Client cpan[2]>install IO::Socket::SSL
日前有廠商問我有沒有辦法寫一個pop3認證程式給radius用
我是記得之前有人有改過用pam去做認證,但是一次只能對一台pop3做認證…
雖然有人有改出來…但是卻沒有提供source
而我以前的師父是直接改pam的source去達成….
http://cym6112.blogspot.com/2008/01/freeradius-pampop3-mail-server-pop3.html
那我的作法…因為我比較懶惰..我想要能夠持續用apt或者是yum去更新server的套件…
所以是用外掛的方式…寫一隻script去完成這項工作
#!/usr/bin/perl
# Example:
# pop3.pl 你的認證主機 username password 是否使用ssl(1 or 0)
use Mail::POP3Client;
my $hostname=$ARGV[0];
my $username=$ARGV[1];
my $password=$ARGV[2];
my $ssl=$ARGV[3];
$pop = Mail::POP3Client->new(
USER => $username,
PASSWORD => $password,
HOST => $hostname,
USESSL => $ssl,
);
if($pop->Connect()){
# login success
# ex... "Aruba-User-Role = guest";
print "";
}else{
# login fail
exit 4;
}
$pop->Close;
這隻程式就看你要丟去哪裡囉…
記得要讓freeradius的使用帳號有權限去執行它..
程式裡面的 login success
看你要輸出什麼參數給radius做接收…
fail的話就不要輸出任何訊息
接下來要如何使用這隻script呢?
我們要先編輯users
下面加入
DEFAULT Auth-Type = Accept, User-Name !~ "@"
Exec-Program-Wait = "/usr/local/bin/pop3.pl 你的認證主機 %u %{Password} 0",
Fall-Through = 1,
DEFAULT Auth-Type = Accept, User-Name =~ "@你的認證主機domain"
Exec-Program-Wait = "/usr/local/bin/pop3.pl 你的認證主機 %u %{Password} 1",
Fall-Through = 1,
加完之後…記得要去proxy.conf裡面去加入你需要的認證主機的domain哦
能否請問一下,您proxy.conf的realm是怎麼設定的?
您好,
就是把您的pop3主機的domain加進去realm裡面
例如
realm mail1.com.tw { type = radius authhost = LOCAL accthost = LOCAL }您好,又碰到問題,要麻煩您解惑了
users 中加入您上述的幾行指令….
DEFAULT Auth-Type = Accept, User-Name !~ "@"
Exec-Program-Wait = "/etc/freeradius/pop3.pl 192.168.0.11 %u %{Password}",
Fall-Through = 1,
DEFAULT Auth-Type = Accept, User-Name =~ "@email.abc.com.tw"
Exec-Program-Wait = "/etc/freeradius/pop3.pl 192.168.0.11 %u %{Password}",
Fall-Through = 1,
修改完users之後重新執行freeradius卻出現下面的錯誤訊息
/etc/freeradius/users[212]: Parse error (check) for entry Exec-Program-Wait: Invalid vendor name in attribute name ""
Errors reading /etc/freeradius/users
您好,
請您先試試看直接下command
若可以,請確認pop3.pl的權限是否為755
該行指令可以執行 有pass pop3 auth
pop3.pl這個檔案的權限確定是755
我的OS是ubuntu9,是不是
Exec-Program-Wait = "/usr/local/bin/pop3.pl 你的認證主機 %u %{Password}",
這一行語法上有問題?
有沒有相關的文件可以查?
感謝您耐心的回覆!!
您好
Exec-Program-Wait與Fall-Through前面都按個tab鍵…
這樣應該就可以了…
發現Freeradius的設定~對於階層做的非常嚴謹…
水手兄您好~
前幾天太忙了,忘記來回報,加上TAB之後Freeradius就可以正常執行了,
但是目前client端實際認證時都會失敗…
能否請您仔細說明一下users中增加的那六行指令的涵義、前三行和後三行又有何差異?
我猜問題可能是在這裡!!
感謝您!!
您好,
若您先前有直接使用過程式認證成功的話…
基本上認證程式應該是沒有問題的….
前三行其實就是…
當User-Name沒有@的時候要執行什麼程式…
後三行就是User-Name有@email.abc.com.tw的時候~要執行什麼
而User-Name就是使用者所輸入的認證帳號…
建議您可以先開debug mode去看radius的動作….
看看哪個環節出了問題…
水手兄~
用debug mode之後果然找到問題,太感謝您了!!
我們學校校內的帳號用一台pop3認證,校外則用教育局的radius認證
所以我把proxy.conf的realm改成null
然後刪除掉users後三行,重新啟動radiusd就可以了!!
再次感謝您的耐心回覆
您好,
很高興能幫您解決問題…^^
建議直接用freeradius 2.X版的perl模組及所附範例,
用exec呼叫自寫程式要注意shell escape等問題。
以下以FreeBSD 8.1 安裝 net/freeradius2後已做了基本設定環境示範:
假設使用者帳號是user@mail.XX.edu.tw,而pop3s主機剛好也是mail.XX.edu.tw。
/usr/local/etc/raddb/proxy.conf
最後面增加
realm mail.XX.edu.tw {
authhost = LOCAL
accthost = LOCAL
}
接著使用Perl作POP3 over SSL認證:
先安裝
mail/p5-Mail-POP3Client
security/p5-IO-Socket-SSL
# cp -p /usr/local/etc/raddb/example.pl /usr/local/etc/raddb/pop3s.pl
修改/usr/local/etc/raddb/pop3s.pl
開頭增加
use Mail::POP3Client;
use IO::Socket::SSL;
….
修改認證函式
…
sub authenticate {
# For debugging purposes only
# &log_request_attributes;
my $pop = new Mail::POP3Client( USER => $RAD_REQUEST{‘Stripped-User-Name’},
PASSWORD => $RAD_REQUEST{‘User-Password’},
HOST => $RAD_REQUEST{‘Realm’},
USESSL => 1,
);
if ($pop->Login()) {
$RAD_REPLY{‘要回應的訊息’} = "1″;
return RLM_MODULE_OK;
}
else {
return RLM_MODULE_REJECT;
}
$pop->Close();
}
# cp -p /usr/local/etc/raddb/module/perl /usr/local/etc/raddb/module/pop3perl
(新檔名可隨便取,反正在radius.conf中是讀整個module資料夾
將pop3perl中修改module指定行
module = ${confdir}/pop3s.pl
再到
/usr/local/etc/raddb/sites-avaliable/default及
/usr/local/etc/raddb/sites-avaliable/inner-tunnel分別加入幾行
…
authorize {
…
file
+pop3
}
…
authenticate {
+Auth-Type POP3s {
+pop3
+}
…
}
/usr/local/etc/raddb/user
在最後加入
DEFAULT Auth-Type = POP3s, Realm != DEFAULT
不好意思,可以說明一下加到user的那兩段嗎??? 不太了解第一段的用意?? 十分感謝!!!!
上面的回覆有說明喔~
非常感謝