Shunze 學園 >資訊設備專區 >Extreme & Enterasys > 《分享》架設FreeRadius做為NAS 哈囉,還沒有註冊或者登入。請你[註冊|登入]
« 上一篇主題 下一篇主題 » 顯示成列印模式 | 增加到我的最愛
發表新主題 發表回覆
作者
主題
shunze
工友伯伯


註冊日期: 2002 04
來自: 潮汐終止之地
文章: 2370

shunze 離線
《分享》架設FreeRadius做為NAS引用回覆 編輯/刪除文章 搜尋由  發表的其他文章 回報給版主 IP 位置 回此頁最上方

在NAC中能夠控管的Network Access Server(NAS)基本上就是Switch,
且NAC與NAS間是透過SNMP(建議v3版本)來控管溝通。
(也有一說NAS是Network Access Switch的縮寫,不過能受控於Radius的設備其實不止Switch,
包含無線AP、無線Controller、防火牆、VPN及撥號伺服器都能支援Radius驗證。
所以順子比較認同Network Access Server的說法。)


有沒有辦法裝一台FreeRadius做為Radius Proxy,
將FreeRadius NAS Client的驗證訊息,統一往NAC送呢?



答案是有滴!

條件是FreeRadius Server要能納入NAC控管,所以必需安裝SNMP服務,讓它能成為NAC的NAS,
然後將FreeRadius設定為Radius Proxy,將其下Switch的Radius驗證訊息往NAC送。


測試環境
NAC 6.1.0.135 IP 192.168.10.12
Ubuntu 14.04.1 LTS IP 192.168.10.23
NAC下Switch 192.168.10.10
Radius Proxy下Switch 192.168.20.200


Ubuntu安裝設定

IP配置設定,請到/etc/network/interfaces中依實際環境進行修改。
iface eth0 inet static
address 192.168.10.23
netmask 255.255.255.0
gateway 192.168.10.1
dns-nameservers 192.168.10.1


設定好IP後,第一步請先更新套件資訊,以免部份套件不全,造成套件安裝失敗。
apt-get update


安裝SSH套件,以方便管理。
apt-get install ssh


安裝SNMP套件。
apt-get install snmp snmpd

安裝完成後,修改設定檔 /etc/snmp/snmpd.conf 內容,增加一個SNMP v3的user snmpuser。
# Listen for connections from the local system only
#agentAddress udp:127.0.0.1:161 註解掉這行
# Listen for connections on all interfaces (both IPv4 *and* IPv6)
agentAddress udp:161,udp6:[::1]:161 啟用這行

#end of line,增加一個snmpuser的user
createUser snmpuser MD5 snmpauthcred DES snmpprivcred
rwuser snmpuser priv 1.3.6.1.2.1

然後啟動SNMP服務。
/etc/init.d/snmpd start


安裝FreeRadius套件。
apt-get install freeradius freeradius-utils

FreeRadius在此Proxy架構下,有Radius Server與NAS雙重角色,
所以要針對這兩個部份各自進行設定。

做為Radius Server而言,它要設定允許認證的前端使用者網段與preshared key。
修改設定檔 /etc/freeradius/client.conf。
client 192.168.0.0/24 {
    secret = ETS_TAG_SHARED_SECRET
    shotname = radiusproxy
}


做為NAS角色,它要設定遠端供認證的Radius Server (NAC)資訊。
修改設定檔 /etc/freeradius/proxy.conf。
#註解掉所有區段,僅留下以下兩個部分
proxy server {
    default_fallback = no
}
realm DEFAULT {
    authhost = 192.168.10.12:1812
    accthost = 192.168.10.12:1813
    secret = ETS_TAG_SHARED_SECRET
}


設定完後重開機,FreeRadius的設定到此就算結束了。


NAC
回到NAC中,第一步自然是透過SNMP v3,把Ubuntu納入控管。







然後...
就完成了!?

