Ubuntu 리눅스에 TACACS+ 인증서버 설치하고 시스코 스위치에 적용하기

우분투 리눅스에 TACACS+ 인증서버 설치하기

설치환경:
TACACS+ 설치 : ubuntu 18.04, ip address: 192.168.0.6
Cisco switch: C3550, ip address: 192.168.0.200

1. 작업 환경 확인 및 tacacs plus 설치

리눅스 버전 확인

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.1 LTS
Release:        18.04
Codename:       bionic

TACACS+ 설치

$ sudo apt-get install tacacs+

2. 설정(/etc/tacacs+/tac_plus.conf) 화일

2.1. tacacs+ 서버와 클라이언트간의 패킷 암호화에 사용하는 키설정.

$ sudo vi /etc/tacacs+/tac_plus.conf
key = snowfox_tacacs	

2.2. ACL(Access Control List) 설정
ACL은 클라이언트 IP 주소나 호스트네임별로 사용자 또는 그룹의 로그인 또는 접근을 제한하도록 정의할 수 있다.
ACL은 아래와 같은 형식으로 지정할 수 있다.

acl = rule_name {
    permission = regular_expression
    # implicit deny (ie: anythong else)
}

아래 예는, net_admin 그룹은 모든 IP 주소에서, sys_admin 그룹은 10.10.10.2 에서만 접속가능하도록 설정한다.

acl = net_admin {
    permit = .*
}

acl = sys_admin {
    permit = ^10\.\.10\.2$
}

2.3. 그룹
그룹을 만들고 각각의 그룹이 네트워크 장비에서 수행할 수 있는 권한을 정의한다. 그룹은 아래와 같은 형식으로 정의한다.

group = group_name {
    [ default service ]
    group_attr
    svc
}

default service를 허용하기위해서 아래와 같이 명시한다.
default service = permission
만약 생략하면 기본값은 deny가된다.

그룹 속성(group_attr)은 그룹 사용자가 상속하는 속성이며 ACL 이나 유효기간 같은 속성을 포함한다.
서비스(svc)는 그룹이 실행할 권한이 있는 서비스를 정의한다. 서버와 클라이언트 모두에 권한을 부여해 구성해야 올바로 작동한다.

command 권한은 아래와같이 정의한다.

cmd = string {
    permission regex
    permission regex
    ...
    permission
}

위의 2.2에서 만든 두 그룹이 실행할 수 있는 명령어를 제한 하려면, 아래와 같이 설정한다.
아래예에서, net_admin 그룹은 모든 명령어를 실행할 수 있지만, sys_admin 그룹은 실행할 수 있는 명령어의 제한을 받는다.

group = net_admin {
        default service = permit
        acl = net_admin
        service = exec {
                priv-lvl = 15
        }
}

group = sys_admin {
        default service = deny
        acl = sys_admin
        service = exec {
                priv-lvl = 0
        }
        cmd = enable {
                permit .*
        }
        cmd = show {
                permit .*
        }
        cmd = exit {
                permit .*
        }
        cmd = interface {
                permit Ethernet.*
                permit FastEthernet.*
                permit GigabitEthernet.*
        }
        cmd = switchport {
                permit "access vlan.*"
                permit "trunk encapsulation.*"
                permit "mode.*"
                permit "trunk allowed vlan.*"
                permit "trunk allowed vlan.*"
        }
        cmd = description {
                permit .*
        }
        cmd = no {
                permit shutdown
        }
}

2.4. 사용자(Users)
그룹을 설정한 다음에는 사용자를 정의하고 그룹에 속하도록 할 수 있다.
사용자 설정은 그룹과 유사하며, 아래와 같다.

user = user_name {
    [ default service ]
    user_attr
    svc
}

이제, 위의 두 그룹에 속할 사용자를 하나씩 만든다.
net_admin 그룹에 속하는 nadmin 사용자는 미리 정의된 DES로 암호화된 비밀번호로 인증한다.
sys_admin 그룹에 속하는 fox 사용자는 /etc/passwd에서 인증한다. 이를 위해서는 TACACS+ 서버에서도 사용자를 설정해야한다.

