Aqua EnterpriseをAmazon EKS環境で構築する

クラウドネイティブアプリケーションのためのセキュリティソリューションであるAqua Enterpriseについて、Amazon EKSなどKubernetesクラスターを利用してセットアップする手順を記載しました。セットアップ後、管理ダッシュボードにログインすると、Kubernetesクラスター上で利用されているコンテナイメージの脆弱性スキャン、EC2などホストインスタンスを含んだRisk Explorerなど、Aqua Enterpriseが提供するセキュリティ機能がすぐに利用できる状態となります。
2021.11.09

コンサル部のとばち(@toda_kk)です。

クラウドネイティブアプリケーションのためのセキュリティソリューションであるAqua Enterpriseについて、Amazon EKS環境で構築する手順について記載します。

Aqua Enterpriseに関する詳細は、以前の記事にまとまっておりますのでそちらをご参照ください。

Aqua Enterpriseのセットアップでは、Kubernetes(OpenShift含む)を中心に、Amazon ECSやDockerコンテナでの起動といったさまざまな環境で構築が可能となっています。Dockerコンテナを利用してセットアップする手順については、下記の記事をご参照ください。

なお、本記事ではAmazon EKSを利用した検証を基本としていますが、Microsoft AzureやGoogle Cloudといった他のマネージドKubernetesサービスや、マネージドでないKubernetesクラスターの場合でも、セットアップ手順は大きくは変わりません。

前提・注意点について

本記事における検証においては、Aqua社から提供いただいたトライアルアカウントを利用しています。コンテナイメージや、セットアップ用のドキュメントなどは、公式ドキュメントアクセス用のアカウントが必要となりますのでご留意ください。

また、本記事ではセットアップにおける環境としてEKSを利用する手順について記載しています。監視対象としてEKS環境を指定する方法については範囲外としておりますので、ご注意ください。

Amazon EKSを利用したセットアップ手順

基本的に、下記の公式ドキュメントに従って実施していきます。

2つのセットアップ方法

Aqua Enterpriseのセットアップ環境としてKubernetesを利用する場合は、下記3つの方法があります。

  • 手動(manual)で構築する方法
  • Aqua社が提供するHelm Chartを利用して構築する方法
  • Aqua社が提供するCLIツールであるAquactlを利用して構築する方法

本記事では、手動で構築する手順について記載します。Helm ChartやAquactlを利用する手順については、公式ドキュメントをご参照ください。

手動で構築する場合、GitHubリポジトリで公開されているマニフェストファイルをそのままkubectl applyするような形になります。

ファイルの内容は下記から確認できます(2021年11月現在の最新バージョンは6.5です。)

事前準備

