立ち話

興味があることを書いてます。正確な内容は公式ドキュメントや参考文献を確認してください。ブログに示された意見はすべて個人の見解であり、所属する組織の公式見解ではありません。

ボイスロイドと擬似的な会話をしたいと思った人間が2日くらいでそれっぽいのを作った話

はじめに

なんかふとボイスロイドと擬似的な会話をしたくなったので、それっぽいのを作ってみました。

今回は、作ったものについて簡単に紹介しようと思います。作ったものはGitHubリポジトリで公開しました。

実現したいことと必要な機能

今回は、『自分の声で話しかけたら反応を返してくれる』ことを実現しようと考えた。具体的には以下の5つの機能が必要だと考えた。

  • (1) PCに接続したマイクに入力した音声をテキストに変換する(音声認識
  • (2) テキストをOpenAIのAPIに入力
  • (3) ChatGPT等の出力を取得
  • (4) 出力されたテキストデータをVOICEROIDに入力
  • (5) VOICEROIDが音声を出力

必要と考えた機能

実現方法

(1)

(1) については、Python音声認識ライブラリ SpeechRecognition がかなり精度よく音声認識をしてくれることが分かったので、このライブラリを使うことにしました。

(2), (3)

(2) と (3) については、OpenAI のライブラリ を使って実装可能。

(4), (5)

(4) と (5) については、AssistantSeika で実現可能。Pythonsubprocess モジュールを使う。

実装

いつも使っている Python で実装しました。3/22 の仕事後に思いついて、3/23 の仕事後にできたので、3~4時間くらいで実装できた気がします。

動作確認


www.youtube.com

自分の声が入っていて恐縮ですが、動作確認のために短めの対話をしました。制約を設けることで、ある程度『それっぽい』会話になっているのではないでしょうか。

まとめ

たまにうまく音声を認識してくれなかったり、認識した文章がおかしいときは挙動がおかしくなったりしますが、ある程度うまく機能するものができた気がします。

無料期間が終わったら使えなくなりそうなので、今のうちに楽しみたいです。

Certified Network Defender(CND)に合格点ギリギリで合格した話

はじめに

2023/3/11 に EC-Council の Certified Network Defender の試験を受験し、合格点ギリギリ(72/100)で合格しました。

受験した経緯としては、

  • 会社のお金で CND の講習を受講させていただいた
    • 現在の専門分野がセキュリティ関係
  • 受講料金に CND の試験バウチャーも含まれていた

というような感じです。今回は、この試験について振り返ろうと思います。特に試験勉強の反省点を重点的にまとめます。

講習について

Certified Network Defender とは

サイバーセキュリティ教育カンパニーのGSXさん(認定講座のマスターディストリビュータ)によると、

CND(認定ネットワークディフェンダー)は、EC-Council認定資格の一つで、ネットワークセキュリティ対策の知識を包括的に学ぶコースです。組織のセキュリティについてどの部分をレビュー、テストする必要があるかを特定し、ネットワークのリスクを防止、軽減するスキルを身に付けます。
引用元: CND(認定ネットワークディフェンダー)|EC-Council公式トレーニング|GSX

とのことです。ネットワークセキュリティを中心として、攻撃に対する防御や攻撃の検知、インシデントへの対応、リスクの予見などに焦点を当てています。今回は、CNDv2 の教育を受講しました。

CNDv2 では、コースは計20個のモジュールから構成されています。テキストのページ数の合計は約750ページでした。

講習についての所感

20個のモジュールを3日間で行うようなものだったので、各モジュールにかけられる時間はあまり多くなかったです。講義中に集中力が切れてしまうと置いていかれてしまうと思いました。私の場合はある程度知っている部分とほとんど知らない部分がはっきりしていたので、ほとんど知らない部分を集中して聞き、気になったところを講師の先生に質問する、というスタンスで受講しました。

受験について

講習受講から試験受験までのスケジュール感

講習を受講したのが12月第3週で試験を受験したのが3月の第2週だったので、講習受講後約3ヶ月後に試験を受けたことになります。

  • 会社の予算的な都合で3月末までには受験し終えなければならなかった
  • 3月末ギリギリまでは引き伸ばしたくない(忙しそうというのもある)
  • 本当は2月下旬に受験しようとしていたが、明らかに合格できなさそうだった
  • 平日に受験するためには半休をとる等しなければいけなかったが、有休の残り日数がギリギリだった

という理由で、試験受験日を 2023/3/11 にしました。講習受講後から試験受験までのスケジュール感はこのような感じです。

講習受講後から受験前までのスケジュール

学習方法

注:結構反省点が多い学習方法です。

上図に示すように、

  • テキストを読み、重要そうな用語と意味の対応表を作成
  • 問題を解く
  • 同時並行で未定着の部分の復習

という流れで勉強しました。実際知識がある程度定着してきたなと思ったのは、問題を解いて復習したときです。

はじめはインターネットに転がっていた問題を解いていたのですが、明らかに答えや解説が間違えているものが多かったので、試験の10日前に Udemy にあった問題集(1,500円)を個人的に購入してそれを解きました。

www.udemy.com

個人的には、

テキストである程度勉強する
→ 問題を解く
→ 解説を読んで復習する
→ テキストの関連箇所を見直す/まとめなおす

という試験約1か月前から前日までの流れが良かったと思っています。ちなみにこの学習方法は、私が高校のときからとっていたものです。

勉強時間・勉強場所

各月の勉強時間と勉強場所は以下のような感じです。

  • 12月
    • 仕事納め後
      • 1h/日:家
  • 1月
    • 30min/日(平日で勉強できた日):家
      • やる気が起こらなかったため
  • 2月
    • 前半
      • 30min/日(土日):家
    • 後半
      • 3h/日(平日で勉強できた日):家
      • 5h/日(土日):図書館、家
  • 3月
    • 3h/日(平日で勉強できた日):家
    • 5h/日(土日):図書館、家

2月の前半まであまりやる気が起こらず、やる気が起こった日に30分くらい勉強していました。2月の後半から焦りが出てきて勉強時間を確保しました。具体的には、

  • 平日(勉強できた日)
    • 朝仕事前の30分
    • 仕事、夕食後の2時間~2時間半
  • 土日(予定がなかった日)
    • 朝~昼過ぎの3時間~4時間
    • 夕方~夜の1時間~2時間

を勉強時間として確保しました。土日で予定がないときは朝から図書館に行って昼過ぎまで勉強するようにしていました。

勉強場所についてですが、駅前に朝早くから営業しているカフェがあるので土日はそこで勉強してもよかったかなと今更ながら思っています。

試験勉強の反省点

今回の受験について、いくつか反省点を挙げようと思います。

  • 12月に割と忙しかったというのもあり(言い訳)勉強が進まなかった
    • 仕事後に勉強するやる気も休日に勉強するやる気もあまり起こらなかった
  • 前半の「テキストを読み、重要そうな用語と意味の対応表の作成」で、ほとんど知識が定着していなかった
    • 対応表を作るのに満足していたのか、記憶に残っていなかった
    • 試験が近づくまでやる気があまり起こらず、最初の方はかなり間を空けてしまっていた
    • 私は昔からテキストを読むだけよりも問題を解きながらテキストで復習する方が知識が定着するタイプだったが、今回は先にテキストを読むだけ読んでいただけだった
  • 問題集を解き始めるのが遅かった
    • インターネットに転がっていた問題集を解き始めたのが試験の約1ヶ月前
    • Udemy にあった問題集は1周しか解いていない

特に、やる気が起こらずギリギリになるまで放置していたことと、自分の昔からの勉強方法を無視してしまったことはかなり反省しています。やる気が起こらなかった原因の1つは、テキストを読んでいるだけで具体的なイメージができなかったことだと思っています。

試験当日

試験はピアソンVUEで実施しました。

www.pearsonvue.co.jp

テストセンター自体初めての経験でした。荷物をすべて預けてテストセンターのPCに向かう、という感じでした。

問題自体は30分くらいで解き終えて、見直し含めて約45分くらいで終わりました。自信のない問題は15問くらいだったので問題集よりは解けたかなと思ったのですが、結果としては 72/100(合格点は70/100)とかなりギリギリでした。まあ合格は合格なので良しとしましょう(良くない)。

無事合格したので、試験後は春物の洋服を試着して買ったり、帽子屋さんで色んな帽子の試着をして店員さんにおすすめを聞いたりしてました。

感想など

感想

ネットワークセキュリティまわりの基礎的な知識を広く勉強する機会になったと思いました。今回は試験ギリギリになってから勉強時間を確保したということもあり、試験に合格するためだけの勉強になってしまった感じもするので、勉強する過程でテキストを読むだけではなく自分で色々調べたり手を動かしてみたりすれば良かったかなと思いました。

試験としては正直いろいろ気になった部分もあるのですが(一部問題の出題意図があまり分からなかったり)、基本的な知識の確認としては良いのかなと思いました。講習および試験全体の満足度は個人的には7割といったところでしょうか。

試験(試験勉強)を通じた学び

自分に合った学習方法は、自分が高校生の頃からしていた学習方法

テキストである程度勉強する
→ 問題を解く
→ 解説を読んで復習する
→ テキストの関連箇所を見直す/まとめなおす

だったことを改めて実感しました。自分に合った学習方法だとやる気も起きやすいし、継続しやすいと思います。

また、この資格の勉強を通じて継続的な学習習慣は大事だと改めて実感しました。今回の試験勉強を通じて学習方法の目星が付いたと思うので、これを継続していきたいと思っています。

今後の目標

今のところ、今後取りたい資格として

  • 情報処理安全確保支援士
  • Certified Ethical Hacker(CEH)
  • G検定

あたりを考えています。資格試験を通じて学習するきっかけにするのと、試験に合格するためだけの勉強ではなく学習を通じて知識を定着させるということを意識したいです。

資格試験以外にも学習する習慣をつけたいです。例えば、セキュリティ関係の英語のニュースを読むとか、自宅のインフラまわりをさらに改造するとかですかね。適度にモチベを保ちつつ頑張りたいですね。

今回は以上です。ここまで読んでくださり、ありがとうございました。

Proxmoxサーバ上に模擬制御システム (GRFICS) を構築してみた

はじめに

産業用制御システム (ICS) まわりを勉強しようとしたとき実機を使った環境を用意するのはハードルが高いので、学習用に仮想環境が用意されていることがあります。例えば、GRFICSv2 あたりは調べればすぐ出てくると思います。

このような仮想環境上に構築できるものは大抵VirtualBox用のVMとして用意されていて、Proxmoxサーバなどに導入するにはそこから自分で少し作業する必要があったので、今回はその作業ログをまとめたいと思います。

Proxmoxサーバに構築するモチベ

  • VirtualBoxは重い
    • 今回のように4台同時に動かそうと思うとかなり重くなると思う
  • ホストマシンのスペックに依存する
    • VMのストレージやメモリがホストマシン依存
  • VirtualBoxだと、ホストOSを再起動するときにVMも再起動される
    • 常時起動したいような場合に向いていない

参考情報

前準備

ネットワークの全体像の理解

GRFICSv2 は、下図のようなシステム構成をしている。

GRFICSv2のシステム構成

5つのVMから構成されており、DMZのサブネット (192.168.90.0/24) とICSのサブネット (192.168.95.0/24) を持ち、pfsense がルーティング機能とファイアウォール機能を担っている。

VM IPアドレス
Simulation VM 192.168.95.10-15
HMI VM 192.168.90.5
pfsense VM 192.168.90.100
192.168.95.1
PLC VM 192.168.95.2
Workstation VM 192.168.95.5

今回構築するシステム構成

今回は、Proxmoxサーバと物理マシンを用いて以下のように構築することにした。

今回構築したもの

GRFICSv2のVM以外は、次のような機器から構成される。

機器 IPアドレス 用途
Kali (VM) 192.168.90.99 攻撃実験用
Ubuntu (VM) 192.168.90.125 HMIへのアクセス用
Ubuntu (物理マシン) 192.168.95.125 シミュレータの表示用

今回物理マシンをICSのサブネットに接続することにしたのは、仮想マシンでシミュレータにアクセスしようとしたが、重くてGUIが表示されなかったため。

ブリッジネットワークの作成

上記構成を踏まえて、ブリッジネットワークを2つ作成する。今回は、以下のように作成する。

DMZのサブネット

ICSのサブネット

192.168.95.0/24ブリッジポート (執筆者の環境では enp33s0) を割り当てているのは、物理マシンを接続できるようにするためである。

スイッチングハブの用意

物理マシンを接続するため、以下のようにスイッチングハブを用意した。

用意したスイッチングハブ (上側)

ブリッジポートからLANケーブルをスイッチングハブの5番ポートにつなぎ、1番ポートに物理マシンを接続した。

Pre-build VMs のダウンロードとサーバへの転送

GRFICSv2VM 5つをダウンロードする。

  • Simulation VM (ChemicalPlant.ova)
  • HMI VM (ScadaBR.ova)
  • pfsense VM (pfSense.ova)
  • PLC VM (plc_2.ova)
  • Workstation (workstation.ova)

ダウンロードしたOVAファイルを解凍し、VMDKファイルを得る。例えば、Lhaplusなどを使うと解凍できる。または、WSLなどのターミナル上で tar コマンドを実行。

tar xvf [filename].ova

このVMDKファイルを scp などを使って Proxmox サーバに送信する。

環境構築

VMDKのインポート

参考proxmoxにvirtualboxのマシンをインポートする

一度VMを立てて qm を用いて既存のVMDKファイルをインポートする、という方法をとる。詳しくは上記参考サイトにやり方が載っている。

  1. VM を立てた後、コンソールの Hardware で、VMを立てた際に作成した Hard Disk を Detach して Remove する
  2. Proxmox のターミナルで qm コマンドを使って、VMDKファイルをインポートする

     # qm importdisk [vmid] [vmdk file] local-lvm -format raw
    
    • vmid: 立てたVMのID
    • vmdk file: Proxmoxサーバに送ったVMDKファイル
  3. コンソールの Hardware を見て追加された Unused Disk を Edit で見て、問題なければ Add する

  4. コンソールの Options で Boot Order に先ほど追加した Hard Disk を追加し、優先度を一番高くする

この状態で VM を起動する。

個々のVMIPアドレス設定

前手順までで、VMをProxmoxサーバ上に構築することはできた。ここでは、VMIPアドレスの設定を行う。

公式サイトでは VirtualBox の Host-Only Adapter の DHCP サーバを有効化してIPアドレスを割り当てているが、ここでは各仮想マシンに手動でIPアドレスを割り当てる方法を採用する。

IPアドレスの設定方法 (pfsense, Workstation 以外)

pfsense, Workstation 以外のVM (Simulation, HMI, PLC) については、以下の手順でIPアドレスを設定する。

  1. Link を Up にする
  2. /etc/network/interfaces に記載
  3. 再起動
# ip link set [interface] up

ただし、interface は、自分の環境のインタフェース (例:ens18)。

/etc/network/interfaces への記載
# cp /etc/network/interfaces /etc/network/interfaces.bk
# vi /etc/network/interfaces

/etc/network/interfaces に記載されている設定を、インタフェースが適切になるように書き換える。例えば、執筆者の環境の場合、Simulation VM の設定は以下。

auto ens18:0
iface ens18:0 inet static
address 192.168.95.10
netmask 255.255.255.0
gateway 192.168.95.1

auto ens18:1
iface ens18:1 inet static
address 192.168.95.11
netmask 255.255.255.0

auto ens18:2
iface ens18:2 inet static
address 192.168.95.12
netmask 255.255.255.0

auto ens18:3
iface ens18:3 inet static
address 192.168.95.13
netmask 255.255.255.0

auto ens18:4
iface ens18:4 inet static
address 192.168.95.14
netmask 255.255.255.0

auto ens18:5
iface ens18:5 inet static
address 192.168.95.15
netmask 255.255.255.0

IPアドレスの設定 (pfsense)

参考Fortiphyd ICS Security Training - GRFICS Setup

pfsenseについては、以下のように設定する。

  1. VMを作るときに、192.168.90.0/24 のネットワークを先に追加する。その後の設定で 192.168.95.0/24 のネットワークを追加する。
  2. 以下のように初期設定する
    • Should VLANS be set up now [y|n]? → n
    • Enter the WAN interface name of 'a' for auto-detection → vtnet0
    • Enter the LAN interface name or 'a' for auto-detection → vtnet1
    • Do you want to proceed [y|n]? → y

IPアドレスの設定 (Workstation)

GUI上で設定する。

WorkstationでのIPアドレスの設定

テンプレート化

Proxmox のテンプレートにすることで、導入しなおそうとしたときにわざわざVMDKから読み込んだりネットワークの設定をしたりするといったことが必要なくなる。

テンプレート化したもの

テンプレートから仮想マシンを作成

テンプレートからクローンすることで、テンプレート化したところまでの設定を引き継いだ仮想マシンを作成できる。

動作確認

起動

シミュレーション環境を立ち上げる。

  1. Workstation以外のVMの電源を付ける
  2. Simulation VM のターミナルに入り、以下コマンドを実行
$ cd ~/GRFICSv2/simulation_vm/simulation/remote_io/modbus
$ sudo bash run_all.sh

シミュレータの確認

Ubuntu (物理マシン) で、http://192.168.95.10 にアクセス。

シミュレータ

Scadaの確認

Ubuntu (VM) で、http://192.168.90.5:8080/ScadaBR にアクセス。

ScadaBR

まとめ

Proxmox 上に模擬環境 GRFICSv2 を構築しました。暇なときに遊びたいと思います。

社会人1年目に作った自宅環境と在宅勤務環境について語りたい

はじめに

自宅インフラ(自宅ラボ)系の記事を書いてからだいぶ間が空いてしまいましたが、1年目の12月までに作った自宅環境(自宅ラボ)と在宅勤務環境について語りたいと思います。

Twitter でつぶやいたように、個人的にはワンルームという制約条件下では良い感じに構築できたと思っています。

これまでの自宅インフラ系記事のリンク

自宅環境と在宅勤務環境の分割

前述のように、1つの机に自宅環境と在宅勤務環境を作って分けている。

ハード的な分割

使っている物理機器を以下表にまとめる。

環境 物理機器
自宅環境 デスクトップPC
自宅環境 仮想化サーバ
在宅勤務環境 ノートPC

ここでは、ハード的な分割についてまとめる。

自宅環境と在宅勤務環境のハード的な分割

HDMI切替器は、多数のデバイスの信号を入力とし、1つのモニターに出力するようなものである。執筆者は、以下表のように利用している。

利用時 HDMI切替器の入力 キーボード2の接続先
在宅勤務時 会社用ノートPC -
デスクトップPC使用時 デスクトップPC デスクトップPC
仮想化サーバメンテナンス時 仮想化サーバ 仮想化サーバ

在宅勤務時

デスクトップPC使用時

仮想化サーバメンテナンス時

執筆者はHDMI切替器とUSB切替器には以下のメリットがあると考えている。

  • 複数台のPCを1台のモニターに接続できる
    • 物理的なモニターを大量に用意する必要がない
  • 同一のキーボード を複数台のPCで使うことができる
    • わざわざキーボード(USB機器)を繋ぎ変える必要がない

ネットワーク的な分割

次に、ネットワーク的な分割についてまとめる。

12/28時点では、以下のようなネットワーク構成にしている。

自宅環境と在宅勤務環境のネットワーク的な分割

自宅環境と在宅勤務をネットワーク的にも分割するために、ポートvlan機能を使っている。会社PCはVPN機能を使うことが多いが、自宅環境と分けておくと安心感がある。

構築した自宅ラボ

ここでは、Proxmox仮想サーバ上に構築した自宅ラボについてまとめる。

12/28時点で、以下のような構成にしている。

自宅ラボの構成

図中の灰色のボックスが物理マシン、白色のボックスが仮想マシンである。また、水色で囲っている部分が仮想化サーバである。

net1 に接続しているクライアント、サーバは、以前記事で構築したものである。

ここでは、home-net上のwikiサーバとファイルサーバについて簡単に触れる。

wikiサーバは、9月くらいに構築したものであり、主に以下の内容をまとめている。

  • 環境構築の際の備忘録
  • 資格の勉強

seekt.github.io

ファイルサーバは大学院時代に構築したものとほぼ同じであり、主にWindowswikiサーバのバックアップなどに使っている。仮想マシンとして作っているので、仮想化サーバが物理的に壊れてしまうと、バックアップしたデータもなくなってしまう、という問題点がある。

wikiサーバとファイルサーバ

wikiサーバは、home-netに接続した機器から閲覧・編集が可能であり、cronを使って毎日ファイルサーバにバックアップをとっている。今後もwikiサーバを更新して、自分のためのwikiを作成する予定である。

まとめ

12月までに構築した自宅環境および在宅勤務環境についてまとめました。在宅勤務主体なので、かなりお金をかけて構築しました。お金が貯まって引っ越したら自宅環境と在宅勤務環境を物理的に分けたいと考えています。もう一度構築を考える必要がありそうですね。

今回構築した環境は、ワンルームという制約の下で自宅環境と在宅勤務環境を分割できていると思っていますが、執筆者の整理整頓能力がないせいで配線が汚くなってしまいました。今後は、配線も綺麗にしつつ、よりエレガントな自宅環境・在宅勤務環境を構築したいと考えています。

最後に、いずれ実現したい自宅環境についてまとめます。

2022年の振り返りと2023年の目標

はじめに

社会人1年目で大きく環境が変化しました。今回は、以前別媒体で書いた2022年の目標

note.com

に対する振り返りを行い、2023年の目標を設定したいと思います。

各目標に対する振り返り

ここでは、各目標に対する達成度を ◎、○、△、× の4段階で評価したいと思います。

# 目標 評価 理由
1 生きる 忙しい時期もあったが、病まずに過ごせた
2 修了する 無事修了して、優秀学生賞もとった
3 遅刻しない 致命的な遅刻は一度もしていない
4 余裕を持つ 金銭的な余裕はできたが、先輩が皆優秀な方で精神的な余裕が持てていない
5 無理はしない 無理しすぎないことを考えて仕事に取り組んだ
6 金融関係の勉強 ふるさと納税制度の勉強をしたりつみたてNISAをはじめたり
7 資格をとる × 1つも資格をとっていない。来年2月に受験予定のものが1つある
8 無駄遣いしない 自信を持つために服やメガネにかなりお金をかけた
9 先輩・同期との良好な関係 同期間で勉強会をしている。先輩にも気軽に相談できるようになった
10 女性とご飯に行く 一応行ったので目標としては達成。その後の関係につながってはいない
11 感謝の気持ちは言葉にする 先輩に助けていただいたときなど意識的に言葉にするようにした
12 お金を貯める 一応1年目に目標としていた額は貯めることができそう
13 身だしなみに気を遣う 前述のように、自信を持つために身だしなみに気を遣うようになった
14 部屋の掃除 最低限は掃除しているが、そこまできれいではない
15 推し活はやることやってから そもそもあまり推し活をしていない
16 積読積みゲーの解消 × 逆に増えた
17 コミケに行く × 行けなかった。技術書典には行った
18 日本ダービー 入場券をとって、友人と行った

達成度は以下の表のようになった。

×
4 7 4 3

年初に立てた目標はある程度は達成できたと思うが、少しずれもあったように思います。

目標として書いたこと以外の振り返り

目標として書いたこと以外の振り返りもしたいと思います。

仕事関連

  • 仕事とチームとして働くということに慣れることに必死だった。
  • 全然できていなくても、チームリーダーの方が「大丈夫ですよ」と言ってくれるのが心苦しかった。
  • 最近はやることが増えて、残業時間も増えて、仕事が終わったらベッドに横になってスマホを見る生活になってしまっている。
  • まだ効率的に仕事をできない。

自己研鑽

  • 自宅ラボ(自宅インフラ)を構築して、得た知識をWikiに書いて、といったことはしていた。
  • 昼休みや仕事前後に勉強したいなぁと思っていたが、最近(10月以降)は仕事が増えてしまい、仕事をするだけで体力・気力がなくなってしまい、何もできなかった。
    • 12月に入ってから、仕事前後や昼休みに意識的に情報収集をするようにした。今後も継続したい。

2023年の目標

ここまでを踏まえて、2023年の目標を設定します。

分類 # 目標
仕事関連 1 効率的に仕事をすることができるようになる
仕事関連 2 チーム外、部門外の方とも積極的にやり取りする
仕事関連 3 時間管理を意識する
仕事関連/自己研鑽 4 積極的に知識を吸収する
自己研鑽 5 資格2つ以上。資格勉強の過程で知識を定着させる
自己研鑽 6 仕事前後や昼休みに情報収集する(継続)
自己研鑽 7 仕事の効率化の方法を学ぶ
私生活 8 健康的な食生活を意識する。自炊する
私生活 9 運動を習慣化する。最低限ストレッチはする
私生活 10 コーデのレパートリーを増やす
精神面 11 無理はしない(継続)
精神面 12 病みそうになったら休む・相談する

この12個を2023年の目標にしたいと思います。2年目になるとさらに忙しくなると思いますが、無理せず生きたいと思います。

自宅インフラを育てる (3) 遊ぶための環境を作って動かしてみる

はじめに

前回はサーバーを自作し、Proxmox を導入して仮想化しました。

seekt.hatenablog.com

今回は、遊ぶための環境をサーバー上に作ったのでそのメモを残したいと思います。

今回作った環境

今回作った環境

こんな環境を作りました。上段がホームネットワーク上の物理マシン (Windows10) で、中段と下段が Proxmox 上のVMです。

  • 攻撃端末 (ParrotOS)
  • 踏み台 (Ubuntu)
  • クライアント (Fedora)
  • サーバ (Fedora)

の4つのVMを Proxmox 上に立てて動かしています。

用途・使い方

用途・使い方はこんな感じです。

  • クライアントからサーバに TCP または UDP の通信をする
  • 攻撃端末は通信の盗聴・改ざんをする
  • Windowsからクライアントおよびサーバを動かせるようにする
    • Windowsから踏み台サーバにSSH接続できるようにする
    • 踏み台からクライアントおよびサーバにSSH接続できるようにする
  • 踏み台サーバでクライアントおよびサーバの負荷監視を行えるようにする

VMの設定

ここでは、それぞれのVMの設定について簡単にまとめます。

ParrotOS

ParrotOS は、攻撃端末として使います。基本的にGUIで運用しますが、WindowsSSH接続できるようにします。

インストール

公式サイト から ISO イメージをダウンロードして設定します。ここでは、Security Edition の ISO イメージを使っています。

VMのスペックはこんな感じにしています。

  • CPU
    • 6 CPUs
  • Memory
    • 8 GB
  • Storage
    • 96 GB

初期設定

sudo apt update
sudo apt -y upgrade

realtek-rtl8188-dkms でエラーが出るので、エラーの解決をします。

community.parrotsec.org

sudo apt purge realtek-rtl8188eus-dkms
sudo parrot-upgrade
sudo apt autoremove
sudo parrot-upgrade

SSHを有効にします。

sudo apt install ssh
sudo systemctl start ssh
sudo systemctl enable ssh

必要なパッケージのインストール

通信の盗聴や改ざんには Python の Scapy と NetfilterQueue を使うので、必要なパッケージをインストールします。

パッケージのインストール

sudo apt install python3-venv
mkdir .venvs
python3 -m venv ~/.venvs/venv39
source ~/.venvs/venv39/bin/activate
(venv39) pip install --upgrade pip
(venv39) pip install scapy NetfilterQueue

テスト

(venv39) python
>>> import scapy
>>> from netfilterqueue import NetfilterQueue
(Ctrl + D)
(venv39) deactivate

もし NetfilterQueue でうまくいかなかったら、以下のコマンドを実行してもう一度試す。

sudo apt install build-essential python-dev python3-dev libnetfilter-queue-dev

アップデートの自動化

crontab を用います。具体的には、/etc/crontab に以下を追記します。

00 3    * * *   root    apt update && apt -y upgrade && apt -y autoremove

毎日朝3時に root 権限でアップデートが行われる1

ParrotOS の VM

Ubuntu

インストール

公式サイト から ISO イメージをダウンロードして設定します。ここでは、Ubuntu 22.04 を使っています。

VMのスペックはこんな感じにしています。

  • CPU
    • 4 CPUs
  • Memory
    • 8 GB
  • Storage
    • 256 GB

初期設定

sudo apt update
sudo apt -y upgrade

SSHを有効にします。

sudo apt install ssh
sudo systemctl start ssh
sudo systemctl enable ssh

GUI は負荷が大きいので、CUI で運用することにする。

sudo systemctl set-default multi-user.target
reboot

アップデートの自動化

Parrot と同じ方法でアップデートを自動化する。

UbuntuVM

Fedora (Client, Server)

インストール

公式サイト から ISO イメージをダウンロードして設定します。ここでは、Fedora Server をダウンロードしました。

VMのスペック・設定はこんな感じにしています。

  • CPU
    • 2 CPUs
  • Memory
    • 2 GB
  • Storage
    • 32 GB
  • インストール時は 192.168.0.0/24 のみ接続し、インストール後に 192.168.50.0/24 を追加する。
  • root ユーザを作る

初期設定

yum update

nmtui をインストールする

yum install NetworkManager-tui

nmtui192.168.50.0/24 のIP を固定 (下図は server の例)。

nmtui を使って IPアドレスを固定する

また、192.168.0.0/24 のネットワーク接続を切っておきます (nmtui で deactivate する)。

FedoraVM (Client)

FedoraVM (Server)

クライアント - サーバ間の通信

www.oreilly.co.jp

この本を参考に作っています。

UDP 通信

UDP のクライアントとサーバを作りました。

UDP クライアント

クライアント側で動かすプログラムです。

UDP サーバ

サーバ側で動かすプログラムです。

TCP 通信

TCP のクライアントとサーバを作りました。

TCP クライアント

クライアント側で動かすプログラムです。

TCP サーバ

サーバ側で動かすプログラムです。

通信のテスト

通信を行う前に、サーバ側のポートを開けます。今回は、12590/udp12600/tcp を開けます。

サーバ側 (192.168.50.3) に root でログインして、以下コマンドでポートを開けます。

# firewall-cmd --add-port=12590/udp
# firewall-cmd --add-port=12600/tcp

youtu.be

通信を実行している様子を動画にしました。

サーバ側 (右側) のプログラムを実行してからクライアント側 (左側) のプログラムを実行すると、サーバ側がメッセージを受け取る様子が見て取れます。

通信を定期的に行う

サーバを起動した状態で、クライアントのプログラムを数秒おきに実行すると、定期的な通信を模擬できます。

例えば、5秒おきに UDP の通信をしたいときは、

watch -n 5 python3 udp_client_sample.py

とすれば良いです。

負荷監視ログの取得

踏み台からクライアントとサーバの負荷監視ログを取得しようと思います。今回は、毎秒の vmstat のログを1時間とるようにしました。

こんなスクリプトを書けば実現できます。

サーバのログを取得するスクリプト (obtain_log_server.sh)

#!/bin/bash

HOST=192.168.50.3
USER=guest

ssh ${USER}@${HOST} < log_command.sh > ./log/log_server_`date "+%Y%m%d%H%M%S"`.vmstat

クライアントのログを取得するスクリプト (obtain_log_client.sh)

#!/bin/bash

HOST=192.168.50.4
USER=guest

ssh ${USER}@${HOST} < log_command.sh > ./log/log_client_`date "+%Y%m%d%H%M%S"`.vmstat

共通で使うスクリプト (log_command.sh, 上2つのスクリプトと同じディレクトリに置く)

#/bin/bash

vmstat -n -t 1 3600

./obtain_log_server.sh でサーバの、./obtain_log_client.sh でクライアントのログが取得できます。

やっていることは、SSH 接続先で log_command.sh を実行して、踏み台の log ディレクトリに log_client_YYYYmmddHHMMSS.vmstat として保存するということです。

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- -----timestamp-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st                 JST
 0  0      0 1478852   1668 313252    0    0     3     1   41   42  0  0 99  0  0 2022-09-04 11:17:21
 0  0      0 1478852   1668 313252    0    0     0     0  120  116  0  0 100  0  0 2022-09-04 11:17:22
 0  0      0 1478852   1668 313252    0    0     0     0  102  104  0  0 99  0  0 2022-09-04 11:17:23
 0  0      0 1478852   1668 313252    0    0     0     0   95   96  0  1 99  0  0 2022-09-04 11:17:24
 0  0      0 1478852   1668 313252    0    0     0    20  103  106  0  1 99  0  0 2022-09-04 11:17:25
 0  0      0 1478852   1668 313252    0    0     0     0   92   92  0  1 100  0  0 2022-09-04 11:17:26

こんな感じのログが取れます。

まとめ

ここでは、

  • 遊ぶための環境について
  • クライアント - サーバ間の通信について
  • 踏み台サーバからのクライアントおよびサーバの負荷監視について

書きました。

時間があるときに通信の盗聴とか改ざんとかもこの環境で試そうと思っています。


  1. cron-apt を使ってもいいと思う。

自宅インフラを育てる (2) サーバーを自作して仮想化する

はじめに

前回、ネットワークまわりの改造をしました。

seekt.hatenablog.com

今回は、サーバーを自作したことについて書こうと思います。

なぜ自作サーバーを作ろうと思ったのか???

前の記事でも少し書きましたが、なぜ今時自作サーバーを作ろうと思ったかについてもう一度触れておきます。

  • 環境構築とかネットワークまわりの勉強をしたい
    • 自分で作れば多少勉強できる気がした
  • 自分で使うための用途にサブスクのクラウドは使いたくない
    • どれくらい使うかわからないし、課金はしたくない
  • 自分で好きなだけ使える
    • いくら使ってもいいし、いくら壊してもいい (電気代はかかるけど)
  • ロマン
    • 『家にサーバーあります』ってかっこいいよね

今回自作したサーバーについて

用途

  • 24時間稼働で、サーバー上で仮想サーバーが何台も動く
    • ハイパーバイザ型にする (Proxmox を使う)
    • グラフィック機能はそれほど必要ない

この目的にあったサーバーを組むために、PCショップのTSUKUMOで店員さんに相談しました。

店員さんに相談するのは良いぞ。自作するときは相談しよう。

構成

相談した結果、今回の構成は以下のようになりました。

→ 約15万円

思ったよりは安く済みました。

マザーボード

CPU、メモリ、SSD、電源とか

サーバーを組む

組み立ての様子

組み立て後の PC

組み立て後の BIOS の画面

組み立てはかなり楽でした。理由としては、

  • 起動診断を TSUKUMO さんにお願いしていた
    • マザボにCPU、SSD、メモリをつけたままにしてくれた
    • 事前に BIOS が起動するのを確認してくれた
  • ケースが大きい
    • マザボや電源の取り付けが楽だった

ということが挙げられます。

Proxmox の導入

今回自作したサーバーは、Proxmox をインストールしてハイパーバイザ型の仮想マシンを動かすことにしました。

ハイパーバイザ型の仮想マシン

Proxmox の特徴

  • Webの管理画面で仮想サーバーの管理ができる
  • 無料で使える (VMWare ESXiは有償になってしまった)
  • SSHでサーバーに入ることができる
  • 複数ノードのクラスタもできる
    • サーバーを冗長構成にできる (今回はやってない)
  • 仮想サーバーのスナップショット機能がある

無料で使えるのが大きい (あと勉強にもなる) ので、今回は Proxmox を使うことにしました。

Proxmox のインストールと設定

Proxmox のインストールの様子

インストールについては、記事や動画が公開されていました。今回は以下の2つを参考にしました。

www.youtube.com

qiita.com

インストール後は、サブスクリプションなしでも使えるリポジトリを追加する必要があります。

(1) /etc/apt/sources.list に以下を追加

deb http://download.proxmox.com/debian/pve bullseye pve-no-subscription

(2) /etc/apt/sources.list.d/pve-enterprise.listコメントアウト

#deb https://enterprise.proxmox.com/debian/pve bullseye pve-enterprise

ここまで設定すると仮想マシンを作れるようになります1

Proxmox の Web 管理画面

まとめ

  • サーバーを自作しました。
    • 総額15万円でした。安い。
  • 店員さんに相談するのは良いぞ
    • 詳しい人に聞いたほうが絶対良いです
    • 最初自分で構成を考えて行ったけど、それを直してもらえる
  • Proxmox をインストールして、Webコンソールから仮想サーバーをいくつか作りました。
  • 今後の予定
    • スイッチングハブを買う (LANポートが全部埋まってしまった)
    • NASを導入して Proxmox のストレージに使いたい
    • 色々動かして遊ぶ

  1. 仮想マシン作成時は、起動前に VM の Options の KVM hardware virtualization を “No” に変更する必要があります。