shinobe179の日記

パケットの気持ちになって考えるのはもうやめだ

2019年GW進捗(2日目: 2019/04/28)

概要

本日の進捗です。ご査収ください。

AtCoder

  • 精進
    • ABC
      • B: 10問

所感

BはACできるけど他の人のコード見てみると効率よい書き方はできてない。お勉強が必要。Cはやってない。ネスペ勉強してた頃の午後Ⅱやりたくない(できないからやらない)感じに似てる。 いいからやれ

プロコン用アンチョコが充実してきた。

https://github.com/shinobe179/procon-cheatsheet/blob/master/README.md

明日の目標

  • AtCoder
    • 精進
      • ABC
        • B: 8問
        • C: 1問

2019年GW進捗(1日目: 2019/04/27)

概要

ABCのB埋めとブログのHTTPS化(AWS or Github Pages)をGW中の目標にして、進捗を記録する。とりあえず本日の進捗です。ご査収ください。

AtCoder

  • 精進
    • ABC
      • B: 3問
  • コンテスト
    • ABC125
      • AB2完
      • 灰→茶

所感

今年の必達目標としていた茶コーダーになれた!まさか灰に逆戻りなんてことはないと思うので、年内緑目指してCを解いていきたい。

明日の目標

  • AtCoder
    • 精進
      • ABC(1問に30分以上かけない!)
        • B: 8問
        • C: 2

「グリー開発本部 Meetup #4 フルスタックセキュリティ」に参加した

概要

「グリー開発本部 Meetup #4 フルスタックセキュリティ」に参加して思ったこと。

https://gree.connpass.com/event/124994/

感想

セキュリティ部署の守備範囲

事業横断部署である開発本部の中にあって、技術の話だけではなくポリシーやガバナンスまでをひとつの部署で面倒見ているとのこと。

立ち位置的に部署として(人数が少ないのなら各個人としても)技術面でフルスタックにならざるをえないだろうという感じだけど、ビジネスレイヤーまで同じ部署で面倒見るというのは珍しいかもしれない。一緒にしたほうがポリシーの策定とその実装で責任が分散しなくていいんじゃないかなと思う反面、大きめのインシデントが発生すると法務や広報などのバックオフィスとの連携が必要になったりもするので、一長一短か。実際、分離していた期間もあったみたい。

社内での脆弱性診断

自社アプリの脆弱性診断を社内でやっている、という話について。

脆弱性診断って(診断そのものももちろん大事だけど)第三者のお墨付きをもらうことに意味があると思っていて、自分の中では決め手になるようなメリットが見いだせていない(QAの一貫として、というのはあるかもしれないけど、QAチームは別にあるっぽい)。グリーの方としては「フットワーク軽く実施できること」にメリットがあると考えているみたい。確かに外注と比べれば手間もお金もかからないというのはその通りで、スピード以外のメリットとか、スキームとか、懇親会でもう少し深い話聞けたらよかったんだけど、いそいそと帰ってきてしまった。

実際の求人内容

https://jobs.forkwell.com/GREE/jobs/4481

「お任せしたい業務」の多様さよ。色々挑戦できて楽しそうだ。

その他

スピーカーの方が「CANバスハッキングをやりたいがために車を買った」とおっしゃってたのが衝撃だった。

ネットワーク検証自動化フレームワーク「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に則って検証していきたい

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

そろそろネットワークエンジニアやめたいけどNETCON参加してきた

概要

色々あってネットワーク機器を扱う仕事をやめたいと日々思っているのですが、ネットワークは好きなので、ネットワークのトラブルシューティングコンテスト「NETCON」に参加しました。その感想を書き綴ります。

camp-fire.jp

※プロジェクトはもう終わってます

感想

当日の問題。

it-networking.jp

ルーター、スイッチが入り乱れた環境で発生している9個のトラブルをいくつ解決できるか?という内容で、 控えめに言ってめちゃくちゃ楽しかったです。 難易度設定が絶妙というのもあるけど、構築や実機検証バリバリやってますって人以外はネットワークを自由にいじる機会自体があまりないので、レベル関係なく楽しめる内容だったと思います。昔と比べてシミュレータが充実してるって言っても、自前のPCでは厳しいところもあるだろうし(実際VIRLライセンス買おうと思ったけど、それ用にサーバー買うのも、なんかなーと思っている)。

僕は9問中6問正解で、だいたい平均点ぐらいだと思われます。VRF関連の問題に全く太刀打ちできなかったのが悔やまれる。またCCIEに手を出すのか…?ネットワークエンジニアやめたいのに…?

環境はパブリッククラウドで動いていました。現在運営チームには基盤担当の方がおひとりしかいらっしゃらない様子で、「助けられるものなら助けたいけど足手まといになるよねー」と、一緒に参加した友人と小籠包食べながら話しました。小籠包おいしかった。

試験中にスコアサーバーなんて単語も聞こえたけど、Ansibleでshowコマンドの出力チェックと設定ファイルの妥当性チェックができればワンチャンあるのでは…?などと思いました。技術的にどう実現しうるかに興味があるだけで、実際のところ今回みたいな自己採点でも全然問題ないですけどね。

クラウドファンディングにしてくれたのもよかったです。僕みたいな技術でコミットできない凡人はブログとTwitterで宣伝するか金を出すぐらいしか貢献する術がない。お金を出さなきゃ。

PyZabbix(PythonのZabbix APIライブラリ)の使い方

概要

Zabbix APIPythonで叩くためのライブラリ「PyZabbix」に関する日本語情報があんまりなくて英語読んだりソース読んだりちょっと大変だったので、メモがてら書いておく。

github.com

Zabbix APIそのものについての説明は割愛するが、公式ドキュメントとお世話になったQiita記事をいくつか。

www.zabbix.com

qiita.com

qiita.com

使い方

ざっくり、ログインとそれ以外に分かれる。

ログイン

最初にアカウント情報を渡してトークンをもらうのがZabbix APIのお作法。これはreadmeに書いてある通りやったらよい。プロキシはOSの設定値(http_proxyやhttps_proxy)に従う。

from pyzabbix import ZabbixAPI

# ZabbixサーバーのFQDN。パス(/zabbix/api_jsonrpc.php)は不要
zapi = ZabbixAPI("http://zabbixserver.example.com")

# Zabbixアカウントのユーザー名とパスワード
zapi.session.auth = ("http user", "http password")

# SSL/TLS証明書の検証をするかどうか。Falseの場合は警告メッセージが出力される(後述)
zapi.session.verify = False

# タイムアウト値(秒)の設定
zapi.timeout = 5.1

# ログイン。session.authで入力している場合はpasswordは不要?
zapi.login("http user", "http password")

zapi.session.verifyをFalseにしている場合、PyZabbixで使われているRequestsライブラリの警告メッセージが出力される。抑止したい場合は以下を参照。

http://73spica.tech/blog/requests-insecurerequestwarning-disable/

import urllib3
from urllib3.exceptions import InsecureRequestWarning
urllib3.disable_warnings(InsecureRequestWarning)

get、create、deleteなどのAPIの利用

例えばhost.get APIを使う時は、zapi.host.getのように、あたかもPyZabbix自体のメソッドであるかのようにZabbix APIのメソッドを繋げて使う。パラメータの指定は引数でおこなう。アウトプットはdict型でリターンされる。

for h in zapi.host.get(output="extend"):
    print(h['hostid'])

# 複数の値を持たせる場合、list型で指定する。
host_dict = zapi.host.get(search=["test01", "prod"], output=["name", "available"])