ホワイトリスト棚卸しのすすめ

### はじめに

ファイアウォール、プロキシ、メールセキュリティなどのゲートウェイ製品では、許可や拒否といった処理を静的に定義する、一般的にブラックリストやホワイトリストと呼ばれる設定を持ちます。[^1]

こうした静的なリストの問題点としてときどき耳にするのが、
機器導入時に設定したリストが長い間メンテナンスされておらず妥当性が評価できない、
機器リプレイスの段階になって検討したものの判断できないので現行踏襲の名の下とりあえずすべてインポートすることになった、ドメイン名のタイポ、などです。

さらにセキュリティの観点で考慮したい点として、ホワイトリストに加えていたとあるドメインが悪意のある攻撃者によって｛不正な｜正当な｝方法で取得され、コマンド＆コントロールサーバやフィッシングサイトなど様々な攻撃の土台となり得るということが挙げられます。

ドメインのライフサイクルに関するリスクや脅威については下記がわかりやすいので是非ご一読ください。
https://tochijisen.tokyo
https://piyolog.hatenadiary.jp/entry/2020/07/08/025056
https://www.nic.ad.jp/sc-sendai/program/iwsc-sendai-d2-3.pdf

この記事ではホワイトリストに含まれるドメインの現在の脅威レベルを簡単に調査する方法を紹介します。

### ホワイトリストに含まれるドメインの傾向

一般的にホワイトリストは「アクセスを許可する＝そのセキュリティ機器での検査をスキップする」という処理をさせます。ではどのようなドメインがホワイトリストに含まれているのでしょうか。
もちろん企業や組織で様々な観点で運用されているため一概には言えないですが、例えばセキュリティ信頼度（ドメインのレピュテーションスコアなど）、ビジネス上の信頼度という観点でざっくり四象限で分類してみました（下図）。

こうしてみると、ホワイトリストに含まれるドメインは、「（設定時点において）セキュリティ信頼度は低いが、ビジネス上取引する必要がある」ドメインであると言えます。ドメインの状態は時間が経つと変化します。リストにあるドメインのなかで、実はクリーンなもの、または逆に本当に危なそうなドメインが見つかれば除外する候補と言えるのではないでしょうか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437531/a1b921c8-5e3c-bf5e-53fa-5b5b61af1845.png)

### 脅威インテリジェンスを活用した調査方法

ホワイトリストはセキュリティ信頼度の低いドメインが含まれる傾向があるため、リストや該当機器の用途に合わせた定期的な評価が重要と言えます。ドメイン（や IP アドレス）を評価する方法のひとつとして、脅威インテリジェンスの活用が考えられます。
脅威インテリジェンスにも様々な種類があり、有償/無償、Email レピュテーションに強い、IP/Domain に強い、マルウェアとの関連付けに強い、などなどあるかと思います。
Cisco Umbrella が提供する Investigate という脅威インテリジェンスサービスでは、下図のようなデータに基づいてドメインや IP のセキュリティスコアを様々な観点から取得することができます。またこれらの情報は Umbrella Investigate REST API という形で API 経由でも取得可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437531/dcfe8843-fce6-1c38-fa00-25b59120fbdc.png)


### Umbrella Free Trial (PR)

Umbrella では無償トライアルを提供しています。会社のメールアドレスを登録するだけで Investigate も利用可能です。
https://signup.umbrella.com

GUI の操作だけを試してみたい場合  [dcloud](https://dcloud.cisco.com) から予約なしすぐに使える Instant Demo がいろいろと用意されています。
https://dcloud2-sng.cisco.com/content/instantdemo/umbrella-instant-v2?returnPathTitleKey=content-view
https://dcloud2-sng.cisco.com/content/instantdemo/cisco-securex-v1-instant-demo-2?returnPathTitleKey=content-view

### リスクスコアを調査してみよう (GUI 編)

GUI では検索窓にて気になるドメインを入力することで脅威スコアだけでなくクエリ量、所有者や AS、関連する IP、関連するマルウェア(by ThreatGrid)などなど様々な情報が確認できます。例えば`google.com`では`要約`で表示されているようにリスクスコアが6となります。リスクスコアは 0~100 の値をとり、低いほうが安全なドメインとなります。
取得できる情報の詳細については[公式ドキュメント](https://docs.umbrella.com/investigate-api/docs/security-information-for-a-domain-1
)をご覧ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437531/6c75a084-8147-7450-1137-1862e09f2b89.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437531/f9e74889-2143-0277-7a55-cab9d279b4a3.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/437531/ec331e4b-0b12-870a-0527-5af118f28fff.png)


