サーバー

Ubuntu 18.10をサーバとして使うための初期設定いろいろ

Ubuntu 18.10をサーバとして使うための初期設定のイメージ

こんにちは、日本は寒くなってきましたね。
なので今週末から移動してベトナムへ住居を移す予定です。
日本の冬からベトナムは寒暖差が激しいのですが、すでに半袖以外のインナーがないので究極に寒くてブログも更新できなかったという……。

今日は久しぶりに新しくサーバを立てたので、構築をした際の諸々を書き記しておきます。
2018/10/18(世界標準時)にUbuntuのLTSと呼ばれる長期サポート版の最新バージョンにUbuntu 18.10、コードネームCosmic Cuttlefishがリリースされていたのでそれをサーバとして使ってみることにしました。
※Cosmic Cuttlefishは直訳すると「宇宙イカ」ですかね。

せっかくなので、はじめてVPSやクラウドサーバのインスタンスでサーバ構築するよ!という人にもわかりやすく説明していきます。

一番最初の基本的な設定

まず最初にパッケージ関連のアップデートや、サーバ上で必要となるパッケージのインストール、さらにユーザーやSSHログイン周りについて説明していきます。
なお、今回はクライアント(つまり手元の操作するパソコン)にMacOS、ホスト(アプリケーションの展開先)にVultrのVPSサーバ(メモリ2GB、月$10)を利用しています。

パスワードでSSHログイン

Vultrでもなんでも同じですが、最初はrootユーザーを使ってパスワードでSSHログインします。
手元のパソコンで以下のコマンドを打つとパスワード入力画面になります。

