基本的セキュリティ対策チェックリスト（CentOS7 @ さくらのVPS）

> "Security is a journey, not a destination."
> 　　　　　　　　　　──────　by [Bruce Schneier](https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AB%E3%83%BC%E3%82%B9%E3%83%BB%E3%82%B7%E3%83%A5%E3%83%8A%E3%82%A4%E3%82%A2%E3%83%BC)

# セキュリテイ・チェックリスト

OS（CentOS7）をインストールした直後に設定する**セキュリティ対策の ToDo リスト**です。

盲目的に設定するのではなく、理由を知った上で対策することが重要です。可能な限りインラインコードや括弧内は、各々にそのキーワードで検索の関連リンクを張っています。

> <sup>**「さくらの VPS」ユーザー**は、主に Apache の設定がメインであるものの『[VPS 設定マニュアル](http://www.sakura-vps.net/)』は**必読**だと思います。</sup>
 
---

- [ ] バックアップ体制（3-2-1 ルール）
- [ ] アップデート（`yum update`, WordPress, plug-inなど）
  - `yum --enablerepo=remi,remi-php56 update -y && reboot` （KUSANAGIの場合）
- [ ]  root のパスワードを他のユーザと同じにしない
  - [`passwd`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E5%A4%89%E6%9B%B4), [`mkpasswd -l 12`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+%E3%83%A9%E3%83%B3%E3%83%80%E3%83%A0+%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E4%BD%9C%E6%88%90)
- [ ]  root になれるユーザの作成と限定
  - [`useradd`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+useradd), [`wheel`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+wheel)
- [ ]  log を監視しやすい体制を整える
    - [`Logwatch`](https://www.google.co.jp/search?q=site:qiita.com+logwatch+CentOS7)
- [ ]  接続失敗を繰り返す IP をブロックする
    - [`denyhosts`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+denyhosts)
    - 2020/01/21 現在 `yum` ではインストールできなくなっています。[ソースからビルドする](https://nakoruru.jp/?p=3823)必要があります。
- [ ]  不要なポートを閉じる
    - [`firewalld`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+firewalld)

---

- [ ]  `.ssh` ディレクトリのパーミッション
  - [`chmod 0700 .ssh`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+.ssh+%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA+%E3%83%91%E3%83%BC%E3%83%9F%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3)
- [ ]  SSH 接続ユーザの公開鍵のアップロード
    - [`~/.ssh/authorized_keys`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+.ssh+authorized_keys), [`scp`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+scp) or [`ssh-copy-id`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+ssh-copy-id)
- [ ]  authorized_keys ファイルのパーミッション変更
    - [`chmod 0600`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+.ssh+authorized_keys+%E3%83%91%E3%83%BC%E3%83%9F%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3+0600)
- [ ]  [/etc/ssh/sshd_config](https://www.ssh.com/ssh/sshd_config/) の編集
  - [ ]  パスワード認証による SSH の接続を禁止（[`PasswordAuthentication`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+sshd_config+%22PasswordAuthentication+no%22)）
  - [ ]  [rootのssh接続を無効にする](http://qiita.com/search?q=root+ssh+%E6%8E%A5%E7%B6%9A+%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3+%E7%A6%81%E6%AD%A2+PermitRootLogin)（[`PermitRootLogin`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+sshd_config+%22PermitRootLogin+no%22)）
  - [ ]  SSH 接続するユーザーを限定（[`AllowUsers`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+sshd_config+AllowUsers)）
  - [ ]  [SSH ポート番号の変更](https://www.sakura-vps.net/ssh-firewall-security-settings-for-sakura-vps/)（[`Port`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+sshd_config+%E3%83%9D%E3%83%BC%E3%83%88%E5%A4%89%E6%9B%B4)）
      - [ ]  [/usr/lib/firewalld/services/ssh.xml](https://github.com/firewalld/firewalld/blob/master/config/services/ssh.xml) の変更<br><sup>**ポート変更箇所は２箇所ある**ので忘れずに。（"/etc/ssh/sshd_config" と "/usr/lib/firewalld/services/ssh.xml"）<br><strong>`yum update` をすると `ssh.xml` のポートがデフォルトに戻ることがあるので<font color="red">注意！</font></strong>アップデート後デフォルトに戻った場合は SSH 接続できなくなります。頻繁におきるようだったら、ssh.xml をコピーして別途登録します。以下の記事が参考になります。</sup>
          - <sup>[CentOS7でSSHのポート番号を変更する](https://qiita.com/fk_2000/items/019b62818e34be973227) @ Qiita</sup>

```shell-session:SSHの任意のポートをファイアーウォールに開ける（要sshd_config変更済み）
$ # 設定の確認
$ firewall-cmd --list-all
$ # 設定ファイルの作成（SSH 22 ポートの設定ファイルをコピー）
$ cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-<ポート番号>.xml
$ # XML 内のポート番号の箇所を変更
$ vi /etc/firewalld/services/ssh-<ポート番号>.xml
$ # 設定変更（旧 SSH のポート 22 を閉じて新しい SSH のポートを開ける）
$ firewall-cmd --permanent --remove-service=ssh
$ firewall-cmd --permanent --add-service=ssh-<ポート番号>
$ firewall-cmd --reload
$ # 設定の確認
$ firewall-cmd --list-all
```

- [ ]  SSH 接続元を IP・ホスト名で限定（[`hosts.allow`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+sshd_config+%22hosts.allow%22), [`hosts.deny`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+sshd_config+%22hosts.deny%22)）
  - [ ] 接続元である自宅や会社のプロバイダーの[グローバル IP からホスト名を探し](https://www.google.com/search?q=%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%ABIP+%E3%83%9B%E3%82%B9%E3%83%88%E5%90%8D+%E7%A2%BA%E8%AA%8D)ワイルドに指定する。<br>（例: `123x123x123x123.ap123.ftth.ucom.ne.jp` が現在のホスト名だとすると `*.ap123.ftth.ucom.ne.jp` のように変動しないホスト部分を残して指定する。`hosts.deny` で全てをブロックしておき、`hosts.allow` に `*.ap123.ftth.ucom.ne.jp` を加えて SSH 接続元の許可を限定させる）
    - 資料：[接続時のセキュリティの設定（CentOS 7）](https://www.sakura-vps.net/centos7-setting-list/ssh-firewall-security-settings-for-sakura-vps-centos7/) @ さくらの VPS 設定マニュアル
    - 資料：[Bash で未使用の空きポートをランダムに取得する関数](https://blog.keinos.com/20180125_3145) @ KEINOS Blog

```bash:ランダムな空きポートの取得ワンライナー
(netstat --listening --all --tcp --numeric | sed '1,2d; s/[^[:space:]]*[[:space:]]*[^[:space:]]*[[:space:]]*[^[:space:]]*[[:space:]]*[^[:space:]]*:\([0-9]*\)[[:space:]]*.*/\1/g'| sort -n | uniq; seq 1 $PORT_NUM_MIN; seq 1 $PORT_NUM_MAX ) | sort -n | uniq -u | shuf -n 1
```

---
  
- [ ]  Web サーバ（主に nginx）
  - [ ]  http 接続を https に転送させる（`/etc/nginx/conf.d/*_http.conf`）
  - [ ]  Let's Encrypt/SSLの更新（有効期限確認）
  - [ ]  HTTP応答ヘッダー
      - [ ]  OS のバージョン情報を含めない（[`server_tokens`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+Nginx+%22server_tokens+off%22+%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B9%E3%83%98%E3%83%83%E3%83%80)）
      - [ ]  SSL 用に HSTS を含める設定([`Strict-Transport-Security`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+Nginx+%22Strict-Transport-Security%22))
      - [ ]  CSP を含める設定（[`Content-Security-Policy`](https://www.google.co.jp/search?q=site%3Aqiita.com+CentOS7+Nginx+%22Content-Security-Policy%22+CSP)）
      - [ ]  X-Frame-Option を SAMEORIGIN に設定にする（iframe での利用拒否、`DENY` が理想）
      - [ ]  ダウンロードしたファイルの種類をファイルの内容から決定させない（[`X-Content-Type-Options` を "nosniff" に](https://www.google.com/search?q=site:qiita.com+X-Content-Type-Options&tbs=qdr:y)）
          - [OWASP ZAP](https://qiita.com/tags/owasp_zap) ツールの X-Content-Type-Options header missing エラー対策
      - [ ]  ダウンロードしたファイルを自動で開かせない（`X-Download-Options`）
  - [ ]  SSL の conf に SSLv2, SSLv3 が含まれていないか確認（`ssl_protocols`）
  - [ ]  デフォルトの Welcome ページを変更する
  - [ ]  DocumentRoot 以下の各ディレクトリ直下に index.html を設置する（ない場合）
      - [ポカよけ](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%82%AB%E3%83%A8%E3%82%B1)
  - 資料：[KUSANAGI の nginx で HSTS を設定する方法](https://keikenchi.com/hsts-setting)

---

- [ ] Wordpress の設定
    - [ ]  DB の接頭辞を "WP_" 以外にする
    - [ ]  ソース内のWordpressバージョンを非表示にする（`remove_action,generator`）
    - [ ]  重要ファイルはWEBアクセス圏外のディレクトリに移動する（`wp-config`）
    - [ ]  ファイル・ディレクトリの所有者の確認（`wp-config.php`,`0600`）
    - [ ]  ファイル・ディレクトリのアクセス権の確認（`0700`）
    - [ ]  管理者向けディレクトリは[ベーシック認証](https://qiita.com/mpyw/items/bb8305ba196f5105be15#basic%E8%AA%8D%E8%A8%BC)もかける（`.htaccess`, `0600`, `wp-admin`）
    - [ ]  [`Wordpress` `セキュリティ` `対策` を Qiita に絞って検索](https://www.google.co.jp/search?q=site:qiita.com+WordPress+%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3+%E5%AF%BE%E7%AD%96) @ Google

---

- [ ] セキュリティチェック
    - SSL サーバーテスト（SSL 対応グレード評価）
        - https://www.ssllabs.com/ssltest/ @ SSL Labs
    - レスポンスヘッダー、SSL/TLS 設定のセキュリティ・チェック
        - https://observatory.mozilla.org/ @ Mozilla.org
    - Webアプリケーション脆弱性診断ツール
        - [OWASP ZAP(The Open Web Application Security Project's Zed Attack Proxy)](https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project) @ OWASP.org
    - WordPress 脆弱性チェック
        - https://wpscans.com/ @ [WPSCANS](https://www.urlvoid.com/scan/wpscans.com/)
    - 総合チェック
        - https://sitecheck.sucuri.net/ @ [SECUri](https://www.urlvoid.com/scan/sitecheck.sucuri.net/)
        - https://hackertarget.com/wordpress-security-scan/ @ [HACKERTARGET](https://www.urlvoid.com/scan/hackertarget.com/)
- [ ]  その他（やった方がいいが諸事情でペンディングにしているもの）
  - [ ]  HTTP 応答ヘッダー
      - [ ]  HPKP（PIN）を設定する（[`HTTP Public Key Pinning`](https://www.google.com/search?q=HPKP+Http+Public+Key+Pinning)） 
      - [ ]  Referrer-Policy を設定する（[`Referrer-Plicy` `Nginx`](https://www.google.com/search?q=Referrer-Policy+Nginx)）
  - [ ]  IDS（ファイル改ざん検知ツール）を入れる（[`IDS` `AIDE`](https://www.google.com/search?q=%E6%94%B9%E3%81%96%E3%82%93+IDS+AIDE+CentOS)）
  - [ ]  マルウェア／ウィルス検知ツールを入れる（[`Sophos AV`](https://www.google.com/search?q=Sophos+AV+linux), [`Clam AV`](https://www.google.com/search?q=Clam+AV+Linux)）
      - 特にユーザー・アップロードやダウンロード・ファイルをサーバーに保存する必要がある場合

---

## 所感

最近、検証のために OS を入れ直すことが多いのですが、[バニラ](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%8B%E3%83%A9_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2))状態から毎回行う設定項目の私的チェック・リストです。VPS だと簡単に入れ直すことが出来て便利ですね。

毎回行うことなので、作業効率的にはスクリプトや [Ansible](https://ja.wikipedia.org/wiki/Ansible_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2)) などで設定した方がいいかもしれません。しかし、**私は絶対忘れる**自信があります。そのため、**最低限のセキュリティ設定は体で覚えたい**なと思って毎回ゴリゴリ設定しています。もぅ、写経ならぬ乱取り稽古の勢い。

基本的に自分用（メモを見てあっ！と思い出せるもの）なので詳しい内容は記載していませんが、せっかくなので Qiita でシェアします。

「これ忘れとるよー」とお気付きの点や、おすすめの項目などありましたらコメントいただけるとありがたいです。