### リスクスコアを調査してみよう（API 編）

便利なライブラリが用意されており、Python で簡単に Investigate REST API を叩くことができます。
https://github.com/opendns/pyinvestigate

```
pip3 install investigate
```

```python
$python3
>>> import investigate
>>> api_key = 'XXXXXXXXXXXXXXXXXXX'
>>> inv = investigate.Investigate(api_key)
>>> inv.risk_score('bibikun.ru')
{'indicators': [{'indicator': 'Geo Popularity Score', 'normalized_score': 50, 'score': 0}, {'indicator': 'Keyword Score', 'normalized_score': 5, 'score': 0.058088698016961676}, {'indicator': 'Lexical', 'normalized_score': 70, 'score': 0.701}, {'indicator': 'Popularity 1 Day', 'normalized_score': None, 'score': None}, {'indicator': 'Popularity 30 Day', 'normalized_score': None, 'score': None}, {'indicator': 'Popularity 7 Day', 'normalized_score': None, 'score': None}, {'indicator': 'Popularity 90 Day', 'normalized_score': None, 'score': None}, {'indicator': 'TLD Rank Score', 'normalized_score': 2, 'score': 0.026904106079046825}, {'indicator': 'Umbrella Block Status', 'normalized_score': 0, 'score': False}], 'risk_score': 45}
>>> inv.risk_score('google.com')['risk_score']
6
```


### まとめて調査してみよう

ドメイン名を CSV 形式で保存したファイルを用意し、繰り返し処理を用いて一括検索することも可能です。

```
$ cat whitelist.csv 
cosco.com
ciisc0.com
cisco.tokyo
```

```python
import investigate
api_key = 'XXXXXXXXXXX'
inv = investigate.Investigate(api_key)

with open('whitelist.csv') as f:
    for lines in f.read().splitlines():
        try:
            rs = inv.risk_score(lines)['risk_score']
            print('%s の Risk Score: %d' % (lines, rs)) 
        except:
            pass  
```

結果

```
cosco.com の Risk Score: 19
ciisc0.com の Risk Score: 66
cisco.tokyo の Risk Score: 59 
```

### 注意点

Umbrella Investigate REST API にはレートリミットが設けられており、とあるリストを一括で調査したところ `status code 429`が返り、リクエスト数の上限に到達しました。ご利用は計画的に

>Investigate Integration API — Rate limit 3 requests per second, up to 2000 requests per day.
https://docs.umbrella.com/investigate-api/docs/requests-1

### まとめ

もし長年メンテナンスされていないホワイトリストをお持ちの方は、年末年始にかけて Umbrella Investigate のリスクスコアで棚卸ししてみてはいかがでしょうか。その後定期的に差分を取得してスコア等に変更のあったドメインだけを確認する[継続的監視](https://blogs.cisco.com/tag/continuous-monitoring)を実践してみるのも面白いかもしれません。

また、マニュアルで運用するリストだけでは[サブドメインテイクオーバー](https://piyolog.hatenadiary.jp/entry/2020/07/08/025056
)のような動的に変化する脅威には迅速に対応しきれない可能性がありますので、多層防御や Cisco Umbrella の導入をご一考いただければ幸いです。 

### Appendix

簡単に利用できる Cisco Talos のインテリジェンスもあります 
https://talosintelligence.com
多様な OSINT を整理されている記事 
https://qiita.com/00001B1A/items/4d8ceb53993d3217307e
もちろん dig や whois も有効です
https://www.ipa.go.jp/security/vuln/20050627_dns.html

[^1]: white/black, master/slave といった IT 用語は議論の対象となっていますが、本投稿では慣例にしたがって記載しました。https://lkml.org/lkml/2020/7/4/229