目錄

前言
Authentication 認證
Authorization 授權
Accounting 計費
TACACS+ Server
網絡設備連接 TACACS+
  第一步:啟動 AAA new-model
  第二步:設定 TACACS+ 資料
  第三步:設定 Authentication
  第四步:設定 Authorization
  第五步:設定 Accounting

前言

Authentication、Authorization 及 Accounting 合稱 AAA,泛指伺服器或網絡設備上對使用者的控制和監察,以達至企業或組織的保安準則。本文會先介紹網絡設備的 Local AAA 機制,然後再進一步介紹 Remote AAA Server 的種類和設定方法。

Authentication 認證

Authentication 就等於網絡設備在問:「你是誰?」。透過輸入 Username 讓設備知道你是誰人,並輸入 Password 去證明你的身份。所以我們需要預先告訴網絡設備什麼 Username 將會用什麽 Password 登入,最直接的方法是在設備上設定,稱為 Local 設定,又或者另設 Authentication Server 作遙距設定 (Remote),Remote Authentication Server 最常用的有 RADIUS 和 TACACS+,Remote 設定稍後說明。以下先在 Router 上設定 Local AAA,相信大家對這些設定並不陌生:

如輸入時不選參數 0 或 7,預設使用 0,即沒有加密。

R1(config)#username alice password ?
  0     Specifies an UNENCRYPTED password will follow
  7     Specifies a HIDDEN password will follow
  LINE  The UNENCRYPTED (cleartext) user password

R1(config)#username alice password 123

但沒有加密的密碼會在 Running-config 中顯示。

R1(config)#do sh run | i username
username alice password 0 123
R1(config)#

service password-encryption 可把密碼加密,以下可見密碼 123 經加密後變成 1543595F,而參數自動變成 7,方便網管人員把設定複製到其他設備上。

R1(config)#service password-encryption 
R1(config)#do sh run | i username
username alice password 7 1543595F

但這是很陽春的加密,網上已有破解,所以還是比較建議使用 secret。如用 GNS3 做實驗,會見到 4 (SHA256) 和 5 (MD5),而 SHA256 因安全問題已被移除了,在新的 IOS 中應看見選項 8 和 9,是安全性較高的加密。

R1(config)#username bob secret ?
  0 Specifies an UNENCRYPTED secret will follow 
5 Specifies a MD5 HASHED secret will follow
8 Specifies a PBKDF2 HASHED secret will follow
9 Specifies a SCRYPT HASHED secret will follow
LINE The UNENCRYPTED (cleartext) user secret R1(config)#username bob secret 123 R1(config)#do sh run | i username username alice password 7 14464058 username bob secret 8 daKYKG/09tp/TYVbvxlDi8/85nzz5u/yaMu4xzSWSiA

有一個設定是比較容易被忽略的,就是 User 的 Privilege。Cisco IOS 讓我們為 User 設定 0 至 15 一共 16 個層級的 Privilege,如不填寫則預設為 1。Privilege 的概念是:層級越低則權限越少,可用的指令就越少;相反層級越高,可用的指令越多。每一個層級可用指令必然包含較低的所有層級,舉例:Privilege 10 的 User 除了可使用 Privilege 10 的指令,也可使用全部 Privilege 0 至 9 的指令。IOS 原廠設定只使用了 16 個 Privilege 裡面其中 3 個,分別是 0、1 和 15。

Privilege俗稱可用指令
0 - 只有 enable, disable, exit, help, logout 5 個指令可用。
1 User Mode 多了很多資訊性的指令可用,例如 show version 和 show inventory 等,
但不包括 show running-config。此層級也不能做任何設定。
2 - 14 - 層級可用的指令由網絡人員設定,設定方法稍後說明。
15 Privileged / Enable Mode 可使用全部指令。

以下指令把 Charlie 的 Privilege 設為 5:

R1(config)#username charlie privilege ?
    User privilege level

R1(config)#username charlie privilege 5 secret 456

