ペネトレーションしのべくん

さようなら、すべてのセキュリティエンジニア

ネットワーク検証自動化フレームワーク「RENAT」動かしてみたメモ

概要

皆さん、ネットワーク検証してますか?

検証自体は楽しいんですが、機器の貸し借り、ラックマウント、配線、検証結果報告書の作成などなど……検証にまつわるエトセトラのほうはちょっとめんどくさいですよね。

そんなネットワーク検証のめんどくささを軽減すべく生み出されたネットワーク検証自動化フレームワーク「RENAT」をいじってみました。ほんのちょっとだけ使い方が分かったので、忘れないうちに進捗を記録します。今回はいつにも増して内容の正確性に自信がないので悪しからず。

RENAT(A Robotframework Extension for Network Automated Testing)とは?

ROBOTなるソフトウェアテストフレームワークを、ネットワーク検証に応用したもの。NTTコミュニケーションズの方が開発したようで、私はその存在をNTT Communications Tech Conference #3(2018年)で知りました。

github.com

検証

今回やったこと

RENATを使って、vSRX4台で「show version and haiku」コマンドを実行して、ログを確認する。

VagrantでvSRX4台を立ち上げる

vSRX4台はVagrantで用意します。いつも id:akira6592 さん謹製のVagrantfileを拝借しています。

tekunabe.hatenablog.jp

この記事のVagrantfileをそのまま実行するとCentOSのサーバーが立ちますが、私は該当箇所をコメントアウトして、ホストマシン(Ubuntu)からRENATを実行しています(READMEのコマンド例はCentOS)。

ログインユーザーを作成する

公開鍵認証だとちょっとめんどくさかったので、ものぐさして4台全てにパスワード認証のユーザーを作りました。

$ vagrant ssh vsrx1

% cli
$ configure
# set system login user shino class super-user authentication plain-text-password
※パスワード入力(2回)
# show | compare
# commit

リポジトリをクローンする

$ git clone https://github.com/bachng2017/RENAT.git

グローバル設定ファイルを編集する

マニュアル曰く、configディレクトリ配下にあるファイルはグローバル設定ファイル(global configuration filesもしくはmaster files)と呼ばれ、全プロジェクト/全テストケースで共通に参照される設定が記されています。今回はそのうちのdevice.yaml、template.yamlおよびauth.yamlを編集していきます。

device.yaml

検証で使用する機器情報を保持するファイルです。以下を追記しました。

    # vsrx 
    vsrx1:
        type: juniper-vagrant-ssh
        description: vsrx by Vagrant
        ip: 127.0.0.1
        port: 2201
    vsrx2:
        type: juniper-vagrant-ssh
        description: vsrx by Vagrant
        ip: 127.0.0.1
        port: 2202
    vsrx3:
        type: juniper-vagrant-ssh
        description: vsrx by Vagrant
        ip: 127.0.0.1
        port: 2203
    vsrx4:
        type: juniper-vagrant-ssh
        description: vsrx by Vagrant
        ip: 127.0.0.1
        port: 2204

template.yaml

ホストの種別と種別ごとのアクセス方法や認証方法を設定するファイルです。device.yamlで「type」として指定した、「juniper-vagrant-ssh」を定義します。「prompt」はCLIプロンプト、「init」はログイン時に必ず実行するコマンドのリストです。

    juniper-vagrant-ssh:
        access: ssh
        auth: plain-text
        profile: vagrant
        prompt: "@.*(#|>) "
        init:
            - set cli idle-timeout 0
            - set cli screen-length 0

auth.yaml

ユーザー名やパスワードなどの認証情報を設定するファイルです。template.yamlで「profile」として指定した「vagrant」を定義します。もちろん公開鍵認証も可能ですが、今回はパスワード認証にしました。

auth:
    plain-text:
        <snip>
        vagrant:
            user: shino
            pass: P@ssw0rd!

環境変数RENAT_PATHを設定する

テストケース実行時にグローバル設定ファイルの格納場所を知るためなどに必要な環境変数です。sampleディレクトリ内を見てみると、各プロジェクト/ケースディレクトリ(後述)にrcファイルを置いてその中に$RENAT_PATHを書き、sourceで読み込むみたいなことをしているみたいです。

$ export RENAT_PATH="path/to/RENAT"

プロジェクトディレクトリを作る

複数のケースディレクトリをまとめたもの。tools/配下のproject.shを実行すると作られます。プロジェクトディレクトリに作成されるrun.shを実行すると、プロジェクトディレクトリ配下のケースを全て実行するっぽい……が、今回は試してないです。

$ $RENAT_PATH/tools/project.sh プロジェクト名

テストケースディレクトリを作る

個々のテストケースは1つのディレクトリに含まれた複数のファイルで表現されます(後述)。tools/item.shを実行すると作ってくれます。local.yamlを作るかどうか聞かれるのでYesと答えて、「vsrx1,vsrx2,vsrx3,vsrx4」を試験で使うノードに指定します。

