お名前.comが勝手にWebサーバのセキュリティ診断してくれたので、解決してみた。

# 勝手な事やってくれたなぁ、お名前.com

![スクリーンショット 2025-02-23 112523.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624329/b2dfa480-74a1-455d-94bb-b874b8305b1b.png)

お名前.comからドメイン等を購入すると、怒濤のごとく「ドメイン買いませんか？」メールが大量に送られてくる、曰く付きのサイトなのですが、
自分が使用しているドメインが元々お名前.comなので、そのサービスの一環なのか、新サービスのPRが目的なのか、勝手にセキュリティ診断を行い、一方的に診断結果が送られてきました。

診断結果は**D判定**でした。
まぁ、ちょっと時間的にも余裕が出来たので、こいつの対処をやってみたいと思います。

## nginxのバージョンが古くてサポート切れしている。

![スクリーンショット 2025-02-23 093249.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624329/5a96cb27-70bc-436b-ba6f-6630954b571a.png)

そもそもOSのバージョンがubuntu 22.04なので、LTSのサポート期間中なのに最新のnginxが古いのはどうなのか、と思いますが。
結局はOSをubuntu 24.04にアップグレードし、さらにリポジトリなどを弄って、nginx 1.24にバージョンアップしました。

:::note info
それでも、nginx 1.24は現在サポート切れているようです。。。
:::

## HTTPヘッダにHSTSが無い。

![スクリーンショット 2025-02-23 105431.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624329/4eff58c9-541f-4f7a-b7dd-5b782affdec9.png)

よくわからんけど、これが無いとサイトにアクセスした人が悪意あるサイトに誘導されてしまうらしい。

対策はnginxの設定ファイルに以下を追加すれば良い。

```nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
```

設定例
```nginx
server {
    listen 443 ssl;
    server_name diet.taki-lab.site;

    ssl_certificate /etc/letsencrypt/live/diet.taki-lab.site/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/diet.taki-lab.site/privkey.pem;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
}
```

## X-Frame-Optionsが無い

![スクリーンショット 2025-02-23 105632.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624329/e7db1bab-ceab-4ed4-a15b-07b0f8ab2e6f.png)

これを設定しないと、悪意あるサイトのiframeの中に、自分のサイトが埋め込まれてしまうらしい
対策はnginxの設定ファイルに以下を追加すれば良い。

```nginx
add_header X-Frame-Options "DENY" always;
```

## X-Content-Type-Options が無い

![スクリーンショット 2025-02-23 105941.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624329/a24e1c44-3e6a-4b23-afe7-247c35e72e36.png)

これが無いと、テキストファイルや画像ファイルを、謝ってスクリプトとして実行可能になってしまうらしい。

対策はnginxの設定ファイルに以下を追加すれば良い。
```nginx
add_header X-Content-Type-Options "nosniff" always;
```

## Content-Security-Policy(CSP)が無い

![スクリーンショット 2025-02-23 110138.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624329/41081933-476c-41e9-8baf-b805631828d3.png)

これが無いと、XSS（クロスサイトスクリプティング）やクリックジャッキング攻撃のリスクがあるらしい。

対策はnginxの設定ファイルに以下を追加すれば良い。
```nginx
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self'; img-src 'self'; font-src 'self'; object-src 'none'; frame-ancestors 'none'; base-uri 'self'; form-action 'self';" always;
```

ChatGPT曰く、これらの設定には、

* default-src 'self' → すべてのリソースは自サイト (self) からのみ許可
* script-src 'self' → JavaScript の読み込みを自サイトのみに限定
* style-src 'self' → CSSも自サイトのもののみ許可
* img-src 'self' → 画像も自サイトのもののみ許可
* font-src 'self' → フォントも自サイトのもののみ許可
* object-src 'none' → FlashやJavaアプレットの読み込みを禁止
* frame-ancestors 'none' → iframe で埋め込まれないようにする（クリックジャッキング対策）
* base-uri 'self' → <base> タグの悪用を防ぐ
* form-action 'self' → フォーム送信を自サイトのみに制限

という意味があるらしい。

:::note warn
これを入力したら、wordpressのブログサイトの表示がおかしくなった。
消したら元に戻ったので、現在消したままの状態にしている
:::


## nginxのバージョンが見えてしまう

![スクリーンショット 2025-02-23 110320.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624329/daeacc1a-3cbb-47d1-ac51-44030d5895e9.png)

nginxのバージョンが見えてしまうと、どんな脆弱性を突くことが可能かが分かってしまうので、バージョンが分からないようにする方がセキュリティ的に良いらしい。

対策はnginxの設定ファイルに以下を追加すれば良い。
```nginx
http {
    server_tokens off;
}
```

# 最終的にこうなった。

![スクリーンショット 2025-02-24 084953.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624329/90edc069-d505-4f89-bfa4-e22630aaa0ab.png)

これまでは「Webが動けばいいや」みたいに考えていた（7年間）けど、
Web関連の仕事を通してきて、少しセキュリティについても知識を身につけないと、と考えていて、
今回の一連の作業を通じて色々学ぶ機会が合って、結果的に良かったかなと思います。