ラズパイとAWSで試すセキュリティ検証環境構築(後編)

セキュリティ

2022.04.27

前編では環境設定まで行いました。後編ではこの環境にて利用するDockerイメージをAWSを活用してビルドします。

4. AWS上でDockerイメージのビルド

このステップからはAWSを使用するため、まずはAWSに関する設定を行います。
設定の手順と概要は次のとおりです。

  • IAMユーザーへのロールの適用、git認証情報の生成
  • AWS CodeCommitにリポジトリの作成
  • AWS CodeCommitのリポジトリにソースコードを格納
  • AWS Amazon Elastic Container Registry(ECR)リポジトリを作成
  • AWS CodeBuildにてプロジェクトを作成
  • Dockerイメージのビルド

ご注意:AWS利用料金について

本コラムの以降のステップを進めていただいた場合のAWS利用料金ですが、ソースコードのビルドなど一部を除き、大部分はAWS 無料利用枠の範囲内に収まります。利用するリージョンなどにより料金は異なるため、予め以下の内容をご確認ください。

それでは設定する内容を順番に確認していきます。

● IAMユーザーへのロールの適用、git認証情報の生成

本手順では、AWS CodeCommitなどへのアクセスに使用するIAM ユーザーに対して必要な権限の付与、および、AWS CodeCommitリポジトリへの接続に使用する認証情報の生成を行います。

先ずはAWS コンソールにサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)にアクセスします。 AWS CodeCommitへのアクセスに使用するIAM ユーザーは新規に作成いただいても既存のIAMユーザーでもどちらでも問題ありません(IAMユーザーの新規作成の方法やアクセス許可権限の追加方法については割愛します)。

使用するIAMユーザーに対して、次の権限を追加します。

AWSCodeCommitPowerUser
AmazonEC2ContainerRegistryReadOnly

・ 権限の追加

AWSCodeCommitPowerUser、および、AmazonEC2ContainerRegistryReadOnly 権限を追加します。

権限の追加

・ 権限を追加した状態

権限を追加した状態

・ 認証情報の確認

使用するIAMユーザーの次の情報が必要となるため記録しておきます。

  • AWS アクセスキー/AWS Access Key ID
  • AWS シークレットアクセスキー/AWS Secret Access Key

続いて、AWS CodeCommitリポジトリへアクセスするための認証情報(ユーザー名、パスワード)を生成するため、IAM コンソールからユーザー一覧を表示し、先ほど権限を追加したユーザーを選択して概要画面を開きます。

・ 概要画面にて「認証情報」タブを選択し、「AWS CodeCommit の HTTPS Git 認証情報」欄にある「認証情報を生成」ボタンを押下

概要画面

・ 生成された認証情報を記録

生成された認証情報を記録

この認証情報はAWS CodeCommitリポジトリへソースコードをpushする際に使用します。

● AWS CodeCommitにリポジトリを作成

「米国東部 (バージニア北部) us-east-1」リージョン(※)のAWS CodeCommitにソースコードを格納するためのリポジトリを作成します。
※リージョンは任意に指定いただいて問題ありません。
「米国東部 (バージニア北部) us-east-1」以外を指定した場合、以後は適宜読み替えてください。

・ CodeCommit コンソールにアクセスし、画面右上から「米国東部 (バージニア北部) us-east-1」リージョンを指定後、「リポジトリを作成」ボタンを押下

CodeCommit コンソール

・ 「リポジトリを作成」画面にて、任意のリポジトリ名(例:ita-websec-handson)を入力して「作成」ボタンを押下

リポジトリを作成

・ 作成されたリポジトリとURLとの取得

作成されたリポジトリとURLとの取得

リポジトリの作成後、「URLのクローン」コンボボックスを押下し、表示されたオプションから「HTTPSのクローン」を選択することにより、CodeCommit に接続するためのURLを取得することができます。

取得したURLから、「米国東部 (バージニア北部) us-east-1」リージョンであること、リポジトリ名が「ita-websec-handson」であることが判ります。

https://git-codecommit.us-east-1.amazonaws.com/v1/repos/ita-websec-handson

参考:Git リポジトリを AWS CodeCommit に移行する
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/how-to-migrate-repository-existing.html

● AWS CodeCommitのリポジトリにソースコードを格納

作成したAWS CodeCommitのリポジトリに、前のステップにてKaliにダウンロードしたOWASP Juice Shopのソースコードをプッシュします。
VS Codeを起動していない場合はVS Codeを起動し、OWASP Juice Shopのソースコードがあるフォルダーを開いてください。