$ $RENAT_PATH/tools/item.sh テストケース名

テストケースディレクトリ/config/local.yamlを編集する

こちらはグローバル設定ファイルに対してローカル設定ファイルと言うそうです。「Tag」は操作実行対象のより分けに使えるので、今回はLab Setup(テストケース実行時、最初に行われる処理。プロジェクトディレクトリ/lab.robotを参照)の対象となるようjuniperとinitのタグを付与しました。

$ cat config/local.yaml 
# -*- coding: utf-8 -*-
# $Rev: 203 $
# $Ver: $
# $Date: 2017-04-19 10:14:50 +0900 (Wed, 19 Apr 2017) $
# $Author: $

# router, server setting
node:
    vsrx1:
        device: vsrx1
        snmp-polling: yes
        follow-remote-log: yes
        mib: 
        tag:
            - juniper
            - init
    vsrx2:
        device: vsrx2
        snmp-polling: yes
        follow-remote-log: yes
        mib: 
        tag:
            - juniper
            - init
    vsrx3:
        device: vsrx3
        snmp-polling: yes
        follow-remote-log: yes
        mib: 
        tag:
            - juniper
            - init
    vsrx4:
        device: vsrx4
        snmp-polling: yes
        follow-remote-log: yes
        mib: 
        tag:
            - juniper
            - init

テストケースディレクトリ内のmain.robotを編集する

デフォルトのmain.robotを見ると、かろうじて「Router.Switchで操作対象の機器を入れ替えてるんだろうな」「Router.Cmdで機器で実行するコマンドを指定するんだろうな」ぐらいのことが分かったので、直感に任せて編集します。

$ cat main.robot
# -*- coding: utf-8 -*-
# $Date: 2018-03-20 00:33:18 +0900 (Tue, 20 Mar 2018) $
# $Rev: 822 $
# $Ver: $
# $Author: $

# Basic setting
*** Setting ***
Documentation   Get configuration files
Metadata        Log File    [.|${CURDIR}/result]
Suite Setup     Lab Setup
Suite Teardown  Lab Teardown

# Common setting
Resource        lab.robot

# Variable setting
*** Variables ***


*** Test Cases ***
01. Get configuration:
    Router.Switch    vsrx1
    Router.Cmd    show version and haiku

02. Get configuration:
    Router.Switch    vsrx2
    Router.Cmd    show version and haiku

03. Get configuration:
    Router.Switch    vsrx3
    Router.Cmd    show version and haiku

04. Get configuration:
    Router.Switch    vsrx4
    Router.Cmd    show version and haiku

テストケースディレクトリ内のrun.shを実行する

$ ./run.sh 
Current RENAT path: /home/shino/work/test-renat/RENAT

### Current folder is /home/shino/work/test-renat/RENAT/test/test-project-01/case-01 ###
Run only once

Run: 001
Current local.yaml: /home/shino/work/test-renat/RENAT/test/test-project-01/case-01/config/local.yaml
Loaded extra library `Hypervisor`
==============================================================================
case-01 :: Get configuration files                                            
==============================================================================
RENAT Ver:: RENAT 0.1.14
------------------------------------------------------------------------------
README:
Write you readme file here


------------------------------------------------------------------------------
00. Lab Setup
------------------------------------------------------------------------------
01. Get configuration:                                                | PASS |
------------------------------------------------------------------------------
02. Get configuration:                                                | PASS |
------------------------------------------------------------------------------
03. Get configuration:                                                | PASS |
------------------------------------------------------------------------------
04. Get configuration:                                                | PASS |
------------------------------------------------------------------------------
99. Lab Teardown
------------------------------------------------------------------------------
case-01 :: Get configuration files                                    | PASS |
4 critical tests, 4 passed, 0 failed
4 tests total, 4 passed, 0 failed
==============================================================================
Output:  /home/shino/work/test-renat/RENAT/test/test-project-01/case-01/result/output.xml
Log:     /home/shino/work/test-renat/RENAT/test/test-project-01/case-01/result/log.html
Report:  /home/shino/work/test-renat/RENAT/test/test-project-01/case-01/result/report.html

HTMLのレポートを見る

ログに出力されている通り、デフォルトではテストケースディレクトリ/result/report.htmlとして保存されます。

f:id:befs_anne:20190401033910p:plain

素晴らしい……ExcelPowerPointでの報告書作成とは近いうちにお別れだ……。

感想

自動テストの素晴らしさはいわずもがなですが、なんと言ってもレポートがいいです。

その他、まだまだ試したいことがたくさんあります:

  • 機器ベンダーごとのライブラリの使用、作成(Router.Cmdでのコマンド直打ちだけじゃない)
  • テスターやL1スイッチを使ったテスト(ケーブリングが不要になる!?)
  • プロジェクトレベルでの一括テスト実行
    • run.shを見るとrobotユーザーのsqliteで実行管理をしているようで、READMEに則って検証していきたい

日本語情報が少ない中で、こんな時間までよくがんばった。