🙆

AAAの練習

2022/12/19に公開

本エントリについて

Dynagen、Dynamips、freeradius を使って、AAA認証の設定を練習します。
Dynagen、Dynamips の利用環境はすでに整っているものとします。

参考

https://www.cisco.com/c/ja_jp/support/docs/security-vpn/remote-authentication-dial-user-service-radius/116291-configure-freeradius-00.html
https://www.cisco.com/c/en/us/support/docs/security-vpn/remote-authentication-dial-user-service-radius/116291-configure-freeradius-00.html
https://wiki.freeradius.org/vendor/Cisco

環境について

r1 を radius client とします。
r1 へ telnet するときの認証について、r1 から radius server へ問合せます。
r2 から r1 へ telnet することで動作を確認します。

[radius server] .1 === (10.2.0.0/24) === .254 f0/0[r1]f0/1 .253 === (10.2.1.0/24) === .254 f0/0[r2]
Dynagen 設定ファイル抜粋
    [[ETHSW sw1]]
        1 = access 1
        2 = access 1
        3 = access 1 NIO_udp:30001:127.0.0.1:20001
    [[ROUTER r1]]
        f0/0 = nio_tap:tap0
        f0/1 = sw1 1
    [[ROUTER r2]]
        model = 3725
        f0/0 = sw1 2

radius サーバ基本設定

radius サーバは、Debian buster で動かします。パッケージで利用できる freeradius を利用します。
ローカルでの動作テストで radtest を実行するため freeradius-utils も追加します。こちらはサーバの動作自体には不要です。

$ sudo apt install -y freeradius freeradius-utils

インストールしたら、/etc/freeradius/clients.conf ファイルに接続元のクライアント(Cisco機器)のアドレスやシークレットを記載します。
記載したら radius サーバを再起動します。

$ sudo cp -pi  /etc/freeradius/3.0/clients.conf{,.000}
$ sudo vi  /etc/freeradius/3.0/clients.conf
$ sudo diff -u /etc/freeradius/3.0/clients.conf{,.000}

@@ -266,8 +266,3 @@
 #              secret = testing123
 #      }
 #}
-client ciscolabo {
-       ipaddr = 10.2.0.0/16
-       secret = radiussecret
-}
-

$ sudo systemctl restart freeradius

なお、radius サーバは、udp で動作します。

admin@ip-10-0-0-73:~$ sudo ss -apn | grep 1812
udp                UNCONN              0                    0                                                                        127.0.0.1:18120                                                0.0.0.0:*                                    users:(("freeradius",pid=938,fd=7))
udp                UNCONN              0                    0                                                                          0.0.0.0:1812                                                 0.0.0.0:*                                    users:(("freeradius",pid=938,fd=8))
udp                UNCONN              0                    0                                                                             [::]:1812                                                    [::]:*                                    users:(("freeradius",pid=938,fd=10))
admin@ip-10-0-0-73:~$
admin@ip-10-0-0-73:~$ sudo ss -apn | grep 1813
udp                UNCONN              0                    0                                                                          0.0.0.0:1813                                                 0.0.0.0:*                                    users:(("freeradius",pid=938,fd=9))
udp                UNCONN              0                    0                                                                             [::]:1813                                                    [::]:*                                    users:(("freeradius",pid=938,fd=11))
admin@ip-10-0-0-73:~$

認証(authentication)

認証は「誰に何を許可する」の 誰に の部分です。

freeradius 側設定

freeradius のユーザデータベースとして、rdb や ldap も使うことも可能ですが、ここではシンプルに、テキストファイルを利用します。
ユーザを追加したら、デーモンを再起動します。

$ sudo cp -pi /etc/freeradius/3.0/mods-config/files/authorize{,.000}
$ sudo vi /etc/freeradius/3.0/mods-config/files/authorize
$ sudo diff -u /etc/freeradius/3.0/mods-config/files/authorize{,.000}

@@ -1,4 +1,3 @@
-ccna Cleartext-Password := "cisco"

$ sudo systemctl restart freeradius

いったんローカルで radtest コマンドで動作テストをしてみます。
以下は認証成功の例です。

$ radtest ccna cisco 127.0.0.1 1812 testing123
Sent Access-Request Id 241 from 0.0.0.0:38371 to 127.0.0.1:1812 length 74
        User-Name = "ccna"
        User-Password = "cisco"
        NAS-IP-Address = 127.0.1.1
        NAS-Port = 1812
        Message-Authenticator = 0x00
        Cleartext-Password = "cisco"