$ ssh [email protected]アドレス
[email protected]アドレス's password:
Welcome to Ubuntu 18.10 (GNU/Linux 4.18.0-10-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Mon Nov 26 23:39:21 UTC 2018

  System load:  0.0               Processes:           84
  Usage of /:   4.2% of 39.32GB   Users logged in:     0
  Memory usage: 6%                IP address for ens3: IPアドレス
  Swap usage:   0%


0 packages can be updated.
0 updates are security updates.

パスワード入力はコピペでやりましょう。
基本的にターミナルのパスワード入力画面は「本当に打てているのか?」と疑問になるような空間になっています。

ログインすると上記の Welcome to Ubuntu が表示されます。

パッケージのアップデートとアップグレード

上記画面に 0 packages can be updated. とあるのでパッケージで更新できるものがないのはわかるのですが、バージョンの違いやしばらく時間が経つとパッケージの更新が必要な場合もあります。
なので念の為、パッケージの更新をしておきましょう。

# apt-get -y update && apt-get -y upgrade

こうしておくことで、ソフトウェアの更新状況がバーっと表示されていきます。

必要なソフトウェアのインストール

ここはある程度好みの問題もありますが、私の場合はEmacsは必須なのでインストールしていきます。
さらに後々ソフトウェアのビルドで必要になるgccもインストールします。

# apt-get -y install emacs gcc

emacsはテキストエディタです。

gccはGNU Compiler Collectionの略で、ソフトウェアのコンパイル時に利用します。明示的にgccコマンドを使うことはほとんどありませんが、ソースコードからビルドしたソフトウェアのコンパイル時に利用することが多いです。

ユーザーの追加とsudo権限の付与

これは最初にやってもいいのですが、ユーザーの作成を行います。
通常、最初はrootユーザーでログインした状態になっていると思いますが、rootでSSHログインできる状態にしておくことは危険です。
後々、sshdというSSHに関する設定で行いますが、ログインユーザーは別に作っておきましょう。

# adduser USERNAME

実はUbuntuには useradd というコマンドもありますが、こちらはホームディレクトリと呼ばれる /home 以下にそのユーザー用のディレクトリが作られなくて面倒なので、 adduser でつくることをオススメします。
ここでパスワードの入力を求められるのでほどよく設定しておきましょう。

パスワード自動生成ツール

作成されると以下のように情報を質問されるのですが、全部空のままEnterを押してしまって大丈夫です。

Enter the new value, or press ENTER for the default
	Full Name []:
	Room Number []:
	Work Phone []:
	Home Phone []:
	Other []:
Is the information correct? [Y/n]

次にsudoグループに作成したユーザーを追加します。

# gpasswd -a USERNAME sudo
Adding user USERNAME to group sudo

ここまで行いユーザーが追加されたことを確認しましょう。

# ls /home
USERNAME # ディレクトリが作成されています
# cat /etc/passwd
USERNAME:x:1000:1000:,,,:/home/USERNAME:/bin/bash # 一番下の行にあります

SSHの設定

次にサーバの初期設定で最も大事とも言えるログイン周りです。
最初はパスワード認証でrootログインしましたが、辞書攻撃と呼ばれるよく使われるパスワード群によるログイン試行される場合があります。
それを防ぐために手元のクライアントで作った鍵ペアを利用した暗号化が必要です。

-> クライアントのMacOS
$ ssh-keygen -t ed25519 -P ""

これで /home/USERNAME/.ssh 以下に id_ed25519, id_ed25519.pub というファイルが生成されます。
-P "" はパスワードを空で設定しているということになりますが、ここは任意です。
sshでログインするときにさくっとつなぎたいという場合には空のままでも良いのですが、仮に自分の秘密鍵が流出したり手元のパソコンが勝手に使われた場合にはリスクが生じますので自己責任でお願いします。

他のサイトなどではRSAという暗号化方式が紹介されていることも多いのですが、最近では ECDSA が徐々に浸透しつつあります。
ですが、OpenSSLという暗号化通信に関するソフトウェアのバージョンが6.5以上であれば Ed25519 というさらに強力なアルゴリズムを利用できるので、そちらを使うことをオススメします。

次に作成した鍵ペア(公開鍵と秘密鍵のペアのこと)のうち、公開鍵のほうをサーバ上に置きましょう。
.pub がついているほうが公開鍵です。
間違っても秘密鍵をアップロードしないようにしてください。

準備として、サーバ上で公開鍵の置き場所を作ります。

-> ホスト側のサーバ
# su - USERNAME
$ mkdir -m 700 .ssh

700という作成ユーザーにはすべての権限が付与されるが、それ以外には不許可というパーミッションのディレクトリを作成するのが上記です。
次にホスト側に公開鍵をアップロードします。

-> クライアントのMacOS
$ rsync ~/.ssh/id_ed25519.pub [email protected]アドレス:/home/USERNAME/.ssh/authorized_keys

さらにアップロードしたファイルの権限を600にしてファイルの所有者以外の読み書きを禁じます。
そこまでやったら下準備はOKです。
SSHの設定ファイルを編集しましょう。

-> ホスト側のサーバ
$ sudo chmod 600 ~/.ssh/authorized_keys
$ sudo chown USERNAME ~/.ssh/authorized_keys
$ sudo emacs /etc/ssh/sshd_config

編集できる項目はたくさんありますが、ここでは最低限設定しておいたほうが良いものだけ設定を入れます。

-> /etc/ssh/sshd_config

Port XXXXXX <- 好きな数字
PermitRootLogin no
MaxAuthTries 3
MaxSessions 4
PubkeyAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no
  1. Portは接続するポート番号を示します
  2. PermitRootLoginはrootユーザーでログインを許可するかを示します
  3. MaxAuthTriesは認証失敗を何度許可するかを示します
  4. MaxSessionsはSSHでの同時接続許可数を示します
  5. PubkeyAuthenticationは公開鍵による認証の有無を示します
  6. PasswordAuthenticationはパスワード認証を許可するかを示します
  7. PermitEmptyPasswordsは空のパスワード認証を許可するかを示します

最低限この程度設定しておけばOKです。
他にもKerberosを利用した認証方法などもあります。

次にクライアントからSSHで接続する際により簡略化できる方法を紹介します。
通常であれば以下のようにSSHコマンドでログインします。

$ ssh -i ~/.ssh/id_ed25519 -p ポート番号 [email protected]アドレス

これを毎回打つのは面倒なので、クライアントの ~/.ssh/config に設定を記載します。

-> クライアントのMacOS
$ sudo emacs ~/.ssh/config
Host my-server # ここは好きな名前でOKです
     HostName IPアドレス
     User USERNAME
     Port ポート番号
     UserKnownHostsFile /dev/null
     StrictHostKeyChecking no
     PasswordAuthentication no
     IdentityFile ~/.ssh/id_ed25519
     IdentitiesOnly yes
     TCPKeepAlive yes
     ServerAliveInterval 30

こうしておけば、 ssh my-server と打つだけでログインできるようになります。

JST(日本標準時)やデフォルトエディターの設定

日本標準時である世界標準時+9:00も最初にやっておいたほうがいいです。
もちろん国外向けの場合は問題ありませんが、データベースやログの時間がずれているとわかりづらくなってしまいます。

$ date
Tue Nov 27 05:07:53 UTC 2018
$ sudo rm -rf /etc/localtime
$ sudo ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ date
Tue Nov 27 14:08:34 JST 2018

さらにエディタもデフォルトでviが選択されるようになっているので、もし変更したい場合は以下のコマンドで変更してみましょう。

$ sudo update-alternatives --config editor
There are 5 choices for the alternative editor (providing /usr/bin/editor).

Selection Path Priority Status
------------------------------------------------------------
* 0 /bin/nano 40 auto mode
1 /bin/ed -100 manual mode
2 /bin/nano 40 manual mode
3 /usr/bin/emacs 0 manual mode
4 /usr/bin/vim.basic 30 manual mode
5 /usr/bin/vim.tiny 15 manual mode

Press to keep the current choice[*], or type selection number: 3
update-alternatives: using /usr/bin/emacs to provide /usr/bin/editor (editor) in manual mode

※上記例ではEmacsを選んでいます。

用途による使い分け

ここまではサーバを構築する際にだいたいすべてのサーバで行います。
クラウドサーバプラットフォームを利用している場合は、認証方法がオリジナルで用意されている場合も多々ありますが、基本的な認証に関する方式は同じです。

あとはWebサイトを公開するのか、それともシステムトレードで活用するのか、単なる遊び場としてゴリゴリ使うのかによってさまざまな使い方ができます。
それによってソフトウェアのインストールやさらなる設定の違いなどがあるので、おいおい種類別に紹介していきたいと思います。

ABOUT ME
UOT合同会社 / SOT Co.,Ltd 合同開発部
UOT合同会社 / SOT Co.,Ltd 合同開発部
UOT合同会社 / SOT Co.,Ltd開発部の合同公式ブログ。 代表がITエンジニア出身のデジタルノマド→日本とベトナム・ホーチミンでIT企業設立。 海外デジタルノマドやエンジニアのリモートワーク、プログラミング、オフショア開発やミニラボ情報などをまとめていきます。