沒錯,設定到此就算完成了!
但這種架構有一些已知的瑕疵在。
  1. 無法解析Radius Proxy的使用者IP。
    NAC跟一般的Radius不同的地方,在於NAC的驗證機制上多了一道MAC to IP Resolution。
    解析出MAC所對應的IP後,NAC可依需求於此IP進行後續agent-less or agent-based的Assessment/Remediation。

    而NAC中的MAC to IP Resolution是透過DHCP的廣播封包或是SNMP協定向下層Switch或Router取得。
    在這種多了一層Proxy的架構下,若下層Switch是在同一網段,還可統一透過Router解析出網卡所對應的IP;
    但若下層的Switch分佈在不同網段,各自透過了對應的Router來進行路由,則NAC無法逐一向下層真正的Switch或Router來取得MAC與IP的對應關係,
    所以會出現MAC to IP Resolution Failed的訊息。





    有這瑕疵是架構上的問題,無可避免,但不影響驗證後的權限配置。
    若不想出現這訊息,可以把IP Resolution關掉。
    但若在整體NAC佈署上包含了Assessment/Remediation,這種跨了網多重網段的Radius Proxy架構可是無法配合運作的喔!



  2. 無法看出是Radius Proxy下的那台Switch進行的驗證。
    由於NAC下能掌控的都是直接管理的NAS,所以透過Radius Proxy機制上來驗證的使用者,
    其對應的NAS裝置都會顯示為Radius Proxy的IP。



    若Radius Proxy下的Switch數量不多,還比較容易找;
    若數量多達1,200台,如何去分辨是哪台Switch就是個麻煩的課題了。


原廠不support的架構在測試上果然還是有些問題,
不過做為Radius Proxy再轉一手給NAC,理論上還是可行的。


參考資料
http://www.fineconnection.com/how_to_ins...yption_testing/
http://www.lijyyh.com/2013/07/radius-con...ius-server.html



♥順子老婆的網拍,請多關照∼

If you don't like something, change it.
If you can't change it, change your attitude.
Don't complain!




2014-10-24, 16:50 shunze 的個人資料 把 shunze 加入好友列表 發送Email給 shunze 瀏覽 shunze 的網站 MSN : shunze@gmail.com
shunze
工友伯伯


註冊日期: 2002 04
來自: 潮汐終止之地
文章: 2370

shunze 離線
《分享》FreeRadius Debug Mode引用回覆 編輯/刪除文章 搜尋由  發表的其他文章 回報給版主 IP 位置 回此頁最上方

如何進入FreeRadius的Debug Mode進行偵錯呢?
先停掉FreeRadius服務,然後再下 freeradius -X 就可以進入偵錯模式。

進入Debug mode後,就可以得到很多有用的訊息。

rad_recv: Access-Request packet from host 192.168.20.200 port 46907, id=11, length=120
    User-Name = "administrator"
    EAP-Message = 0x02ce00120161646d696e6973747261746f72
    NAS-IP-Address = 192.168.20.200
    Service-Type = Login-User
    Calling-Station-Id = "9C-EB-E8-01-EC-5B"
    NAS-Port-Id = "24"
    NAS-Port = 1024
    NAS-Port-Type = Ethernet
    Message-Authenticator = 0xba9ec31804a2556551558ff17deaf8af
# Executing section authorize from file /etc/freeradius/sites-enabled/default
+- entering group authorize {...}
++[preprocess] returns ok
++[chap] returns noop
++[mschap] returns noop
++[digest] returns noop
[suffix] No '@' in User-Name = "administrator", looking up realm NULL
[suffix] Found realm "DEFAULT"
[suffix] Adding Stripped-User-Name = "administrator"
[suffix] Adding Realm = "DEFAULT"
[suffix] Proxying request from user administrator to realm DEFAULT
[suffix] Preparing to proxy authentication request to realm "DEFAULT"
++[suffix] returns updated
[eap] Request is supposed to be proxied to Realm DEFAULT. Not doing EAP.
++[eap] returns noop
++[files] returns noop
++[expiration] returns noop
++[logintime] returns noop
++[pap] returns noop
WARNING: Empty pre-proxy section. Using default return values.
Sending Access-Request of id 127 to 192.168.10.12 port 1812
    User-Name = "administrator"
    EAP-Message = 0x02ce00120161646d696e6973747261746f72
    NAS-IP-Address = 192.168.20.200
    Service-Type = Login-User
    Calling-Station-Id = "9C-EB-E8-01-EC-5B"
    NAS-Port-Id = "24"
    NAS-Port = 1024
    NAS-Port-Type = Ethernet
    Message-Authenticator = 0x00000000000000000000000000000000
    Proxy-State = 0x3131