Received Access-Accept Id 241 from 127.0.0.1:1812 to 127.0.0.1:38371 length 20
$ radtest ccna cisco 10.2.0.1  1812 radiussecret
Sent Access-Request Id 160 from 0.0.0.0:34124 to 10.2.0.1:1812 length 74
        User-Name = "ccna"
        User-Password = "cisco"
        NAS-IP-Address = 127.0.1.1
        NAS-Port = 1812
        Message-Authenticator = 0x00
        Cleartext-Password = "cisco"
Received Access-Accept Id 160 from 10.2.0.1:1812 to 10.2.0.1:34124 length 20

radius サーバが起動していないときは下記が表示されます。

(0) No reply from server for ID 35 socket 3

認証が通らなかった時のメッセージは下記のようになります。

Received Access-Reject Id 245 from 10.2.0.1:1812 to 10.2.0.1:47980 length 20
(0) -: Expected Access-Accept got Access-Reject

Cisco デバイス側設定

radius サーバの情報を設定します。

r1(config)#aaa new-model
r1(config)#radius-server host 10.2.0.1 auth-port 1812 acct-port 1813
r1(config)#radius-server key radiussecret

設定した内容を確認します。

r1#show aaa servers

RADIUS: id 2, priority 1, host 10.2.0.1, auth-port 1812, acct-port 1812
     State: current UP, duration 1247s, previous duration 0s
     Dead: total time 0s, count 0
     Quarantined: No
     Authen: request 12, timeouts 0
             Response: unexpected 0, server error 0, incorrect 1, time 1567699ms
             Transaction: success 11, failure 1
     Author: request 0, timeouts 0
             Response: unexpected 0, server error 0, incorrect 0, time 0ms
             Transaction: success 0, failure 0
     Account: request 0, timeouts 0
             Response: unexpected 0, server error 0, incorrect 0, time 0ms
             Transaction: success 0, failure 0
     Elapsed time since counters last cleared: 20m
     Estimated Outstanding Access Transactions: 0
     Estimated Outstanding Accounting Transactions: 0

設定した radius サーバに対していったんテストします。
正しい認証情報を与えてみます。

r1#test aaa group radius server 10.2.0.1 ccna cisco legacy
Attempting authentication test to server-group radius using radius
User was successfully authenticated.

誤った認証情報を与えてみます。

r1#test aaa group radius server 10.2.0.1 cca cisco legacy
Attempting authentication test to server-group radius using radius
User authentication request was rejected by server.

下記でもテスト実行できます。

r1#test aaa group radius ccna cisco legacy
Attempting authentication test to server-group radius using radius
User was successfully authenticated.

仮想端末に認証設定を追加

最初に、ローカルデータベースにフォールバック用のユーザを作成しておきます。

r1(config)#username user  privilege 1  password 0 cisco

「デフォルトだと、最初に radius 認証、radius に接続できないときはローカル認証」 するように設定します。

r1(config)#aaa authentication login default group radius local
r1(config)#line vty 0 4
r1(config-line)#login authentication default

ログインテストします。

r2#telnet 10.2.1.253
Trying 10.2.1.253 ... Open


User Access Verification

Username: ccna
Password:

r1>

radius サーバを停止して、フォールバックの確認をしてみます。

admin@ip-10-0-0-73:~$ sudo systemctl stop freeradius

このように、radius サーバが応答しない場合、ローカル認証でログインすることができます。
なお、パスワードを入力してから radius サーバとの接続がタイムアウトするまで少し時間がかかります。

r2#telnet 10.2.1.253
Trying 10.2.1.253 ... Open


User Access Verification

Username: ccna
Password:

% Authentication failed

Username: user
Password:

r1>

テストを終えたら、radius サーバを起動しておきます。

admin@ip-10-0-0-73:~$ sudo systemctl start freeradius

認可(authorization)

認可(許可)は「誰に何を許可する」の 何を の部分です。
権限レベルを指定することで、何を許可するのかを定義します。

freeradius 側設定

下記のように、ユーザごとに権限レベルを設定します。認証と認可は同じ設定ファイルに記載します。
設定ファイルを変更したら radius サーバを再起動します。