・ AWS CodeCommitリポジトリへのpush操作の実施

ターミナルから次のコマンドを実行します。

git push https://git-codecommit.us-east-1.amazonaws.com/v1/repos/ita-websec-handson --all

リージョン、リポジトリ名を変更している場合は赤字個所を適宜修正してください。

「username」、「password」の入力を順に求められるため、前の手順にて生成したgit認証情報のユーザー名、パスワードを入力します。

AWS CodeCommitリポジトリへのpush操作の実施

・ プッシュされたソースコードの確認および修正

AWS CodeCommitリポジトリを参照すると、ソースコードがプッシュされたことを確認できます。
この後にプッシュしたソースコードをビルドしてDockerイメージを作成しますが、プッシュしたものであることが判りやすいようにファイルを一部修正してテーマ設定を変更します(実施せずに次の手順に進んでも問題ありません)。以下に修正するファイルと修正箇所を示します。

修正対象ファイル:/config/default.yml

ファイルを編集する場合はリポジトリ内で修正したいファイルを選択し、「編集」ボタンを押下することで編集可能になります。

修正内容:

修正前 theme: bluegrey-lightgreen
修正後 theme: deeporange-indigo

プッシュされたソースコードの確認および修正

ファイル修正後、修正をコミットする必要があります。コミットの際には次の情報の入力を求められるため、適宜入力してください。

  • 「作成者名」(必須)
  • 「Eメールアドレス」(必須)
  • 「コミットメッセージ」(オプション)

入力完了後、「変更のコミット」ボタンを押下します。

ちなみに、修正対象の「/config/default.yml」ファイルにはOWASP Juice Shopに関してサーバーを起動するポートやタイトルの変更など多くの設定項目があります。
どのような設定が可能かはドキュメントが用意されているためそちらをご確認ください。
なお、今回は直接ファイルを修正しましたが、独自の設定ファイルを用意して任意に設定を切り替えることも可能です。その方法についても記載されていますため併せてご確認ください。

参考:Customization
https://pwning.owasp-juice.shop/part1/customization.html

● AWS Amazon Elastic Container Registry(ECR)リポジトリを作成

AWS CodeCommitリポジトリに格納したソースコードをビルドして生成されたDockerイメージを格納するための場所(リポジトリ)を準備します。

・ Amazon Container Services内のRepositoriesからPrivateを選択し、「リポジトリを作成」ボタンを押下

プライベートリポジトリ

・ 「リポジトリを作成」画面にて、任意のリポジトリ名(例:ita-app)を入力し、「リポジトリを作成」ボタンを押下

リポジトリを作成

Dockerイメージを格納するリポジトリの準備が完了したため、次はソースコードをビルドするための設定を行います。

● AWS CodeBuildにてプロジェクトを作成

AWS CodeCommitに格納したソースコードをビルドするため、コンソールホームからCodeBuildへ遷移し設定を行います。

・ 「ビルドプロジェクト」画面にて「ビルドプロジェクトを作成する」ボタンを押下

ビルドプロジェクト

・ 「ビルドプロジェクトを作成する」画面にて各種設定を実施

ビルドプロジェクトを作成する

なお、プロジェクト名などの設定を順次行っていきますが、「バッチ設定」および「アーティファクト」については特に設定は行わないため説明を省略しています。

・ 「プロジェクトの設定」欄

プロジェクトの設定

プロジェクト名:ita-juice-shop

・ 「ソース」欄

ソース

  • ソースプロバイダ:AWS CodeCommit
  • リポジトリ(※):ita-websec-handson
  • リファレンスタイプ:ブランチ
  • ブランチ:master

※前のステップにて別のリポジトリ名を指定した場合はそちらに合わせて指定してください。

・ 「環境」欄

環境

  • 環境イメージ:マネージド型イメージ
  • オペレーティングシステム:Amazon Linux 2
  • ランタイム:Standard
  • イメージ:aws/codebuild/amazonlinux2-aarch64-standard:2.0
  • イメージのバージョン:このランタイムバージョンには常に最新のイメージを使用してください
  • 特権付与:チェック
  • サービスロール:新しいサービスロール
  • ロール名:codebuild-ita-websec-handson-service-role (自動入力)

ここではサービスロールを新規に作成しています。
CodeBuildで生成したDockerイメージはAWS ECRにプッシュするため、CodeBuildにECRへのアクセスを許可する設定を行う必要があります。
プロジェクト作成後にその許可を行う修正をこのサービスロールに対して行います。

