IBM Cloud Internet Service(CIS): TLSの暗号化スイートを制限する


#1. はじめに
https://www.ssllabs.com/ssltest/ などを利用すれば、暗号化スイート（Cipher Suite)の脆弱性などをチェックすることができる。CISではコマンドラインからCipherスイートのallowlistを変更することができるので、この記事で試してみた。

#2. デフォルトのテスト結果
まずは、CISで保護しているサイトに対して、`https://www.ssllabs.com/ssltest/`を使ってテストしてみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/affb3772-fc99-3697-e55e-70688e93285e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/381d2181-0a77-3e94-5373-cb34399c3566.png)

(TLS1.0や1.1は論外として）上記の結果から分かる通り、TLS1.2以上を使うように構成していても、`WEAK`扱いされている暗号化スイートは存在し、後方互換性のために利用可能な状態になっている。一方で、

- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256  
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
- TLS_CHACHA20_POLY1305_SHA256
- TLS_AES_128_GCM_SHA256 

あたりが使えるようになっていれば最近の環境であれば問題なさそうだとうことが分かる（上記レポートをざっとでしか確認していないので、本番利用時にはより細かくチェックしてください）。

#3. CISの設定

IBM Cloud docsとしては以下を参照
https://cloud.ibm.com/docs/cis?topic=cis-cli-plugin-cis-cli&locale=en#update-domain-settings
https://cloud.ibm.com/docs/cis?topic=cis-cis-tls-options&locale=en#cipher-suites


```txt:インスタンスを探す
# ibmcloud cis instances
Retrieving service instances for service 'internet-svcs' ...
OK
Name                    ID                                                                                                                     Location   State    Service Name
CIS-Enterprise-Usage1   crn:v1:bluemix:public:internet-svcs:global:a/039dbe6794084c7cb514a276dd2345da:cf4d8b04-b49e-4bf0-a99d-9303bba2cd90::   global     active   internet-svcs
```

```txt:コマンドごとにIDを指定しなくて済むように、デフォルトインスタンスを設定しておく
# ibmcloud cis instance-set CIS-Enterprise-Usage1
Setting context service instance to 'CIS-Enterprise-Usage1' ...
OK
Context service instance set succeeded.
```

```txt:ドメインを探す
# ibmcloud cis domains
Listing domains for service instance 'CIS-Enterprise-Usage1' ...
OK
ID                                 Name                 Status   Paused
a4135402d38fff24e32ef13c82c1ab4a   cisibm.tk           active   false
```


```txt:暗号化スイートの設定確認
# ibmcloud cis domain-settings a4135402d38fff24e32ef13c82c1ab4a -f "ciphers"
Getting 'ciphers' for domain 'a4135402d38fff24e32ef13c82c1ab4a'...
OK

ID            ciphers
Editable      true
Modified On   N/A
Value
```

CISの暗号化スイートでallowlistとして[設定可能な値](https://cloud.ibm.com/docs/cis?topic=cis-cli-plugin-cis-cli&locale=en#update-domain-settings)は以下のあたりのようなので、

`ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-ECDSA-CHACHA20-POLY1305, ECDHE-RSA-AES128-GCM-SHA256, ECDHE-RSA-CHACHA20-POLY1305, ECDHE-ECDSA-AES128-SHA256, ECDHE-ECDSA-AES128-SHA, ECDHE-RSA-AES128-SHA256, ECDHE-RSA-AES128-SHA, AES128-GCM-SHA256, AES128-SHA256, AES128-SHA, ECDHE-ECDSA-AES256-GCM-SHA384, ECDHE-ECDSA-AES256-SHA384, ECDHE-RSA-AES256-GCM-SHA384, ECDHE-RSA-AES256-SHA384, ECDHE-RSA-AES256-SHA, AES256-GCM-SHA384, AES256-SHA256, AES256-SHA, DES-CBC3-SHA, default` なので、

以下の4つを設定する。

- ECDHE-ECDSA-AES128-GCM-SHA256
- ECDHE-ECDSA-CHACHA20-POLY1305
- ECDHE-RSA-AES128-GCM-SHA256
- ECDHE-RSA-CHACHA20-POLY1305


```txt:暗号化スイートの設定変更
# ibmcloud cis domain-settings-update a4135402d38fff24e32ef13c82c1ab4a -f "ciphers" -v ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-ECDSA-CHACHA20-POLY1305,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-RSA-CHACHA20-POLY1305
Updating 'ciphers' for domain 'a4135402d38fff24e32ef13c82c1ab4a' to 'ECDHE-ECDSA-AES128-GCM-SHA256,ECDHE-ECDSA-CHACHA20-POLY1305,ECDHE-RSA-AES128-GCM-SHA256,ECDHE-RSA-CHACHA20-POLY1305'...
OK

ID            ciphers
Editable      true
Modified On   N/A
Value
                 ECDHE-ECDSA-AES128-GCM-SHA256

                 ECDHE-ECDSA-CHACHA20-POLY1305

                 ECDHE-RSA-AES128-GCM-SHA256

                 ECDHE-RSA-CHACHA20-POLY1305

```


#4. 再テスト
CISおよび`https://www.ssllabs.com/ssltest/`のキャッシュをクリアして再テスト。結果、利用できる暗号化スイートが大きく減った！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/a9d3a07c-99c7-85bd-ccd6-20dadcdecd45.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/855d2472-44aa-83f8-eab3-f298b84fa06f.png)

#5. 設定を元に戻す（オプション）

```
# ibmcloud cis domain-settings-update a4135402d38fff24e32ef13c82c1ab4a -f "ciphers" -v default
Updating 'ciphers' for domain 'a4135402d38fff24e32ef13c82c1ab4a' to 'default'...
OK

ID            ciphers
Editable      true
Modified On   N/A
Value
```