👨‍💻

ConoHa VPSで個人的な開発環境を構築① まずはUbuntuでサーバーを立てる

2022/10/10に公開

はじめに

今回、ConoHaVPSに個人的な開発環境を作りたくてサーバーを立てることにしました。
忘備録的に作業の流れと、特にハマった点などを書き残しておこうと思います。

同じようなことをして、ハマった方への参考になれば幸いです。

やりたいこと

  1. 個人的な開発環境を用意したい
  2. リモートでも作業できると吉
  3. 物理的なサーバーは1つに。ただし中身を取引先ごとに環境を切り分けて管理したい

コスト面を考えるとVPSが良さそうです。
別案でクラウドサーバーも考えられますが、意図せず課金が増えるのは避けたいところ。あとは個人的にConoHaのこのはちゃんが好きです。
中身の切り分けはDockerが便利らしいということを知ったので、以下の方針でいくことにしました。

  • ConoHa VPSを使用
  • Dockerを導入して、取引先ごとに環境を分ける
  • 主な使用はwebサイトやwebシステムなので、webサーバーとして稼働させる

全ての作業を1つのページでまとめるのは大変そうなので、まずはファーストステップとして以下を進めていこうと思います。

  • サーバー契約
  • 最低限必要なセキュリティ設定

サーバー契約~最初に行うセキュリティ設定

①VPSを契約

VPSといえば、さくらのVPSConoHa VPSなどが有名どころですが今回はConoHaを選択。
お試し使用という側面も考えてスペックは以下で。

  • VPS ConoHa
  • サーバースペック メモリ1GB, 2CORE, SSD 100GB
  • OS Ubuntu 20.04

このあたりは必要に応じてスペックアップも検討していこうと思います。

②rootでログイン

契約完了後、ConoHaの管理画面から「コンソール」を開いて作業します。

ここで設定したパスワードが入らず、いきなり詰んだと焦りましたが、キーボードが英語配列のため特殊記号(:セミコロンなど)がうまく入力できていないらしい‥と気がつくのにしばらく時間を費やしました。

英語配列のキーボードで特殊記号が入力できない場合は、コンソール > シリアル と切り替えてあげると入力できるようになると思います。

③システム(OS)をアップデートする

セキュリティ面を考慮すると、VPSに限らず利用のシステムが最新の状態であることが望ましいので、最初にアップデートしておきます。

管理画面コンソール
# インストール可能なパッケージ(システム内に入っているソフトウェア群)の一覧を更新
$ apt update

# 上記の一覧を使って、実際にインストール・アップグレードを行う
$ apt upgrade

これ、2種類ありますが2つで1セットですね。
VPSを契約して直後のまっさらな状態での作業なので、セットで行うと考えると分かりやすいです。

コマンドを実行するとダダーッと処理内容が表示されるので一瞬焦りますが、基本は放っておいて大丈夫です。

④作業用のユーザーを作成する

ユーザーrootは、何でも操作ができるスーパーユーザーです。
慣れていないと、誤ってシステム上重要なファイルを削除してしまうことも考えられるので、普段作業を行う場合は、別のユーザーでログインして作業をする方が安全です。

というわけで、作業用の「一般ユーザー」を作成します。
以下では、gonbeという名前のユーザーを作りました。

管理画面コンソール
# ユーザーを作成(続いてパスワードも設定)
$ adduser gonbe

# 作成したユーザーに sudo 権限を追加(許可する)
$ gpasswd -a gonbe sudo

sudoは、管理者権限が必要なコマンドを一般ユーザーが実行するときに用いるコマンドです。この権限を許可しておくことで、一般ユーザーでもシステム環境を変更するなどの操作が可能になります。

ここまで出来たら、一度ログアウトして作成したユーザーでログインできるか、sudoが実行できるかをチェックしておきます。

管理画面コンソール
# 一般ユーザーでログイン後以下コマンドを実行する
$ groups gonbe
gonbe : gonbe sudo 

上記のようにsudoとあれば、権限が付与されています。

⑤rootでの直接ログインを拒否する

前述のとおり、rootは何でもできちゃう反面、誰もが扱えるとセキュリティ上危険が増します。そんな観点からrootでの直接ログインは禁止するのが良いと言われています。

※当方、Windows環境なのでWindows PowerShellを使用

※接続にあたり、サーバーのIPアドレスが必要になるのでメモしておきます。
ConoHaの管理画面から、サーバー > 契約したサーバー名 > ネットワーク情報 を見ると、IPアドレスの欄で確認できます。

gonbeというユーザーでサーバーに接続するときは以下コマンドを実行。
下記のxxx.xxx.xxx.xxxには確認したIPアドレスを指定します。

Windows
$ ssh gonbe@xxx.xxx.xxx.xxx

パスワードを入力すると接続できます。
無事に接続できたら、以下でrootでのログイン禁止設定を行います。

サーバー
# sshの設定ファイルを変更(yesをnoにする)
$ sudo vi /etc/ssh/sshd_config
PermitRootLogin no

