fbpx

ECS-Fargate環境にAqua Platformをデプロイしてみた – サイドカー編 #Aqua Platform #コンテナ #セキュリティ #AWS #ECS #CloudFormation

この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。

はじめに

前回は、埋め込みタイプでコンテナの中にMicroEnforcerをデプロイしました。今回は、サイドカータイプでMicroEnforcerをデプロイする手順について紹介します。
本稿は、前回の補足的な位置づけであるため、ECS-Fargate上に、Aqua Platformがデプロイ済みであることを前提とします。また、手順が重複する箇所(タスク定義の起動・動作確認テスト)に関しては割愛します。

本稿を読み進めるにあたって、以下の注意点があります。

  • 本稿では、EC2のインスタンス上に作られたLinux環境とAWSマネジメントコンソールで作業を進めて行きます。EC2のインスタンス上に作られたLinux環境のことを、本稿では作業環境と呼称します。
  • AWS CLIのConfig設定など、AWS CLIの一般的な使用方法については割愛します。

コンポーネントの紹介

次に、本稿に登場するコンポーネントを紹介します。

  • Aqua Server:Aqua Platformの中央制御コンポーネントです(コンソールまたは管理コンソールとも呼ばれます)。
  • Aqua Gateway:Aqua ServerとMicroEnforcerの間の通信を処理します。
  • Aqua Database:Aqua ServerおよびAqua Gatewayで使用されるデータベースです。Aqua Platformの構成(セキュリティ関連のポリシー、ユーザーの役割、オプションなど)及びセキュリティ監査の結果に関連する情報を格納します。
  • MicroEnforcer:Aqua Platformのエージェントとして機能し、実行中のコンテナにランタイム保護の機能を提供します。
  • アプリケーションコンテナ:MicroEnforcerによって保護される対象となるアプリケーションコンテナです。
  • サイドカーコンテナ:MicroEnforcerのバイナリが埋め込まれたコンテナです。起動した後、アプリケーションコンテナにMicroEnforcerのバイナリを渡して、その後停止します。
    なお、Enforcerにはいくつか種類があり、その中でもMicroEnforcerはECS-Fargate上で使用されるものです。

各コンポーネントの構成は、下図の通りになっております。

作業全体のオーバービュー

  1. サイドカータイプでMicroEnforcerをFargateにデプロイする
    • サイドカー用イメージをビルドしてECRにpushする
    • ECS-Fargateタスク定義の作成
    • ECS-Fargateタスクの起動

サイドカータイプでMicroEnforcerをFargateにデプロイする

サイドカータイプの手順では、アプリケーションコンテナとは別に、MicroEnforcerの埋め込まれたサイドカーコンテナを用意して、2つのコンテナをデプロイします。

サイドカータイプでコンテナを起動する流れを説明します。Fargateタスクを起動した後、まずサイドカーコンテナとアプリケーションコンテナが起動します。サイドカーコンテナからアプリケーションコンテナにMicroEnforcerのバイナリを渡した後、サイドカーコンテナは停止し、アプリケーションコンテナにMicroEnforcerが埋め込まれた状態となります。これでサイドカータイプでのコンテナ起動は完了です。

MicroEnforcerが埋め込まれたアプリケーションコンテナは、Aqua Platformのランタイム保護の機能が有効化し、コンテナ実行中の不正な動作を制限することが可能となります。

サイドカー用イメージをビルドしてECRにpushする

まず、あらかじめ以下の作業が完了していることを確認してから、手順に取り掛かってください。

  • 作業環境上にDockerのインストールが完了していること。
  • 作業環境上にAWS CLIのインストール・初期設定が完了していること。
  • 保護対象となるアプリケーションコンテナのイメージを別途用意しておくこと。

作業環境上にDockerFfileのビルドに使うための作業ディレクトリを作成し、MicroEnforcerのバイナリを作業ディレクトリの中に配置します。

作業環境上で作業ディレクトリに移動します。そして前回のブログでも使用した資材(policy.json・firewall.json)を作業ディレクトリの中に格納します。

サイドカーコンテナのDockerfileを作成し、ビルドします。今回の例ではalpineをベースイメージとして使います。

設定値の入力例

$ cat Dockerfile
FROM alpine
COPY microenforcer /bin/microenforcer
USER root
RUN ["chmod", "+x", "/bin/microenforcer"]
RUN ["/bin/microenforcer", "aqua-init"]
VOLUME ["/.aquasec"]
ADD policy.json /.aquasec/policy/policy.json
ADD firewall.json /.aquasec/policy/firewall.json
COPY microenforcer /.aquasec/bin/microenforcer
RUN ["chmod", "+x", "/.aquasec/bin/microenforcer"]
RUN addgroup -g 11433 -S aqua && \
adduser -h /home/aqua -g "aqua user" -s /sbin/nologin -G aqua -S -u 11431 aqua
USER aqua
ENV LD_PRELOAD='/.aquasec/bin/$PLATFORM/slklib.so'
ENV AQUA_MICROENFORCER="1"
ENV AQUA_DEBUG_TYPE=STDOUT
LABEL name="Aqua MicroEnforcer" \
vendor="Aqua Security Software Ltd." \
summary="Aqua Security Microenforcer" \
description="The Aqua Security MicroEnforcer provides runtime protection." \
com.aquasec.component=microenforcer \
com.aquasec.baseimage=alpine \
product=aquasec \
maintainer="admin@aquasec.com"
$ sudo docker build --no-cache -t ecr-tabata/aqua-sidecar:1.0 .

