とある自社・自宅サーバーの建て方:超かんたん概要

とある理由で物理サーバーを建てることとなりました。
せっかくなので、サーバー建て方を備忘録として残します。

細かく掘り下げずに【ざっとした概要（メモに近い）】としています。
サーバーを建ててから、数日が立っており多少ズレていたり間違っているところがあるかもしれません。

目次は以下のとおり。
1. マシーン選定
どんなマシーンをサーバーにする？

2. 回線の申し込み
サーバー公開用の回線を決める。

3. IP、ドメイン取得

4. サーバー設定
Webサーバー周りと、セキュリィ準備が中心

5. セキュリティ対策
必要最低限のセキュリティ対策

6. コーディングチェック
簡単でよくあるチェック項目

7. その他
サイト解析とか、死活監視とか


## 1 マシーン選定
サーバーにするマシーンを決める。
何をするかによりますが、CPU、メモリの性能を留意したいです。
あとは、排熱性も大事みたいです。

おすすめとしては、ミドルタワー型のPCです。

## 2 回線の申し込み

### 既存回線か、新規回線か
すでにある既存の回線を使うのか、それとも新規にネット回線を引くのかまず決めます。
こちらもサーバーに何をやらすかによりますが、
おすすめは、【新規】に独立して回線を引いたほうがよいです。
理由として、

- クラックされて万が一突破された場合、ネットワーク上の他の端末に被害が及ぶ。
- 公開サーバーに帯域を奪われてしまい、他の端末の通信が遅くなる。
- iptableなど、ネットワーク全体で設定する箇所があり、他の端末に影響が出てしまう。

逆をいえば、あくまでプライベートもしくは、1日に数十件のアクセス、知っている方からのみのアクセスなどの場合は、既存の回線でもよいと思います。

### その回線プランで、サーバー公開できるのか？
もうひとつ、公開に適している回線プランなのか確認が必要です。

- 固定IPできるか
サーバーを公開するにはIPアドレスを固定する必要がありますので、固定IPできる回線プランを選ぶ必要があります。

- 上り速度
通常のPCと違い、サーバーからネット上にデータを返すことが多くなりますので、上りの速度はある程度欲しいところです。

- 転送制限があるか
プロバイダーやプランによっては転送制限がある場合があります、例:（30GB/日）とか。なるべく制限が無いものを選びたいです。

### 新規回線の流れ
あくまで私が行った開通までの流れです。

1. プロバイダーに連絡
サーバーを建てたい旨を触れて、問題ないか問い合わせ。念には念をです。

2. 回線プラン申し込み
ほとんどのプロバイダーはネット上から申し込みできます。

3. NTTからFLET'S工事の電話が来る
時期によりますが、申し込んでから1-2週間でNTTの工事業者から電話がかかってきます。注意としては、留守電に入れてくれなかったり、ちょっと勤務時間ではない時間にかかってきたりが時々あります。
FLET'S工事は2段階です。
  - 1回目、FLET'S敷設できるかチェックに来る。(申し込みから2週間ぐらい)
  - 2回目、本工事（チェックから2週間ぐらい）  
それぞれ、業者からかかってくる電話で時間を予約して決める必要があります。
また、時期によりますが申し込みから開通まで1ヶ月近くかかる場合もあります。
特に、3月後半〜4月前半はものすごく混むらしいで要注意！

4. 工事が終われば、、
ネットはすぐに使えるようになります。次は固定IPの取得ですが、ざっと5-7営業日かかると見込んでおきましょう。
以下の流れの後に申請できるようになるためです。
工事→工事業者さんがNTTに連絡→NTTがプロバイダーに連絡→プロバイダーがユーザーのステータスを変更（開通済に）
ステータスが変更された後に、開通のお知らせがメールで届きますので、
その後に、固定IP取得申請が可能となります。

しばし、メール到着まで待ちましょう。

## 3. IP、ドメイン取得
「回線の申し込み」の続きです。

### 固定IPの取得
プロバイダーから開通のお知らせが届いたら、Web上で固定IPの申し込みをします。
20、30分ぐらいですぐに反映されたと思います。

