読む人も、書く人も、
すべてを考え抜いたデザイン。
真の使いやすさを追求したWPテーマ『JIN』
VPS×Djangoセットアップ

【conoha】VPSサーバーのセキュリティ対策

こんにちは、hokkyokunです。

初心者向け、特に非ITエンジニアの一般事務家にconohaVPSのサーバーの立ち上げ方とDjangoフレームワークを使ったウェブアプリの立ち上げ方を解説しています。

VPSサーバーは共有サーバーと違い、自分で管理しなければいけない点がたくさんあり、初心者にはハードルがとても高いです。

私自身、非IT職のサラリーマンで、エンジニアとして働いたことは一度もありませんが、四苦八苦しながらDjangoをVPSサーバーで立ち上げました。

自分が立ち上げるときにこんなサイトがあれば苦労しなかったのに…、というようなサイトを目指しています。

プロのエンジニアだったら「そんなことわからないの?」となりそうなところも、非ITエンジニアだからこそ、丁寧に、初心者でもわかりやすく、解説していきます。

今回は、セキュリティ対策です
最低限やっておくべき対策をまとめておきました。

私がそうだったのですが、初心者は何をすればいいのかわからないと思います。
具体的にどんな作業をし、なぜそれをするべきかを解説しています。

【セキュリティ対策1】SSHユーザーログインにする

SSHとは

まずSSHとは何かを簡単に説明します。

SSH(Secure Shell)は、ネットワークを通じてリモートサーバーに安全に接続するためのプロトコルです。通常、SSHは暗号化された通信を提供し、ユーザーがリモートサーバーでコマンドを実行したり、ファイルを転送したりするのに使用されます。

VPSサーバーをレンタルするわけですが、自宅等の自分のPCから遠隔操作をする必要があります。このときの通信が単なるログイン名とパスワードだと悪意のある第三者から攻撃される危険性が高い状態です。

SSHは公開鍵という文字列の塊と、秘密鍵という文字列の塊があり、公開鍵をVPSサーバー(リモートサーバー側)に設置し、秘密鍵を自分のPC(ローカル側)に置くことで、この鍵同士が合致すれば通信が成立する方式です。

秘密鍵が流出しない限り、パスワード設定よりもセキュリティ強度が高くなる効果が期待できます。

ルートログインは危険

例えばwindowsPCでも何かのサービスでもユーザー名とパスワードでログインする方式をとっていることが多いと思います。

VPSサーバーについてもユーザー名とパスワード名でログインすることは可能です。

ユーザー名は各自が好きなように作成できる=第三者からの特定が難しいわけですが、唯一第三者が100%確実に推定できるユーザー名が絶対に存在します

それがrootです

rootは絶対に確実に存在するため、ユーザー名の特定は不要です。
よって、パスワードさえ特定できればログインできてしまいます。

そのうえ、rootで入ると、最悪、サーバーを初期化させることもできるためやりたい放題の権限を乗っ取られることになります。

基本的にrootログインはしない。
ユーザーログイン推奨

初心者にとっての最初の関門

ただ、rootログイン出なく、ユーザログインでssh接続というのはコツがいります。

特にサーバーをさわったことがない初心者にとっては最初の関門といえます。

理屈で言うとローカル環境でsshペアkeyを作り、サーバー側に公開鍵を送るという作業があるのですが、初心者にはこれも大変…

そこで私がやっている初心者にとっても簡単な方法をご紹介します。

conohaでVPSを登録すると初期設定時にsshキーの発行が可能です。
このとき、自動で公開鍵をVPSサーバー上に配置してくれます。

ただしこのsshキーはルートログイン用のkeyのため、このままではユーザーログインで使うことができません。

そこで、このルート用のsshキーをそのままユーザー用にコピーして転用しようという作戦です。

ユーザーログインでSSH認証を適用させる方法

具体的な手順を説明します。

/root/.ssh/authorized_keysというファイルがあります。
このなかに公開鍵が入っており、ペアで生成される秘密鍵を使ってssh接続ができるようになります。

実際にファイルの中を覗いてみました。全部ではありませんが、このような謎の文字列が羅列されています。

この公開鍵をユーザーディレクトリ下に.sshディレクトリを作り、コピペすることでVPS作成時に作ったsshペアkeyを使いまわす方法です。

先述した通り、ルートログインは特定されやすいため、どちらにしろ禁止にします。

せっかく作ったペアkeyも使わない運命になるので、ユーザーログイン時に使ってしまおうという作戦です。

繰り返しになりますが、

この作戦の場合、新たにsshキーを作成する必要がなく、また、tera termのように秘密鍵をローカルpc内に持ち、公開鍵をVPSサーバー内に持たせるのは結構大変で、面倒なので、この方法が初心者には簡単でお勧めです。

流れをまとめます。

  • VPSサーバーコントロールパネル操作
  • ユーザーの新規登録
  • 管理者権限の付与
  • ルートログイン用の公開鍵をコピペ

