全文検索エンジンについて調べてみた

こんにちは、虎の穴ラボのA.M.です。

とらのあなでは、Fantia等のサービスに全文検索エンジンの導入を検討しており、 その流れで使用する検索エンジンを選定するために各種全文検索エンジンについて調べてみました。

まず、全文検索エンジンとは、「全文検索を行うためのソフトウェア」です。 ソフトウェアといっても幅が広いですが、Webサービスに検索エンジンを導入する場合、一般的に下記図でいう「検索サーバ」を使用することが多いように思います。

※1/22のLTイベント資料より

なので、今回は主に世の中の「検索サーバ」について調べてみました。

大きく分けると、以下のような系統に分類できます。

  • Groonga系
  • Apache Lucene系
  • その他(MySQL等)

Groonga系

  • Groonga(読み方:ぐるんが)
    • 開発者が日本人で、日本語特化の機能(ローマ字検索等)がある
    • 検索サーバとしてだけではなく、C言語のライブラリとしても使用可能
    • N-Gramと形態素解析(Mecab)の両方が使用可能
    • 既存の製品と組合せて使うためのプラグインが豊富(Mroonga, PGroonga等)
  • Mroonga(読み方:むるんが)
    • GroongaベースのMySQLストレージエンジン
    • SQLコマンドでGroongaが使える(SQLだけで日本語の全文検索ができる)
    • MySQLの便利機能(レプリケーション等)も使える
    • Groongaを直接使用することもできる
    • MySQLのFULLTEXTインデックスよりも高速
    • ただし、CloudSQL(GCP)やRDS(AWS)では使えない(インストールできない)
  • PGroonga(読み方:ぴーじーるんが)
    • PostgreSQLの拡張機能
    • Groongaをインデックスとして使用可能
    • LIKE演算子をサポート(既存SQLを変更せずに全文検索可能)
    • ただし、CloudSQL(GCP)やRDS(AWS)では使えなさそう(インストールできない)

Apache Lucene系

  • Apache Lucene(検索ライブラリ)
    • Apacheが開発しているJava製の全文検索エンジン(ライブラリ)
    • Javaのライブラリ(jar)が提供されている
    • 単体ではサーバ機能はない
  • Apache Solr
    • Apacheが開発しているLuceneベースの検索サーバ
    • 長年の実績があり、信頼性も高い。
    • Elasticsearchに比べるとクラスタ、スケーリングが面倒
    • N-Gramと形態素解析(kuromoji)の両方が使用可能
  • Elasticsearch
    • Elastic社が開発しているLuceneベースの検索サーバ
    • RESTful APIでCRUD操作可能(様々なシステムと連携しやすい)
    • 分析機能が豊富
    • クラスタ、スケーリングが簡単
    • N-Gramと形態素解析(kuromoji)の両方が使用可能
    • Apache Solrよりも後発な分ノウハウの蓄積が少ないと言われているが、近年は
    • 現在の一番人気(らしい)

MySQL

  • MySQLのFULLTEXTインデックス
    • MySQLの標準機能(v3.23.23以降)
    • v5.7から日本語に対応
    • N-Gramと形態素解析(Mecab)の両方が使用可能

まとめ

上記情報から、個人的な所感ですが、使用する検索エンジン(検索サーバ)を選ぶ際は以下のように選択できると思います。

  • データベースにMySQLを使用している場合
    • MySQLのバージョンが5.7以上
      • 開発コストを抑えたい ⇒ FULLTEXTインデックス
      • 高速に検索したい ⇒ Mroonga
    • MySQLのバージョンが5.6以下 ⇒ Mroonga
  • データベースにPostgreSQLを使用している場合 ⇒ PGroonga
  • データベースにMySQL, PostgreSQL以外を使用している場合
    • 高機能でかつ開発コストを抑えたい ⇒ Elasticsearch
    • 実績・信頼性が高い検索エンジンを採用したい ⇒ Apache Solr

※ただし、CloudSQL(GCP)やRDS(AWS)を使用している場合、MroongaやPGroongaのインストールができないので、別の手段を考える必要がありそうです。

次回はMySQLにフォーカスして、FULLTEXTインデックスとMroongaを実際に使ってみて検索速度の比較等をやってみたいと思います。

P.S.
虎の穴ではJavaエンジニアをはじめとして一緒に働く仲間を絶賛募集中です! この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。 yumenosora.co.jp

【とらのあな主催】オタクが最新技術を追うライトニングトークイベント2回目を開催しました!!

こんにちは!虎の穴ラボのM.Uです。

昨日1月22日(水)に「【とらのあな主催】オタクが最新技術を追うライトニングトークイベント」の2回目を実施しました。 今回もほぼ満席でした。ご参加頂いた方、誠にありがとうございました!

【とらのあな主催】オタクが最新技術を追うライトニングトークイベント2回目 - connpass

1回目のレポート記事はこちら

toranoana-lab.hatenablog.com

イベント概要

日時: 2019年1月22日(火) 19:30〜22:00
場所:東京都千代田区外神田4-7-3 (秋葉原虎ビル4F)

とらのあなのエンジニア部署である「虎の穴ラボ」が主催するライトニングトーク会です。 ライトニングトークの練習をしながら最新技術への導入・入門として一緒に勉強していく会となります。

ライトニングトーク