### ドメインの取得
すみません、ここに関しては自分でやっていなくて知識がありません。
固定IPと取得したいドメインを結びつける作業となります。
お名前.comとか参考です。

### ssl証明取得
TLSデジタル証明の取得となります。簡単にいうと、httpsにする証明のことです。
sslでhttpsにしておかないと、googleの検索でかなり扱いが小さくなるのでssl取得をおすすめしておきます。また、httpを暗号化すると言う意味でも、ユーザーとセキュアーな通信となります。

お手軽な方法としてLet's Encryptがあります。
以下の準備が必要です。

- DNS設定されている（正引きされている:ホスト名からIPアドレスが引ける）
- 80番、443番ポートにアクセスできる
- サーバーが設定済みである。

参考ページ
IP調べるサイト
https://www.cman.jp/network/support/ip.html

自分のIP
https://www.cman.jp/network/support/go_access.cgi


certbot コマンドでインストール
参考ページ
https://officeyuai.com/ubuntu18-04/ubuntu-18-04でlets-encryptを使用してapacheを保護する方法/

Lets'Encryptの証明書は3ヶ月ごとに更新が必要です。
忘れてしまうので、crontabに設定してきましょう。

```
sudo crontab -e

0 3 1 * * /usr/bin/certbot renew
```

## 4.サーバー設定
### ubuntuをインストール
16.04を入れようとしたけど、何度やってもインストール途中で止まってしまいました。
原因はおそらく、PCのUEFI（BIOS）との相性のようです。
OSとUEFIの相性ってあるのね。。
根気よくドライバーを整理し入れ直せばインストール可能のようですが、
16.04に強いこだわりがなかったので18.04をインストールすることにしました。

USBメモリを使って、ブートUSBに作成
こちらのサイトが丁寧に解説↓
https://qiita.com/hktm/items/0bacdd144365c2da1165

PC起動時に[F2]か[F12]長押しで、UEFI画面を開き、(PCにより異なる)
起動デバイス設定からInstall Ubuntu Serverを選びubuntuをインストール。

### Webサーバーをインストール

apache2インストール

```
sudo apt install apache2
```

apache全体の設定

```
/etc/apache2/apache2.conf
```

ディレクトリ不可視にしておきます。
下記の Indexを削除します。

```
<Directory />
    Options Index
</Directory>
```

バーチャルホストの設定

```
/etc/apache2/sites-available/
```

簡単に触れると、同じIPアドレスでもportや、ドメイン名によってページを出し分けることができます。
それぞれのドメイン設定となります。
おすすめは、000-default.confをコピーして任意の名前をつけての編集です。

```
cp 000-default.conf hoge.conf
```
hoge.conf 編集後に、設定をenableにします。

```
sudo a2ensite hoge.conf
```
ちなみに
a2ensite → available to enabled site の略と思われます。
（変更）可能な設定を有効に変更するって感じ。

設定の再読込み

```
sudo systemctl reload apache2
```
起動

```
sudo systemctl start apache2
```
サーバー復帰後も自動でdeamon起動するようにします。

