オープンソースで作るtacacs兼踏み台サーバ

カウンターが1万こえました!ありがとうございます。最近小まめに書いてるからですかね。見てくれている人がいると思うと書く意欲も沸きます。ブログ書くのは勉強するモチベーションを高めるのにはなかなか良い方法ですね。

はい、ということでタイトル通りなんですが、ある程度の数のルータを管理する必要が出た時に各ルータ毎に認証の設定を入れるのは面倒です。ということでRadiusサーバやtacacsサーバを使うという方法が考えられますが、どーせならということで

  • セキュリティを高めるためにルータへのログインは特定のホスト(踏み台)からに絞る
  • 踏み台に入るためのユーザアカウントでそのままルータに入れるようにする

なんてことをやってみます。

今回使うのはこちら http://www.shrubbery.net/tac_plus/
tacacsは結構色々種類があるみたいなので他にもっと良いのがあるかも...
まずはインストール

$ wget ftp://ftp.shrubbery.net/pub/tac_plus/tacacs+-F4.0.4.15.tar.gz
$ tar zxvf tacacs+-F4.0.4.15.tar.gz
$ cd tacacs+-F4.0.4.15
$ ./configure --prefix=/usr/local/tac_plus
$ make
$ su
# make install

続いて設定

# vi /usr/local/tac_plus/etc/tac_plus.conf

key = "xxxxxxxx"
accounting file = /var/log/tacacs/tac_plus.acct
default authentication = file /etc/passwd

#ルートでログインできないようにする
user = root {
    login = des .
    name = "root"
}

#enableになるためのパスワード
user = $enable$ {
    login = des xxxxxxxxxx
    name = "enable"
}

少し補足しておきます。

  • keyの部分はルータ側で認証の設定をする際に必要になるキー
  • default authentication = file /etc/passwd を設定することでルータにログインするためのアカウントをサーバのアカウントと同じにする
  • user = rootセクションはrootでルータにログインできなくするための設定
  • user = $enable$セクションはルータでenableする際のパスワードの設定

といった感じです。

rootでログインできなくする方法は少し裏技チックです。暗号化のパスワードの設定にDESを使うんですが、設定として絶対にありえないものを指定することでログインできないようにしています。
また、DESで暗号化したパスワードは/usr/local/tac_plus/bin/tac_pwdで生成できます。

$ tac_pwd
パスワード

これでサーバ側の設定は終了です。
起動スクリプトはこんな感じ

# vi /etc/init.d/tac_plusd


#!/bin/sh
#
# tac_plusd       This shell script takes care of starting and stopping
#                 tac_plus
# chkconfig:- 91 9
# description:
#

PROG=//usr/local/tac_plus/bin/tac_plus
PIDFILE=/var/run/tac_plus.pid
CONFFILE=/usr/local/tac_plus/etc/tac_plus.conf

. /etc/init.d/functions

start() {
        echo -n $"Starting $PROG:"
        daemon $PROG -C $CONFFILE
        retval=$?
        echo
        return $retval
}

stop() {
        echo -n $"Stopping $PROG:"
        killproc $PROG
        retval=$?
        echo
        return $retval
}

case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        status)
                status $PROG
                RETVAL=$?
                ;;
        restart)
                stop
                start
                ;;
        *)
                echo $"Usage:$0 {start|stop|status|restart}"
                exit 1
esac

exit $?

ついでにルータ側の設定例も。Ciscoの場合ですが。

(config)# aaa new-model
(config)# tacacs-server host TACACSサーバのアドレス single-connection
(config)# tacacs-server key キー文字列
(config)# aaa authentication login default group tacacs+ line
(config)# aaa authentication login default group tacacs+ enable

ルータ側の設定のミソは

  • aaa authentication login default group tacacs+ line
  • aaa authentication login default group tacacs+ enable

の中の
tacacs+ line,tacacs+ enableの部分です。
ここで設定した順番に認証を行います。すなわちログインについてはtacacsで認証して失敗したらルータのlineのパスワードで認証する。同様にenableする場合はenableのパスワードで認証する。ように滑り落ちるわけです。

tacacsサーバが絶対に止まらないという保証はありません。
しかし、サーバが止まっててルータにログインできない!というのは余りにおマヌけなのでこういう事ができるわけですね。
ちなみにルータのアカウントでログインしたい場合はlocalを指定すれば良いです。3つ順番にならべることもできます。

今回は踏み台兼tacacsとして構成しましたが、この場合はルータへのアクセスを踏み台からのみに絞るとサーバが落ちた時にどちらにしろログインできなくなるので、実際はもう少しログインできるアドレス帯を広げる必要はありますね。