公式ドキュメントの "Quick-Start Guide" に従い、事前に下記の項目を準備しておきます。

  • Aqua Enterpriseコンソール(https://my.aquasec.com/)の認証情報(ユーザー名、パスワード)
  • Aqua Enterpriseのライセンストークン
  • kubectlコマンドを介してKubernetesクラスターにアクセスできる環境

今回は検証目的ということで、eksctlを利用してEKSクラスターを新たに作成しました。

EKSクラスターの新規作成

$ eksctl create cluster

eksctlを利用してEKSクラスターを作成すると、自動的にkubeconfigにクラスターの情報が追加され、kubectlコマンドを介してEKSクラスターと通信できるようになります。

マニフェストファイルを利用したセットアップ

公式ドキュメントに従い、下記コマンドを実行してマニフェストファイルをapplyします。

マニフェストファイルから構築する

$ kubectl create namespace aqua
$ kubectl create secret docker-registry aqua-registry --docker-server=registry.aquasec.com --docker-username=<AQUA_USER> --docker-password=<AQUA_PASSWORD> -n aqua
$ kubectl apply -f https://raw.githubusercontent.com/aquasecurity/deployments/6.5/quick_start/kubernetes_and_openshift/manifests/aqua-csp-quick-default-storage.yaml

Namespaceを元に作成されたリソースを確認すると、Aqua Enterpriseを構成するさまざまなコンポーネントに必要なリソースが作成されていることがわかります。

作成されるリソース

$ kubectl get all -n aqua
NAME                                      READY   STATUS    RESTARTS
pod/aqua-agent-4k425                      1/1     Running   0
pod/aqua-agent-khlrr                      1/1     Running   0
pod/aqua-audit-db-0                       1/1     Running   0
pod/aqua-db-0                             1/1     Running   0
pod/aqua-gateway-7f7585f89c-sdsk4         1/1     Running   0
pod/aqua-kube-enforcer-6b574697c5-b7nz8   1/1     Running   0
pod/aqua-web-5f494bd84-qpjbk              1/1     Running   1
pod/starboard-operator-6c44948b9b-dfzsr   1/1     Running   0

NAME                         TYPE           CLUSTER-IP       EXTERNAL-IP                                   PORT(S)                      
service/aqua-audit-db        ClusterIP      10.100.75.24     <none>                                        5432/TCP
service/aqua-db              ClusterIP      10.100.78.110    <none>                                        5432/TCP
service/aqua-gateway         LoadBalancer   10.100.21.101    xxxxxxxxxx.ap-northeast-1.elb.amazonaws.com   8443:31244/TCP,3622:31298/TCP
service/aqua-kube-enforcer   ClusterIP      10.100.214.231   <none>                                        443/TCP
service/aqua-web             LoadBalancer   10.100.30.110    yyyyyyyyyy.ap-northeast-1.elb.amazonaws.com   443:30700/TCP,8080:30801/TCP

NAME                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR
daemonset.apps/aqua-agent   2         2         2       2            2           <none>

NAME                                 READY   UP-TO-DATE   AVAILABLE
deployment.apps/aqua-gateway         1/1     1            1
deployment.apps/aqua-kube-enforcer   1/1     1            1
deployment.apps/aqua-web             1/1     1            1
deployment.apps/starboard-operator   1/1     1            1

NAME                                            DESIRED   CURRENT   READY
replicaset.apps/aqua-gateway-7f7585f89c         1         1         1
replicaset.apps/aqua-kube-enforcer-6b574697c5   1         1         1
replicaset.apps/aqua-web-5f494bd84              1         1         1
replicaset.apps/starboard-operator-6c44948b9b   1         1         1

NAME                             READY
statefulset.apps/aqua-audit-db   1/1
statefulset.apps/aqua-db         1/1

NAME                                                                                SCANNER
configauditreport.aquasecurity.github.io/configmap-aqua-csp-db-config               Conftest
configauditreport.aquasecurity.github.io/configmap-aqua-csp-enforcer                Conftest
configauditreport.aquasecurity.github.io/configmap-aqua-csp-kube-enforcer           Conftest
configauditreport.aquasecurity.github.io/configmap-aqua-csp-server-config           Conftest
configauditreport.aquasecurity.github.io/configmap-starboard                        Conftest
configauditreport.aquasecurity.github.io/configmap-starboard-conftest-config        Conftest
configauditreport.aquasecurity.github.io/daemonset-aqua-agent                       Conftest
configauditreport.aquasecurity.github.io/replicaset-aqua-gateway-7f7585f89c         Conftest
configauditreport.aquasecurity.github.io/replicaset-aqua-kube-enforcer-6b574697c5   Conftest
configauditreport.aquasecurity.github.io/replicaset-aqua-web-5f494bd84              Conftest
configauditreport.aquasecurity.github.io/replicaset-starboard-operator-6c44948b9b   Conftest
configauditreport.aquasecurity.github.io/role-aqua-kube-enforcer                    Conftest
configauditreport.aquasecurity.github.io/rolebinding-aqua-kube-enforcer             Conftest
configauditreport.aquasecurity.github.io/service-aqua-audit-db                      Conftest
configauditreport.aquasecurity.github.io/service-aqua-db                            Conftest
configauditreport.aquasecurity.github.io/service-aqua-gateway                       Conftest
configauditreport.aquasecurity.github.io/service-aqua-kube-enforcer                 Conftest
configauditreport.aquasecurity.github.io/service-aqua-web                           Conftest
configauditreport.aquasecurity.github.io/statefulset-aqua-audit-db                  Conftest
configauditreport.aquasecurity.github.io/statefulset-aqua-db                        Conftest

Aqua Enterpriseを構成するコンポーネントに関する詳細については、下記の記事をご参照ください。

コンポーネントイメージ図

Aqua Server、Aqua Database、Aqua Gatewayといった主要なコンポーネントが、Podとして起動していることがわかります。

今回はFargateを利用せずEC2でEKSクラスターを構成しているため、Deamonsetとしてaqua-agentが動いています。

Aqua Databaseは実態としてはPostgreSQLであり、データの永続性を確保するためにStatefulSetとして提供されています。もしデータプレーンとしてFargateを利用する場合は、EFSなどを利用してデータの永続性を考慮する必要があります。

また、Aqua SecurityではEnforcerというコンポーネントを通じてコンテナランタイムに対するセキュリティ保護を提供しますが、EKSクラスター上ではAqua KubeEnforcerがPodとして動いていることがわかります。

さらに、Aquaが提供するKubernetesネイティブなセキュリティツールであるStarboardも起動しています。Starboardの詳細は下記ページをご参照いただきたいですが、こういった周辺ツールも統合して提供されていることがわかります。

管理ダッシュボードへのアクセス

ここで、Serviceリソースのうちaqua-webのExternalIPとPortを指定することでAqua Serverにアクセスできます。

その後は、上述のDockerコンテナでセットアップする場合と同じように、初期ユーザーとライセンストークンの登録をすると管理ダッシュボードを表示できます。

Kubernetesクラスター上でセットアップすると、そのクラスター内のコンポーネントもすでにAqua Enterpriseの監視対象となるようです。

クラスター上で実行されているコンテナイメージの脆弱性スキャンや、Risk ExplorerによるAttack Surfaceの可視化など、すぐに利用できる状態になっています。

構築したコンポーネントを削除する

公式ドキュメントに従って構築していくと、必要なコンポーネントはNamespaceaquaで作成されているので、Namespaceを削除すればクラスターからAqua Enterpriseをクリーンアップできます。

kubectl delete namespace aqua

Kubernetesへの導入は簡単

既にKubernetesを利用している場合、Aqua Enterpriseのセットアップは非常に簡単なのではないかと思います。

例えばプロダクション環境をシングルクラスター構成で構築している場合など、セットアップからそのままセキュリティ機能をシームレスに利用できて良いのではないかという印象を持ちました。

以上、コンサル部のとばち(@toda_kk)でした。