# sshdを再起動して設定を反映
$ sudo service sshd restart

ただし、これを設定すると以下のような状態になるので注意が必要です。

  • ConoHaのコンソールからはrootでのログインは可能
  • ターミナルなどのクライアントソフトを使ってrootでログインすることは不可

⑥SSHのポート番号を変更する

サーバーとの通信を行うための窓口を「ポート」と呼んでいて、データのやり取りはこのポートを通して行われる。そんなイメージです。

ターミナル等のソフトを使ってサーバーに接続する場合、このポートは初期設定で22番と決まっています。

この番号を変更する/しないについては色々と議論があるようですが、初期状態で使い続けていると、この22番ポートに対してログインを試みる形跡が大量に発生するようなので、念のため変えておくと良さそうです。

サーバー
$ sudo vi /etc/ssh/sshd_config
# Port 22を以下に変更
Port 10022

# sshdを再起動して設定を反映
$ sudo service sshd restart

変更したら、ターミナルからの接続で反映されているかどうかを確認します。

以下コマンドで接続できればOKです。
-p 10022がポート番号の指定部分です。

Windows
# xxx.xxx.xxx.xxxにはサーバーのIPアドレスを指定
$ ssh gonbe@xxx.xxx.xxx.xxx -p 10022

⑦公開鍵認証の設定

ぼくが一番ハマったのがここでした。
ここにたどり着くまでに色々やることになりましたが、以下の手順で上手くいきました。

通常、サーバーとの接続はアカウントとパスワードを入力してログインしますが、セキュリティ面を考慮すると、「パスワード」の認証よりも「鍵」を使った認証の方がセキュリティレベルが上がります。

これには2種類の鍵があり、それぞれ以下のような用途で用います。

  • 公開鍵 サーバー側に設置します。
  • 秘密鍵 クライアント側に設置します。

公開鍵と秘密鍵はペアで作成・使用し、両者の鍵が一致するとログイン認証成功となる仕組みです。

Windows
# Windowsのユーザーフォルダ(自分のフォルダ)に移動します
$ cd c:\Users\XXXX\

# ssh用の設定を保存するフォルダを作成します
$ mkdir .ssh
$ cd .ssh

# 移動した先で鍵を作成します
# 鍵の名称をconoha_keyにしていますが任意で変更してください
$ ssh-keygen -t rsa -f conoha_key

パスフレーズ(パスワード)を何にするか聞かれるので好きな文字列を設定します。
これで2種類の鍵が作成できます。

  • conoha_key    秘密鍵(クライアント用)
  • conoha_key.pub  公開鍵(サーバー用)

作成した鍵のうち公開鍵(拡張子.pub)をサーバー側に設置します。

サーバー
# サーバー側に鍵を設置するフォルダを作成します
# 作成した一般ユーザーでログイン
$ cd ~/
/home/gonbe/

# 現在の場所のファイル一覧を表示
$ ls -al

# .sshフォルダがなければ作成する
$ mkdir .ssh

続いて、クライアント側(Windows)のターミナルで作業します。

Windows
# 先ほど鍵を作成したフォルダに移動しておく
$ cd c:\Users\XXXX\.ssh

# リモートコピーでファイルをコピーする
$ scp -P 10022 conoha_key.pub gonbe@xxx.xxx.xxx.xxx:/.ssh

またサーバー側の操作に戻ります。

サーバー
# 作業ユーザーのホームディレクトリ下で作業
$ cd /home/gonbe/
$ cd .ssh

# 以下ファイルを作成する
$ touch authorized_keys

# クライアント側からリモートコピーしたファイルを認証用の鍵として追記する
$ cat .ssh/conoha_key.pub >> .ssh/authorized_keys

# 鍵を設置したディレクトリ及び認証用ファイルのパーミッションを変更する
$ chmod 700 /home/gonbe/.ssh
$ chmod 600 /home/gonbe/.ssh/authorized_keys

このパーミッション、誤った権限に設定すると正しく認証が行われないため注意が必要です。

ここまで準備できたら、sshの設定を変更します。

サーバー
# sshの設定ファイルを開き、以下設定を変更する
$ sudo vi /etc/ssh/sshd_config

PubkeyAuthentication yes

AuthorizedKeyFile .ssh/authorized_keys