nadmin 사용자의 비밀번호를 만들기위해 tac_pwd 명령어를 사용하며 tac_plus.conf에 DES로 암호화된 비밀번호를 설정해야한다.

# tac_pwd
Password to be encrypted: abc123
IZHuieAMcFwuU

사용자 fox계정을 만들고(리눅스 계정), passwd 명령어를 사용하여 비밀번호를 생성한다.

# useradd fox
# passwd fox
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

다음으로 enable 비밀번호를 생성한다.
위에서 처럼, nadmin 사용자는 tac_pwd 명령어를 사용한다.(enable 비밀번호는 enable 로 설정)

# tac_pwd
Password to be encrypted: enable
WuVeol5JWp3Nk

사용자 fox의 경우에는 TACAS+ 데몬에서특별히 정의된 사용자인 ‘$ enable $’를 사용하는데, 이 것은 사용가능한 비밀번호를 설정하지 않은 모든 사용자들이 기본으로 사용하게된다.
tac_pwd 명령어로 ‘$ enable $’ 사용자의 비밀번호를 생성한다. 여기서는 비밀번호를 ‘default’로 설정했다)

# tac_pwd
Password to be encrypted: default
8Kytdhagh743s

이제, tac_plus.conf 에 아래 내용을 추가하여 사용자 설정을 마무리한다.

## user account and passwd
user = nadmin {
        member = net_admin
        login = des IZHuieAMcFwuU
        enable = des WuVeol5JWp3Nk
}

user = fox {
        login = file /etc/passwd
        member = sys_admin
}

user = $enable$ {
        login = des 8Kytdhagh743s
}

3. TACACS+ 서비스 실행

이제, TACACS+ 서비스를 시작하고, 서비스 상태를 확인해 본다.

# systemctl start tacacs_plus

# systemctl status tacacs_plus
● tacacs_plus.service - LSB: TACACS+ authentication daemon
   Loaded: loaded (/etc/init.d/tacacs_plus; generated)
   Active: active (running) since Thu 2019-05-30 15:37:16 KST; 46min ago
     Docs: man:systemd-sysv-generator(8)
    Tasks: 1 (limit: 1109)
   CGroup: /system.slice/tacacs_plus.service
           └─1004 /usr/sbin/tac_plus -C /etc/tacacs+/tac_plus.conf

May 30 15:37:13 fox tacacs_plus[909]:  * Starting TACACS+ authentication daemon
May 30 15:37:14 fox tac_plus[941]: Reading config
May 30 15:37:14 fox tac_plus[941]: Version F4.0.4.27a Initialized 1
May 30 15:37:15 fox tac_plus[989]: Reading config
May 30 15:37:15 fox tac_plus[989]: Version F4.0.4.27a Initialized 1
May 30 15:37:15 fox tac_plus[1004]: socket FD 0 AF 2
May 30 15:37:15 fox tac_plus[1004]: socket FD 2 AF 10
May 30 15:37:15 fox tac_plus[1004]: uid=0 euid=0 gid=0 egid=0 s=829941392
May 30 15:37:16 fox tacacs_plus[909]:    ...done.
May 30 15:37:16 fox systemd[1]: Started LSB: TACACS+ authentication daemon.

4. 시스코 스위치 설정 및 테스트

시스코 스위치 설정 내용은 아래 문서를 참고.

Switch(config)#tacacs-server host 192.168.0.6
Switch(config)#tacacs-server directed-request
Switch(config)#tacacs-server key snowfox_tacacs

