SONiCとAAA(覚書)

# 本稿についての注意(お詫び)

調べはしたものの実際に試せておらず、ただの覚書にとどまっているので、詳細な記述ができていない残念な内容となっている。いずれ試した際には加筆・修正する可能性があることを付記するが、現段階では機能の存在を紹介する以上の内容になってない旨、あらかじめご了承いただきたい。

# AAA

AAAとは、Authentication, Authorization, and Accounting、
- Authentication 認証
- Authorization 認可
- Accounting 課金
を表す用語。

認証でアクセスしてくるユーザを確認し、認可でユーザごとに参照・設定可能な権限を与え、その記録を取得・収集する。

# SONiCとAAA

SONiCはCLIでの操作のためにログインが必要になるが、ここにAAAが適用される。設定がない倍は、ビルド時に設定されたユーザ名とパスワードによるログインとなる。設定することにより、外部サーバによってユーザ認証させることができる。対象はsshによるログインとコンソールログインの両方となっている。また、gRPCによるtelemetryもAAAと連動できるようにする予定がある模様。

世の中の主なAAA用のプロトコルとしてはRADIUS, TACACS+があるが、SONiCではTACACS+をサポートする。
## AAAを使う利点
AAAを使うことによる利点は下記となる。

- 共通アカウントでなく、各ユーザのアカウントを用意しアクセス状況を確認できる 
- スイッチ(実機)ごとにユーザアカウント情報を作成する必要がなく、サーバ側でアカウント情報を管理できる

## TACACS+サーバを用意する
Linuxホスト用のTACACS+サーバパッケージが存在する。
Ubuntuでの例は下記。[`tac_plus.conf`](http://manpages.ubuntu.com/manpages/bionic/man5/tac_plus.conf.5.html)を記述し`-C`で指定して起動する。

```shell
$ sudo apt install tacacs+
(ログ省略)
$ tac_plus
Usage: tac_plus -C <config_file> [-GghiLPstv] [-B <bind address>] [-d <debug level>] [-l <logfile>] [-p <port>] [-u <wtmpfile>] [-w <whologfile>]
        -G      stay in foreground; do not detach from the tty
        -g      single thread mode
        -h      display this message
        -i      inetd mode
        -L      lookup peer addresses for logs
        -P      parse the configuration file and exit
        -S      enable single-connection
        -s      refuse SENDPASS
        -t      also log to /dev/console
        -v      display version information
```

## 認証方法を設定する

```shell
$ sudo config aaa authentication login -h
Usage: config aaa authentication login [OPTIONS] [AUTH_PROTOCOL]...

  Switch login authentication [ {tacacs+, local} | default ]
$ sudo config aaa authentication fallback enable
$ sudo config aaa authentication failthrough enable
$ sudo config aaa authentication login tacacs+ login
```

- `local` を指定すると、パスワード認証となる。インストール後のSONiCにログインしたのち、通常のLinuxホストと同様`vipw`などを駆使してアカウント情報を更新すれば、その通りにログインできる。
- `tacacs+`を指定すると、TACACS+サーバへ問い合わせる認証となる。
- 並べて記述し`fallback enable`とすることで、先に記述した認証に失敗した際、次の認証方法を試すことができる。
- 内部的にはTACACS+用のPAMモジュールが用意されていて、`/etc/nsswitch.conf`による参照優先度が書き換わる。


## AAA設定状態を参照する

(未設定時)

```shell
$ show aaa
AAA authentication login local (default)
AAA authentication failthrough False (default)
```

(設定後)

```shell
$ show aaa
AAA authentication login tacacs+,local
AAA authentication failthrough True
AAA authentication fallback True
```

- `local`はパスワード認証をあらわす。`tacacs+`だとTACACS+認証となる。
- `failthrough`は、複数のTACACS+サーバを登録してあるサーバで認証エラーとなった際に別のサーバに問い合わせに行くかをあらわす。`True`で次のサーバに問い合わせに行く。

## 認証サーバ設定

```shell
$ sudo config tacacs
Usage: config tacacs [OPTIONS] COMMAND [ARGS]...

  TACACS+ server configuration

Options:
  -?, -h, --help  Show this message and exit.

Commands:
  add       Specify a TACACS+ server
  authtype  Specify TACACS+ server global auth_type [chap...
  default   set its default configuration
  delete    Delete a TACACS+ server
  passkey   Specify TACACS+ server global passkey...
  timeout   Specify TACACS+ server global timeout <0 -...
```

## 認可関連情報を設定する
`/etc/nss_tacacs.conf`を直接編集する模様。

# 参考リンク
- [TACACS+ Authentication.md](https://github.com/Azure/SONiC/blob/master/doc/aaa/TACACS%2B%20Authentication.md)
- [tac_plus.conf.5](http://manpages.ubuntu.com/manpages/bionic/man5/tac_plus.conf.5.html)