CentOS6.9/CentOS7.4でWebサーバのSSLのセキュリティ対策





この記事は

> CentOS6.6でWebサーバのSSLのセキュリティ対策
> https://qiita.com/qiitamatumoto/items/3bc4a22918412a7a169b

の改訂版です。またこの記事を書くにあたって以下の文献を参考にしています。

> https://www.marineroad.com/staff-blog/16042.html
> [SSL] SSL/TLS暗号化設定を見直そう！！（その2）

この記事は上記記事をもとにした、難しい事を考えるのが面倒な管理者が書いた文章です(^_^;

追記: 2018/1/19, 採点基準が変わったようなので修正。BEAST対策について加筆

追記: 2018/1/29, X-Frame-Options レスポンスヘッダの加筆について、注意事項を追記。

#はじめに
最近WebサーバのSSL関係のセキュリティ報告が多いのですが、たくさんあってよくわかりませんので、チェックツールを使ってみました。

> https://www.ssllabs.com/ssltest/index.html
> SSL Server Test

#管理下のWebサーバを検査してみた。
管理下のサーバは某大学のWebサーバで、OSはCentOS6.9およびCentOS7.4で、WebサーバはOS標準のApache、SSLの証明書はUPKI

> https://certs.nii.ac.jp/
> UPKI電子証明書発行サービス

を用いています。

Webサーバ(OS標準のapache)のSSL周りの設定(/etc/httpd/conf.d/ssl.conf)はUPKIのサーバ証明書の設定のみで、それ以外はOSのdefaultのままです。

それで検査してみた結果。

評価はC。

##CentOS6.9の例
執筆時点の最新版
httpd-2.2.15-60.el6.centos.6.i686.rpmおよびmod_ssl-2.2.15-60.el6.centos.6.i686.rpmで確認しました。

![CentOS6-Default-Summary.jpg](https://qiita-image-store.s3.amazonaws.com/0/61370/76ee9d3a-aa61-3ed8-b4c7-56ff4a25efd5.jpeg)

#CentOS7.4の例
執筆時点の最新版httpd-2.4.6-67.el7.centos.6.x86_64.rpmおよび mod_ssl-2.4.6-67.el7.centos.6.x86_64.rpmで確認しました。

![CentOS7-Default-Summary.jpg](https://qiita-image-store.s3.amazonaws.com/0/61370/6e2f2367-44ed-194d-6fff-5d2fc543553b.jpeg)

#設定変更
CentOS6.9およびCentOS7.4でのウイークポイントを調べると共通していまして、

##Protocols
プロトコルでSSLv3がウイークポイントという指摘。
![Protocol.jpg](https://qiita-image-store.s3.amazonaws.com/0/61370/c6b2726f-5d76-da7a-74da-83630b185e82.jpeg)

##CipherSuite
長いので一部分のみ掲載しますが、こんな感じで多数指摘されます。

![CentOS6-cipherSuites.jpg](https://qiita-image-store.s3.amazonaws.com/0/61370/b495a425-bedd-9502-60a8-bad70cd79b64.jpeg)

全体を通してみると、ウイークポイントが指摘されているCipherSuiteにはすべてRC4と3DESとTLS_RSAという文字列が入っています。また合格したCipherSuiteにはRC4と3DESという文字列は入っていません。(注記: TLS_RSAとTLS_DHE_RSAとは別みたい。)

##設定変更例

CentOS6.9のssl.confのデフォルト設定は以下のとおりです。

``` /etc/httpd/conf.d/ssl.conf
SSLProtocol all -SSLv2
SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES
```
CentOS7.4のssl.confのデフォルト設定は以下の通りです。

``` /etc/httpd/conf.d/ssl.conf
SSLProtocol all -SSLv2
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
```

それぞれに, ProtocolからSSLv3を削除する設定(-SSLv3)および、ChiperSuiteからRC4および3DESおよびRSAを除外する設定(!RC4と!3DESと!RSA)をします。(注記: !RSAをしてもTLS_DHE_RSAは無効にならないみたい。)


CentOS6.9設定変更例

``` /etc/httpd/conf.d/ssl.conf
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:!RC4:!3DES:!RSA
```

CentOS7.4設定変更例

``` /etc/httpd/conf.d/ssl.conf
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4:!3DES:!RSA
```

次に、BEAST対策が必要な場合はTLSv1.0を無効にする必要があります。

> SSL と TLS の CBC モードに選択平文攻撃の脆弱性
> http://jvndb.jvn.jp/ja/contents/2011/JVNDB-2011-002305.html

ただしこの対策をすると古いブラウザが切られますのでリスク判断を行ったほうがよいとおもいます。

SSLlabでTLSv1を有効/無効にして対応ブラウザを比較してみました。無効にして残ったブラウザはすべてTLSv1.2対応していました。そのためTSLv1を停止するならTLSv1.1を停止しても対応状況に変化はないようです。なのでついでにTLSv1.1も停止しても問題ないようです。(かなり独断と偏見)

``` /etc/httpd/conf.d/ssl.conf
# 引数に -TLSv1 -TLSv1.1を追加。
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
```

次に、SSLとは直接関係ありませんが、次の設定が必要な場合は検討をしてください。

CentOS6.9とCentOS7.4にはTRACEメソッドを無効にする設定。

> http://itochif.com/contents/Security/Apache/apache_003000.html
> [Apache] TRACEメソッドを無効にする - itochif.com


``` /etc/httpd/conf/httpd.conf
TraceEnable Off
```

CentOS6.9にはエンティティタグ（ETag）の設定をします。(補足:CentOS7は不要)

> https://qiita.com/bezeklik/items/1c4145652661cf5b2271
> Apacheセキュリティ設定

``` /etc/httpd/conf/httpd.conf
FileETag MTime Size
```

フレーム内への表示などを禁止する必要がある場合は、次の設定を検討してください。

> https://developer.mozilla.org/ja/docs/Web/HTTP/X-Frame-Options
> X-Frame-Options レスポンスヘッダ

``` /etc/httpd/conf/httpd.conf
Header always append X-Frame-Options SAMEORIGIN
```

追記：2018/1/29: 上記の設定は事前に身内のWebサーバからフレームを使って参照されてないか確認ください。もし参照されていた場合は以下の資料を参考にして別のタブでリンクを開くように書き換えを依頼すればおそらく良いかとおもいます。

> http://htmlst.hatenablog.jp/entry/entry/2017/01/12/2230
> 別タブでリンクを開くようにする方法

次に、Webサーバのコンテンツのディレクトリにindex.htmlがおいてある場合はindex.htmlが表示されますが、もし無い場合は、ディレクトリの中身が表示される事があります。この設定が好ましくない場合は、設定を調べてOptions から Indexesを削除してください。Optionsは複数ある場合もありますので、すべてを調べてみてください。(副作用を検討して削除を行ってください。)。なお、「-Indexes」は無効にする設定ですので。


```
$ cd /etc/httpd/
$ grep Indexes */*.conf
```

設定例。

``` /etc/httpd/conf/httpd.conf
# Options Indexes FollowSymLinks
Options FollowSymLinks
```

その他推奨設定については参考文献をご覧ください。

上記の変更後、apacheを再起動してください。

```
/sbin/service httpd restart
```

補足:　次の文献などで挙げられている

> https://rms-digicert.ne.jp/howto/basis/Forward_Secrecy_Apache_Ngix.html
> ApacheとNginxでのForward Secrecy設定方法 

設定「SSLHonorCipherOrder on」は今回指定していません。この指定をする場合は、「SSLCipherSuite」を真面目に書く必要があるからです(^_^; この記事で挙げているような、ダメなものを除外するだけの設定ではおそらく悪い影響が出ると思います。

#上記変更後のSSLlabの評価

##CentOS6.9/7.4の評価(BEAST未対応)

![CentOS6-on-tlsv1.jpg](https://qiita-image-store.s3.amazonaws.com/0/61370/9ddba7a4-c3ed-f2f7-5c22-be168af81948.jpeg)

CからAに改善しました。

##CentOS6.9/7.4の評価(BEAST対応済み)

![CentOS6-off-tlsv1.jpg](https://qiita-image-store.s3.amazonaws.com/0/61370/36fe75b1-ace2-cd6d-0b64-a2fbc5811115.jpeg)

BEAST未対応よりProtocol supportが改善しています。

#最後に
ほかにもウイークポイントが指摘されていますが、ここまでにしておきます(^_^;
以上です。