實驗二---連結上網:身份認證 (Authentication)

[實驗目的]

學習連結上網過程中的第二個步驟---身份認證的過程。

 

[測試環境]

    Mininet-WIFI是一個無線網路仿真器(Emulator),允許使用者採用軟體的方式建置所需要的無線網路,可以建構成具有基礎架構的無線網路(Infrastructure Mode,包含基地台和行動主機)或者是無線隨意網路(AdHoc Mode,只有行動主機)。非常的方便,只需要全軟體的操作,不需要額外再購買其他的硬體。本實驗內容當中的指定操作部份,也同樣適用於實機操作。

    Mininet-WIFI Github網站https://github.com/intrig-unicamp/mininet-wifi,使用者只需先安裝一台Linux機器,然後使用下列指令安裝,便可使用。

step 1: $ sudo apt-get install git
step 2: $ git clone 
https://github.com/intrig-unicamp/mininet-wifi
step 3: $ cd mininet-wifi
step 4: $ sudo util/install.sh -Wnfv

 

[背景知識]

連結上網需要經過尋找基地台、身份認證和系統連結的三個步驟。其行動主機狀態如下圖所示,一開剛始時,行動主機是處於狀態一:尚未認證(unauthenticated)和尚未連結(unassociated),然後選定要連結的基地台,並做完身份認證之後,狀態會變成已認證(authenticated)和未連結(unassociated),最後完成連結動作就會變到已認證(authenticated)和已連結(associated)

 

    身份認證有兩種模式:開放式系統(open system)和金鑰共享(shared key)。開放式系統是很簡單的身份認證方式,行動主機只要跟基地台表明身份,基地台就會回傳認證成功,接著行動主機就可以繼續做下面的步驟。

 

另一種身份認證的方法是金鑰共享的方式。其方式包含四個步驟,首先行動主機會送出認證要求,接著基地台會送出一個挑戰字串(字串內容是沒有經過WEP加密的),第三個步驟行動主機會使用設定好的金鑰對挑戰字串加密,並把結果回傳給基地台,最後基地台會把收到加密的字串用自己本身的金鑰解密,如果解密的結果跟之前所送出的挑戰字串內容相同,就會送出認證成功,否則就送送出認證失敗。

 

    身份認證的訊框主體如下體所示。在訊框內容(Frame body)中包含身份認證方法(0:open system1:shared key)、身份認證進度碼(每一個一動作之後都會加一,做為順序的代碼)、狀態碼和挑戰字串。

 

[實驗環境]

我們使用script去建立一個簡單的無線網路環境,包含了一個AP和兩個stations.底下的程式碼中,使用net.addStation去增加一台station,並設定其IP位址;使用net.addBaseStation去增加一台AP,並設定其ssid名稱,使用的模式和傳輸通道

#!/usr/bin/python

 

"""

This example shows how to work with authentication.

"""

 

from mininet.net import Mininet

from mininet.node import  Controller, OVSKernelSwitch

from mininet.cli import CLI

from mininet.log import setLogLevel

from mininet.link import TCLink

 

def topology():

    "Create a network."

    net = Mininet( controller=Controller, link=TCLink, switch=OVSKernelSwitch )

 

    print "*** Creating nodes"

    sta1 = net.addStation( 'sta1', passwd='1234567890', encrypt='wep' )

    sta2 = net.addStation( 'sta2', passwd='1234567890', encrypt='wep' )

    ap1 = net.addBaseStation( 'ap1', ssid="simplewifi", mode="g", channel="1", passwd='1234567890', encrypt='wep' )

    c0 = net.addController('c0', controller=Controller, ip='127.0.0.1', port=6633 )

 

    print "*** Associating Stations"

    net.addLink(sta1, ap1)

    net.addLink(sta2, ap1)

 

    print "*** Starting network"

    net.build()

    c0.start()

    ap1.start( [c0] )

 

    print "*** Running CLI"

    CLI( net )

 

    print "*** Stopping network"

    net.stop()

 

if __name__ == '__main__':

    setLogLevel( 'info' )

    topology()

 

 

[實驗步驟]

1.       執行script

2.  使用xterm開啟ap1sta1的視窗

 

3.  ap1開啟封包抓取程式tcpdump,並把抓取資料存放到ap1.log

 

4.  由於執行完此script, authenticationassociation的過程已經結束,所以再次把sta1的無線網卡關閉後再打開,並重新執行認證與連結的動作。(note:當執行完認證與連結後,要重新使用iwconfig觀察是否連結ap的狀態,需要一點時間,若馬上執行,會顯示還為連結的狀態)

5.   使用ctrl+c中斷封包抓取程式。

6.  使用wireshark觀察封包抓取結果,可在Filter中輸入wlan.fc.type_subtype==0x0b,因為身分認證是屬於管理訊框(type=00,subtype=1011=0x0b)

 

7.  下圖是shared key認證的第一個步驟:認證請求。可以看出Authentication Algorithm=1(採用Shared Key),序號為1

8.  下圖是基地台送出的挑戰字串封包,當中的WEP flag是為0,表示沒有加密,另外序號變為2了。

 

 

9.  sta1透過key加密挑戰字串回傳基地台的封包。可看出WEP Flag=1,顯示有封包內容有被加密

 

10.基地台收到後再用設定好的key解密,判斷是否跟原本的資料相同,相同就會送出status code=0,表示認證成功回給sta1。另外此封包的序號為4

 

 

[參考資料]

1.簡榮宏,廖冠雄,”無線區域網路”,全華科技圖書股份有限公司

2.https://supportforums.cisco.com/document/101431/80211-sniffer-capture-analysis-management-frames-and-open-auth#Client_Authentication_Process

 

[作者]

Dr. Chih-Heng Ke (smallko@gmail.com)

Department of Computer Science and Information Engineering,

National Quemoy University, Kinmen, Taiwan.