雖然我們為每位 User 設定好 Privilege,但因應工作關係,他們可能需要把 Privilege 升級去使用某些高階指令。升級需要輸入該層的通關密碼,網管人員可預先把每層的密碼設定好:

R1(config)#enable secret level 1 S01
R1(config)#enable secret level 2 S02
R1(config)#enable secret level 3 S03
.
.
.
R1(config)#enable secret level 14 S14
R1(config)#enable secret level 15 S15

如果你用 GNS3 來做以下實驗,必需先把 line console 0 (Console 登入) 和 line vty 0 4 (SSH 或 Telnet 登入) 裡面的 privilege level 15 移除,這是 GNS3 為了方便我們才加上去的設定。另外,也要告訴 line 和 vty 使用 Local 來驗證 User。

R1(config)#line console 0
R1(config-line)#no privilege level 15
R1(config-line)#login local
R1(config-line)#line vty 0 4
R1(config-line)#no privilege level 15
R1(config-line)#login local

所以,現在當 Charlie 登入時會在 Privilege 5,可用指令 show privilege 去確認。後來,她用了某些方法向網管人員取得了通關密碼 😳,此時她用 enable <level> 並輸入密碼去到她想去的層級。

	User Access Verification

Username: charlie
Password: 

R1#show privilege 
Current privilege level is 5
R1#enable 10
Password: 
R1#show privilege 
Current privilege level is 10

升級至 Privilege 10 後 Charlie 除了可使用 Privilege 10 的指令,也包括了 0 至 9 的所有指令。如用 enable 指令時不輸入層級,則預設為最高層級 15。當然她要知道 level 15 的 enable secret。

R1#enable 
Password: 
R1#show privilege 
Current privilege level is 15

除了升級也可降級,降級是不需要使用密碼的,指令是 disable <level>

R1#disable 7
R1#show privilege 
Current privilege level is 7

Authorization 授權

如果 Authentication 等於網絡設備在問:「你是誰」,那麽 Authorization 就是問:「你可以做什麼?」。我們在上一個部份已解釋過,Router 會跟據 Privilege Level 去配指令。原廠設定下,Privilege 0 只有幾個指令可用,Privilege 1 可用大部份 show 指令,而 Privilege 15 則可用全部指令。如果我們想容許 Privilege 5 可以做 Interface 的 IP Address 設定,指令如下:

首先在 exec mode 為 Privilege 5 開放 configure terminal 指令。

R1(config)#privilege exec level 5 configure terminal

然後在 configure mode 裡開放 interface 指令。

R1(config)#privilege configure level 5 interface

最後在 interface mode 裡開放 ip address 指令。

R1(config)#privilege interface level 5 ip address

現在,Privilege 5 或以上的 user 可以為 interface 設定 ip 了。

R1#show privilege 
Current privilege level is 5
R1#configure terminal 
Enter configuration commands, one per line.  End with CNTL/Z.
R1(config)#interface ethernet 1/1
R1(config-if)#ip address 192.168.100.1 255.255.255.0

Accounting 計費

Accounting 帶出的問題是:「你做過什麼?」網絡設備可以把 User 登入登出時間和下過的指令記錄下來,方便日後問責之用 🤨。譯作計費的原因是古時在網絡服務還在按用量付費時,Accounting 的登入登出紀錄真的可用作計費之用。但 Accounting 必需配合 TACACS+ Server,因而沒有 Local 設定。

TACACS+ Server

假如你管理的網絡 User 少而且網絡設備數量少,Local AAA 設定是足夠應付的。相反,如果規模大則應使用 Remote AAA 設定。RADIUS Server 可管理用戶的 Authentication,而 TACACS+ Server 則可進一步處理用戶的 Authorization 和 Accounting。不缺錢的公司多會使用 Cisco ACS (Cisco Access Control System) 用作 TACACS+ Server,預算較緊張或者只作學習用途的話,筆者介紹 tac plus,這是一套在 Linux 上運行的 TACACS+ Server,功能齊備而且免費。