$ sudo ls -l /etc/freeradius/3.0/mods-config/files/authorize{,.001}
$ sudo cp -p /etc/freeradius/3.0/mods-config/files/authorize{,.001}
$ sudo vi /etc/freeradius/3.0/mods-config/files/authorize
$ sudo diff -u /etc/freeradius/3.0/mods-config/files/authorize{,.001}

@@ -1,11 +1,4 @@
-ccna  Cleartext-Password := "cisco"
-      Cisco-AVPair = "shell:priv-lvl=0"
-
-ccnp  Cleartext-Password := "cisco"
-      Cisco-AVPair = "shell:priv-lvl=1"
-
-ccie  Cleartext-Password := "cisco"
-      Cisco-AVPair = "shell:priv-lvl=15"
+ccna Cleartext-Password := "cisco"

$ sudo systemctl restart freeradius

Cisco デバイス側設定

認可の設定を追加します。

switch(config)#aaa authorization exec default group radius if-authenticated

ccna ユーザで接続してみます。
権限レベル0なので、実行できるコマンドがごく限られたものになります。

r2#telnet 10.2.1.253
Trying 10.2.1.253 ... Open


User Access Verification

Username: ccna
Password:

r1>
r1>?
Exec commands:
  <1-99>   Session number to resume
  disable  Turn off privileged commands
  enable   Turn on privileged commands
  exit     Exit from the EXEC
  help     Description of the interactive help system
  logout   Exit from the EXEC

r1>

ccie ユーザで接続してみます。
権限レベル15なので、特権レベルとなり、プロンプトが # となります。

r2#telnet 10.2.1.253
Trying 10.2.1.253 ... Open


User Access Verification

Username: ccie
Password:

r1#

アカウンティング(accounting)

アカウンティングの設定を追加します。

r1(config)#aaa accounting exec default start-stop group radius

ログイン、ログアウトしてみます。

r2#telnet 10.2.1.253
Trying 10.2.1.253 ... Open


User Access Verification

Username: ccna
Password:

r1>
r1>exit

[Connection to 10.2.1.253 closed by foreign host]

radius サーバに、下記のようにログが出力されます。

admin@ip-10-0-0-73:~$ sudo ls -lR /var/log/freeradius/radacct
/var/log/freeradius/radacct:
total 4
drwx------ 2 freerad freerad 4096 Dec 19 08:03 10.2.0.254

/var/log/freeradius/radacct/10.2.0.254:
total 8
-rw------- 1 freerad freerad 4882 Dec 19 20:41 detail-20221219
admin@ip-10-0-0-73:~$ sudo cat /var/log/freeradius/radacct/10.2.0.254/detail-20221219

Mon Dec 19 20:41:05 2022
        Acct-Session-Id = "00000006"
        User-Name = "ccna"
        Acct-Authentic = RADIUS
        Acct-Status-Type = Start
        NAS-Port = 98
        NAS-Port-Id = "tty98"
        NAS-Port-Type = Virtual
        Calling-Station-Id = "10.2.1.254"
        Service-Type = NAS-Prompt-User
        NAS-IP-Address = 10.2.0.254
        Acct-Delay-Time = 0
        Event-Timestamp = "Dec 19 2022 20:41:05 JST"
        Tmp-String-9 = "ai:"
        Acct-Unique-Session-Id = "593a6a14c7b4bf3364eda1acdc6ab048"
        Timestamp = 1671450065

Mon Dec 19 20:41:40 2022
        Acct-Session-Id = "00000006"
        User-Name = "ccna"
        Acct-Authentic = RADIUS
        Acct-Terminate-Cause = User-Request
        Acct-Session-Time = 35
        Acct-Status-Type = Stop
        NAS-Port = 98
        NAS-Port-Id = "tty98"
        NAS-Port-Type = Virtual
        Calling-Station-Id = "10.2.1.254"
        Service-Type = NAS-Prompt-User
        NAS-IP-Address = 10.2.0.254
        Acct-Delay-Time = 0
        Event-Timestamp = "Dec 19 2022 20:41:40 JST"
        Tmp-String-9 = "ai:"
        Acct-Unique-Session-Id = "593a6a14c7b4bf3364eda1acdc6ab048"
        Timestamp = 1671450100

まとめ

freeradius を使用して、Cisco デバイスのAAA認証の設定を練習しました。
ユーザデータベースを、今回のようなファイルではなく、外部の rdb サーバや ldap サーバと連携してみるのも楽しい勉強になると思います。

GitHubで編集を提案

Discussion