```
sudo systemctl enable apache2
```
ざっとこんな感じ(細かく書くのはまたの機会に。。）


### sshを使えるようにする

インストール

```
sudo apt install openssh-server
```

パスワードでssh接続できるかを確認。

公開鍵認証を設定
エンジニアさんのルールによりますが、
公開鍵認証を作ったら、パスワード接続は不可にしてしまうのもよいかと思います。

rootユーザーのログインを不可にする

### tmuxをインストール
ssh接続が急に切れても続きからできるようになります。

```
sudo apt install tmux
```
tmuxの設定は以下に記述

```
~/.tmux.conf
```
設定を読み込み

```
tmux source ~/.tmux.conf
```

### firewallの設定
uwfを使って、不要なportを閉じます。
- ssh(22)接続は自ネットワーク内からのみ
- http(80)、https(443)は
  サーバー公開前は自ネットワーク内のみで、公開時は開放します。

ufw 動作状況確認

```
sudo ufw status

ルール番号を知りたいときは
sudo ufw status numbered

まず、デフォルトで一度denyにする
sudo ufw default deny

その後、必要なportを許可していく。
sudo ufw allow from 192.168.1.0/24 to any port 443
sudo ufw allow from 192.168.1.0/24 to any port 80
sudo ufw allow from 192.168.1.0/24 to any port 22
```

サーバー公開時

```
sudo ufw delete [ルール番号]

一度、443,80を完全に閉じた後、
下記でポート開放・公開する
sudo ufw allow 443
sudo ufw allow 80
```

ファイヤーウォールを有効にする

```
sudo ufw enable
```
### fail2banの設定
悪意のあるアクセスを捉えて、アクセス元のIPをbanしてくれます。

インストール

```
sudo apt install fail2ban
```

設定ファイルを作ります。
jail.confをコピーしましょう。

```
cd /etc/fail2ban/
sudo cp jail.conf jail.local
```
jail.localを編集していきます。

- ignoreipを設定
無視してよいIPアドレスがあれば記述
例:ignoreip = 127.0.0.1/8 192.168.0.0/16

- IPアドレスを○秒間遮断する
例:1日 bantime = 86400

- [sshd]の項目に以下を記述しsshdで有効にする
[sshd]
enabled = true

fail2ban の起動

```
sudo systemctl start fail2ban.service
(serviceの場合は、.service省略可)
```

sshdの状況を確認

```
sudo fail2ban-client status sshd
```

(場合により)
---
### anacondaインストール

参考サイト
https://www.sejuku.net/blog/85373

### php7インストール
```
sudo apt install php libapache2-mod-php php-cgi php-mbstring php-pear
```
参考サイト
どうせ開発までするならx-debugも入れたほうが良いと思います↓
https://qiita.com/yamatmoo/items/b9e8035c55032de88084


## 5.セキュリティ対策
以下、最低限必要な対策を羅列します。

### OSコマンドインジェクション対策
 本来なら、なるべくexec処理を書かないのが正解ですが、
 必要な場合は、execの変数をエスケープ処理します。

### ユーザー入力のエスケープ処理
言わずもがな、絶対必須です。
上記のOSコマンドでも言えますが、フロント側ではなく、サーバ側プログラムでエスケープ処理します。悪意を持ったユーザーはフロント側だけだと改竄してしまいます。

### UPファイルのファイル名をリネーム
ユーザーが画像とかをアップなどするなら、ファイル名のリネームが必要です。

### 他に、
 - X-Frame-Option
 - X-XSS-Protection
 - X-Content-Type
 - LimitRequestBody
 - LimitRequestFields
も設定。後述の「安全なウェブサイトの作り方」を確認すると楽です。

### 開発言語の設定をdev→procuctionに変更
例:phpなら、

```
php.ini
    error_reportingをオフ
    display_errorsをオフ
    xdebugをオフ
    display_startup_errorsをオフ
```
など、他にmemoryサイズや、許容ファイルサイズなども確認。
画像のUPロードがあるなら、php.iniで許容するファイルサイズを設定する。
また、コード側でも必要以上に大きなファイルを弾くようにする。


## 6.コーディングのチェック
あるあるのチェック内容を簡単に触れます。

### エラーハンドリングちゃんと書く
try catch が漏れなく書かれているか

### 0割チェック
チェックしましょう。開発では0で割るケースがたまたまなかっただけかもしれません。

### 無限ループチェック
これも、基本ですがチェック。
主要な箇所の条件分岐はよく確認です。


### ユーザーへのエラー表示どうする
何が起こったのか的確に分かるけど、ユーザーに表示するのは最小限に。
余計な情報は不要です。


### 余計なconsole表示を削除
consoleに本番には不要な表示がされていないかをチェック、削除します。

### リストでチェック
以下のサイトから、チェックリストをダウンロードして確認する。

「安全なウェブサイトの作り方」チェックリストを確認
https://www.ipa.go.jp/security/vuln/websecurity.html

## 7.その他

### 画像サイズは適切か
無駄に大きな画像やファーマットを最適化する。


### アクセス解析仕込む
GoogleAnalyticsとか。

### 死活監視
簡単なものなら、savamoniを導入。

---
以上、
気がついたら端折ったつもりだったのに、結構長くなってしまいました。
時をみて、加筆修正、分割するかもしれません。
それでは、良い自鯖ライフを。