安裝 tac plus

首先你要有 Linux,以下用 CentOS 6.9 示範如何使用 yum 來安裝 tac plus。

[root@TACPLUS ~]#vim /etc/yum.repos.d/nux-misc.repo

填入以下內容:

[nux-misc]
name=Nux Misc
baseurl=http://li.nux.ro/download/nux/misc/el6/x86_64/
enabled=0
gpgcheck=1
gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro

然後安裝 tac_plus:

[root@TACPLUS ~]#yum --enablerepo=nux-misc install tac_plus

tac plus 的設定檔在 /etc/tac_plus.conf。以下是 tac_plus.conf 檔的一些基本參數和說明。

# TACACS+ Server 的 Key,網絡設備需設定相同的 Key 才能與其連接。 
key = ccie

# 用作 Accounting 的記錄檔位置
accounting file = /var/log/tac.acct

# 把 User jan 放進 user5 這個 User Group
user = jan {
        member = user5
}

group = user5 {
    # PAM 即是使用 Linux 本機的登錄帳號
    login = PAM

    # 把這個 group 的 privilege 設為 5
    service = exec {
        priv-lvl = 5
    }
}

# 可設定不同 Privilege 層級的 enable 密碼,為方便測試使用了 cleartext (不加密),真實環境建議用 des 加密。
user = $enab5$ {
        login = cleartext s5
}
user = $enab10$ {
        login = cleartext s10
}
user = $enab15$ {
        login = cleartext s15
}

別忘記在 Linux 新增 jan 這位 User。

[root@TACPLUS ~]# useradd jan
[root@TACPLUS ~]# passwd jan
Changing password for user jan.
New password:
BAD PASSWORD: it is WAY too short
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.

最後把 tac_plus 這個服務啟動。

[root@TACPLUS ~]# service tac_plus start
Starting tacacs+:                                          [  OK  ]

網絡設備連接 TACACS+

現在示範怎樣把 AAA 連接到 TACACS+ Server,有一個技巧是要留意的,因為 TACACS+ 始終是依靠網絡連接,一旦網絡發生問題時,網絡設備無法連接 TACACS+ Server,豈不是無法進行登入?因此我們通常把 TACACS+ 設為首選 AAA 方案,而 Local 會被設為第二方案,好讓 TACACS+ 無法連接時,設備自動使用第二方案來認證 User。

第一步:啟動 AAA new-model

R1(config)#aaa new-model

第二步:設定 TACACS+ 資料

R1(config)#tacacs server TACACS-SERVER
R1(config-server-tacacs)#address ipv4 192.168.1.21
R1(config-server-tacacs)#key ccie

第三步:設定 Authentication

首先,建立一組用來做 Authentication 的 Priority List,LIST_LOGIN 為 List 的名稱,使用 group tacacs+ 為第一方案,local 為第二方案。

R1(config)#aaa authentication login LIST_LOGIN group tacacs+ local

然後告訴 Console 登入時按 LIST_LOGIN 的設定來檢查認證。

R1(config)#line console 0
R1(config-line)#login authentication LIST_LOGIN

同樣在 VTY 進行設定。

R1(config)#line vty 0 4
R1(config-line)#login authentication LIST_LOGIN

另外,把 Enable Password 也設定成查找 TACACS+,第二方案 enable 意思是本機的 enable secret,List 名稱不用設,用 default 便可以了。

R1(config)#aaa authentication enable default group tacacs+ enable

第四步:設定 Authorization

當 User Login 時,我們想去 TACACS+ 查找這 User 獲得什麼 Privilege 層級。步驟相若,先建 Authorization 的 Priority List。

R1(config)#aaa authorization exec LIST_PRIV group tacacs+ local

在 Console 加入 List 設定,然後會看到系統要求再加一條 aaa authorization console 的設定,照辦便可。

R1(config)#line console 0
R1(config-line)#authorization exec LIST_PRIV 
%Authorization without the global command 'aaa authorization console' is useless
R1(config-line)#exit
R1(config)#aaa authorization console