Switch(config)#aaa authentication login default group tacacs+ local
Switch(config)#aaa authentication enable default group tacacs+ enable
Switch(config)#aaa authorization config-commands
Switch(config)#aaa authorization commands 0 default group tacacs+ local
Switch(config)#aaa authorization commands 1 default group tacacs+ local
Switch(config)#aaa authorization commands 7 default group tacacs+ local
Switch(config)#aaa authorization commands 15 default group tacacs+ local
Switch(config)#aaa accounting commands 0 default start-stop group tacacs+
Switch(config)#aaa accounting commands 1 default start-stop group tacacs+
Switch(config)#aaa accounting commands 7 default start-stop group tacacs+
Switch(config)#aaa accounting commands 15 default start-stop group tacacs+
Switch(config)#aaa accounting network 0 start-stop group tacacs+
Switch(config)#aaa accounting network 15 start-stop group tacacs+
Switch(config)#aaa accounting connection 0 start-stop group tacacs+
Switch(config)#aaa accounting connection 15 start-stop group tacacs+
Switch(config)#aaa session-id common
Switch(config)#end

Switch(config)#line con 0
Switch(config-line)#login authentication consol
Switch(config-line)#line vty 0 4
Switch(config-line)# access-class 99 in
Switch(config-line)# exec-timeout 15 0
Switch(config-line)# privilege level 15
Switch(config-line)# authorization exec vty
Switch(config-line)# accounting commands 1 pri1
Switch(config-line)# accounting commands 5 pri5
Switch(config-line)# accounting commands 15 pri15
Switch(config-line)# accounting exec vty
Switch(config-line)# login authentication vty
Switch(config-line)#line vty 5 15
Switch(config-line)# access-class 99 in
Switch(config-line)# exec-timeout 15 0
Switch(config-line)# privilege level 15
Switch(config-line)# authorization exec vty
Switch(config-line)# accounting commands 1 pri1
Switch(config-line)# accounting commands 5 pri5
Switch(config-line)# accounting commands 15 pri15
Switch(config-line)# accounting exec vty
Switch(config-line)# login authentication vty
Switch(config-line)#end

테스트, user fox는 명령어가 제한됨을 볼 수 있다.

User Access Verification

Username: nadmin
Password:

Switch#conf t
Enter configuration commands, one per line.  End with CNTL/Z.
Switch(config)#


User Access Verification

Username: fox
Password:

Switch#conf t
Command authorization failed.

5. 설정 내용
5.1. TACACS+ 서버 설정

root@fox:/var/log# cat /etc/tacacs+/tac_plus.conf
# Created by Henry-Nicolas Tourneur(henry.nicolas@tourneur.be)
# See man(5) tac_plus.conf for more details

# Define where to log accounting data, this is the default.

accounting file = /var/log/tac_plus.acct

# This is the key that clients have to use to access Tacacs+

#key = testing123
key = snowfox_tacacs

# Use /etc/passwd file to do authentication

#default authentication = file /etc/passwd


# You can use feature like per host key with different enable passwords
#host = 127.0.0.1 {
#        key = test
#        type = cisco
#        enable = <des|cleartext> enablepass
#        prompt = "Welcome XXX ISP Access Router \n\nUsername:"
#}

# We also can define local users and specify a file where data is stored.
# That file may be filled using tac_pwd
#user = test1 {
#    name = "Test User"
#    member = staff
#    login = file /etc/tacacs/tacacs_passwords
#}

# We can also specify rules valid per group of users.
#group = group1 {
#       cmd = conf {
#               deny
#       }
#}

# Another example : forbid configure command for some hosts
# for a define range of clients
#group = group1 {
#       login = PAM
#       service = ppp
#       protocol = ip {
#               addr = 10.10.0.0/24
#       }
#       cmd = conf {
#               deny .*
#       }
#}

user = DEFAULT {
        login = PAM
        service = ppp protocol = ip {}
}

acl = net_admin {
        permit = .*
}
acl = sys_admin {
        permit = ^192\.168\.0\.
}

# Much more features are availables, like ACL, more service compatibilities,
# commands authorization, scripting authorization.
# See the man page for those features.
#

group = net_admin {
        default service = permit
        acl = net_admin
        service = exec {
                priv-lvl = 15
        }
}