No. テーマ スピーカー
1 go + swaggerでAPIサーバー 虎の穴ラボ
2 Kotlinについて 虎の穴ラボ
3 今日から始める全文検索 虎の穴ラボ
4 Amazon Echoのウェイクワードをカスタマイズする mat 様
5 javascriptでのメソッドカスケーディングの代替手段
(クロージャカスケーディング)
MinoOka 様
6 ブログ更新を通して 最新技術を学ぶ よしたく 様

go + swaggerでAPIサーバー

Swaggerを活用して、go言語でAPIサーバーを作ってみた話。
フレームワークはつかわず、 SwaggerでAPI仕様を定義、コード自動生成の手順を主に発表しています。

f:id:toranoana-lab:20190123170546j:plain

speakerdeck.com

Kotlinについて

Kotlin言語の特徴からWebフレームワークのKtorまで解説しています。
「かわいい」と「かっこいい」はとても重要ですね!

f:id:toranoana-lab:20190123171603j:plain

speakerdeck.com

今日から始める全文検索

全文検索の基礎を解説しています。
これから全文検索を学ぼうという方にもわかりやすい内容となっていました。

f:id:toranoana-lab:20190123175536j:plain

speakerdeck.com

懇親会

最後に今回も懇親会を行いました。 気になるトークセッションを話題に非常に盛り上がっていました。

f:id:toranoana-lab:20190123180737j:plain

最後に

ライトニングトークイベント2回目も大盛況のうちに終えることができました。 LT参加枠のみなさんが個性溢れるトークセッションで盛り上げていただき、虎の穴ラボスタッフも非常に刺激を受けました!! 今後もおたくな技術者同士の交流の機会を設けたいと思います。

と、言うことで…

来月2月19日(火)、ライトニングトークイベント3回目を開催致します!! 是非ご参加ください!!

yumenosora.connpass.com

オタクエンジニアはどこで作業をしているのか?

こんにちは!
虎の穴 開発室のO.Sです。

今回はとらのあなのオタクエンジニアに、業務時間外はどこで作業をしているかアンケートをとってみました。
※どんな怪しげな作業をしているか気になるところですが、作業内容についてはプライバシー保護の為(?)調査しておりません。

以下の3項目についてそれぞれ回答をいただきました。

  • 業務時間外に集中して作業に取り組める場所は何処か?
  • そこが作業場所に適していると思う理由はなにか?
  • 作業に欠かせない必須アイテムは?

業務時間外に集中して作業に取り組める場所は何処か?

f:id:toranoana-lab:20181129182448p:plain
落ち着いて作業が出来る場所

1位:カフェ
2位:事務所
3位:自宅、布団の中
4位:その他

1位は安定のカフェ、2位はまさかの事務所・・・
布団の中という珍しい意見がありました。
もし筆者が布団の中で作業をしたらそのまま寝てしまう自信があります。

そこが作業場所に適していると思う理由

f:id:toranoana-lab:20181129182628p:plain
作業場所に適していると思う理由

1位:落ち着いて作業が出来る
2位:優れた作業環境がある
3位:適度なざわつき
4位:その他

1位、3位の理由を書いた方の多くはカフェで作業する人でした。
カフェは適度なざわつきがあり、落ち着いて作業を行うのに最適なようです。
その他の中には 近所の公園という回答があり、天気のいい日は外に出て青空プログラミングというのも健康的に良さそうですね。

作業に欠かせない必須アイテム

f:id:toranoana-lab:20181129184739p:plain
作業に欠かせない必須アイテム

1位:音楽、ラジオ
2位:カフェイン飲料
3位:ガム、飴
4位:不要
5位:その他