VPSコントロールパネル操作

VPSサーバーとしてconohaを使います。

conohaのVPSサーバーコントロールパネルにアクセスし、サーバーの管理画面にはいります。

①「サーバー」をクリック
②ネームタグ(内容は隠してますが、リンクが張ってあります)をクリック

そうすると、各サーバーに関するオプションが現れ、コンソールに入ることができます。

「コンソール」をクリック

下記のような黒い画面が出るので、最初は「root」で入り、パスワードは最初に設定したものを入力します。

ユーザーの新規登録

先ず、新しいユーザー名を作成します。

sudo adduser ユーザー名

コマンドを入力すると、パスワードの入力が求められます。
入力しなくても作成できますが、セキュリティ的には入力した方が無難です。

二回聞かれるので適切に入力してください。

管理者権限の付与

新しく作ったユーザーに管理者権限を付与します。

sudo usermod -aG sudo 新しいユーザー名

今回は「hokkyokun」というユーザー名を作ってみたいと思います。

ルートログイン用の公開鍵をコピペ

次はroot配下の公開鍵をユーザー配下にコピーする作業です。

ゴールは/home/ユーザー名/.ssh/authorized_keysというファイルを作成し、そこに公開鍵情報を入れることです。

おそらく、/home/ユーザー名/.ssh の.sshディレクトリが存在しないので、これを先ず作成します。

sudo mkdir /home/ユーザー名/.ssh

ユーザー名は作成したユーザーの名前に変えてください。
今回の例でいえばユーザー名は「hokkyokun」ですので、

sudo mkdir /home/hokkyokun/.ssh ということになります。

次に公開鍵をコピーします。

sudo cat /root/.ssh/authorized_keys >> /home/ユーザー名/.ssh/authorized_keys

これも同様にユーザー名は作成したユーザー名に変更してください。

これでtera termでsshユーザーログインが可能です。

試しにやってみるとこんな感じでユーザー名をrootではなく、ユーザー名でログイン可能になります。

この時点では、まだルートログインは禁止されていないので、後ほどルートログインを禁止にしていきます。

【セキュリティ対策2】ポート変更

ポートとは

ポートとは、コンピュータネットワークにおいて通信の窓口を示す数値のことです。具体的には、ネットワーク上のサーバーやデバイスが通信を受け取るための「門番」のような役割を果たします。

自宅PCからVPSサーバーへのリモートログインにはポート22(ssh)をつかいます。
webサイトの通信ではポート80(http)、ポート443(https)を使います。

ただ、このポートは初期設定では上記のように役割がわかってしまっているので、ポート番号を変更することで外部からの攻撃に合いにくくします。

1.設定ファイルを編集(ポート番号変更)

tera termなどのターミナルなどから次のコマンドを入力してください。

sudo nano /etc/ssh/sshd_config

下記のようなファイルがでてきますので、編集します。

#Port 22
という表記がある部分の変更をします。

例えばポート番号を2222に変更したとします。

Port 2222

このような変更になります。

Ctr+O Ctr+Xでファイルを閉じます。

sshサービスを再起動します。

sudo systemctl restart ssh

この状態でターミナルは絶対に閉じないでください。
次の接続で締め出される可能性があります。
救済処置はありますが、とても面倒になるので、次の章のファイアウォールの更新まで終わらせてから閉じてください!

セキュリティ更新(ファイアウォール、セキュリティグループ)

上記でポート番号の変更はできました。
今回でいうと2222番でssh接続を行います。

しかし、このままでは接続はできません。
二つのセキュリティ更新が必要です。

  • VPSサーバー内のファイアウォールの更新
  • conohaVPS管理画面のセキュリティグループの更新

先ず、ファイアウォールの更新ですが、
これは簡単です。

tera termとうのターミナルから次のコマンドを打ってください。

sudo ufw allow 2222/tcp

ここまで打ったら、ターミナルを閉じても大丈夫です!

閉じても大丈夫なのですが、注意があります。
この時点で再度tera term等のターミナルから接続を行っても通信ができない可能性があります。

conohaVPSを使っている場合、conohaの管理画面(コントロールパネル)側の設定も変える必要があります。

意外にも、このことを教えてくれている人や書籍がなく、私も最初かなり戸惑いました。

具体的な作業ですが、以下の通りです。

  1. conoha管理画面ログイン
  2. 「セキュリティグループ」の設定
  3. 今回作成したポート番号を開くセキュリティグループの作成
  4. 対象のVPSのセキュリティグループに③で作ったセキュリティグループを適用

下記はconohaのVPS管理画面です。

ここで簡単な操作を行います。

  1. 左側のタブから「セキュリティグループ」をクリック
  2. 右上にある「セキュリティグループ」をクリックして、新規登録画面を出す
  3. セキュリティグループ名、説明を記入。
    自分がわかれば何でもいいです。
  4. 保存をクリック

おそらく画面の下の方に今作ったセキュリティグループ(今回で言うとssh-change-port)ができていると思います。