VTY 設定。

R1(config)#line vty 0 4
R1(config-line)#authorization exec LIST_PRIV

除此之外,各 Privilege 所用的指令也可透過 TACACS+ 設定,但已超出了 CCIE 的範圍,不在此詳述。

第五步:設定 Accounting

Accounting 可以把登入者的登入時間及所下過的指令記錄下來,傳送到 TACACS+ Server。

同樣地,先設定 List,留意 accounting 並不可使用 Local。exec 中的參數 start-stop 即登入和登出都記錄,如使用 stop-only 則只記錄登出。用在 commands 則沒有影響。

aaa accounting exec LIST_ACC start-stop group tacacs+
aaa accounting commands 5 LIST_COMM_5 start-stop group tacacs+
aaa accounting commands 10 LIST_COMM_10 start-stop group tacacs+
aaa accounting commands 15 LIST_COMM_15 start-stop group tacacs+

把 List 放到 Console。

R1(config)#line console 0
R1(config-line)#accounting exec LIST_ACC 
R1(config-line)#accounting commands 5 LIST_COMM_5 
R1(config-line)#accounting commands 10 LIST_COMM_10 
R1(config-line)#accounting commands 15 LIST_COMM_15 

也把 List 放到 VTY。

R1(config)#line vty 0 4
R1(config-line)#accounting exec LIST_ACC 
R1(config-line)#accounting commands 5 LIST_COMM_5 
R1(config-line)#accounting commands 10 LIST_COMM_10 
R1(config-line)#accounting commands 15 LIST_COMM_15 

最後可以在 TACACS+ Server 中查看這些紀錄。

[root@TACPLUS etc]# cat /var/log/tac.acct
Jul 22 13:29:06 192.168.1.88    jan     tty0    async   start   task_id=42      timezone=UTC    service=shell
Jul 22 13:47:53 192.168.1.88    jan     tty0    async   stop    task_id=10      timezone=UTC    service=shell disc-cause=1    disc-cause-ext=9        pre-session-time=2      elapsed_time=2  stop_time=1532267261
Jul 22 13:48:37 192.168.1.88    jan     tty0    async   stop    task_id=12      timezone=UTC    service=shell priv-lvl=15     cmd=configure terminal 
Jul 22 13:48:50 192.168.1.88    jan     tty0    async   stop    task_id=13      timezone=UTC    service=shell priv-lvl=15     cmd=configure terminal 
Jul 22 13:48:52 192.168.1.88    jan     tty0    async   stop    task_id=14      timezone=UTC    service=shell priv-lvl=15     cmd=interface Ethernet 1/0 
Jul 22 13:49:04 192.168.1.88    jan     tty0    async   stop    task_id=15      timezone=UTC    service=shell priv-lvl=15     cmd=show running-config 
Jul 22 13:49:17 192.168.1.88    jan     tty0    async   stop    task_id=16      timezone=UTC    service=shell priv-lvl=15     cmd=configure terminal 
Jul 22 13:49:19 192.168.1.88    jan     tty0    async   stop    task_id=17      timezone=UTC    service=shell priv-lvl=15     cmd=do-exec sh run 
Jul 22 13:49:19 192.168.1.88    jan     tty0    async   stop    task_id=18      timezone=UTC    service=shell priv-lvl=15     cmd=show running-config 
Jul 22 13:49:40 192.168.1.88    jan     tty0    async   stop    task_id=20      timezone=UTC    service=shell priv-lvl=15     cmd=configure terminal 
Jul 22 13:49:43 192.168.1.88    jan     tty0    async   stop    task_id=21      timezone=UTC    service=shell priv-lvl=15     cmd=interface Ethernet 1/0 
Jul 22 13:50:31 192.168.1.88    jan     tty0    async   stop    task_id=11      timezone=UTC    service=shell disc-cause=1    disc-cause-ext=9        pre-session-time=3      elapsed_time=26 stop_time=1532277298