Apache Traffic ServerでServerヘッダとViaヘッダのバージョンを非表示にする

Apache の [ServerTokens](https://httpd.apache.org/docs/2.4/ja/mod/core.html#servertokens) や nginx の [server_tokens](http://nginx.org/en/docs/http/ngx_http_core_module.html#server_tokens) の設定でサーバーのバージョンを非表示にするのがセキュリティ上良いとされていますが、 Apache Traffic Server でのバージョンを非表示にする設定を調べたのでメモです。

## Server レスポンスヘッダー内のバージョンを非表示にする

デフォルトでは Apache Traffic Server からのレスポンスには `Server:ATS/5.3.2` のような `Server` ヘッダがついています。

`Server` レスポンスヘッダー内のバージョンを非表示にするには [records.config](https://docs.trafficserver.apache.org/ja/latest/admin-guide/files/records.config.en.html) の [proxy.config.http.response_server_str](https://docs.trafficserver.apache.org/ja/latest/admin-guide/files/records.config.en.html#proxy-config-http-response-server-str) を `ATS` にします。するとレスポンスの `Server` ヘッダーは `Server:ATS` のようになりました。

```:/etc/trafficserver/records.config
CONFIG proxy.config.http.response_server_str STRING ATS
```

[proxy.config.http.response_server_str のドキュメント](https://docs.trafficserver.apache.org/ja/latest/admin-guide/files/records.config.en.html#proxy-config-http-response-server-str) にはデフォルト値は `ATS/` で、設定した値の後にバージョン番号が追加されると書かれていますが、これは間違いです。ソースコードを確認したところ、デフォルト値は `"ATS/" PACKAGE_VERSION` でした。

https://github.com/apache/trafficserver/blob/770e7878c0f4dde9516f6f93490eb8b2f66a8dd2/mgmt/RecordsConfig.cc#L412

```c++:mgmt/RecordsConfig.cc#L412
  {RECT_CONFIG, "proxy.config.http.response_server_str", RECD_STRING, "ATS/" PACKAGE_VERSION, RECU_DYNAMIC, RR_NULL, RECC_NULL, ".*", RECA_NULL}
```

## Via レスポンスヘッダー内のバージョンを非表示にする

[records.config](https://docs.trafficserver.apache.org/ja/latest/admin-guide/files/records.config.en.html) の [proxy.config.http.insert_response_via_str](https://docs.trafficserver.apache.org/ja/latest/admin-guide/files/records.config.en.html#proxy-config-http-insert-response-via-str) の値に応じて、レスポンスの `Via` ヘッダーの値は以下のようになります。

* 0: (Via ヘッダー無し)
* 1: `http/1.1 copr-builder-673246007.novalocal (ApacheTrafficServer/5.3.2)`
* 2: `http/1.1 copr-builder-673246007.novalocal (ApacheTrafficServer/5.3.2 [cSsSfU])`
* 3: `http/1.1 copr-builder-673246007.novalocal (ApacheTrafficServer/5.3.2 [uScMsSf pSeN:t cCMi p sS])`

2 と 3 の場合の角括弧の中身はキャッシュのヒット／ミスなどの状態を表しています。 [Via Decoder Ring](http://trafficserver.apache.org/tools/via) でデコードするか、 [FAQ](https://docs.trafficserver.apache.org/ja/latest/appendices/faq.en.html) の [どうやって Via: ヘッダーコードを解釈するのですか？](https://docs.trafficserver.apache.org/ja/latest/appendices/faq.en.html#how-do-i-interpret-the-via-header-code) を見れば意味がわかります。

Apache Traffic Server からクライアントへのレスポンスの `Via` ヘッダー内のバージョンを非表示にするには [records.config](https://docs.trafficserver.apache.org/ja/latest/admin-guide/files/records.config.en.html) に以下のように設定します。

```:/etc/trafficserver/records.config
CONFIG proxy.config.http.response_via_str STRING ApacheTrafficServer
```

`proxy.config.http.response_via_str` は [records.config のドキュメント](https://docs.trafficserver.apache.org/ja/latest/admin-guide/files/records.config.en.html) には記載されていませんでしたが、ソースコードでは https://github.com/apache/trafficserver/blob/770e7878c0f4dde9516f6f93490eb8b2f66a8dd2/mgmt/RecordsConfig.cc#L408 で定義されていて、デフォルト値は `"ApacheTrafficServer/" PACKAGE_VERSION` です。

```c++:mgmt/RecordsConfig.cc#L408
  {RECT_CONFIG, "proxy.config.http.response_via_str", RECD_STRING, "ApacheTrafficServer/" PACKAGE_VERSION, RECU_DYNAMIC, RR_NULL, RECC_NULL, NULL, RECA_NULL}
```

## Via リクエストヘッダ内のバージョンを非表示にする

[records.config](https://docs.trafficserver.apache.org/ja/latest/admin-guide/files/records.config.en.html)の[proxy.config.http.insert_request_via_str](https://docs.trafficserver.apache.org/ja/latest/admin-guide/files/records.config.en.html#proxy-config-http-insert-request-via-str)の値に応じて、Apache Traffic Serverからオリジンサーバーへのリクエストの `Via` ヘッダーは以下のようになります。

* 0: (Via ヘッダー無し)
* 1: http/1.1 copr-builder-673246007.novalocal\[0A00020F] (ApacheTrafficServer/5.3.2)
* 2: http/1.1 copr-builder-673246007.novalocal\[0A00020F] (ApacheTrafficServer/5.3.2 [uScH])
* 3: http/1.1 copr-builder-673246007.novalocal\[0A00020F] (ApacheTrafficServer/5.3.2 [uIcHs f p eN:t cCSi p s ])

なお、値は[カスタムログギングフィールド](http://trafficserver.readthedocs.org/ja/latest/admin-guide/monitoring/logging/log-formats.en.html#custom-logging-fields)の[pqh (プロキシーのリクエストの HTTP ヘッダー)](http://trafficserver.readthedocs.org/ja/latest/admin-guide/monitoring/logging/log-formats.en.html#custom-logging-fields)で `%<{Via}pqh>` のように指定して確認しました。

Apache Traffic Serverからオリジンサーバーへのリクエストの `Via` ヘッダー内のバージョンを非表示にするには [records.config](https://docs.trafficserver.apache.org/ja/latest/admin-guide/files/records.config.en.html) に以下のように設定します。

```:/etc/trafficserver/records.config
CONFIG proxy.config.http.request_via_str STRING ApacheTrafficServer
```

`proxy.config.http.request_via_str` は [records.config のドキュメント](https://docs.trafficserver.apache.org/ja/latest/admin-guide/files/records.config.en.html) には記載されていませんが、ソースコードでは https://github.com/apache/trafficserver/blob/770e7878c0f4dde9516f6f93490eb8b2f66a8dd2/mgmt/RecordsConfig.cc#L406 で定義されていて、デフォルト値は `"ApacheTrafficServer/" PACKAGE_VERSION` です。

```c++:mgmt/RecordsConfig.cc#L406
  {RECT_CONFIG, "proxy.config.http.request_via_str", RECD_STRING, "ApacheTrafficServer/" PACKAGE_VERSION, RECU_DYNAMIC, RR_NULL, RECC_NULL, NULL, RECA_NULL}
```