・ 「環境」- 「追加設定」欄
  • コンピューティング:4 GB メモリ、2 vCPUs
  • 環境変数

環境変数の設定の入力フィールドは、最初は1組しか表示されていないため、「環境変数の追加」ボタンを押下して入力フィールドを追加します。
これらの設定値はこの後に設定を行う「Buildspec」の「ビルドコマンド」に反映されます。

環境変数

  • AWS_DEFAULT_REGION:us-east-1
  • AWS_ACCOUNT_ID:********* (ご自身のアカウント ID[画面の右上から確認いただけるかと思います]を指定します)
  • IMAGE_REPO_NAME:ita-app (ECRのリポジトリ名を指定します)
  • IMAGE_TAG:latest
・ 「Buildspec」欄

ビルド仕様を定義します。
参考:CodeBuild のビルド仕様に関するリファレンス
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-spec-ref.html

Buildspec

  • ビルド仕様:ビルドコマンドの挿入
  • ビルドコマンド:「エディタに切り替え」ボタンを押下して以下の内容を入力します。
version: 0.2

phases:
  install:
    runtime-versions:
      docker: 19
      nodejs: 12
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...          
      - docker build -f Dockerfile.arm -t $IMAGE_REPO_NAME .
      - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image...
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
・ 「ログ」欄

ビルドにて何らかのエラーが発生した場合にその詳細を確認するため、ログを有効にしておくことをおススメします。

  • CloudWatch Logs - オプショナル:チェック
  • グループ名:ita-ojs-build
  • ストリーム名:ita-ojs-build

ログ

以上で設定は完了です。
「ビルドプロジェクトを作成する」ボタンを押下します。
続いてコンソールホームからIAMへ遷移し、ロールの設定を行います。
「ロール」画面にて、前の手順で新規に作成した「codebuild-ita-juice-shop-service-role」を選択します。

・ ロールの選択

ロール

・ 選択したロールのポリシーの編集

ポリシーに追加するステートメントは次のとおりです。
赤文字で示した内部の文字列をコピーしてポリシーに追加します。

{
  "Statement": [
    ### BEGIN ADDING STATEMENT HERE ###
    {
      "Action": [
        "ecr:BatchCheckLayerAvailability",
        "ecr:CompleteLayerUpload",
        "ecr:GetAuthorizationToken",
        "ecr:InitiateLayerUpload",
        "ecr:PutImage",
        "ecr:UploadLayerPart"
      ],
      "Resource": "*",
      "Effect": "Allow"
    },
    ### END ADDING STATEMENT HERE ###
    ...
  ],
  "Version": "2012-10-17"
}

ステートメントの追加イメージ

ステートメントの追加イメージ

参考:CodeBuild のDocker サンプル
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-docker.html

● Dockerイメージのビルド

ビルドプロジェクトの作成完了後、作成したビルドプロジェクトに「ビルドを開始」ボタンが表示されます。
「ビルドを開始」ボタンを押下してビルドを行います。

・ ビルドプロジェクト

ビルドプロジェクト

・ ビルド成功

ビルドを開始後、終了するまで多少時間がかかります。

ビルド成功

ビルドに要した時間は次のとおりです(※)。

No. コンピューティング 所要時間
1 4 GB メモリ、2 vCPUs 9 分 23秒
2 16 GB メモリ、8 vCPU 8 分 51秒

※環境設定の「コンピューティング」設定から選択できる2つの環境それぞれで3回実施しての平均値を示しています。

・ ビルド失敗

ビルドに失敗した場合、設定漏れがないか、記述ミスがないかをご確認ください。ログを有効にしている場合はビルド処理のどこでエラーが出ているかが分かるため、その情報を参考に設定漏れなどがあれば修正します。

また、設定にミスがなくビルドに失敗した場合、次のメッセージがログの中に確認できることがあります。

toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit

このメッセージはDocker HubへのPullリクエストの回数制限を超えた場合に出力されます。
回数のカウントはIPアドレス単位に行われ、他のユーザーの方のPullリクエスト回数と合算される点にご注意ください。

なおこのエラーの回避策としては、Docker Hubへのログイン処理をbuildspecに記述する方法が簡単だと思います。
もしまだDocker Hubのアカウントを保有していない場合は新規にアカウントを取得することをおススメします。本コラムの内容を試す程度であれば無料のPersonalプランのアカウントでも十分かと思いますが、Docker Hubの利用状況によってはProプランなどの有償プランをご検討ください。

