とある理由で物理サーバーを建てることとなりました。
せっかくなので、サーバー建て方を備忘録として残します。
細かく掘り下げずに【ざっとした概要(メモに近い)】としています。
サーバーを建ててから、数日が立っており多少ズレていたり間違っているところがあるかもしれません。
目次は以下のとおり。
-
マシーン選定
どんなマシーンをサーバーにする? -
回線の申し込み
サーバー公開用の回線を決める。 -
IP、ドメイン取得
-
サーバー設定
Webサーバー周りと、セキュリィ準備が中心 -
セキュリティ対策
必要最低限のセキュリティ対策 -
コーディングチェック
簡単でよくあるチェック項目 -
その他
サイト解析とか、死活監視とか
1 マシーン選定
サーバーにするマシーンを決める。
何をするかによりますが、CPU、メモリの性能を留意したいです。
あとは、排熱性も大事みたいです。
おすすめとしては、ミドルタワー型のPCです。
2 回線の申し込み
既存回線か、新規回線か
すでにある既存の回線を使うのか、それとも新規にネット回線を引くのかまず決めます。
こちらもサーバーに何をやらすかによりますが、
おすすめは、【新規】に独立して回線を引いたほうがよいです。
理由として、
- クラックされて万が一突破された場合、ネットワーク上の他の端末に被害が及ぶ。
- 公開サーバーに帯域を奪われてしまい、他の端末の通信が遅くなる。
- iptableなど、ネットワーク全体で設定する箇所があり、他の端末に影響が出てしまう。
逆をいえば、あくまでプライベートもしくは、1日に数十件のアクセス、知っている方からのみのアクセスなどの場合は、既存の回線でもよいと思います。
その回線プランで、サーバー公開できるのか?
もうひとつ、公開に適している回線プランなのか確認が必要です。
-
固定IPできるか
サーバーを公開するにはIPアドレスを固定する必要がありますので、固定IPできる回線プランを選ぶ必要があります。 -
上り速度
通常のPCと違い、サーバーからネット上にデータを返すことが多くなりますので、上りの速度はある程度欲しいところです。 -
転送制限があるか
プロバイダーやプランによっては転送制限がある場合があります、例:(30GB/日)とか。なるべく制限が無いものを選びたいです。
新規回線の流れ
あくまで私が行った開通までの流れです。
-
プロバイダーに連絡
サーバーを建てたい旨を触れて、問題ないか問い合わせ。念には念をです。 -
回線プラン申し込み
ほとんどのプロバイダーはネット上から申し込みできます。 -
NTTからFLET'S工事の電話が来る
時期によりますが、申し込んでから1-2週間でNTTの工事業者から電話がかかってきます。注意としては、留守電に入れてくれなかったり、ちょっと勤務時間ではない時間にかかってきたりが時々あります。
FLET'S工事は2段階です。
- 1回目、FLET'S敷設できるかチェックに来る。(申し込みから2週間ぐらい)
- 2回目、本工事(チェックから2週間ぐらい)
それぞれ、業者からかかってくる電話で時間を予約して決める必要があります。
また、時期によりますが申し込みから開通まで1ヶ月近くかかる場合もあります。
特に、3月後半〜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を導入。
以上、
気がついたら端折ったつもりだったのに、結構長くなってしまいました。
時をみて、加筆修正、分割するかもしれません。
それでは、良い自鯖ライフを。