Aqua EnterpriseをAmazon EKS環境で構築する
コンサル部のとばち(@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クラスターを新たに作成しました。
$ 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)でした。