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上で使用されるものです。
各コンポーネントの構成は、下図の通りになっております。
作業全体のオーバービュー
- サイドカータイプで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の導入を検討している方は是非、参考にして頂けたら幸いです。