上記2つはコメントになっているので(文頭が#で始まっている)、それぞれコメントを解除し、必要があれば変更します。

仕上げにあと2つ!

クライアント側で簡単に操作できるよう、
c:\Users\XXXX.ssh のフォルダ内に以下ファイルを作成します。

Windows
Host conoha
  HostName   xxx.xxx.xxx.xxx
  User       gonbe
  Port       10022
  IdentityFile ~/.ssh/conoha_key

それぞれの項目は以下のような内容です。

項目名 説明
Host conoha ここは任意の名称でOK
HostName xxx.xxx.xxx.xxx サーバーのIPアドレス
User gonbe 作業ユーザー名
Port 10022 ssh接続するポート番号
IdentityFile ~/.ssh/conoha_key 作成した秘密鍵の場所とファイル名

保存ができたら、ターミナルソフトから以下で接続します。

Windows
$ ssh conoha

上記のコマンドは、conohaという接続先に対し、gonbeというユーザーで鍵認証を使って接続するという意味になります。
接続時に鍵を作成した際のパスフレーズを入力し、無事に接続できればOKです!

最後にサーバー側で以下を設定し、パスワードによるログインを禁止しておきます。

サーバー
# 設定ファイルを開きます
$ sudo vi /etc/ssh/sshd_config

# yesをnoに変更する
PasswordAuthentication no

# 以下コマンドでsshを再起動し、変更内容を反映します
$ sudo service ssshd restart

この状態で、以下のようにターミナルからコマンドを入力し、サーバーへの接続を試みてみます。

Windows
# 公開鍵を使わず、パスワード認証で接続を試みる
$ ssh gonbe@xxx.xxx.xxx.xxx -p 10022
gonbe@xxx.xxx.xxx.xxx: Permission denied (publickey).

コマンドの結果、上にあるような拒否メッセージが表示されればOKです。
Permission deniedということで、パスワードによる認証が禁止されていることが分かります。

⑧ファイヤーウォールを設定して必要なポートのみ開ける

linuxでは、ファイヤーウォールの設定にiptablesというツールを利用しますが、ubuntuでは、これを設定するためにufwというツールがあるのでこれを利用します。

サーバー
# いまの設定状況を確認する
$ sudo ufw status
# 以下の表示の場合は、現在「無効」になっている
status inactive

# ファイヤーウォールを有効にする
$ sudo ufw enable

# 一旦すべてを拒否
$ sudo ufw default deny

# webサーバーとして使用することを想定して以下のポートは有効にする
$ sudo ufw allow https/tcp
$ sudo ufw allow http/tcp
$ sudo ufw allow ftp

# sshで設定したポート番号
$ sudo ufw allow 10022

# 現在の設定を確認
# 設定した内容は以下に記載されている
# /etc/ufw/user.rules
$ sudo ufw status verbose

# 設定した内容を反映する
$ sudo ufw reload

⑨不正アクセスへの対処(fail2banを導入する)

サーバーを運用するということは、不正アクセスなどの「セキュリティ対策」が重要です。
fail2banとは、サーバーに不正アクセスがあった場合に、そのユーザーを一定時間ブロックしてくれるプラグインです。

サーバー
# fail2banをインストールする
$ sudo apt install fail2ban

# fail2banを起動する
$ sudo /etc/init.d/fail2ban start

ただし、自分もログインを失敗し続けると、不正アクセスとみなされブロック対象になるので注意が必要です。

⑩ログ監視ツールを導入(logwatchを導入する)

同じくセキュリティ面から、定期的なサーバーのログ確認も大事な管理事項の1つです。
手動でログをチェックするのは大変なので、監視用のツールを導入してみます。

監視ツールにはいろいろありそうですが logwatch の名前をよく見かけたので、これを入れてみます。

サーバー
# logwatchをインストールする
$ sudo apt install logwatch

# 動作確認。画面に直近のログ内容が表示される
$ sudo logwatch --output stdout

さらに管理者宛にメールを送信することもできそうですが、これは別の機会にやってみようと思います。

終わりに

VPSの契約後、まずはやっておきたい最低限のセキュリティ設定について、実際の作業メモを元にまとめてみました。

参考サイトを片手に進めたものの、スムーズに作業できたり/できなかったりと思ったよりも時間がかかりました。その中でも自分のハマった箇所を中心に書いてみましたが、誰かの参考になれば嬉しいです。

次は、「Dockerの導入」にチャレンジしたいと思います。

余談

VPSを利用しようと思ったきっかけを少し。

これまで、自宅のデスクトップPC(windows)では、vagrant+virtualboxを使って仮想サーバー環境を構築。その中で取引先ごとにサーバーを分け、お互いに影響しないように個別の環境を用意していました。

そこからは、個人の開発環境における、あるあるネタかと思いますが、
このPCがクラッシュしても安心できるように、サブPCにも同じ環境を作って運用しはじめたのですが、サーバー側ソフトのバージョンアップや、構築したシステムのファイル管理などが煩雑になり始め、メインPCでは動くけどサブPCでは動かない、またはその逆、のようなカオスな状態になっていました。

さすがにこんな状態を続けるわけにもいかず、管理コストを考えて、PCごとの環境ではなくVPSなどを使って開発環境を用意できれば解決できるかもと思ったのが事の発端です。

まだまだ準備段階の忘備録のため、思い描く環境になるのはもう少し先になりそうですが、理想的な開発環境を目指して進めたいと思います。

なにぶん、サーバー管理周りのことは経験が浅いので、おかしな部分や間違った点などありましたら、ご指摘いただければ幸いです。

ではまた。

参考サイト

Discussion