group = sys_admin {
        default service = deny
        acl = sys_admin
        service = exec {
                priv-lvl = 0
        }
        cmd = enable {
                permit .*
        }
        cmd = show {
                permit .*
        }
        cmd = exit {
                permit .*
        }
        cmd = interface {
                permit Ethernet.*
                permit FastEthernet.*
                permit GigabitEthernet.*
        }
        cmd = switchport {
                permit "access vlan.*"
                permit "trunk encapsulation.*"
                permit "mode.*"
                permit "trunk allowed vlan.*"
                permit "trunk allowed vlan.*"
        }
        cmd = description {
                permit .*
        }
        cmd = no {
                permit shutdown
        }
}

## user account and passwd
user =  nadmin {
        member = net_admin
        login = des IZHuieAMcFwuU
        enable = des WuVeol5JWp3Nk
}

user = fox {
        login = file /etc/passwd
        member = sys_admin
}

user = $enable$ {
        login = des 8Kytdhagh743s
}

5.2. CISCO 스위치 설정(TACACS+ 테스트를 위한 최소 설정임).

Switch#sh run
Building configuration...

Current configuration : 5233 bytes
!
version 12.2
no service pad
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
!
hostname Switch
!
!
aaa new-model
!
!
aaa authentication login default group tacacs+ local
aaa authentication enable default group tacacs+ enable
aaa authorization config-commands
aaa authorization commands 0 default group tacacs+ local
aaa authorization commands 1 default group tacacs+ local
aaa authorization commands 7 default group tacacs+ local
aaa authorization commands 15 default group tacacs+ local
aaa accounting commands 0 default start-stop group tacacs+
aaa accounting commands 1 default start-stop group tacacs+
aaa accounting commands 7 default start-stop group tacacs+
aaa accounting commands 15 default start-stop group tacacs+
aaa accounting network 0 start-stop group tacacs+
aaa accounting network 15 start-stop group tacacs+
aaa accounting connection 0 start-stop group tacacs+
aaa accounting connection 15 start-stop group tacacs+
!
!
!
aaa session-id common
!
vlan 192
!
!
!
interface FastEthernet0/1
 switchport access vlan 192
 switchport mode dynamic desirable
!
interface FastEthernet0/2
 switchport mode dynamic desirable
!
interface FastEthernet0/3
 switchport mode dynamic desirable
!
interface FastEthernet0/4
 switchport mode dynamic desirable
!
interface FastEthernet0/5
 switchport mode dynamic desirable
!
interface FastEthernet0/6
 switchport mode dynamic desirable
!
interface FastEthernet0/7
 switchport mode dynamic desirable
!
interface FastEthernet0/8
 switchport mode dynamic desirable
!
interface FastEthernet0/9
 switchport mode dynamic desirable
!
interface FastEthernet0/10
 switchport mode dynamic desirable
!
interface FastEthernet0/11
 switchport mode dynamic desirable
!
interface FastEthernet0/12
 switchport mode dynamic desirable
!
interface FastEthernet0/13
 switchport mode dynamic desirable
!
interface FastEthernet0/14
 switchport mode dynamic desirable
!
interface FastEthernet0/15
 switchport mode dynamic desirable
!
interface FastEthernet0/16
 switchport mode dynamic desirable
!
interface FastEthernet0/17
 switchport mode dynamic desirable
!
interface FastEthernet0/18
 switchport mode dynamic desirable
!
interface FastEthernet0/19
 switchport mode dynamic desirable
!
interface FastEthernet0/20
 switchport mode dynamic desirable
!
interface FastEthernet0/21
 switchport mode dynamic desirable
!
interface FastEthernet0/22
 switchport mode dynamic desirable
!
interface FastEthernet0/23
 switchport mode dynamic desirable
!
interface FastEthernet0/24
 switchport mode dynamic desirable
!
interface FastEthernet0/25
 switchport mode dynamic desirable
!
interface FastEthernet0/26
 switchport mode dynamic desirable
!
interface FastEthernet0/27
 switchport mode dynamic desirable
!
interface FastEthernet0/28
 switchport mode dynamic desirable
!
interface FastEthernet0/29
 switchport mode dynamic desirable
!
interface FastEthernet0/30
 switchport mode dynamic desirable
!
interface FastEthernet0/31
 switchport mode dynamic desirable
!
interface FastEthernet0/32
 switchport mode dynamic desirable