初期設定では上記のようになっているので、ここにポートを追加していきます。

+のボタンをクリックすると以下のような画面が出ます。

ここで

通信方向:IN ,イーサタイプ:IPv4 , プロトコル:TCP , ポート範囲:任意の設定(今回なら2222), IP/CIDR:空白

通信方向:IN ,イーサタイプ:IPv6 , プロトコル:TCP , ポート範囲:任意の設定(今回なら2222), IP/CIDR:空白

という設定を追加します。

最後に対象のVPSの詳細から「ネットワーク情報」をクリックします。
セキュリティグループを追加できるので、作ったセキュリティグループ(今回ならssh-change-port)を追加します。

以上で、sshポート番号変更は完了です。

tera termで入るときの注意ですが、
今まではTCPポートを22にしていたと思いますが、
今度からは登録した番号(今回なら2222)にしてください。

その他は今までと変わりません。
これで新規ポートでログインできます。

ルートログイン禁止

ここまでで、ssh認証とポート番号の変更をやってきました。

「もうお腹いっぱい!すごい大変!」という方もいると思いますが、ここから先は簡単ですので、もう少し頑張ってみてください。

ここではルートログインの禁止を行っていきます。

ルートログインの危険性は上記で説明した通りです。
ここまででsshのユーザーログインが可能になったので、ルートで入る必要は全くないはずです。

tera term等ターミナルでlinuxにログインした状態で、以下のコマンドを入力してください。

sudo nano /etc/ssh/sshd_config

こういった記述があると思いますので、「PermitRootLogin yes」を以下のように変更して登録します。

PermitRootLogin no

Ctr+O Ctr+Xでファイルを閉じます。

sshをリスタートします。

sudo systemctl restart ssh

これでルートでのログインができなくなったはずです。

パスワード認証の無効化

次はパスワード認証の無効化です。

パスワードがなぜだめかというとブルートフォース攻撃(Brute Force Attack)の攻撃対象となりやすいからです。

ブルートフォース攻撃(Brute Force Attack)とは、攻撃者がターゲットシステムに対してあらゆる可能な組み合わせのパスワードを試みることで、不正にアクセスしようとする攻撃手法です。

攻撃方法には単純な文字列の組み合わせやよく使われるフレーズを使った辞書攻撃などがあります。

理屈で言うと、sshも文字列の組み合わせなので、無限の時間とチャンスがあれば入れるということなんでしょうが、現実的にはパスワード認証をやめてssh認証だけに絞ることで侵入される確率を大幅に下げることができます。

再びconfigを開きます。

sudo nano /etc/ssh/sshd_config

「PasswordAuthentication yes」の箇所を探します。
おそらく、最後の方にあると思います。

「yes」を「no」に変更します。

Ctr+O Ctr+Xでファイルを閉じます。

sshをリスタートします。

sudo systemctl restart ssh

これでパスワード認証が無効化されたはずです。

Fail2banのインストールと設定

さきほど申し上げたブルートフォース攻撃を防ぐ方法としてパスワード認証不可意外にも方法があり、Fail2banをインストールして対策を練ります。

Fail2banは、ブルートフォース攻撃を防ぐための有効なツールの一つです。Fail2banはログファイルを監視し、不正なログイン試行が検出されると、そのIPアドレスを一時的にブロックします。これにより、攻撃者が短期間に大量のログイン試行を行うことを防ぐことができます。

まず、イントールします。

sudo apt install fail2ban

次に設定ファイルをコピーします。

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

ファイルを編集します。

sudo nano /etc/fail2ban/jail.local

ファイル中盤あたりに以下の記述があると思いますので、編集します。

[sshd]
enabled = true
port = 2222  # 使用しているSSHポートに変更(今回は2222に設定)
logpath = %(sshd_log)s
backend = %(sshd_backend)s

Ctr+O Ctr+Xでファイルを閉じます。

Fail2banを再起動します。

sudo systemctl restart fail2ban

ポート設定

最後にポートの設定を行います。

必要なポートだけを開くことで、侵入の機会を減らすことができます。

また、sshのポート(22)は上記で変更しているはずなので、ポート22番の閉じる作業や、http通信(80)やhttps通信(443)のポートの管理もここで行ってしまいます。

ufwというファイアーウォール管理ツールを使います。まだインストールされていないなら下記コマンドを入力してください。

sudo apt install ufw

最初にデフォルトポリシーを設定します。これにより、すべての受信トラフィックがデフォルトで拒否され、すべての送信トラフィックが許可されます。

sudo ufw default deny incoming
sudo ufw default allow outgoing

次に、必要なポートを個別に許可します。SSH(今回の設定はポート2222)、HTTP(ポート80)、HTTPS(ポート443)を開放する場合:

sudo ufw allow 2222/tcp  # SSH
sudo ufw allow 80/tcp    # HTTP
sudo ufw allow 443/tcp   # HTTPS

ファイアウォールを有効にします。

sudo ufw enable