1位は音楽、ラジオでした。音楽は、JPOPやアニソンではなく歌声が入っていないサントラなどを聞いている方が多いようです。
4位の不要という方からは、「なし。その気になれば人はいくらでも集中できる。(ドヤ」という、貴重なご意見もいただきました!
集中力に大層自信がおありのようです。すごいですね!今度お邪魔しに行こうと思います!!!
カフェイン飲料に関しては、レッド◯ルといったエナジードリンクは少数で、コーヒーが大多数でした。
カフェで作業する人が多いので、自ずとお供はコーヒーとなるようですね。

まとめ

どんな奇想天外な回答が出てくるか怖かったのですが、オタクエンジニアといっても案外まともな場所で作業をしているようで安心しました。
きっと、常識的な方が多いのでしょうね!

エンジニア募集中!

虎の穴ではエンジニアをはじめとして一緒に働く仲間を絶賛募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。

www.toranoana.jp

VyOSを使ったまともなルータ作り

こんにちは、虎の穴ラボのH.Y.です。(激似)(天丼ネタ)

今回は、前回⇣の続きになります。
VyOSを使った純粋なルータ作り - 虎の穴 開発室ブログ


前回あまりにも、特定用途過ぎたので、
家庭用ルータの主な機能であるNAPTとDHCPの設定とその確認を行っていきます。

構成の確認


下のような構成でやっていきたいと思います。
f:id:toranoana-lab:20181226141923p:plain

eth0の設定は、
IPアドレス固定
RIPでルーティング情報を取得
詳細は、前回の記事を参考にしてください。

NAPTの設定

少ないグローバルIPをより多くの端末でインターネットにアクセスするために使われている機能です。
会社によって、NAPT、PATやIPマスカレードとか呼ばれています(用語を統一してほしい)

# 編集モードに移行
configure
# NATの外側のネットワークを設定します
set nat source rule 1 outbound-interface eth0
# NATの内側のネットワークを設定します
set nat source rule 1 source 192.168.101.0/24
# NAPTの設定をします。
set nat source rule 1 translation address masquerade

DHCPサーバの設定

クライアントにIPを振り分ける設定を行っていきます。

# DHCPサーバの設定を作成します。
set service dhcp-server shared-network-name private-network-101 subnet 192.168.101.0/24
# 配布するIPアドレスの範囲を設定します。
set service dhcp-server shared-network-name private-network-101 subnet 192.168.101.0/24 start 192.168.101.100 stop 192.168.101.199
# デフォルトゲートウェイを設定します。
set service dhcp-server shared-network-name private-network-101 subnet 192.168.101.0/24 default-router 192.168.101.1
# DNSサーバを設定します。
set service dhcp-server shared-network-name private-network-101 subnet 192.168.101.0/24 dns-server 192.168.100.1
# 設定有効化
commit
# 設定保存
save

DHCP設定の確認

実際に確認用PCを接続して、DHCPとNAPTの設定が動いているかを確認します。

今回確認用PCはWindows10で確認しています。

>ipconfig /all
Windows IP 構成
  ホスト名. . . . . . . . . . . . . . .: ********
  プライマリ DNS サフィックス . . . . .:
  ノード タイプ . . . . . . . . . . . .: ハイブリッド
  IP ルーティング有効 . . . . . . . . .: いいえ
  WINS プロキシ有効 . . . . . . . . . .: いいえ
イーサネット アダプター イーサネット:
  接続固有の DNS サフィックス . . . . .:
  説明. . . . . . . . . . . . . . . . .: Intel(R) 82579LM Gigabit Network Connection
  物理アドレス. . . . . . . . . . . . .: F0-DE-F1-A7-F7-**
  DHCP 有効 . . . . . . . . . . . . . .: はい
  自動構成有効. . . . . . . . . . . . .: はい
  リンクローカル IPv6 アドレス. . . . .: fe80::ad5a:d776:5ca4:a12d%8(優先)
  IPv4 アドレス . . . . . . . . . . . .: 192.168.101.102(優先)
  サブネット マスク . . . . . . . . . .: 255.255.255.0
  リース取得. . . . . . . . . . . . . .: 2018122423:05:25
  リースの有効期限. . . . . . . . . . .: 2018122523:05:25
  デフォルト ゲートウェイ . . . . . . .: 192.168.101.1
  DHCP サーバー . . . . . . . . . . . .: 192.168.101.1
  DHCPv6 IAID . . . . . . . . . . . . .: 150003441
  DHCPv6 クライアント DUID. . . . . . .: 00-01-00-01-22-7F-26-3D-F0-DE-F1-A7-F7-**
  DNS サーバー. . . . . . . . . . . . .: 192.168.100.1
  NetBIOS over TCP/IP . . . . . . . . .: 有効

設定どおりのIP、デフォルトゲートウェイ、DNSサーバが配布されていることが確認できます。

>tracert 8.8.8.8
google-public-dns-a.google.com [8.8.8.8] へのルートをトレースしています
経由するホップ数は最大 30 です:

 1    <1 ms    <1 ms    <1 ms  192.168.101.1
 2    <1 ms    <1 ms    <1 ms  setup.netvolante.jp [192.168.100.1]

tracertコマンドで経路確認しても、指定のデフォルトゲートウェイ経由で外のネットワークに出ていることは確認できました。

NAPT設定の確認

確認用PCからNAPTの設定が有効かどうかを確認する術がないので
外のネットワークの機器から確認します
f:id:toranoana-lab:20181226164810p:plain

NAPT確認用PCから確認PCに向けってpingを投げてみます。

>ping 192.168.101.102
192.168.101.102 に ping を送信しています 32 バイトのデータ:
要求がタイムアウトしました。

想定通り、外のネットワークから直接アクセスできないようになっています。


今度は、NAPT確認用PCにnginxを動かして、確認用PCからアクセスしてみます。

192.168.100.201 - - [24/Dec/2018:14:33:04 +0000] "GET / HTTP/1.1" 200 529 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"

nginxのアクセスログを見てみると、vyosルータのeth0側のIPになっているので、
想定通りIPの変換ができていることを確認できました。

まとめ

設定自体は、7行の簡単な設定でしたが、確認作業に時間がかかりました。
確認をしながら設定をしないと、インフラ周りはトラブルーシュートが難しいので
一つ一つ確認したほうがいいですね(経験あり)


虎の穴ではJavaエンジニアをはじめとして一緒に働く仲間を絶賛募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。
www.toranoana.jp

Nessusで行う簡単な脆弱性診断

こんにちは、虎の穴ラボのTYです。

今回は、脆弱性診断を行う Nessus というツールを使用して、自宅での簡単な脆弱性診断を試してみましたので、その手順をご紹介します。

Nessusとは

Tenable Network Security社が提供する包括的な脆弱性検知スキャナです。20年からの歴史があり、現在までに約10万件以上のプラグインと呼ばれる脆弱性チェックの為のスクリプトが追加されています。 本来は有償の製品ですが、個人の家庭内環境での使用で且つ、一度の診断が最大16IPアドレスという制限で使用できる「Nessus Home」という無償のエディションが提供されていますので、今回はそれを使用します。

Nessus Professional™ Vulnerability Scanner

事前に用意するもの

  • mac (今回使用したマシンとなりますが、主にVagrantコマンドを使用しているため、Windowsでもあまり変わりは無いと思います。)
  • Oracle VM VirtualBox
  • Vagrant

Oracle VM VirtualBox と Vagrant は事前にダウンロードとインストールを行い、使用できる状態としておきます。

Oracle VM VirtualBox

Vagrant by HashiCorp

全体の手順

  1. Nessusのダウンロード
  2. Nessus Homeのアクティベーションコードの取得
  3. Nessusをインストールする仮想マシンの準備
  4. Nessusのインストール
  5. Nessusの初期設定
  6. スキャンポリシーの作成
  7. 脆弱性診断
  8. 診断後

1. Nessusのダウンロード

以下のダウンロードページからNessusのインストール対象とするOSに対応したファイルを取得しておきます。 今回は対象のOSをCentOS7としましたので、CentOS7用のファイルである Nessus-8.1.0-es7.x86_64.rpm をダウンロードしました。

Nessusのダウンロードページ

2. Nessus Homeのアクティベーションコードの取得

以下のNessus Homeのページにアクセスを行い、「First Name」「Last Name」「Email」を入力して「Register」ボタンをクリックします。

Nessus Homeの製品ページ

しばらくすると「Email」に指定したアドレス宛てに「Tenable Nessus Home Activation Code」という件名のメールを受信します。 このメールの中に今回使用する「Nessus Home」のアクティベーションコードが記載されていますので、確認をしておきます。

3. Nessusをインストールする仮想マシンの準備

今回は VirtualBox と Vagrant を使用してNessusのインストール対象となる仮想マシンを準備します。

VagrantによりCentOS7のbox(と呼ばれる仮想マシンのイメージファイル)をダウンロードし起動します。 Vagrantでは公式にCentOS7のboxが用意されていますので、これを使用します。

Vagrant box centos/7 - Vagrant Cloud

Vagrant用のフォルダを作り、移動します

$ mkdir vagrant && cd vagrant

今回使用する仮想マシン用のフォルダを作り、移動します。

$ mkdir nessus && cd nessus

VagrantFileを準備します。

$ vagrant init centos/7

後ほどホストマシン側からNessusにアクセスする為、作成されたVagrantFileをエディタで開き、以下のようにポート転送の設定を追加しておきます。

# Create a forwarded port mapping which allows access to a specific port
# within the machine from a port on the host machine. In the example below,
# accessing "localhost:8080" will access port 80 on the guest machine.
# NOTE: This will enable public access to the opened port
# config.vm.network "forwarded_port", guest: 80, host: 8080

config.vm.network "forwarded_port", guest: 8834, host: 8834

CentOS7 の仮想マシンを起動します。(初回起動時はCentOS7のboxのダウンロードと、VirtualBoxへの設定も行われます。)

$ vagrant up

仮想マシンが起動をしたら、SSHのポート番号と秘密鍵ファイルのパスを確認します。 以下のコマンドを実行し、表示されるPortとIdentityFileの部分を確認してください。

$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/user1/vagrant/nessus/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

SSHのポート番号が確認できたら、先ほどダウンロードしておいた Nussusのイメージファイルを仮想マシンにリモートコピーします。 この時、-i オプションには IdentityFile で示されていた秘密鍵ファイルのパスを、-P オプションにはポート番号を指定してください。

$ scp -i /Users/user1/vagrant/nessus/.vagrant/machines/default/virtualbox/private_key -P 2222 ~/Downloads/Nessus-8.1.0-es7.x86_64.rpm vagrant@localhost:/home/vagrant

4. Nessusのインストール

仮想マシンにログインを行い、Nessusのインストールを行います。

以下のコマンドで仮想マシンにログインを行います。

$ vagrant ssh

先ほどリモートコピーをした Nessusのイメージファイルを確認します。

[vagrant@localhost ~]$ ls -l
-rw-r--r--. 1 vagrant vagrant 62331220 Dec 16 08:51 Nessus-8.1.0-es7.x86_64.rpm

以下のコマンドでインストールを行い、その後、起動します。

[vagrant@localhost ~]$ sudo yum localinstall -y Nessus-8.1.0-es7.x86_64.rpm
[vagrant@localhost ~]$ sudo systemctl start nessusd

psコマンドを使用して、nessusd が起動していることを確認します。

[vagrant@localhost ~]$ ps aux | grep nessus
root      4434  0.2  0.2  12684  1100 ?        Ss   09:04   0:00 /opt/nessus/sbin/nessus-service -q
root      4435 86.7  5.9 119340 29892 ?        Sl   09:04   0:06 nessusd -q

起動確認後は仮想マシンからログアウトしておきます。

[vagrant@localhost ~]$ exit

5. Nessusの初期設定

ホストマシンのブラウザから以下のURLにアクセスを行うとNessusの初期設定画面が表示されます。

https://localhost:8834/

最初にSTEP 1/3として「Create an account」の画面が表示されるので、作成するアカウントのUsernameとPasswordを入力して「Continue」をクリックし、次の画面に移動します。 以後は、ここで登録した Username と Password でNessusにログインを行います。

f:id:toranoana-lab:20181217004836p:plain
Nessus初期設定1

次にSTEP 2/3として「Register your scanner」の画面が表示されるので、「Scanner Type」には「Home, Professional or Manager」を選択し、「Activation Code」には先にメールで取得したアクティベーションコードを入力して「Continue」をクリックし、次の画面に移動します。

f:id:toranoana-lab:20181217004956p:plain
Nessus初期設定2

STEP 3/3として「Initializing」画面が表示され Nessusの初期化が始まります。

f:id:toranoana-lab:20181217005252p:plain
Nessus初期設定3

初期化が終了すると、Nessus のメイン画面が表示されます。

f:id:toranoana-lab:20181217005327p:plain
Nessusメイン画面

6. スキャンポリシーの作成

脆弱性診断の前にスキャンポリシーの作成を行います。 画面左側のメニューより「Policies」をクリックして「Policies」画面に移動し、画面右上の「New Policy」をクリックすると作成できるスキャンポリシーの一覧が表示されます。 その中から「Advanced Scan」を選択します。

f:id:toranoana-lab:20181217005802p:plain
Nessusスキャンポリシーの一覧画面

新しく作成するスキャンポリシーの設定画面が表示されますので、「Settings」タブを選択し、メニューから「BASIC」->「General」を選択し、「Name」に作成するポリシーの名称を入力します。 今回は Advanced_Scan_Policy と入力しておきます。

f:id:toranoana-lab:20181217005906p:plain
Nessusポリシー設定画面1

メニューから「DISCOVERY」->「Port Scanning」を選択し、「Ports」の「Port scan range: 」の設定を「default」から「all」または「1-65535」に変更します。 (設定の変更により、Nessusで指定している代表的なポートだけではなく、TCPの全ポートをスキャンします。)

f:id:toranoana-lab:20181217005953p:plain
Nessusポリシー設定画面2

メニューから「DISCOVERY」->「Service Discovery」を選択し、「Search for SSL/TLS on」の設定を「Known SSL/TLS ports」から「All ports」に変更します。 (設定の変更により、代表的なSSL/TLSポート以外もSSL/TLSポートとしてスキャンします。)

f:id:toranoana-lab:20181217115854p:plain
Nessusポリシー設定画面3

メニューから「ASSESSMENT」->「Web Applications」を選択し、「Scan web applications」の設定を「OFF」から「ON」に変更します。 (診断対象上でWebアプリケーションが動作していた際の設定です。)

f:id:toranoana-lab:20181217010137p:plain
Nessusポリシー設定画面4

メニューから「REPORT」を選択し、「Override normal verbosity」のチェックボックスにチェックを入れ、「Report as much information as possible」を選択します。 また、Output下の「Display hosts that respond to ping」のチェックボックスにもチェックを入れておきます。 (なるべく診断結果の情報量を増やすための設定です。)

f:id:toranoana-lab:20181217010254p:plain
Nessusポリシー設定画面5

メニューから「ADVANCED」を選択し、Performance Options 下の「Slow down the scan when network congestion is detected」のチェックボックスにチェックを入れます。 (ネットワークの輻輳が検出された際に、診断(スキャン)速度を遅くします。)

f:id:toranoana-lab:20181217010254p:plain
Nessusポリシー設定画面6

上記の設定が完了したら画面下部の「Save」をクリックし、スキャンポリシーを保存します。

7. 脆弱性診断

画面左側のメニューより「My Scans」をクリックして「My Scans」画面に移動し、画面右上の「New Scan」をクリックすると実行する脆弱性診断に使用するスキャンポリシーの一覧が表示されます。

f:id:toranoana-lab:20181217010924p:plain
脆弱性診断に使用するスキャンポリシー一覧画面

一覧画面の「User Defined」タブをクリックすると、先ほど登録したスキャンポリシーが表示されます。

f:id:toranoana-lab:20181217011110p:plain

表示されたスキャンポリシーをクリックすると、脆弱性スキャンの設定画面が表示されますので、ここで「Name」に脆弱性診断の任意の名称(対象とするサーバーの名称など)を入力し、「Targets」に診断対象となるマシンのIPアドレスを設定して「Save」をクリックします。 ここでは「Name」に local_web_server を指定しています。 (「Targets」には複数のIPアドレスが設定できますが、Nessus Homeでは最大16IPアドレスの制限があります。)

f:id:toranoana-lab:20181217011159p:plain

スキャンの一覧画面に戻りますので、作成したスキャン設定の右側の矢印ボタン(Launchボタン)をクリックし、脆弱性診断を開始します。

f:id:toranoana-lab:20181217011223p:plain

診断完了後はスキャン設定の「Last Modified」の位置にチェックマークが付きます。(診断中はぐるぐると回転するアイコンが表示されています。)

f:id:toranoana-lab:20181217011547p:plain

診断完了後はスキャン設定名をクリックすると診断結果画面に移動しますので、内容を確認します。

f:id:toranoana-lab:20181217011758p:plain

f:id:toranoana-lab:20181217011817p:plain

8. 診断後

診断終了後は、以下のコマンドでNessusが稼働する仮想マシンを停止します。

$ vagrant halt

まとめ

今回はNessusの動作環境をVagrantで用意することで、手順の省略化を図ってみました。 説明では画面数が多くなってしまい煩雑なイメージを持たれる方もいるかもしれませんが、実際に操作をしてみると複雑な操作などはほとんど無く、脆弱性診断を行えます。 Nessusには他にも、上記の手順にも出てきました各種スキャンポリシー、外部から実行できる各種API、診断スクリプトの追加など興味を引く箇所が色々あるので、また機会があれば触ってみたいと思いました。



虎の穴ではJavaエンジニアをはじめとして一緒に働く仲間を絶賛募集中です! この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。 www.toranoana.jp

【とらのあな主催】オタクが最新技術を追うライトニングトークイベントを開催しました!!

虎の穴ラボのNSSです。
2018/12/12に「【とらのあな主催】オタクが最新技術を追うライトニングトークイベント」を開催しました。
たくさんの方にご応募いただき、当日はほぼ満席となりました。
今回はそんなイベントの様子をレポートしていきたいと思います。

イベント概要

とらのあなのエンジニア部署である「虎の穴ラボ」が主催するライトニングトーク会です。
ライトニングトークの練習をしながら最新技術への導入・入門として一緒に勉強していく会となります。
今回はとらラボメンバー3名 + 一般公募者の方3名の方にライトニングトークをしていただきました。
とらラボメンバー3名は毎週社内で実施している「最新技術共有会」にて現在学習中のテーマを中心に発表しました。
イベントの最後には懇親会もありました。

ライトニングトーク

今回のLTテーマは以下の通りです。

No. テーマ スピーカー
1 Rails環境に最適なVue.js構成を探る JUNE-JUNE(虎の穴ラボ)
2 Golang ポインタについて UM(虎の穴ラボ)
3 LambdaでAlexa Skillを作ってみる NSS(虎の穴ラボ)
4 芳文社作品の聖地巡礼マップを作ってみた Hirosaji 様
5 flutterでの開発(カレンダーはちゃんとみましょう) godan 様
6 CTFと実務の両面から見たセキュリティ(仮) clown_kage 様

この中からとらラボメンバー3名の発表をご紹介します。

1. Rails環境に最適なVue.js構成を探る(JUNE-JUNE(虎の穴ラボ))

Rails + Vue.js環境を作るために戦ったFantiaマンの物語。
Rails上でVue.jsを動かす時のハマりポイントを丁寧に解説。
ネット上の資料が少ないので、彼の資料は貴重です。 f:id:toranoana-lab:20181213153449p:plain f:id:toranoana-lab:20181213154519p:plain

2. Golang ポインタについて(UM(虎の穴ラボ))

世界一わかりやすいポインタ解説。
あとの質問でも真っ先に「その資料ください」と要望が出るほど。 f:id:toranoana-lab:20181213161908j:plain f:id:toranoana-lab:20181213162154j:plain

3. LambdaでAlexa Skillを作ってみる(NSS(虎の穴ラボ))

Amazon Echo Dotの実機を使ったAlexa Skill解説。
実装されたばかりのRuby2.5を早速使ってみました。
ちょっとおとぼけなAlexa。それもまた萌えポイント?
f:id:toranoana-lab:20181213161403p:plain f:id:toranoana-lab:20181213161730p:plain

懇親会

ライトニングトークの後は懇親会も行いました。 お酒片手にピザを食べながら、いろいろな話をしました。

f:id:toranoana-lab:20181213165421p:plain

最後に

今回初めてライトニングトークイベントをやりました。
LTの準備や当日の段取りなどで課題もありましたが、大変楽しいイベントになりました。

一般公募の方がたのLTが面白すぎました。
イベントを盛り上げていただき、本当にありがとうございました。

ぜひ2回目を開催したいと思います。
そしていつかUDXを借り切れるような一大イベントにしたいと思います!!

VyOSを使った純粋なルータ作り

こんにちは、虎の穴ラボのH.Y.です。(激似)


最近、ギガが減るという単語が一般的に使われてきましたね。
というわけで、ネットワークをネタに
VyOSをつかった純粋なルータ(L3パケット交換のみの機能)作りをしてみようと思います。

そもそも、VyOSとはオープンソースのネットワークOSで、
PCに入れてネットワーク機器としてしまうときに使います。
Debianベースですが、Linuxで使えるコマンドは、ほぼ使えません。


今回は、富士通PRIMERGY TX100 S3を使用します。
f:id:toranoana-lab:20181126113554j:plain
(今回は右側のマシン。左側はマイニングマシンとして使ったマシン)
マイニングマシンの記事はこちら
格安サーバを使ったモナコイン向けマイニングマシン - 虎の穴 開発室ブログ



この機種は、LANポートが2つあるのでルータとしても使用しやすいです。

VyOSのインストール

IOSは本家のページからダウンロードします。
VyOS - an Open Source Linux-based Network OS

VyOSのインストールは以下の記事を参考にしました。
VyOS のインストール&初期セットアップ - らくがきちょう

インストール自体は、基本デフォルトでインストールしたので、5分程度で完了しました。

※インストール直後のネットワーク図
f:id:toranoana-lab:20181126125647p:plain

IPアドレスの指定とsshのインストール

ルーターとして使用するために、interfaceにipアドレスを設定します。
ついでに、マシンと作業スペースが遠いのでsshの有効化も行います。

'編集モードに移行'
$ configure

'interfaceのIP設定の確認'
# show interfaces ethernet
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth0             -                                 u/u
eth1             -                                 u/u

'interfaceのIP設定'
# set interfaces ethernet eth0 address 192.168.100.201/24
# set interfaces ethernet eth1 address 192.168.101.1/24

'sshを有効化'
# set service ssh

'設定のコミットと保存'
# commit
# save

'interfaceのIP設定の確認'
# show interfaces ethernet
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth0             192.168.100.201/24                u/u
eth1             192.168.101.1/24                  u/u

sshとeth0にIPアドレスを設定したので、

user:vyos
password:インストール時のパスワード
でsshで操作できるようになります。

※設定後のネットワーク図(eth1はスイッチと繫がっているが省略)
f:id:toranoana-lab:20181126150941p:plain

外と繋ぐ。

ブロードバンドルーターにはつながっては居ますが、

# ping 8.8.8.8
connect: Network is unreachable

外のネットワークに接続できません。

# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
       I - ISIS, B - BGP, > - selected route, * - FIB route

C>* 127.0.0.0/8 is directly connected, lo
C>* 192.168.100.0/24 is directly connected, eth0
C>* 192.168.101.0/24 is directly connected, eth1

ルーティングテーブルを見て、デフォルトゲートウェイへのルーティングが存在しないことがわかります。

なので、デフォルトゲートウェイ(ブロードバンドルーター)にパケットを飛ばすためスタティックルーティングを設定します。

# set protocols static route 0.0.0.0/0 next-hop 192.168.100.1
# commit
# save

ブロードバンドルーター(192.168.100.1)の経路の設定を行いました。

# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=121 time=3.73 ms
64 bytes from 8.8.8.8: icmp_req=2 ttl=121 time=3.96 ms


# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
       I - ISIS, B - BGP, > - selected route, * - FIB route

S>* 0.0.0.0/0 [1/0] via 192.168.100.1, eth0
C>* 127.0.0.0/8 is directly connected, lo
C>* 192.168.100.0/24 is directly connected, eth0
C>* 192.168.101.0/24 is directly connected, eth1

pingも問題なく帰ってきており、ルーティングテーブルも大丈夫そうです。

ダイナミックルーティングを使いたい

ブロードバンドルーターがダイナミックルーティングであるRIPに対応しているため、
VyOSでも動作しているかを確認してみます。

# set protocols rip interface eth0
# set protocols rip interface eth1
# commit
# save

RIPの広告対象のインターフェイスを設定しました。

# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
       I - ISIS, B - BGP, > - selected route, * - FIB route

R   0.0.0.0/0 [120/2] via 192.168.100.1, 00:00:24
S>* 0.0.0.0/0 [1/0] via 192.168.100.1, eth0
R>* 49.0.0.0/8 [120/2] via 192.168.100.1, eth0, 00:00:24
R>* 123.0.0.0/8 [120/2] via 192.168.100.1, eth0, 00:00:24
C>* 127.0.0.0/8 is directly connected, lo
C>* 192.168.100.0/24 is directly connected, eth0
C>* 192.168.101.0/24 is directly connected, eth1
R>* 220.210.194.0/24 [120/2] via 192.168.100.1, eth0, 00:00:24
R>* 220.210.221.0/24 [120/2] via 192.168.100.1, eth0, 00:00:24
R>* ***.***.***.0/24 [120/2] via 192.168.100.1, eth0, 00:00:24
R>* ***.***.***.0/24 [120/2] via 192.168.100.1, eth0, 00:00:24

※使用しているISPバレてしまうので一部マスクしてます。

RIPでデフォルトゲートウェイを含めたルーティング情報を取得できましたが、
アドミニストレーティブディスタンスの値がスタティックよりも高いので、
実際使われているのは、スタティックのルートを使われています。
(*がついているのが、実際に使われているルート)


なので、スタティックルーティングの設定を削除します。

setの代わりにdeleteを入れれば消えるそうなので

# delete protocols static route 0.0.0.0/0 next-hop 192.168.100.1
# commit
[ protocols static route 0.0.0.0/0 ]
Must add either a next-hop or blackhole for route 0.0.0.0/0

[[protocols static]] failed
Commit failed

あれ?。

# delete protocols static route 0.0.0.0/0
# commit

こちらの方はうまくいきました。
どうやら、deleteは必要最低限の記述でじゃないと、ダメそうです。

# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
       I - ISIS, B - BGP, > - selected route, * - FIB route

R>* 0.0.0.0/0 [120/2] via 192.168.100.1, eth0, 00:00:56
R>* 49.0.0.0/8 [120/2] via 192.168.100.1, eth0, 00:00:56
R>* 123.0.0.0/8 [120/2] via 192.168.100.1, eth0, 00:00:56
C>* 127.0.0.0/8 is directly connected, lo
C>* 192.168.100.0/24 is directly connected, eth0
C>* 192.168.101.0/24 is directly connected, eth1
R>* 220.210.194.0/24 [120/2] via 192.168.100.1, eth0, 00:00:56
R>* 220.210.221.0/24 [120/2] via 192.168.100.1, eth0, 00:00:56
R>* ***.***.***.0/24 [120/2] via 192.168.100.1, eth0, 00:00:56
R>* ***.***.***.0/24 [120/2] via 192.168.100.1, eth0, 00:00:56

スタティックルーティングが消え、RIPのルーティングを使用しています。

いろいろつなぐ

自宅にYAMAHA、NEC、CISCO製のルータが
手持ちになりましたので、マルチベンダー環境でもルーティング情報を交換できているか確認します。
f:id:toranoana-lab:20181126155309p:plain
(メーカーバラバラなのでインターフェイス名もバラバラ。。。)

VyOS

# show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
       I - ISIS, B - BGP, > - selected route, * - FIB route

R>* 0.0.0.0/0 [120/2] via 192.168.100.1, eth0, 21:27:28
R>* 49.0.0.0/8 [120/2] via 192.168.100.1, eth0, 21:27:28
R>* 123.0.0.0/8 [120/2] via 192.168.100.1, eth0, 21:27:28
C>* 127.0.0.0/8 is directly connected, lo
C>* 192.168.100.0/24 is directly connected, eth0
C>* 192.168.101.0/24 is directly connected, eth1
R>* 192.168.201.0/24 [120/2] via 192.168.101.201, eth1, 00:00:15
R>* 192.168.202.0/24 [120/2] via 192.168.101.202, eth1, 00:01:20
R>* 220.210.194.0/24 [120/2] via 192.168.100.1, eth0, 21:27:28
R>* 220.210.221.0/24 [120/2] via 192.168.100.1, eth0, 21:27:28
R>* ***.***.***.0/24 [120/2] via 192.168.100.1, eth0, 21:27:28
R>* ***.***.***.0/24 [120/2] via 192.168.100.1, eth0, 21:27:28

CISCO 1812J
f:id:toranoana-lab:20181126165715j:plain

# show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, + - replicated route

Gateway of last resort is 192.168.101.1 to network 0.0.0.0

R*    0.0.0.0/0 [120/2] via 192.168.101.1, 00:00:03, FastEthernet0
R     49.0.0.0/8 [120/2] via 192.168.101.1, 00:00:03, FastEthernet0
R     123.0.0.0/8 [120/2] via 192.168.101.1, 00:00:03, FastEthernet0
R     192.168.100.0/24 [120/1] via 192.168.101.1, 00:00:03, FastEthernet0
      192.168.101.0/24 is variably subnetted, 2 subnets, 2 masks
C        192.168.101.0/24 is directly connected, FastEthernet0
L        192.168.101.201/32 is directly connected, FastEthernet0
      192.168.201.0/24 is variably subnetted, 2 subnets, 2 masks
C        192.168.201.0/24 is directly connected, FastEthernet1
L        192.168.201.1/32 is directly connected, FastEthernet1
R     192.168.202.0/24 [120/1] via 192.168.101.202, 00:00:02, FastEthernet0
R     220.210.194.0/24 [120/2] via 192.168.101.1, 00:00:08, FastEthernet0
R     220.210.221.0/24 [120/2] via 192.168.101.1, 00:00:08, FastEthernet0
R     ***.***.***.0/24 [120/2] via 192.168.101.1, 00:00:05, FastEthernet0
R     ***.***.***.0/24 [120/2] via 192.168.101.1, 00:00:05, FastEthernet0

NEC IX2015
f:id:toranoana-lab:20181126165650j:plain

# show ip route
IP Routing Table - 10 entries, 2038 frees
Codes: C - Connected, S - Static, R - RIP, O - OSPF, IA - OSPF inter area
       E1 - OSPF external type 1, E2 - OSPF external type 2, B - BGP
       * - Candidate default, s - Summary
Timers: Age
R*   0.0.0.0/0 [120/3] via 192.168.101.1, FastEthernet0/0.0, 0:00:23
R    49.0.0.0/8 [120/3] via 192.168.101.1, FastEthernet0/0.0, 0:00:23
R    123.0.0.0/8 [120/3] via 192.168.101.1, FastEthernet0/0.0, 0:00:23
R    192.168.100.0/24 [120/2] via 192.168.101.1, FastEthernet0/0.0, 0:00:23
C    192.168.101.0/24 [0/1] is directly connected, FastEthernet0/0.0, 0:26:11
C    192.168.202.0/24 [0/1] is directly connected, FastEthernet0/1.0, 0:08:02
R    220.210.194.0/24 [120/3] via 192.168.101.1, FastEthernet0/0.0, 0:00:24
R    220.210.221.0/24 [120/3] via 192.168.101.1, FastEthernet0/0.0, 0:00:24
R    ***.***.***.0/24 [120/3] via 192.168.101.1, FastEthernet0/0.0, 0:00:24
R    ***.***.***.0/24 [120/3] via 192.168.101.1, FastEthernet0/0.0, 0:00:24

YAMAHA NVR500
※瘴気が濃いところにあったので、写真はなしです。。。。

show ip route
宛先ネットワーク    ゲートウェイ     インタフェース  種別  付加情報
default             -                    PP[01]    static  filter:500000
default             -                    PP[02]    static  filter:500000
default             -                    PP[01]    static  
49.***.***.***/32    -                    PP[01] temporary  
123.***.***.***/24    -                    PP[02]    static  
123.***.***.***/32    -                    PP[02] temporary  
123.***.***.***/32    -                    PP[02] temporary  
192.168.100.0/24    192.168.100.1          LAN1  implicit  
192.168.101.0/24    192.168.100.201        LAN1       RIP  metric=1 
192.168.201.0/24    192.168.100.201        LAN1       RIP  metric=2 
192.168.202.0/24    192.168.100.201        LAN1       RIP  metric=2 
220.210.194.***/25    -                    PP[02]    static  
220.210.221.***/32    -                    PP[02] temporary  
***.***.***.***/32    -                    PP[01] temporary  
***.***.***.***/32    -                    PP[01] temporary  
#


全機器、問題なく全ルーティング情報を交換できていました。

※NVR500のルーティング情報が多いのはRIPv1を使っているため、自動集約されているからです。

まとめ

ハードウェアの値段にもよりますが、同等の機能を持ったアプライアンス機器よりも安い
(今回は大体1万円ぐらい)
コマンドの使い勝手は、CISCO IOSに近いものが多く、使い慣れている方は学習コストは少ない
(と思います)

今回は、業務用として使うような(?)設定しかしていませんが、
NAPTやファイアウォールなどのブロードバンドルーターとしても設定できますので
余っているPCをルータにしてみたり、ネットワークの勉強としてや、
VPNを作って遊んでみたりしては、いかがでしょうか。

P.S.
NEC IX2015を設定するコマンドを探すのに一番時間がかかりました。


12/20(木) に『とらのあな開発室』の採用説明会を秋葉原で開催します! Webエンジニアがメインの説明会となりますが、デザイナー、ディレクターもあわせて募集していますので、ぜひ気軽にご参加下さい!
yumenosora.connpass.com


虎の穴ではJavascriptエンジニアをはじめとして一緒に働く仲間を絶賛募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧下さい。
www.toranoana.jp