5. ビルドしたイメージのRaspberry Pi上での実行

AWS環境にてビルドしたDockerイメージをKali環境で使用する準備がようやく整いました。
AWS ECRからDockerイメージを取得するための設定を行い、イメージの取得、OWASP Juice Shopの起動を順に行います。

● AWS CLIの(デフォルト)プロファイル 設定

次のコマンドを実行します。

┌──(kali㉿kali-raspberry-pi)-[~]
└─$ aws configure

4つの事項(アクセスキーID、シークレットアクセスキー、リージョン、出力形式)について入力を求められます。
アクセスキーID、および、シークレットアクセスキーについては前のステップにて権限を追加したIAMユーザーの情報を順に入力します。
リージョン、出力形式については特に変更がなければ次に示す値をそのまま入力します。

AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-east-1
Default output format [None]: json

赤文字部分はダミーの値のため、適宜書き換えて入力します。

● AWS CLIにおけるECR利用の設定

AWS CLIからAWS ECRにアクセスするためのコマンドを実行します。

┌──(kali㉿kali-raspberry-pi)-[~]
└─$ aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin アカウントID.dkr.ecr.us-east-1.amazonaws.com

赤文字部分は適宜書き換えて入力します。

コマンドが問題なく実行された場合、結果として「Login Succeeded」が表示されます。次の手順に進みます。

Login Succeeded

参考:AWS CLI での Amazon ECR の使用
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/getting-started-cli.html

● AWS ECRからDockerイメージの取得

次のコマンドを実行し、AWS ECRからDockerイメージを取得します。

┌──(kali㉿kali-raspberry-pi)-[~]
└─$ docker pull アカウントID.dkr.ecr.us-east-1.amazonaws.com/ita-app:latest

赤文字部分は適宜書き換えて入力します。

● ECRから取得したイメージにてOWASP Juice Shopの起動

イメージ取得に成功後、docker runコマンドにて起動し、http://localhost:3000 にアクセスします。

┌──(kali㉿kali-raspberry-pi)-[~/my-juice-shop]
└─$ docker run --rm -p 3000:3000 アカウントID.dkr.ecr.us-east-1.amazonaws.com/ita-app

赤文字部分は適宜書き換えて入力します。

・ OWASP Juice Shop起動イメージ

修正したテーマが反映されていることを確認できます。

OWASP Juice Shop起動イメージ

● クリーンアップ

検証終了後、使用しないリソースについて削除します。

  • IAM:使用したユーザーの削除、または、アクセスキー、および、git 認証情報の無効化/削除
  • AWS CodeCommit:リポジトリの削除
  • AWS Amazon Elastic Container Registry(ECR):リポジトリの削除
  • AWS CodeBuild:プロジェクトの削除

おわりに

お疲れ様でした。以上で終了になりますが、いかがでしたでしょう?
Raspberry Piは教育用として利用されることを想定して当初は作成され、その後にIoTの試作品開発などにも利用されてきた経緯のため、処理性能はそれほどでもありません。ですが、VS CodeやDocker、コンテナで起動したOWASP Juice ShopなどはRaspberry Pi上でも特に問題なく動作することが確認できたかと思います。

セキュリティに関する検証を行う場合、その結果として検証環境に何らかの改変を与えることが多く、検証環境の構築とその維持は時間や手間がかかる上にストレージを圧迫するなど悩ましい面が多くありました。ですが、気軽に環境の構築/破棄が行えるDockerやRaspberry Pi、クラウドなどを併用することにより、そうした検証環境にまつわる苦労の解消に役立てることができます。

もしクライアントの処理能力が不安な場合は、Raspberry PiではなくアップルのM1チップを搭載したMacを利用することも可能ですし、また、サーバーもAWSのArm採用のインスタンスを活用することでコストパフォーマンスや省電力性能に期待できるなど、適材適所で機材を選択することで多くのメリットが考えられる状況になりました。一概には言えませんが、少なくとも本コラムでご覧いただいたように開発や検証環境として、Armも採用の選択肢になると考えられます。

弊社ではエンジニアが講師を担当するクラウドやセキュリティ等の各種のトレーニングコースを提供しています。トレーニングにてクラウドなどをより活用するためのノウハウの獲得もできるため、クラウドの導入を検討されている、セキュリティについて学びたい場合など、受講を検討されてみてはいかがでしょう。

※文章中の商品名、会社名、団体名は、各社の商標または登録商標です。

ラズパイとAWSで試すセキュリティ検証環境構築(後編)