aqua securityでよく使いそうな機能紹介

# 概要
kubernates環境でのセキュリティツールにaqua securityという製品があります。
インストールに関する記事は色々とありますが、実運用に関する記事はまだ少ないのでこの機会にまとめてみようと思います。
代表的な機能を幾つか紹介します。

本記事は以下の製品をGCP market place より購入しGKEクラスターにインストール済みであることを前提としています。
aqua security version : Aqua Cloud Native Security Platform　

![スクリーンショット 2019-12-18 10.15.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/d83178a4-d843-8a1f-080a-22f2a8a44842.png)

# 機能紹介
## アンチウイルス検索
Setting からScan Optionの項目の”Search for malware in images”をオンにします。
![ac56ec54-b626-e95b-6106-8120718eafe9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/57d24927-2a8e-6a61-848a-4081c14840b2.png)

ここの項目だけでは検索が行われるだけで制御はされないので、後述の改ざん検知機能と連携する必要があります。
## 改ざん検知
aqua では監査機能が用意されています。
- Image Assurance Policies 
- Runtime Policy
- Image Profiles
これらで設定したポリシーに違反した内容の検知やイメージやコンテナ上でのコマンドの実行禁止設定などが行えます。
### Image Assurance Policies 
aquaのインストールされているクラスタ全体のイメージが対象となります。
イメージ、パッケージやCVE脆弱性情報のホワイトリスト/ブラックリスト、ウイルス検知したイメージの実行禁止などが設定できます。
![ffc58ff5-de17-2fdf-050c-636b5985cdd4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/523c536f-1c20-07f0-71bd-58ea7e877e27.png)


個別にポリシーを設定したい場合はADD POLICYから新規に作成します。
Scope で適用させたい内容に応じてパラメーターを設定します。
![8d4875fa-13b1-5fe8-a55e-bc4e018ae685.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/f5a7f03b-b015-a797-9107-15124dd30be7.png)



下はパッケージのポリシーに違反した様子。
![faa86bf4-aab5-0e24-6e45-1c76afa728e9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/f3a96e9f-2b30-d093-76bb-b9170b55a5bf.png)


違反したイメージはブロックされGKE上は実行できずエラーになります。
![d0bd87f4-01ee-74ee-ca24-2228978f8510.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/69a48e85-6b72-2553-0325-590e358ad887.png)

### Runtime Policy
aquaのインストールされているクラスタ全体が対象となります。
コンテナの実行内容をリアルタイムで監査できます。
実行プロセス数の制限、指定したコマンドや、元のイメージファイルにないファイル実行禁止などが行えます。
NISTやPCI-DSSに準拠したテンプレートも用意されています。
![791185d2-10be-7816-c652-d3be64da2261.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/b2697aa9-4b82-363b-3195-c8e86dc57478.png)


監査対象から外したいリソースはBypassScopeでパラメータを指定します。
![c5987f82-e91d-c147-7409-766614994ab8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/e87b6e40-a8fd-8aa4-fe3d-b93e06982b75.png)


下はプロセス数制限を検知したもの
![e7518740-b71e-57d7-c16b-be9e5574af26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/04962fe2-07a9-40f5-bc43-c8fcfe1e6f15.png)


### Image Profiles
個別のイメージファイルが対象となります。
コンテナ内のディレクトリ/ファイルのアクセス権限制御やコマンドの実行制限、CPUやメモリのリソース制限などが行えます。
![5db40a2b-9659-05e4-d60d-98f23df1c179.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/7d75a38b-26a6-8298-ec35-cc1471afac0e.png)



下は読み込み専用にした/etc/配下にtestファイルを作ろうとした場合
![71f49402-62c2-f0df-425c-5339810c3969.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/85c89ce6-d8fd-cfb6-ab1b-7d5172fbf4d4.png)
![9966130e-3dfa-e253-c959-df140a8d1df5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/709e69c2-6079-0656-12e1-e201e8b1c60c.png)


OS上では以下の様な状態になります。(rootユーザーでも書き込めない)

```
root@web-dvwa-5fd9874fdf-zjkpt:/# touch /etc/test
touch: setting times of '/etc/test': Operation not permitted
```

## パッケージ管理
イメージスキャン時に自動的に実行されます。
![71f49402-62c2-f0df-425c-5339810c3969.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/50e346c9-a992-cebe-c0e7-d414903d5783.png)



Compliance Vulnerabilities でまとめて管理することもできます。
![64b74c24-bb74-07ec-4d57-94bc4a3785ba.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/faca455f-b9ea-8a99-7444-7db805c755cd.png)

各脆弱性ごとにベンダーのサポートリンクが付いていたり、
![304d86a4-a544-ac7f-0d55-689b5992eed3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/00f57018-8d20-43e2-82ee-487823248256.png)
脆弱性の容認設定など行うことができます。
![aeb6c501-a5b5-4c30-1119-a2eed5acf777.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/d1a2c52a-6e4f-67de-dbd7-053482f35836.png)