Proxying request 0 to home server 192.168.10.12 port 1812
Sending Access-Request of id 127 to 192.168.10.12 port 1812
    User-Name = "administrator"
    EAP-Message = 0x02ce00120161646d696e6973747261746f72
    NAS-IP-Address = 192.168.20.200
    Service-Type = Login-User
    Calling-Station-Id = "9C-EB-E8-01-EC-5B"
    NAS-Port-Id = "24"
    NAS-Port = 1024
    NAS-Port-Type = Ethernet
    Message-Authenticator = 0x00000000000000000000000000000000
    Proxy-State = 0x3131
Going to the next request
Waking up in 0.9 seconds.
rad_recv: Access-Challenge packet from host 192.168.10.12 port 1812, id=127, length=68
    EAP-Message = 0x01cf00061920
    Message-Authenticator = 0x08879216a71a656df1b997eb80819aac
    State = 0x88e949b688265039f6ba46686fa38028
    Proxy-State = 0x3131
...



不過很奇怪的是,有時候透過 /etc/init.d/freeradius stop 停掉FreeRadius服務,再進入偵錯模式,就會出現錯誤!?



這時就要透過 service freeradius stop 停掉FreeRadius服務,再進入偵錯模式,則可正常運作。



但有時候又是相反,透過 service 無法停掉服務;反而要透過 /etc/init.d 才能停掉服務?

這是為什麼?
我完全搞不懂,service 不就是一個執行 /etc/init.d 下程式的script嗎?
實在搞不懂...



♥順子老婆的網拍,請多關照∼

If you don't like something, change it.
If you can't change it, change your attitude.
Don't complain!




2014-10-24, 17:29 shunze 的個人資料 把 shunze 加入好友列表 發送Email給 shunze 瀏覽 shunze 的網站 MSN : shunze@gmail.com
shunze
工友伯伯


註冊日期: 2002 04
來自: 潮汐終止之地
文章: 2370

shunze 離線
《分享》FreeRadius log引用回覆 編輯/刪除文章 搜尋由  發表的其他文章 回報給版主 IP 位置 回此頁最上方

FreeRadius的log記錄在 /var/log/freeradius/radius.log 中,
預設只會記錄freeradius的啟動與載入事件,
若要記錄使用者驗證的記錄,可在 /etc/freeradius/radiusd.conf 設定檔中進行修改。

於radiusd.conf的log區段中,修改 auth、auth_badpass、auth_goodpass 這三個參數,
將值由 no 改為 yes,即可記錄使用者的驗證記錄。

log {
    destination = files
    file = ${logdir}/radius.log
    syslog_facility = daemon
    stripped_names = no
    auth = yes
    auth_badpass = yes
    auth_goodpass = yes
    # msg_goodpass = ""
    # msg_badpass = ""
}


若想在log中,記錄其它Radius參數的內容,例如 NAS-IP-Address,
則可取消 msg_goodpass / msg_badpass 的註解,然後把變數 %{NAS-IP-Address} 帶給它,
這樣在每一筆log的最後,就會帶上 NAS-IP-Address 的內容。

log {
    destination = files
    file = ${logdir}/radius.log
    syslog_facility = daemon
    stripped_names = no
    auth = yes
    auth_badpass = yes
    auth_goodpass = yes
    msg_goodpass = "%{NAS-IP-Address}"
    msg_badpass = "%{NAS-IP-Address}"
}




另外,若想更完整的抓出所有驗證過程中的資訊,
則可在 /etc/freeradius/sites-available/default 檔案中取消對應功能區段的log註解,
例如 authorize 區段中的 auth_log,pre-proxy 區段中的 pre_proxy_log,post-proxy 區段中的 post_proxy_log。
這三個功能區段的log就會依NAS的IP,再以日期,分別產出對應的三個log於 /var/log/freeradius/radacct 目錄中。




