ラズパイとAWSで試すセキュリティ検証環境構築(前編)
はじめに
最近のデジタル業界において、Armに関する話題への注目度が高まっています。
以前よりスマートフォンやタブレット端末向けにはArmが採用されていたため、身近にもArmは存在していました。ですがこれまではどちらかといえばその省電力さなどから、Armは組み込み用途や小型端末向けのもの、というイメージでした。
しかしこの1~2年ほどの間に、アップル社からはArmアーキテクチャのM1シリーズのチップを搭載したMacやiPadが、Microsoft社からはArm版のWindows OSやArmアーキテクチャのMicrosoft SQ1/SQ2が、また、AWSからも同様にArmアーキテクチャのAWS Gravitonシリーズを利用したサービスがリリースされるなど各社ともArmの採用が進み、省電力性能だけではなく処理性能の面でも期待が高まっています。
とはいえ、これまでのイメージから「Armは使いにくいのでは?」、「ワークフローをArmベースに変更するにはまだ早いかな?」などの印象を持っている方もいらっしゃるかと思います。
そのため本コラムでは、最近のシステム開発で利用されることも多いVS CodeやDockerなどをArm端末にインストールして実行してみたいと思います。Arm端末には比較的安価なRaspberry Piを使用し、また併せてAWSのクラウドサービスも利用します。そして、これらを使ってセキュリティ検証に利用可能な環境の構築を行います。
本コラムの内容を実践いただくことにより、Armを使ったシステムが(意外と?)活用できることを体験いただけるかと思います。
概要
- 1. ゴール
本コラムでは、Arm環境(Raspberry Pi)にてセキュリティ検証環境(OWASP Juice Shop)の構築を行い、その過程の中で複数のツールなどを試用してArm環境を体験いただくことを目的としています。 - 2. 使用機材など
- ●Raspberry Pi (本体)
本コラムの内容は次の機種で動作確認を行なっています。- ・Raspberry Pi 400
- ・Raspberry Pi 4(4GB)
- ●microSDカードなどのOSインストール用ストレージ
Raspberry PiのOSをインストールするためのストレージを用意します。
現在、Raspberry PiはmicroSDだけではなく、Raspberry Pi本体のUSBに接続したUSBメモリ/HDD/SSDなど各種ストレージからOSを起動することが可能になっています。本コラムの内容をとりあえず試すだけであれば、特にどのストレージでもこだわる必要はありませんが、容量としては32GB〜256GB程度のものが使いやすいかと思います(容量が大きいと初回起動時に時間がかかるため)。
もし可能であれば、microSDカードの場合はA1規格対応のものを、USB接続したストレージを使用する場合はSSDがおススメです。※ご注意
ストレージはOS書き込み時に内容が消去されるため、必要に応じて事前にバックアップをとるようご注意ください。 - ●Windows 10 PC
Raspberry Piで使用するOSを準備するために使用します。そのため、microSDカードなど上述のOSインストールに使用するストレージの読み書きができ、インターネット接続してOSイメージのダウンロード、および、OSイメージの保存ができるだけの容量(約2G)の確保が可能な端末をご用意ください。 - ●AWS
使用するAWSサービスとその役割は次のとおりです。- ・AWS CodeCommit
マネージド型のプライベートなGit リポジトリです。検証に使用するDockerイメージのためのコード一式を保存します。 - ・Amazon Elastic Container Registry(ECR)
AWSが提供するコンテナサービスの一つで、ビルドしたDockerイメージを保存するプライベートなコンテナリポジトリです。 - ・AWS CodeBuild
AWS CodeCommitに保存されたコードをもとにビルドします。
- ・AWS CodeCommit
- ●Raspberry Pi (本体)
本コラムの内容を実際に試す場合にはAWSアカウントが必要になるため、まだAWSアカウントを保有していない場合はAWSサイトの手順(※)に従いアカウントを作成してください。
※ AWS アカウント作成の流れ(https://aws.amazon.com/jp/register-flow/)
環境
使用する主なOSやツールとそのバージョンは次のとおりです。
- ●Kali linux 2022.1
- ●Raspberry Pi Imager 1.7.1
- ●AWS CLI 2.4.29
- ●Visual Studio Code 1.65.2
- ●OWASP Juice Shop 13.2.2
実施手順
次節より以下に示すステップで進めますが、前半(1〜3)はOSのインストールや環境構築などの内容が中心のため、既に認識済みの内容の場合は適宜読み飛ばしてください。
後半では本コラムで使用するOWASP Juice Shopをカスタマイズすることを念頭に、クラウド(AWS)を活用してより快適に使用する方法を試します。
なお、各手順内で画面キャプチャなどを掲載していますが、これはコラム執筆時点のものになります。予めご了承ください。
- 1.Raspberry PiへのKali Linuxのインストール
- 2.Kali Linux上の環境構築
- 3.コンテナでのOWASP Juice shopの起動
- 4.AWS上でDockerイメージのビルド
- 5.ビルドしたイメージのRaspberry Pi上での実行
1. Raspberry PiへのKali Linuxのインストール
● イメージ入手からKali Linux起動まで
本コラムでは、セキュリティに関するツール類が予め用意されているKali Linux(以降、Kali)をRaspberry Piにインストールして使用します。そのため、先ずはKaliのインストール手順を示します(本手順についてはWindows 10 PCを使用しています)。
次のURLからKaliのイメージをダウンロードします。
https://www.kali.org/get-kali/#kali-arm
・ Kaliのダウンロード
使用するイメージは次のとおりです。
Raspberry Pi 2 (v1.2), 3, 4 and 400 (64-Bit)
イメージのダウンロード完了後、ストレージへKaliの書き込みを行います。
イメージの書き込みには、Raspberry Pi公式の「Raspberry Pi Imager」や、「Rufus」、「balena Etcher」などのツールが利用可能です。ここでは「Raspberry Pi Imager」を使用して書き込みを行います(下図参照)。
次のURLから「Raspberry Pi Imager」をダウンロードします。
https://www.raspberrypi.com/software/
・ Raspberry Pi Imagerのダウンロード
ダウンロード完了後、「Raspberry Pi Imager」を起動します。
・ Raspberry Pi Imagerの起動
「CHOOSE OS」ボタンを押下します。
・ ストレージに書き込むOSイメージの選択
メニューの下部にある「Use custom」を選択し、前の手順にてダウンロードしたKaliのイメージを指定します。
・ 書き込むストレージの選択
「CHOOSE STORAGE」ボタンを押下し、Kaliのイメージを書き込むストレージのドライブを指定します。
ドライブ指定後、「WRITE」ボタンを押下することにより、書き込み処理が実行されます。
書き込み完了後、そのストレージを使用してRaspberry Piを起動します。
初回起動時は初期化処理のため使用しているストレージの速度や容量によっては起動完了まで時間がかかることがあります。
起動するとログイン画面が表示されますので、次のユーザーIDとパスワードでログインします。
ユーザーID:kali
パスワード:kali
・ Kaliデスクトップ
以降にはコマンド実行の手順がありますが、コマンド実行はKaliのデスクトップ画面左上にある「ターミナル」から行うことが可能です。
インターネットに接続し、Terminalを起動してKaliをアップデートします。
アップデートはネットワークの状況等にもよりますが多少時間がかかるためご注意ください(本コラム執筆時には20分以上かかりました…)。
・ Kaliのアップデート
┌──(kali㉿kali-raspberry-pi)-[~] └─$ sudo apt update ┌──(kali㉿kali-raspberry-pi)-[~] └─$ sudo apt full-upgrade -y
2. Kali Linux上での環境構築
Kaliのインストールが終了したため、引き続き各種のツール類のインストール、および、以降の手順にて使用するソースコードのダウンロードを行います。
● Dockerインストール
KaliにおけるDockerのインストールは次のコマンドを実行します。
┌──(kali㉿kali-raspberry-pi)-[~] └─$ sudo apt install -y docker.io ┌──(kali㉿kali-raspberry-pi)-[~] └─$ sudo systemctl enable docker --now ┌──(kali㉿kali-raspberry-pi)-[~] └─$ docker
以上でDockerのインストールは完了ですが、このままではDockerコマンドを実行する際にsudoが必要です。sudoなしでDockerコマンドを使用する場合は、次のコマンドを実行します。
┌──(kali㉿kali-raspberry-pi)-[~] └─$ sudo usermod -aG docker $USER
コマンド実行後、ログアウトし、再度ログインしてください。以降はsudoなしでDockerコマンドの実行が可能です。
参考:https://www.kali.org/docs/containers/installing-docker-on-kali/
● Visual Studio Codeインストール
次のURLからVisual Studio Code(以下、VS Code)をダウンロードします。
https://code.visualstudio.com/#alt-downloads
ダウンロード対象は、「.deb」の ARM 64になります。
ダウンロード完了後、次のコマンドを実行してインストールします。
・ インストールコマンド
┌──(kali㉿kali-raspberry-pi)-[~]
└─$ sudo apt install ./<file>
<file>にはダウンロードしたファイル名を指定してください。
例) sudo apt install ./code_1.65.2-1646922911_arm64.deb
インストールが完了すると、Kaliのデスクトップの画面左上にある「Applications」アイコンなどからVS Codeを起動できます。
次に日本語化を行います。
VS Codeの左側にあるActivity BarからVS CodeExtensionsアイコンを選択し、「Japanese Language Pack for Visual Studio Code」をインストールします。インストール後、VS Codeを再起動し、日本語化されていることを確認します。
以降、各種のコマンド実行についてはVS Codeの統合ターミナル(VS Code上でCtrl + 「`」キーを押下すると表示されます)が利用可能です。
これまで同様にKaliのターミナルを使用いただいても問題ありませんので、使いやすい方で進めてください。
● AWS CLIのインストール
AWSをコマンドラインから使用するためのツールであるAWS CLIをインストールするため、次のコマンドを実行します。
┌──(kali㉿kali-raspberry-pi)-[~] └─$ curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip" ┌──(kali㉿kali-raspberry-pi)-[~] └─$ unzip awscliv2.zip ┌──(kali㉿kali-raspberry-pi)-[~] └─$ sudo ./aws/install
ツールの使用に際してはアクセスキー情報などの設定が必要となります。後ほど必要となったタイミングで実施します。
参考:Installing or updating the latest version of the AWS CLI
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html
● ソースコードのダウンロード
次のコマンドを実行し、OWASP Juice Shopのソースコードをダウンロードします。”my-juice-shop”は任意のフォルダー名を指定してください。
┌──(kali㉿kali-raspberry-pi)-[~]
└─$ git clone https://github.com/bkimminich/juice-shop.git my-juice-shop
VS Codeを起動し、OWASP Juice Shopのフォルダーを開きます。
本コラム内ではソースコードの閲覧やコマンドの実行にはVS Codeを使用します。他のエディタ等を使い慣れている方はそちらを使用いただいて問題ありません。
3. コンテナでのOWASP Juice shopの起動
本ステップではRaspberry Pi上のDockerで、以下の2つの方法を使用してOWASP Juice Shopを起動させ、それぞれの方法のメリット&デメリットを確認します。
- 1.Docker HubからOWASP Juice ShopのDockerイメージを取得して実行する
- 2.OWASP Juice ShopのソースコードからDockerイメージをビルドして実行する
なお、本ステップの内容は特に実行せずとも次のステップに影響はありません。実行には多少時間を要するため(環境によっては計30分以上)、参考程度に結果だけをチェックして次に進めていただいて問題ありません。
1. Docker HubからOWASP Juice ShopのDockerイメージを取得して実行する
OWASP Juice ShopのDockerイメージはDocker Hubに登録されているため、docker pullで取得することが可能です。
ポイントとして、Raspberry Pi上で動作するArm版のイメージを取得する場合はタグの指定(:latest-arm)が必要になります。実行するコマンドは次のとおりです。
・ Arm版のDockerイメージの取得
┌──(kali㉿kali-raspberry-pi)-[~] └─$ docker pull bkimminich/juice-shop:latest-arm
イメージ取得後、次のコマンドを実行することでブラウザからアクセスすることが可能です(アクセスするURLは http://localhost:3000 になります)。
・ 取得したDockerイメージの実行
┌──(kali㉿kali-raspberry-pi)-[~] └─$ docker run --rm -p 3000:3000 bkimminich/juice-shop:latest-arm
2. OWASP Juice ShopのソースコードからDockerイメージをビルドして実行する
前ステップにてダウンロードしたOWASP Juice ShopのソースコードからDockerイメージをビルドします。
・ ソースコードを格納したフォルダーへ移動し、ビルドコマンドを実行
┌──(kali㉿kali-raspberry-pi)-[~] └─$ cd my-juice-shop ┌──(kali㉿kali-raspberry-pi)-[~/juice-shop] └─$ docker build -f Dockerfile.arm . -t my-shop
“-t”オプションを使用し、イメージ名として”my-shop”を付与していますが、任意のイメージ名を指定していただいて問題ありません。
・ ビルドしたDockerイメージの実行
┌──(kali㉿kali-raspberry-pi)-[~/juice-shop]
└─$ docker run --rm -p 3000:3000 my-shop
実行後、1と同様に http://localhost:3000 にアクセスすることでOWASP Juice Shopが利用可能です。
・ OWASP Juice Shop起動イメージ
OWASP Juice Shopはさまざまな脆弱性を含んだWebアプリケーションです。ツールの検証や脆弱性の理解のための学習環境としても利用でき、お題が低難易度から高難易度のものまで多数用意されているため、セキュリティの初学者の方でも取り組みやすいものになっています。もしまだ触れたことがない場合は色々と操作してみるとよいかと思います。
1の方法は公式により提供されたビルド済みのイメージを利用するため、実行までに要する時間はイメージのダウンロード時間が大半です。この方法はpull実行時のタグさえ気を付ければよく、Arm環境でOWASP Juice Shopを手軽に試すには簡単でよいのですが、カスタマイズがやや手間です。
2の方法はソースコードからDockerイメージをビルドして実行するため、カスタマイズ(ソースコードの修正)は容易です。ですが、ビルドに時間を要するうえ(※1)、ビルド中は(特にラズパイなどのマシンパワーが低い場合)当該端末で他の作業ができないほど負荷がかかる場合もあります。
そこで、次のステップではクラウド(AWS)を活用し、マシンパワーを必要とするビルド作業(※2)をAWS上で実行、かつ、DockerイメージをAWS上に格納することで、1、2のそれぞれの方法の良い点を活かしたいと思います。
※1:今回のケースでは当方の環境で初回のビルドは30分以上かかりました。なお、2回目以降のビルドではキャッシュが利用されるため、その分ビルド時間は短くなります。
※2:プロジェクト規模によってはビルド自体がメモリ不足などによりエラーとなったり、現実的な時間内にビルドが終了しなかったりなどがあります。
以上で環境設定とOWASP Juice Shopの起動確認まで完了しました。
後編では設定した環境を利用し、AWSにてビルドしたDockerイメージの起動を行います。
※文章中の商品名、会社名、団体名は、各社の商標または登録商標です。