次に作業環境上にて、AWS CLIでECRにログインし、イメージ名をECR上のリポジトリ名に合わせた後、サイドカーコンテナのイメージをECRにpushします。

ECS-Fargateタスク定義の作成

AWSマネジメントコンソールのECSの画面より、タスク定義を作成します。
今回は埋め込みタイプとは違い、アプリケーションコンテナとMicroEnforcerの埋め込まれたサイドカーコンテナが定義されたタスク定義を作成します。

AWSマネジメントコンソールからECSの画面に行き、画面左側の「タスク定義」をクリックします。

タスク定義の画面が表示されるので、「新しいタスク定義の作成」をクリックします。

起動タイプと互換性の選択という画面が表示されます。デフォルトでは「Fargate」が選択されているため、何も変更せずに「次のステップ」をクリックします。

新しいタスクの作成という画面が表示されます。下記の入力例を参考に、設定項目を入力します。

設定値の入力例

タスクとコンテナの定義の設定
タスク定義名:任意の名前
タスクロール:ecsTaskExecutionRole
オペレーティングシステムファミリー:任意のOS 例:Linux
タスクの実行IAMロール
タスク実行ロール:ecsTaskExecutionRole
タスクサイズ
タスクメモリ:任意の値 例:0.5GB
タスクCPU:任意の値 例:0.25vCPU

次に、コンテナの定義を作成します。埋め込みタイプと違い、サイドカーコンテナとアプリケーションコンテナの2つを定義する必要があります。

まずは、サイドカーコンテナを定義します。コンテナ定義より「コンテナの追加」をクリックします。

「コンテナの追加」という画面が表示されます。下記の入力例を参考に、設定項目を入力し、画面下部の「追加」をクリックします。

設定値の入力例

Aquaサイドカーコンテナ
コンテナの追加
スタンダード
コンテナ名:任意の名前
イメージ:対象のイメージのECR上のURI
詳細コンテナ設定
環境
基本:レ点チェックを外す

サイドカーコンテナが追加されたことを確認します。

次にアプリケーションコンテナの定義をします。
コンテナ定義より「コンテナの追加」をクリックします。

「コンテナの追加」という画面が表示されます。下記の入力例を参考に、設定項目を入力し、画面下部の「追加」をクリックします。

設定値の入力例

アプリケーションコンテナ
コンテナの追加
スタンダード
コンテナ名:任意の名前
イメージ:対象のイメージのECR上のURI
ポートマッピング:80
詳細コンテナ設定
環境
基本:レ点チェックを入れる
エントリポイント:サイドカーコンテナ上に配置したMicroEnforcerバイナリのパス,事前準備で取得した値
コマンド:事前準備で取得した値
環境変数
AQUA_MICROENFORCER:1
AQUA_SERVER:Aqua GatewayのプライベートIPアドレスとポート(通常は8443)
AQUA_TOKEN:「MicroEnforcerのEnforcer Groupの作成」で控えたトークン値
AQUA_IMAGE_ID:事前準備で取得したDockerイメージIDの値
LD_PRELOAD:'/.aquasec/bin/$PLATFORM/slklib.so'
ストレージとログ
ボリュームソース:<サイドカーコンテナの名前>

アプリケーションコンテナが追加されたことを確認します。

「新しいタスク定義の作成」の画面に戻り、画面下部の「作成」をクリックすると、タスク定義が完成されます。

ECS-Fargateタスクの起動

前回と同様の手順でFargateタスクを起動させ、タスクの詳細画面を開くと、アプリケーションコンテナとサイドカーコンテナの2つが立ち上がっている様子が分かります。

最初2つのコンテナはステータスが「PENDDING」となっています。しばらくすると、サイドカーコンテナのステータスが「STOPPED」となり、アプリケーションコンテナが「RUNNING」となることで、タスクの起動は正常に完了します。

Aqua PlatformのEnforcerの画面から、MicroEnforcerとの疎通が取れていることを確認できます。

まとめ

今回はサイドカータイプでECS-Fargate上にコンテナをデプロイする手順を紹介しました。

埋め込みタイプと違い、タスク定義を作成する段階でアプリケーションコンテナを自由に選択できるため、アプリケーションコンテナのDockerfileを変更する必要がありません。
ですので、サイドカータイプの方が柔軟に運用できるのではないでしょうか。

Aquaの導入を検討している方は是非、参考にして頂けたら幸いです。

新規CTA