目录

前言
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