## CI/CD連携
aquaでは登録されたイメージを元にセキュリティ監査を行います。
イメージをビルドするたびに手動で行わなくてもいいようににスキャン用のdocker image（scanner-cli）が公開されています。
### 使用方法
ビルドパイプライン内に以下の様なシェルを追加してください。

```
# スキャン用イメージを持ってくる
gcloud auth print-access-token | docker login -u oauth2accesstoken --password-stdin https://gcr.io
docker pull "gcr.io/cloud-marketplace/aquasecurity-public/aqua-container-security/scanner-cli:3.2"
# スキャンしたいイメージがあるリージョンに再度ログイン
gcloud auth print-access-token | docker login -u oauth2accesstoken --password-stdin https://asia.gcr.io
# スキャンしてaquaに結果を送信
docker run -v /var/run/docker.sock:/var/run/docker.sock gcr.io/cloud-marketplace/aquasecurity-public/aqua-container-security/scanner-cli:3.2 scan -H https://aqua-web -U scanner-user -P *** --local asia.gcr.io/[project名]/centos:7 -n --register --registry asia.gcr.io 
```

実行結果は以下のように判定されます。

|リターンコード|結果|
|:------|:------|
|0|正常終了|
|1|異常終了|
|4|ポリシー違反|

aquaコンソール上では以下の様なログが出力されimagesに登録されます。

![23b6379a-dc25-acdd-d2b4-6aadee600147.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/212d2233-2619-d276-385a-24f8ae50b8e8.png)


### scanner-cli用のエンドポイントを作成する
scanner-cliはaqua webコンソールへアクセスしスキャン用のAPIを叩いています。
aqua webコンソールへIP制限をしている場合、cercleciなどの外部IPアドレスが公開されていないSaaSを使用する場合はIPアドレスによるアクセス制限が問題になることがあります。
その場合はaqua webコンソールにscanner-cli用のエンドポイント(LB)を作成し、スキャン用のAPIにのみ割り振られるように設定します。デフォルトのバックエンドはGCSに、TOPにはアクセスさせる必要はないのでコンテンツは入れません。
aqua-api-backendはaqua webコンソールと紐つけておきます。
#### 設定例
|ホスト|パス|バックエンド|
|:------|:------|:----------|
|不一致すべて（デフォルト）|不一致すべて（デフォルト）|gcs-backend|
| aqua-api-test.testdomain| /api,/api/v1/login,/api/cc/, /api/cc/v4/scan|aqua-api-backend |
| aqua-api-test.testdomain| /scanmgr/*|aqua-api-backend |

上記設定の場合は以下の様に作成したapi用ホストに対してscanner-cliを実行します。

```
docker run -v /var/run/docker.sock:/var/run/docker.sock gcr.io/cloud-marketplace/aquasecurity-public/aqua-container-security/scanner-cli:3.2 scan -H https:/aqua-api-test.testdomain -U scanner-user -P *** --local asia.gcr.io/[project名]/centos:7 -n --register --registry asia.gcr.io 
```

## ログ送信
Systemのintegrations 、LogManagementより設定できます。
ここではGoogle Cloud Logging(Stackdriver)について説明します。
下記画像の様に項目を指定します。KeyはGCPIAMにてloggingの書き込み権限を持ったAPIキーが必要です。

![39ffdf9e-87c5-9a15-5b81-fc04d4fdabbd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/a684b72b-fd7f-fa03-ba63-0ee5aa412b28.png)

Stackdriverから確認する際はフィルタを高度なフィルタに設定し以下の様に指定します。 

```
logName="projects/[project名]/logs/aqua-test-log"
```
Stackdriverに送信されたログの様子

![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/15bb8a04-c414-860b-fae6-d84bd3ba8292.png)


## アラート通知
アラートをSlack、Pagerdutyに送信することができます。
ここではSlackについて説明します。
System integrations よりNotification Feed 、Slackを選択します。
以下の様にパラメーターを環境に合わせて設定します。
![90fea153-0b41-6f97-a9f8-c5e64ba11599.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/603be29c-93e1-8832-1418-846eeb01ce2d.png)



事前にSlackのwebhook登録が必要です。
Send Test Message を押下して通知が来るか確認します。

- 通知例
<img width="767" alt="6186da65-694f-e0e6-2492-f75cc2cbbc66.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/b533a81a-5184-56ba-6c79-9833f49a11e3.png">
<img width="763" alt="f608662b-f328-9e5b-f014-4fa47980f4a1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311041/b0ad963c-854c-4909-f05c-de03510bdb56.png">



# まとめ
ここで紹介している昨日はまだまだ一例で検証できていない項目も多くあります。
強力な権限をもってGKEクラスタを制御できるツールなので、導入後はひとまずAutditモードで実際に運用しながらサービスに合わせた設定を詰めていく必要がありそうです。