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哦

[相關文章]

  • No Related Post
    • shawn
    • 2010 年 9 月 20 日

    能否請問一下,您proxy.conf的realm是怎麼設定的?

      • 水手
      • 2010 年 9 月 20 日

      您好,

      就是把您的pop3主機的domain加進去realm裡面
      例如

      realm mail1.com.tw {
              type            = radius
              authhost        = LOCAL
              accthost        = LOCAL
      }
      
    • shawn
    • 2010 年 9 月 21 日

    您好,又碰到問題,要麻煩您解惑了

    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

      • 水手
      • 2010 年 9 月 21 日

      您好,

      請您先試試看直接下command

      /etc/freeradius/pop3.pl 192.168.0.11 mail使用者帳號 mail使用者密碼

      若可以,請確認pop3.pl的權限是否為755

    • shawn
    • 2010 年 9 月 23 日

    該行指令可以執行 有pass pop3 auth
    pop3.pl這個檔案的權限確定是755

    我的OS是ubuntu9,是不是
    Exec-Program-Wait = "/usr/local/bin/pop3.pl 你的認證主機 %u %{Password}",
    這一行語法上有問題?
    有沒有相關的文件可以查?

    感謝您耐心的回覆!!

      • 水手
      • 2010 年 9 月 24 日

      您好

      Exec-Program-Wait與Fall-Through前面都按個tab鍵…
      這樣應該就可以了…

      發現Freeradius的設定~對於階層做的非常嚴謹…

    • shawn
    • 2010 年 10 月 4 日

    水手兄您好~

    前幾天太忙了,忘記來回報,加上TAB之後Freeradius就可以正常執行了,
    但是目前client端實際認證時都會失敗…

    能否請您仔細說明一下users中增加的那六行指令的涵義、前三行和後三行又有何差異?
    我猜問題可能是在這裡!!

    感謝您!!

      • 水手
      • 2010 年 10 月 4 日

      您好,

      若您先前有直接使用過程式認證成功的話…
      基本上認證程式應該是沒有問題的….

      前三行其實就是…
      當User-Name沒有@的時候要執行什麼程式…

      後三行就是User-Name有@email.abc.com.tw的時候~要執行什麼
      而User-Name就是使用者所輸入的認證帳號…

      建議您可以先開debug mode去看radius的動作….
      看看哪個環節出了問題…

    • shawn
    • 2010 年 10 月 6 日

    水手兄~

    用debug mode之後果然找到問題,太感謝您了!!

    我們學校校內的帳號用一台pop3認證,校外則用教育局的radius認證
    所以我把proxy.conf的realm改成null
    然後刪除掉users後三行,重新啟動radiusd就可以了!!

    再次感謝您的耐心回覆

      • 水手
      • 2010 年 10 月 6 日

      您好,

      很高興能幫您解決問題…^^

    • LHD
    • 2010 年 10 月 21 日

    建議直接用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

    • KKC
    • 2012 年 2 月 15 日

    不好意思,可以說明一下加到user的那兩段嗎??? 不太了解第一段的用意?? 十分感謝!!!!

      • 水手
      • 2012 年 2 月 15 日

      上面的回覆有說明喔~

      水手 :

      您好,

      若您先前有直接使用過程式認證成功的話…
      基本上認證程式應該是沒有問題的….

      前三行其實就是…
      當User-Name沒有@的時候要執行什麼程式…

      後三行就是User-Name有@email.abc.com.tw的時候~要執行什麼
      而User-Name就是使用者所輸入的認證帳號…

      建議您可以先開debug mode去看radius的動作….
      看看哪個環節出了問題…

  1. 尚無引用.