FreeRadius變數參考資料
http://wiki.freeradius.org/config/Run-time-variables



♥順子老婆的網拍,請多關照∼

If you don't like something, change it.
If you can't change it, change your attitude.
Don't complain!




2014-10-24, 18:38 shunze 的個人資料 把 shunze 加入好友列表 發送Email給 shunze 瀏覽 shunze 的網站 MSN : shunze@gmail.com
shunze
工友伯伯


註冊日期: 2002 04
來自: 潮汐終止之地
文章: 2370

shunze 離線
《分享》MAC to IP與Real Switch兩個問題的後續處理引用回覆 編輯/刪除文章 搜尋由  發表的其他文章 回報給版主 IP 位置 回此頁最上方

MAC to IP與Real Switch兩個問題的後續處理

在Radius Proxy架構中的出現的MAC to IP解析與真正的Switch IP這兩個問題總算有解了!

在MAC解析IP部分,順子的做法是把中繼的FreeRadius當做ARP Proxy,
把所有前端的MAC to IP對應全寫在FreeRadius上,
當NAC透過SNMP協定向受控的FreeRadius取得RFC1213-MIB::atPhysAddress內容時,
就能順利解析出MAC對應的IP了。

但這個想法在實作時遇到了兩個問題,
第一,Radius認證完成前,前端Switch還無法產生MAC to IP對應表;
第二,透過FreeRadius呼叫外部程式來寫入FreeRadius本機的ARP表格時,權限不足。

而這兩個問題的對應解法自然是“延時”與“賦予執行時期root的權限”。


在真正的Switch IP顯示上,其實問題不大,
麻煩的是如何在NAC的畫面中統一呈現,而不是讓使用者再透過另一個工具(log)去查詢。

NetSight的資料庫是MySQL,NAC顯示的資料全寫在其中的netsight資料庫。
那可不可以在FreeRadius上安裝MySQL Client套件,
在驗證的過程中直接修改NAC的DB內容,完美的透過NAC畫面統一呈現?

是可以的!
但好不容易開通NetSight讓FreeRadius連結MySQL的權限,
卻因為NAC的MAC to IP延時解析,又把資源還原了...

怎麼辦?
自然是比MAC to IP的延時解析再慢一步來調整囉∼


