【CIS・STIG】インフラ テスト自動化 #serverspec #inspec

## やること

`Dockerデーモン`、`ホスト（OS）`、そして`Dockerコンテナ（NGINX)`に**セキュリティテストを実行**していきます。セキュリテイ基準は、[CISベンチマーク](https://aws.amazon.com/jp/what-is/cis-benchmarks/#)と[DISA STIGs](https://www.sompocybersecurity.com/column/glossary/stig#:~:text=STIG%EF%BC%88Security%20Technical%20Implementation%20Guide,%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E5%AE%9F%E8%A3%85%E3%82%AC%E3%82%A4%E3%83%89%E3%81%A7%E3%81%99%E3%80%82)を使用します。

**推定所用時間は、1~2 分**

---

### 環境情報

#### テスト対象：

- DockerホストOS（Redhat8）
- Dokcerデーモン
- Dockerコンテナ（NGINX）

#### テストツール：

- [InSpec](https://www.chef-sec.com/inspec%e3%81%a8%e3%81%af/)

#### テストコード：
- STIG_Redhat8（[Githubリンク](https://github.com/mitre/redhat-enterprise-linux-8-stig-baseline)）
- CIS_Dockerデーモン（[Githubリンク](https://github.com/dev-sec/cis-docker-benchmark)）
- STIG_NGINXコンテナ（[Githubリンク](https://github.com/mitre/nginx-stigready-baseline)） 

#### テストシナリオ：

> InSpecはローカルからリモートターゲットホストにSSH経由でテストを仕掛けるのが一般的ですが、今回は、対象のホスト上でInSpecコマンドを実行していきます。

Docker nginx コンテナが起動しているRedhat8にSSH接続し、以下のテストを行っていく。

1. `ホスト（OS）`に対して、STIGテストを実行。
1. `Dockerデーモン`に対して、CISテストを実行。
1. `Dockerコンテナ（NGINX)`に対して、STIGテストを実行。
1. 実行結果の確認
1. テストのチューニングとカスタマイズ

（※STIGとCIS、どちらを選択しても手順は同じです。今回は両方使ってます。）

## TL;DR(1~2分）

1：InSpecのインストール

```
curl https://omnitruck.chef.io/install.sh | sudo bash -s -- -P inspec -v 4
```

2：テストコードの取得（3つ）

```
git clone https://github.com/mitre/redhat-enterprise-linux-8-stig-baseline.git &&
git clone https://github.com/mitre/nginx-stigready-baseline.git &&
git clone https://github.com/dev-sec/cis-docker-benchmark.git
```

3：テスト実行（3回）

```
inspec exec --chef-license=yes redhat-enterprise-linux-8-stig-baseline
```
```
inspec exec --chef-license=yes nginx-stigready-baseline -t docker://`docker ps -aqf "ancestor=nginx"`
```
```
inspec exec --chef-license=yes cis-docker-benchmark
```

4：[テスト結果の確認](https://qiita.com/Chef_DevSecOps/items/1e968740b9dc9396eb33#step4-%E3%83%86%E3%82%B9%E3%83%88%E7%B5%90%E6%9E%9C%E7%A2%BA%E8%AA%8D)

---

## 実践チュートリアル

### Step1： InSpecインストール

```
curl https://omnitruck.chef.io/install.sh | sudo bash -s -- -P inspec　-v 4
```

InSpecバージョン4を使っています。バージョンを指定せずに最新の6を使うとライセンスキーの取得が必要になるためです。（v6のTrialキーを取得するにはメールアドレスの登録が必要です）

curlではなく、パッケージからインストールする場合は、[こちら](https://www.chef.io/downloads/tools/inspec)からダウンロードできます。

### Step2： テストコード取得

※InSpecはローカルからリモートターゲットホストにSSH経由でテストを仕掛けるのが一般的ですが、今回は、対象のホスト上でInSpecコマンドを実行していきます。それで、**テストコードは対象のホスト上で取得する必要**があります。

```
git clone https://github.com/mitre/redhat-enterprise-linux-8-stig-baseline.git &&
git clone https://github.com/mitre/nginx-stigready-baseline.git &&
git clone https://github.com/dev-sec/cis-docker-benchmark.git
```

上記の通り、Github上に無料のテストコードが公開されています。
いずれもCISベンチマークやSTIGsに対応しています。

`dev-sec`リポジトリ は、Progress 社が公式にメンテナンスしています。無料利用できるテストコードは数が限られていますが、サポート対象の有償版のリストは[こちら](https://www.chef.io/products/chef-premium-content)で確認することができます。

`mitre`リポジトリ は、脆弱性で有名な**CVE**の管理をしている組織[MITRE Corporation](https://www.sompocybersecurity.com/column/glossary/mitre)がメンテナンスしています。
今回使用するもの以外にも、CISやSTIGに準拠した無料のテストコードを多数公開しています。フルリストは[こちら](https://saf.mitre.org/libs/validate)で確認できます。

### Step3： テスト実行

1.ローカル実行するために、テスト対象にSSH接続します。
2.[Step2](https://qiita.com/Chef_DevSecOps/items/1e968740b9dc9396eb33#step2-%E3%83%86%E3%82%B9%E3%83%88%E3%82%B3%E3%83%BC%E3%83%89%E5%8F%96%E5%BE%97)で取得したテストコードを実行する。

```
inspec exec --chef-license=yes redhat-enterprise-linux-8-stig-baseline
```
```
inspec exec --chef-license=yes \nginx-stigready-baseline -t docker://`docker ps -aqf "ancestor=nginx"`
```
```
inspec exec --chef-license=yes cis-docker-benchmark
```

`--chef-license=yes`の補足：InSpecは、Chefと同様に商用利用する場合ライセンスを取得する必要があります。商用で利用する場合、事前にライセンス販売代理店に[お問い合わせください。](https://www.chef-sec.com/)

### Step4： テスト結果確認

#### ターミナルで結果確認（抜粋）

- STIG_Redhat8（[Githubリンク](https://github.com/mitre/redhat-enterprise-linux-8-stig-baseline)）のテスト結果 `244の大項目で問題検知` 
![capture 2023-11-30 18.24.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565203/5f7cb2ad-a093-1e5a-3c93-a03a668414e5.png)


- CIS_Dockerデーモン（[Githubリンク](https://github.com/dev-sec/cis-docker-benchmark)）のテスト結果 `40の大項目で問題検知`
![capture 2023-11-30 18.28.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565203/41d324fd-06f2-5f22-b327-a4694bd88817.png)

- STIG_NGINXコンテナ（[Githubリンク](https://github.com/mitre/nginx-stigready-baseline)） `26の大項目で問題検知`
![capture 2023-11-30 18.31.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565203/e1ce1a5c-bceb-3d04-ddb4-867029274744.png)

#### Web UI で結果確認

- STIG_Redhat8（[Githubリンク](https://github.com/mitre/redhat-enterprise-linux-8-stig-baseline)）のテスト結果 `244の大項目で問題検知` 
![capture 2023-11-30 21.12.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565203/7bd60aac-9236-e841-e04c-bebb7aef58e8.png)


- CIS_Dockerデーモン（[Githubリンク](https://github.com/dev-sec/cis-docker-benchmark)）のテスト結果 `40の大項目で問題検知`
![capture 2023-11-30 19.43.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565203/ae9cf82f-fc86-2bb5-2c2d-a9d5bffbcc1c.png)

- STIG_NGINXコンテナ（[Githubリンク](https://github.com/mitre/nginx-stigready-baseline)） `26の大項目で問題検知`
![capture 2023-11-30 19.51.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565203/b261f3b5-1937-27de-08c2-95b1fa3919f6.png)

テスト結果は、ターミナルへの出力やウェブUI以外にも、JSON、HTML、またはCSVへの出力も可能です。

### Step4： テスト項目のチューニング

[CISベンチマーク](https://aws.amazon.com/jp/what-is/cis-benchmarks/#)や[DISA STIGs](https://www.sompocybersecurity.com/column/glossary/stig#:~:text=STIG%EF%BC%88Security%20Technical%20Implementation%20Guide,%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E5%AE%9F%E8%A3%85%E3%82%AC%E3%82%A4%E3%83%89%E3%81%A7%E3%81%99%E3%80%82)は、非常に強力なセキュリティ基準ですが、すべての環境でこれらの基準を完全に満たす必要はありません。

InSpecのテストコードは、不必要なテスト項目を追加、削除、修正することができます。

### まとめ

1つのツールで、`Dockerデーモン`、`ホスト（OS）`、そして`Dockerコンテナ（NGINX)`の3つのレイヤーの**セキュリティテスト**を実現できます。

DevOps CI/CDパイプラインに組み込むことで、DevSecOps運用を。
また、継続的かつ定期的にInSpecテストを実行することで、常にセキュアな状態を保証することができます。

InSpecに関する技術サポートや商用ライセンスの取得は、国内販売代理店に問い合わせることができます。

https://www.chef-sec.com/

# テストサポート対象OS（一部抜粋）

ご参考までにProgress社が提供するInSpecテストコードの対象OSを一部ご紹介します。
以下は、CISベンチマークレベル1とレベル2に対応しているOSとサービスの一部です。

| OS | スキャン | 自動修正 |
|:-----------|------------:|:------------:|
| Amazon Linux 2       | ◯        | ◯         |
| Alma Linux 8     | ◯      | ◯       |
| CentOS Linux 7/8       | ◯        | ◯         |
| Debian Linux 9         | ◯          | ◯           |
| Oracle Linux 8       | ◯       | ◯       |
| Red Hat Enterprise Linux 6/7/8/9    | ◯     | ◯      |
| Rocky Linux 8       | ◯        | ◯         |
| Ubuntu Linux 18.04 / 20.04    | ◯      | ◯       |
| Windows Server 2012 / R2       | ◯        | ◯         |
| Windows Server 2012– Domain Controller         | ◯          | ◯           |
| Windows Server 2016 – Domain Controller       | ◯       | ◯       |
| Windows Server 2016 – Member Server    | ◯     | ◯      |
| Windows Server 2019 – Domain Controller       | ◯        | ◯         |
| Windows Server 2019 – Member Server     | ◯      | ◯       |
| Windows Server 2022 – Domain Controller       | ◯        | ◯         |
| Windows Server 2022 – Member Server         | ◯          | ◯           |

| 対象サービス | スキャン | 自動修正 |
|:-----------|------------:|:------------:|
| Apache Tomcat        | ◯       | ◯       |
| Docker    | ◯     | ◯      |
| MongoDB       | ◯        | ◯         |
| NGINX     | ◯      | ◯       |
| Oracle Database       | ◯        | ◯         |
| PostgresSQL         | ◯          | ◯           |
| VMWare ESXI       | ◯       | ◯       |

※全ての対応OSとアプリケーションの一覧は[こちら](https://www.chef.io/products/chef-premium-content)CISに限らず、STIGにも対応しています。