Freeradius+gmail+802.1X設定(POP3s)

邊做邊學,順便留個筆記,若有錯誤請不吝指教。

本篇使用Ubuntu1804版本,freeradius串接gmail pop3s進行認證,
802.1X為使用eap-gtc方法進行認證

安裝freeradius、perl及perl的ssl、pop3函式庫,我們將使用freeradius內建的perl module來完成pop3s認證。

apt-get install freeradius perl libio-socket-ssl-perl libmail-pop3client-perl

編輯client.conf,通常路徑為:/etc/freeradius/3.0/clients.conf
在clients.conf的最後面依以下格式加入Client:

client WiFi {
        ipaddr = 192.168.220.16
        secret = KerKer
}

這個例子為建立一個名為WiFi的的Client,IP為192.168.220.16,當這個Client來進行Radius請求的密碼為KerKer,可以依自己的環境做替換。

將mods-available目錄底下的perl模組設定檔複製到mods-enabled目錄

cp /etc/freeradius/3.0/mods-available/perl /etc/freeradius/3.0/mods-enabled/perl

編輯mods-enabled目錄底下的perl設定檔,將perl認證用程式改為pop3.pl:

    filename = ${modconfdir}/${.:instance}/example.pl
--->
    filename = ${modconfdir}/${.:instance}/pop3.pl

將範例程式example.pl複製一份,並命名為pop3.pl供我們進行修改使用。

cp /etc/freeradius/3.0/mods-config/perl/example.pl /etc/freeradius/3.0/mods-config/perl/pop3.pl

當然上述的兩個步驟也可以略過,直接編輯example.pl也是可以的。

再來我們要修改pop3.pl的程式碼,我們要將一開始安裝的兩個函式庫叫進來用,再程式碼中找到”use Data::Dumpe;”並在後面加上”se Mail::POP3Client;”及”use IO::Socket::SSL;”:

    use Data::Dumper;
--->
    use Data::Dumper;
    use Mail::POP3Client;
    use IO::Socket::SSL;

再來修改認證的程式碼,在程式碼中找到 “sub authenticate {” 把大括號裡的程式碼全部砍掉,把pop3認證的程式碼貼進去:

    sub authenticate {
        ...
    }
--->    
    sub authenticate {
        my $pop = Mail::POP3Client->new(
            USER => $RAD_REQUEST{'User-Name'},
            PASSWORD => $RAD_REQUEST{'User-Password'},
            HOST => "pop.gmail.com",
            USESSL => 1,
            DEBUG => 1,
        );
        if($pop->Connect()){
            return RLM_MODULE_OK;
        }else{
            return RLM_MODULE_REJECT;
        }
        $pop->Close;
    }

程式碼中的my $pop這段是用來確認建立POP3連線的資訊用的,其中USER、PASSWORD是radius會自己帶進來的;HOST是mail server的IP或domain都可以,這裡我們用的是gmail的server;USESSL是使用SSL加密的pop3s,如果要用google的pop3是一定要開的;DEBUG則是是否開啟除錯資訊,如果之後測試都穩定了也可以拿掉。

再來就是嘗試建立pop3連線,如果成功連上則回報認證OK,否則回報REJECT,最後關閉pop3連線。

編輯/etc/freeradius/3.0/sites-available/default,在authorize、authenticate、accounting三段的大括號內分別加入以下內容:

authorize {
...
    if (!control:Auth-Type && User-Password) {
        update control {
            Auth-Type := Perl
        }
    }
...
}

authenticate {
...
    Auth-Type Perl { #Add Auth-Perl auth
        perl
    }
...
}

accounting {
...
    if (ok || updated) {
            update control {
                    Auth-Type := Perl
            }
    }
...
}

編輯/etc/freeradius/3.0/sites-available/default/inner-tunnel,在authenticate大括號內加入以下內容:

authenticate {
...
    Auth-Type Perl { #Add Auth-Perl auth
    perl
    }
...
}

編輯/etc/freeradius/3.0/proxy.conf,在尾端加入內容如下:

realm gmail.com{
    authhost        = LOCAL
    accthost        = LOCAL
    nostrip
}

這裡可以確保當帳號包含”@gmail.com”時能夠將”@gmail.com”作為帳號的一部份保留下來。

到這邊可以開啟freeradius服務進行測試了,以除錯模式運行freeradius:

freeradius –X

若正常運行則應該顯示”Ready to process requests”
若出現port已占用之情形請嘗試將服務關閉:

service freeradius stop

如果仍然不行可以嘗試以下指令用來查詢進程代碼,並使用kill指令關閉該進程:

ps -ef | grep freeradius
kill -9 <PROCESS ID HERE>

當freeradius除錯模式正確運作時,請開啟另一個terminal,並使用已下指令測試:

radtest "User-name" "password" 127.0.0.1 0 "testing123"

相應欄位請自行帶入mail address及密碼,ip填入本機IP,本機請求的預設secret為testing123。

到這邊基本可以確認與mail server串接正確了,再來我們要做802.1X的設定了。

修改/etc/freeradius/3.0/mods-enabled/eap,改成EAP-GTC方法:

    eap {
        default_eap_type = md5
        peap {
            default_eap_type = mschapv2
        }
    }
--->
    eap {
        default_eap_type = peap
        peap {
            default_eap_type = gtc
        }
    }

修改/etc/freeradius/3.0/sites-enabled/default,因為GTC的auth-type是PAP,我們要將PAP的auth-type設定為perl:

    Auth-Type PAP {
            pap
    }
--->
    Auth-Type PAP {
            perl
    }

etc/freeradius/3.0/sites-enabled/inner-tunnel也做相同的修改:

    Auth-Type PAP {
            pap
    }
--->
    Auth-Type PAP {
            perl
    }

到這裡802.1X就設定完成了,可以再次用除錯模式執行freeradius,並嘗試用802.1X進行認證了!

不過這裡還有一點要注意的是,Google帳號預設式不允許應用程式存取的,所以想要認證成功還需要到https://myaccount.google.com/security去開啟”低安全性應用程式存取權”喔!

另外如果你的google帳號有開啟二階段驗證也不能使用這種方式認證,一樣到https://myaccount.google.com/security,並找到”應用程式密碼”選項,建立一組供應用程式登入用的密碼就可以了!