以下為這兩個問題的Step by Step完整解法

  1. 開放FreeRadius連結NetSight MySQL DB的權限
    於NetSight上安裝MySQL Client套件
    apt-get update
    apt-get install mysql-client

    修改NetSight的MySQL設定檔my.cnf,將socket改為/tmp/netsight_mysql.sock,讓新裝的MySQL Client能夠運作。
    vim /etc/mysql/my.cnf

    [client]
    port = 3306
    #socket = /var/run/mysqld/mysqld.sock
    socket = /tmp/netsight_mysql.sock

    透過MySQL Client連結到MySQL資料庫
    mysql -u netsight --port=4589 -p

    (NetSight MySQL的帳號為netsight,預設密碼enterasys)

    賦予FreeRadius的IP能連線到NetSight的MySQL
    use mysql;

    insert into user
    SELECT '<FreeRadius的IP>', User, Password, Select_priv ,Insert_priv ,Update_priv ,Delete_priv ,Create_priv ,Drop_priv ,Reload_priv ,Shutdown_priv ,Process_priv ,File_priv ,Grant_priv ,References_priv ,Index_priv ,Alter_priv ,Show_db_priv ,Super_priv ,Create_tmp_table_priv ,Lock_tables_priv ,Execute_priv ,Repl_slave_priv ,Repl_client_priv ,Create_view_priv ,Show_view_priv ,Create_routine_priv ,Alter_routine_priv ,Create_user_priv ,Event_priv ,Trigger_priv ,Create_tablespace_priv ,ssl_type ,ssl_cipher ,x509_issuer ,x509_subject ,max_questions ,max_updates ,max_connections ,max_user_connections ,plugin, authentication_string ,password_expired FROM user WHERE host='localhost';

    FLUSH PRIVILEGES;


  2. FreeRadius主機安裝MySQL Client套件
    apt-get update
    apt-get install mysql-client

    安裝完測試能否連到NetSight主機的MySQL
    mysql -h <NetSight主機IP> -u netsight --port=4589 -p


    順便於FreeRadius主機安裝snmp-mibs-downloader套件,
    讓snmpwalk能以較易辨識的MIBs來查詢。
    apt-get install snmp-mibs-downloader


  3. 於FreeRadius主機上建立兩支Perl Script來解決上述兩個問題
    這兩支Script順子把它建在/etc/freeradius/中。

    第一支Script - ErayExec.pl,是讓Radius在驗證過程中,被呼叫執行。
    #!/usr/bin/perl -w

    use strict;

    my $NAS_IP = $ARGV[0];
    my $MAC = $ARGV[1];

    exec("sudo /etc/freeradius/EraySync.pl $NAS_IP $MAC");


    第二支Script - EraySync.pl,是實際用來解決兩個問題的script。
    #!/usr/bin/perl -w

    use DBI;
    use DBD::mysql;
    use strict;
    use warnings;

    my $NAS_IP = $ARGV[0];
    my $MAC = $ARGV[1];

    daemonize();
    sleep(5);

    #==更新ARP============================================
    $MAC = uc($MAC);
    $MAC =~ s/-/ /g;
    print "$MAC\n";
    #snmp v1
    #my $SNMP = `snmpwalk -v 1 -c public $NAS_IP RFC1213-MIB::atPhysAddress | grep "$MAC"`;
    #snmp v2C
    #my $SNMP = `snmpwalk -v 2c -c public $NAS_IP RFC1213-MIB::atPhysAddress | grep "$MAC"`;
    #snmp v3
    my $SNMP = `snmpwalk -v 3 -u snmpuser -l authPriv -a MD5 -A snmpauthcred -x DES -X snmpprivcred $NAS_IP RFC1213-MIB::atPhysAddress | grep -i "$MAC"`;
    if ($SNMP) {
      print "Get MAC-IP information in RFC1213-MIB::atPhysAddress\n";
    } else {
      print "Cannot get MAC-IP information in RFC1213-MIB::atPhysAddress\n";
      $SNMP = `snmpwalk -v 3 -u snmpuser -l authPriv -a MD5 -A snmpauthcred  -x DES -X snmpprivcred $NAS_IP RFC1213-MIB::ipNetToMediaPhysAddress | grep -i "$MAC"`;
      if ($SNMP) {
        print "Get MAC-IP information in RFC1213-MIB::ipNetToMediaPhysAddress\n";
      } else {
        print "Cannot get MAC-IP information in RFC1213-MIB::ipNetToMediaPhysAddress\n";
      }
    }
    #my $SNMP = `snmpwalk -v 3 -u snmpuser -l authPriv -a MD5 -A snmpauthcred  -x DES -X snmpprivcred $NAS_IP 1.3.6.1.2.1.3.1.1.2 | grep -i "$MAC"`;

    #格式化網卡為Linux ARP格式
    $MAC =~ s/\s/:/g;
    print "$MAC\n";
    my $Device_IP;

    if ($SNMP) {
      #at.atTable.atEntry.atPhysAddress.3.1.192.168.0.1 =  Hex: 7C 05 07 73 50 63
      #RFC1213-MIB::atPhysAddress.1.1.192.168.10.208 = Hex-STRING: 9C EB E8 01 EC 5B
      #my ($ip, $junkorether, $ether)= /(\d+\.\d+\.\d+\.\d+)\s+=\s+(Hex)?\s*([0-9a-fA-F]+[: ][0-9a-fA-F]+[: ][0-9a-fA-F]+[: ][0-9a-fA-F]+[: ][0-9a-fA-F]+[: ][0-9a-fA-F]+)/;
      $SNMP =~ /(\d+\.\d+\.\d+\.\d+)\s+=\s+(Hex)/;
      $Device_IP = $1;
      print "$Device_IP\n";

      #清除舊ARP
      my @ARP = `arp -n | grep -i "$MAC"`;
      for(my $i = $#ARP; $i >= 0; $i--) {
        #192.168.0.1              ether   7C:05:07:73:50:63   C                     eth0
       my ($ARP_IP) = split(/\s/,$ARP[$i]);
        print "$ARP_IP\n";
        `arp -d $ARP_IP -i eth0`;
      }
      #寫入ARP Table
      `arp -s $Device_IP $MAC -i eth0`;
    }

    #==更新MySQL==========================================
    # assign the values in the accessDB file to the variables
    if ($SNMP) {
      sleep(15);
    } else {
      sleep(50);
    }
    my $database = 'netsight';
    my $host = '192.168.10.11';
    my $userid = 'netsight';
    my $passwd = 'enterasys';

    # invoke the ConnectToMySQL sub-routine to make the database connection
    #$connection = ConnectToMySql($database);
    my $connection =  DBI->connect("dbi:mysql:$database;$host;port=4589",$userid,$passwd);
    print $connection;

    # set the value of your SQL query
    #my $query = "select version()";
    my $query;
    if ($SNMP) {
      $query = "update tam_endsystem set ZONE='$NAS_IP' where macAddress='$MAC'";
    } else {
      $query = "update tam_endsystem set Zone='$NAS_IP', ipAddress='$NAS_IP', STATEDESCR='Cannot get IP from Switch $NAS_IP' where macAddress='$MAC'";
    }
    print $query;
    my $statement = $connection->prepare($query);
    $statement->execute();

    $statement->finish();
    $connection->disconnect();


    #==建立服務============================================
    sub daemonize {
       use POSIX;
       POSIX::setsid or die "setsid: $!";
       my $pid = fork ();
       if ($pid < 0) {
          die "fork: $!";
       } elsif ($pid) {
          exit 0;
       }
       chdir "/";
       umask 0;
       foreach (0 .. (POSIX::sysconf (&POSIX::_SC_OPEN_MAX) || 1024))
          { POSIX::close $_ }
       open (STDIN, "</dev/null");
       open (STDOUT, ">/dev/null");
       open (STDERR, ">&STDOUT");
    }

    為什麼要分為兩支程式?
    主要是因為寫入ARP table需要root權限,
    而順子不知道在FreeRadius呼叫外部程式時,如何下指令才能提升至root權限?
    所以只好硬拆成兩支script,第一支用來被FreeRadius呼叫;
    而第二支則是讓第一支呼叫時,能以sudo的方式提升至root權限,如此而已。

    假設您知道如何讓FreeRadius在呼叫外部程式時,能以root權限來執行的話,
    其實單單第二支script就足夠了。

    因為第二支程式需要以sudo的方式來提升至root權限,所以我們修改了 /etc/sudoers 這個檔案,
    把FreeRadius的執行帳號freerad加入檔案之中,讓freerad能以不輸入密碼的方式,透過sudo提升到root的執行權限。
    freerad ALL=(ALL:ALL) NOPASSWD: /etc/freeradius/EraySync.pl


    最後再變更這兩支Script的執行權限。
    chmod 755 /etc/freeradius/Eray*.pl


  4. 設定FreeRadius,讓Post-Auth階段能去呼叫上述兩支外部程式
    修改/etc/freeradius/modules/exec檔案,加人自定義程式內容。
    ...
    exec {
        wait = no
        input_pairs = request
        shell_escape = yes
        output = none
    }

    exec EraySync {
        wait = yes
        input_pairs = request
        program = "/etc/freeradius/ErayExec.pl %{NAS-IP-Address} %{Calling-Station-Id}"
        shell_escape = yes
        ouput = none
    }


    修改/etc/freeradius/sites-enabled/default檔案,在post-auth區段加入EraySync呼叫第一支程式。
    post-auth {
        exec
        Post-Auth-Type REJECT {
            attr_filter.access_reject
            EraySync
        }
        EraySync
    }

    然後重啟FreeRadius服務。

  5. FreeRadius做為ARP Proxy,加大ARP快取
    在順子的設計中,FreeRadius同時也做為ARP Proxy,收集了其下所有Switch的使用者MAC與IP對應。
    若這使用者數目驚人!那就要加大這ARP快取,以免出現 No Buffer Space avaiable 的問題。

    ARP快取預設值是1024,若要調大成四倍,可以下指令
    sysctl -w net.ipv4.neigh.default.gc_thresh1=512
    sysctl -w net.ipv4.neigh.default.gc_thresh2=2048
    sysctl -w net.ipv4.neigh.default.gc_thresh3=4096

    加到 /etc/sysctl.conf 可以使下次開機生效
    echo "net.ipv4.neigh.default.gc_thresh1=512
    net.ipv4.neigh.default.gc_thresh2=2048
    net.ipv4.neigh.default.gc_thresh3=4096" >> /etc/sysctl.conf


  6. 修改NAC IP Resolution設定
    IP Address Resolution timeout改為20秒;
    Allow Retries On Failure改為2次,Delay 10秒。



  7. 將安裝於NetSight的MySQL Client套件移除
    apt-get remove --auto-remove mysql-client


  8. 運作原理
    當FreeRadius下的Switch送來使用者的Radius驗證訊息時,不做特別處理。
    直到驗證的最後一關 Post-Auth 將證驗資訊回送Switch時,呼叫外部程式來進行兩個問題的處理。

    但因為寫入ARP需要root權限,
    所以藉由修改/etc/sudoers表格,將FreeRadius的執行帳號-freerad賦予執行第二支程式的root權限。

    不過因為NAC的MAC to IP解析階段會覆寫資料庫,
    因此將真正Switch IP寫入table 'tam_endsystem' 欄位 'zone' 的時間要延後,這樣資料才不會又被覆寫。
    在第二支程式寫入MySQL前,等個10秒就是這個原因。

    只是FreeRadius呼叫外部程式時,等個十幾秒鐘的話,會造成驗證失敗!
    所以必需把第二支程式做成服務於背景執行,讓FreeRadius呼叫它時不必等待,才能順利完成Post-Auth階段。
    這就是為什麼有 daemonize 這個副程式的原因,它讓程式本身在背景中執行,而不耽擱主程式的運行。

    另外在透過snmpwalk取得Switch中的MAC與IP表格時,為什麼也要等5秒鐘?
    這是因為驗證過程中,Switch還未開通該驗證port的權限,
    所以使用者MAC與IP的對應資料,在這階段還無法寫入Switch。

    等個幾秒鐘,讓Radius驗證程式執行完成,
    Switch產生了對應的MAC與IP的資料後,
    再用snmpwalk方能順利取得Switch中的MAC與IP對應關係,
    並寫入FreeRadius本機的靜態ARP記錄供NAC查詢。

    這樣NAC在解析MAC to IP資訊時,就可以查出之前無法解析的使用者IP資訊了。


    在透過snmpwalk取得MAC與IP對應表時,由於Switch廠牌不同,對應表的位置也不一樣,
    順子分別透過 atPhysAddress 與 ipNetToMediaPhysAddress 嘗試去取得MAC與IP的對應。
    若還是無法取得對應表,就要去查、去試這對應Switch存放表格的地方。

    最後要注意的是,第二支Script中透過snmpwalk取得Switch資訊的設定是固定的,
    因此所有受控端switch的SNMP版本及相關資訊都要設定相同。
    例如都使用SNMP v3版本,且密碼及加解密方式都要一致才行。


參考資料
FreeRADIUS帳號驗證機制整合 (MySQL)
FreeRadius Debugging Mode除錯, 自訂PHP 抓參數值
rlm_perl module not executing authenticate
Linux snmpwalk 簡易使用方式
Free RFC1213-MIB MIB Download - Search, ...and Upload MIBs
NAC Deployment Guide



♥順子老婆的網拍,請多關照∼

If you don't like something, change it.
If you can't change it, change your attitude.
Don't complain!




2014-11-07, 18:24 shunze 的個人資料 把 shunze 加入好友列表 發送Email給 shunze 瀏覽 shunze 的網站 MSN : shunze@gmail.com
  « 上一篇主題 下一篇主題 »
發表新主題 發表回覆
跳到:

Powered by: Burning Board 1.1.1 2001 WoltLab GbR