【ラズパイ】セキュリティテストを仕掛ける #STIG #PCI-DSS #CISベンチマーク #serverspec

**セキュリティ対策系の記事は多く見かけますが、対策した後のセキュリティ”テスト”関連の記事がほとんどなかったので書きます。**

## やること

家のラズパイのセキュリティレベルがどの程度なのかを把握しておきたいので、セキュリティテストを仕掛けます。 
誰でも簡単にできますので、是非お試しあれ。 （**推定所用時間、1~2 分**）

以下のような、一般的なセキュリティ対策に問題がないことの確認に加えて、、、

https://qiita.com/nokonoko_1203/items/94a888444d5019f23a11

今回は、CISベンチマークに沿ったセキュリティスキャンをします。（[CISベンチマークとは？](https://aws.amazon.com/jp/what-is/cis-benchmarks/#)）
企業が商用環境でサーバーセキュリティに使う、ガチなヤツです。


通常CISベンチマークは、OSの種類によって中身が異なります。（Redhat用、とか、Ubuntu用など。。）しかし、使い分けが面倒な場合があります。

それで、**すべてのLinuxOSに共通化されたベンチマーク↓↓↓**が用意されています。今回はこちらを使っていきます。

https://www.cisecurity.org/benchmark/distribution_independent_linux

`Distribution Independent　Benchmark` = `ディストリビューション(Linuxの種類)に依存しないベンチマーク`

では、やってきましょう！

## TL;DR(1~2分）

1： InSpecインストール（[InSpecとは](https://www.chef-sec.com/inspec%e3%81%a8%e3%81%af/)）

・Windows **Powershell**：
```
. { iwr -useb https://omnitruck.chef.io/install.ps1 } | iex; install -project inspec -version 4
```

・Macターミナル：
```
curl https://omnitruck.chef.io/install.sh | sudo bash -s -- -P inspec -v 4
```

2： テストコード取得（[Githubリンク](https://github.com/dev-sec/cis-dil-benchmark)）
```
git clone https://github.com/dev-sec/cis-dil-benchmark.git 
```

3： InSpec実行
```
inspec exec --chef-license=yes cis-dil-benchmark -t ssh://[ラズパイホスト名orIPアドレス]
```

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


## 実践チュートリアル

### Step1： InSpecのインストール（[InSpecとは](https://www.chef-sec.com/inspec%e3%81%a8%e3%81%af/)）

#### ・Windows **Powershell**：
```
. { iwr -useb https://omnitruck.chef.io/install.ps1 } | iex; install -project inspec -version 4
```
※Windowsの場合、インストール後に、Powershellを閉じて、開き直す必要があります。

#### ・Macターミナル：
```
curl https://omnitruck.chef.io/install.sh | sudo bash -s -- -P inspec -v 4
```

パッケージダウンロードしたい方は、[こちら](https://www.chef.io/downloads/tools/inspec?v=4.56.58)

### Step2： テストコード取得（[Githubリンク](https://github.com/dev-sec/cis-dil-benchmark)）

```
git clone https://github.com/dev-sec/cis-dil-benchmark.git 
```
（※[Gitインストール手順（公式ページ）](https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)）

`cis-dil-benchmark`の`dil` = `Distribution Independent Linux` の意。

上記の通り、Github上に無料のテストコードが公開されています。

-- 

`dev-sec`リポジトリ は、[Progress社](https://www.chef.io/)[^1]が公式にメンテナンスしています。無償で利用できるテストコードは少ないです。

[^1]:Progress社は、ITインフラストラクチャの自動化およびセキュリティの向上を支援する企業です。ChefとInSpecといった強力なオートメーションツールを提供し、クラウドおよびオンプレミスの環境での効率的な運用とセキュリティの確保をサポートしています。

有償版であれば、ほぼすべてのOSに対応するテストコードが用意されています。すべての対応OSリストは[こちら](https://www.chef.io/products/chef-premium-content)で確認することができます。

テストコードがどのようなものか簡単にご紹介します。
例えば、「SSHログイン失敗回数が設定されているか」を確認するコードは、

```
describe sshd_config do
  its('MaxAuthTries') { should cmp <= 4 }
end
```

可読性がとても高いですね。4回以上のログイン失敗を許可しないことを示しています。
他にも、「RootユーザーのSSHログインを許可していないか」を確認するコードは、

```
describe sshd_config do
  its('PermitRootLogin') { should eq 'no' }
end
```

:::note warn
本記事では、 "CISベンチマーク準拠"のテストコードを使いますが、より緩いテストコードも存在します。
自宅サーバーのテストとしては、こちらの方が現実的かもしれません。[Githubリンク](https://github.com/dev-sec/linux-baseline)

```
git clone https://github.com/dev-sec/linux-baseline.git
```

:::

### Step3： テスト実行

:::note info
InSpecは、OSに変更を加えることは絶対にありません。スキャン・監査を行うのみです。
:::

↓のコマンドで、Step2で取得したテストコードを実行していきます。
ラズパイへのSSH接続ができることが実行条件です。

```
inspec exec --chef-license=yes cis-dil-benchmark -t ssh://[ラズパイホスト名orIPアドレス]
```

<details><summary>コマンドオプション説明（展開）</summary>

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

`-t`：リモートターゲットモードです。リモートマシン（ラズパイ）に対してテストコードを実行する際に使用します。
```

</details>

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

#### ・標準出力

さすがCISベンチマーク！テスト項目と結果が半端ない長さなので割愛します😅 

代わりにスクショを貼ります。

![capture 2023-12-08 15.27.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565203/8c8a8263-b692-f5f2-947b-1cae72853117.png)
〜中割愛〜
![capture 2023-12-08 15.27.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565203/623972ff-c8ec-74f5-1083-e740e2c93681.png)


問題なくPassしているテスト項目もありますが、105個の大項目でセキュリティに問題が検知されていることがわかります。

テスト結果の一部を詳しく見てみましょう。

##### ・SSH設定関連

![capture 2023-12-08 15.24.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565203/5a76630c-d03c-076d-049f-14111c312e59.png)

`expected:` は、あるべき設定の状態です。
`got:` は、実際の設定値です。

`HostbasedAuthentication`設定については、”no"（無効化）ではなく、”nil”となっていて明示的に無効化されていないために問題検知を示す　X　となっています。

但し、「Rootログイン」や「空パスワード」については、正常に無効化できていることがわかります。

##### ・ユーザー設定関連

![capture 2023-12-08 15.34.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565203/c59c5449-154e-8d6d-a2eb-acce71d9efce.png)

こちらは、各ユーザーのホームディレクトリの有無や権限を確認しています。
全てのユーザーのホームディレクトリの権限は、`750`以上である必要がありますが、満たせていないようです。
`/home/r-goto`ディレクトリの権限には第三者によるRead権限が付されていまっていることがわかります。

#### ・Web UI画面
![capture 2023-12-05 12.47.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565203/e321760f-e49d-b31c-1ac9-3ee4d0ddb67a.png)

Chef Automate のセットアップが必要になりますが、より高精度なテスト結果の分析を行うことができます。**Slack、メール、ServiceNow**と連携させることで高度な通知機能も扱うことができるようになります。

#### ・HTMLファイル出力

```
inspec exec cis-dil-benchmark -t ssh://myCloud --reporter=html2 > inspect_test_results.html
```

上記コマンドオプションで実行し、[inspect_test_results.html](https://r-goto.github.io/chef-sec_pages/) のように結果をHTML形式で出力することができます。

![capture 2023-12-05 13.23.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3565203/5671a8d2-d20c-0b7d-2271-4c031a9c9675.png)

HTML以外にも、JSONやYAML出力も可能です。

### Step5： まとめ＆【お問い合わせ】

[InSpec](https://www.chef-sec.com/inspec%e3%81%a8%e3%81%af/)でラズパイのセキュリティレベルを把握することができました。
継続的かつ定期的にInSpecテストを実行することで、常にセキュアな状態を保つことができます。

検知された設定項目を手動で直すことも可能ですが、IaC（Infrastructure as Code）で自動修正することで設定ミスを減らし、よりセキュアにすることができます。次の記事でやり方をご紹介します。

---

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

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

---

### おまけ（テストコードのカスタマイズ）

今回のCISベンチマークは、企業のセキュリティ部門が使用する程のガチ堅牢基準です。自宅サーバーをここまで堅牢にする必要はないように思います。

そこで、テスト項目をカスタマイズする方法を最後にご紹介します。

https://docs.chef.io/inspec/waivers/

上記で説明されているWaiver機能を使うことで不要なテストをスキップさせることができます。

YAMLもしくはJASONのファイル(`waivers.yaml`)を作成します。

`waivers.yaml`にスキップさせたいテスト項目名を以下のように追記。
```
cis-dil-benchmark-1.1.1.1:
  expiration_date: 2050-10-15
  justification: Not needed 

cis-dil-benchmark-1.1.1.2:
  expiration_date: 2050-10-15
  justification: Not needed 
```

Waiverファイルを指定してInSpec実行
```
inspec exec --chef-license=yes cis-dil-benchmark --waiver-file waivers.yaml　-t ssh://[ラズパイホスト名orIPアドレス]
```