改訂履歴
2022.12.05 公式実習環境に誘導する記述を追加。あとどこかのタイミングで色々な記載がCTF本の記事とごっちゃになってたので修正(滝汗)。
2022.08.19 仮想NICデバイス名の誤記を修正
2022.05.29 UTMのアップデートに伴い、スクリーンショットおよびパラメータ設定を修正
はじめに
「安全なWebアプリケーションの作り方 第2版」(以降、徳丸本)の実習環境はx86_64アーキテクチャを前提とした構成となっており、アーキテクチャが異なるApple Silicon Macではそのまま動かすことができません。
...この手の実習系はASM民辛いですね。
今回、Mac向けの仮想化環境であるUTMを使って何とか動かすことができましたので、備忘として公開します。
2022.12.05追記 徳丸本公式サポートページでDockerコンテナ版実習環境の提供が始まりました。あえてUTMを弄りたい方以外は公式コンテナ版をお使いください。
想定する読者
- 徳丸本を買って実習しようとワクテカしてたけど、Apple Silicon Macしか持ってなくてつまづいてしまった方
なぜ動かない?
徳丸本の実習環境はx86_64アーキテクチャのVirtualBox環境を前提としていますが、Apple SiliconのCPUはARMアーキテクチャであり互換性がないためです。
使うもの
- Apple Silicon Mac
- 言わずもがなですね。本記事の執筆にあたってはMacBook Air(M1, 2020)で確認しています。
- Homebrew
- サードパーティのパッケージマネージャーです。UTMおよびQEMUを導入するのに使用します。
- UTM
- Mac向けの仮想化環境ソフトウェアです。同一アーキテクチャのハイパーバイザーに加えて、異なるアーキテクチャのエミュレーションにも対応しています。遅くなりますが。
実態としてはQEMUにGUIのフロントエンドが付いたものです。本記事ではHomebrew経由でインストールしますが、App Storeの有償版(App Storeから更新できる以外には機能差異無し)や、サイト上のdmgイメージからの導入でもOKです。
手順1. 各種ソフトウェアの導入
まずはHomebrewをインストールします。ターミナル上でHomebrewのトップページに記載されているインストールコマンドを実行します。
# Homebrewインストールコマンドの実行
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
==> Checking for `sudo` access (which may request your password).
Password: (パスワードを入力)
==> This script will install:
/opt/homebrew/bin/brew
/opt/homebrew/share/doc/homebrew
/opt/homebrew/share/man/man1/brew.1
/opt/homebrew/share/zsh/site-functions/_brew
/opt/homebrew/etc/bash_completion.d/brew
/opt/homebrew
==> The following new directories will be created:
/opt/homebrew/Cellar
/opt/homebrew/Caskroom
Press RETURN to continue or any other key to abort (Enterを入力)
==> /usr/bin/sudo /bin/mkdir -p /opt/homebrew/Cellar /opt/homebrew/Caskroom
(中略)
==> Installation successful!
==> Homebrew has enabled anonymous aggregate formulae and cask analytics.
Read the analytics documentation (and how to opt-out) here:
https://docs.brew.sh/Analytics
No analytics data has been sent yet (or will be during this `install` run).
==> Homebrew is run entirely by unpaid volunteers. Please consider donating:
https://github.com/Homebrew/brew#donations
==> Next steps:
- Run these two commands in your terminal to add Homebrew to your PATH:
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/kumaneko/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
- Run `brew help` to get started
- Further documentation:
https://docs.brew.sh
%
# Next stepsとして指示されたコマンドを実行
% echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/kumaneko/.zprofile
% eval "$(/opt/homebrew/bin/brew shellenv)"
% rehash
続いてUTMをインストールします。
% brew install UTM
(中略)
% rehash
これで必要なソフトウェアのインストールは完了しました。
手順2. 仮想マシンの作成
実習用環境は.ova形式の仮想マシンとして配布されていますが、UTMではこのまま仮想マシンをインポートすることはできません。
そこで、.ova形式のファイルから仮想ディスクを抜き出してUTM(QEMU)に対応した形式に変換します。
# wasbook.ovaの中身を確認
% tar tf wasbook.ova
wasbook.ovf
wasbook-disk001.vmdk
# wasbook.ovaより仮想ディスクイメージwasbook-disk001.vmdkを抽出
% tar xf wasbook.ova wasbook-disk001.vmdk
# 仮想ディスクイメージをvmdk形式からqcow2形式に変換
% qemu-img convert -f vmdk -O qcow2 wasbook-disk001.vmdk wasbook-disk001.qcow2
wasbook-disk001.vmdkはこの先の手順では不要ですので、削除しても結構です。
手順3. 仮想マシンの作成
アプリケーションにUTM.appが導入されていますので、これを起動します。
ウィンドウ上部の「+」をクリックし、続いて[Emulate]をクリックします。
Operating Systemでは[Other]をクリックします。
Otherでは[Skip ISO boot]のチェックを入れて[Continue]をクリックします。
Hardwareでは、配布ovaファイルの構成に倣ってMemoryを512MB、CPU Coresを1にし、[Continue]をクリックします。
Storageではそのまま[Continue]をクリックします。
Shared Dirctoryもそのまま[Continue]をクリックします。
SummaryではNameをwasbookとして、[Open VM Settings]のチェックを入れて[Save]をクリックします。
続いて仮想マシンの編集画面が開きます。
まずIDE Driveで[Delete Drive]をクリックし、既定で作成された仮想ディスクを削除します。
次にNew Driveをクリックし、続いて[Import]をクリックして、先ほど変換した.qcow2ファイルを指定します。
次はNetworkを確認しておきます。Shared Networkで構成されていることを確認しMAC Addressをメモしておきます(後で使います)。
最後にQEMUに移ります。まずは[UEFI Boot]のチェックを外します。
次に下方にスクロールし、1つめの仮想NICの設定を確認しておきます。-device「e1000,mac=(仮想NICのMACアドレス),netdev=net0」および-netdev「vmnet-shared,id=net0」の部分です。
次にウィンドウの最下部に移動し、[New...]となっている欄に「-device e1000,mac=(2つめの仮想NICのMACアドレス),netdev=net1」と入力します。MACアドレスは1つめの仮想NICのものを参考に、16進数下2桁を少し変えたようなものにしておきます。入力したらEnterを入力します。
続いて[New...]となっている欄に「-netdev vmnet-host,id=net1」(+Enter)と入力します。
入力が終わりましたら[Save]をクリックします。
vmdkから変換して生成したqcow2ファイルは以後の手順では使用しないので、削除して結構です。
手順4. ネットワーク設定の調整
それではUTM上で仮想マシンの再生ボタンをクリックして、仮想マシンを起動します
無事起動すればログインプロンプトが表示されますので、徳丸本記載のアカウントでログインします。また、指定したMACアドレスを持つ仮想NICが確かに2つ存在しているか、ip addr
で確認しておきましょう。MACアドレスから判別するに、この例ではenp0s7がShared、enp0s10がHost Onlyの仮想NICとなっています。
ここから先は、仮想マシン側では仮想NICに合わせてネットワーク設定を調整し、ホスト(Mac)側では仮想マシン側のネットワークに合わせてbridgeインターフェイスのIPアドレスを調整します。
# 認識している仮想NICデバイス名に合わせて/etc/network/interfacesを書き換える
# enp0s3をSharedの仮想NICデバイス(前述の例ではenp0s7)に変更
# enp0s8をHost Onlyの仮想NICデバイス(前述の例ではenp0s10)に変更
# エディタはnanoでなくても、viでも何でもいいですよ。
$ sudo nano /etc/network/interfaces
# 編集後の内容を確認
$ cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
## allow-hotplug enp0s7
auto enp0s7
iface enp0s7 inet dhcp
auto enp0s10
iface enp0s10 inet static
address 192.168.56.101
network 192.168.56.0
netmask 255.255.255.0
broadcast 192.168.56.255
# 一旦シャットダウンする
$ sudo halt -p
% sudo nano /Library/Preferences/SystemConfiguration/com.apple.vmnet.plist
<key>Host_Net_Address</key>
<string>192.168.56.1</string> <= Host_Net_Addressを192.168.56.1に変更
<key>Host_Net_Mask</key>
<string>255.255.255.0</string>
仮想マシン側、ホスト側両方の調整が終わりましたら、仮想マシンを再び起動させます。
起動が完了したところで、疎通確認とSSHログインをやってみましょう。
% ping 192.168.56.101
PING 192.168.56.101 (192.168.56.101): 56 data bytes
64 bytes from 192.168.56.101: icmp_seq=0 ttl=64 time=4.210 ms
64 bytes from 192.168.56.101: icmp_seq=1 ttl=64 time=1.609 ms
64 bytes from 192.168.56.101: icmp_seq=2 ttl=64 time=1.767 ms
64 bytes from 192.168.56.101: icmp_seq=3 ttl=64 time=1.927 ms
^C
--- 192.168.56.101 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
% ssh wasbook@192.168.56.101
(中略)
wasbook@192.168.56.101's password: (パスワードを入力)
Linux wasbook 4.9.0-4-686 #1 SMP Debian 4.9.65-3+deb9u1 (2017-12-23) i686
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sat Sep 18 23:49:49 2021
wasbook@wasbook:~$
無事ログインできました!
ようやく実習のスタートラインに立てました。バンザーイ!