!
interface FastEthernet0/33
 switchport mode dynamic desirable
!
interface FastEthernet0/34
 switchport mode dynamic desirable
!
interface FastEthernet0/35
 switchport mode dynamic desirable
!
interface FastEthernet0/36
 switchport mode dynamic desirable
!
interface FastEthernet0/37
 switchport mode dynamic desirable
!
interface FastEthernet0/38
 switchport mode dynamic desirable
!
interface FastEthernet0/39
 switchport mode dynamic desirable
!
interface FastEthernet0/40
 switchport mode dynamic desirable
!
interface FastEthernet0/41
 switchport mode dynamic desirable
!
interface FastEthernet0/42
 switchport mode dynamic desirable
!
interface FastEthernet0/43
 switchport mode dynamic desirable
!
interface FastEthernet0/44
 switchport mode dynamic desirable
!
interface FastEthernet0/45
 switchport mode dynamic desirable
!
interface FastEthernet0/46
 switchport mode dynamic desirable
!
interface FastEthernet0/47
 switchport mode dynamic desirable
!
interface FastEthernet0/48
 switchport mode dynamic desirable
!
interface GigabitEthernet0/1
 switchport mode dynamic desirable
!
interface GigabitEthernet0/2
 switchport mode dynamic desirable
!
interface Vlan1
 ip address dhcp
 shutdown
!
interface Vlan192
 ip address 192.168.0.200 255.255.255.0
!
ip default-gateway 192.168.0.1
ip classless
ip http server
!
tacacs-server host 192.168.0.6 timeout 5
tacacs-server directed-request
tacacs-server key snowfox_tacacs
!
control-plane
!
!
line con 0
 login authentication consol
line vty 0 4
 exec-timeout 15 0
 privilege level 15
 authorization exec vty
 accounting commands 1 pri1
 accounting commands 5 pri5
 accounting commands 15 pri15
 accounting exec vty
 login authentication vty
line vty 5 15
 exec-timeout 15 0
 privilege level 15
 authorization exec vty
 accounting commands 1 pri1
 accounting commands 5 pri5
 accounting commands 15 pri15
 accounting exec vty
 login authentication vty
!
end

참고문서:

,https://www.cisco.com/c/en/us/support/docs/security-vpn/terminal-access-controller-access-control-system-tacacs-/10384-security.html

2 comments

    • 현배 on 2021년 7월 1일 at 3:57 오후
    • Reply

    안녕하세요.
    네트워크 담당자로 리눅스 TACACS 서버 구성하는데 도움을 받고자 문의드립니다.
    리눅스로 TACACS 서비스를 사용 중인데 기존의 인증키가 너무 단순해서 변경하고자 합니다.
    서비스 단절없이 key를 여러개 설정해서 순차적으로 네트워크 장비의 키를 변경하고자 하는데
    TACACS 서버 내 여러개의 key 설정이 가능한가요?

    구글링에서는 구축만 나오지 관련 내용을 찾을 수가 없어서 문의드립니다.
    감사합니다.

    • snowffox on 2021년 7월 5일 at 9:36 오전
    • Reply

    안녕하세요. 답이 좀 늦었네요.
    KEY 값은 패킷을 암호화 하는데 사용하는 값이어서 여러개 설정이 불가능한 것으로 알고 있습니다.

    간단한 방법은 tacacs+ 서버의 서비스를 정지하고 네트워크 장비와 서버의 키값을 변경하는 방법이 있을 수 있는 만약, tacacs+ 서버가 정지되었을때 네트워크장비에 접속할 수 없게 설정되어 있는상황이라면, tacacs+ 서버를 하나 더 만들고 이 서버도 장비에 등록한 다음에 기존 서버의 key값을 변경하는 방법이 있을 수 있겠네요.

    tacacs+ 서버를 여러개 설정하는 부분은 아래 문서를 참고하시면 될 듯 합니다.
    https://community.cisco.com/t5/network-access-control/cisco-ios-have-more-than-1-tacacs-key/td-p/2514501

답글 남기기

Your email address will not be published.