Ubuntu18.04 LTS（CLI）をインストールしたら何しよう

Ubuntu18.04 LTSで作業を始める前の準備事項をまとめました。
VPSを契約しても、自分でマシンにインストールしても、基本的には同じです。

#パッケージ更新
インストール可能なパッケージ一覧を更新して、新しいバージョンにアップグレードします。

```console
# sudo apt update && apt upgrade -y #-yオプションで全ての問い合わせにYes
```

# ユーザーの作成
ユーザー作成コマンドには`adduser`と`useradd`の2種類があり、CentOSでは両者に違いはありませんが、Ubuntuでは使い分けが発生します。

|コマンド|特徴|
|:-----------------|:------------------|
|useradd|オプションをつけて一行で記述|
|adduser|質問に答える形で進める対話形式|

ここでは、`useradd`を用いて一発で作成してみましょう。

```console
# useradd -D #初期値を確認

GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no

# useradd -m -s /bin/bash <ユーザー名> #ユーザー作成
# passwd <ユーザー名> #パスワード変更

# gpasswd -a <ユーザー名> sudo #sudo権限付与

# cat /etc/passwd #作成済みユーザーの確認
# cat /etc/group #作成済みグループの確認
```

|オプション|意味|
|:-----------------|:------------------|
|-m|ユーザーのホームディレクトリを作成|
|-s|ユーザーのログインシェルを指定|
|-u|作成するユーザーのユーザーIDを指定|
|-g|作成するユーザーのグループIDまたは名前を指定|

#rootユーザの設定
rootユーザーを利用可能にしましょう。
ログイン中のユーザーからroot権限でシェルを実行し、パスワードを設定します。

```console
# sudo -i #root権限でシェルを実行
[sudo] password for <username>:

# passwd root #パスワードを設定
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

# su - <username> #作業ユーザーに遷移
# su - #rootユーザーに遷移（おまけ）
```

#エディタ
テキスト編集に使用するエディタをインストールしましょう。

ここではvimを例に挙げて進めます。
全てのパッケージから`vim`を検索し、なければインストールします。

```console
# sudo apt list "vim*" --installed #vimから始まるinstalledパッケージを検索
# sudo dpkg --get-selections | grep vim #こっちでもOK

# sudo apt install vim

# sudo update-alternatives --config editor #visudoのエディタをnanoからvimへ変更
# 4

# sudo visudo #ついでにsudo時にPATHを引き継ぐようにする
- Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
+ Defaults env_keep +="PATH"
```

**挿入モード→編集→コマンドモード→保存＆終了**

|キー|意味|
|:-----------------|:------------------|
|i|挿入モード|
|esc|コマンドモード|
|:w|保存（!をつけて強制）|
|:q|終了（!をつけて強制）|
|:wq|保存＆終了|

#言語やタイムゾーンの設定
使用環境が日本であれば、言語やタイムゾーンを改めて指定する必要があります。
NTPサーバーはお好きなものに設定してください。

参考：[【負荷OK】Public NTPサーバの一覧](https://qiita.com/halpas/items/5a451ead0b13f6792595)

```console
# localectl set-locale LANG=ja_JP.utf8 #システムロケールの変更（文字化け防止）
# localectl set-keymap jp106 #キーマップの変更

# timedatectl set-timezone Asia/Tokyo #タイムゾーンの変更

# apt -y install chrony #時刻同期のためChronyをインストール（NTPサーバー）
# vim /etc/chrony/chrony.conf #設定ファイルの編集

/-はコメントアウト（先頭に#をつける）+は追記（タイムゾーンのNTPサーバーを追記）/
- pool ntp.ubuntu.com        iburst maxsources 4
- pool 0.ubuntu.pool.ntp.org iburst maxsources 1
- pool 1.ubuntu.pool.ntp.org iburst maxsources 1
- pool 2.ubuntu.pool.ntp.org iburst maxsources 2
+ server ntp.nict.jp iburst
+ server ntp1.jst.mfeed.ad.jp iburst
+ server ntp2.jst.mfeed.ad.jp iburst
+ server ntp3.jst.mfeed.ad.jp iburst

# systemctl restart chrony #再起動して設定を反映
# systemctl enable chrony #自動起動設定
```

#SSH
全てのパッケージから`ssh`を検索し、なければインストールします。

```console
# sudo apt list "openssh*" --installed #パッケージを検索
# sudo dpkg --get-selections | grep openssh #こっちでもOK

# sudo apt install openssh-server

# sudo systemctl enable ssh #自動起動設定
# sudo systemctl start ssh #起動
```

ちなみに、SSHの認証方式にはパスワード認証と公開鍵認証の２種類があります。
公開鍵認証方式ではサーバー（VPSや自前のマシン）に対してクライアント（作業しているパソコン；MacやWindowsなど）での作業が必要になりますので注意してください。

|名称|認証方式|メリット|デメリット|
|:-----------------|:------------------|:------------------|:------------------|
|パスワード認証|ユーザー名とパスワードを使用|アクセス方法がシンプル|パスワードの漏洩リスクが高い|
|公開鍵認証|公開鍵と秘密鍵を使用|アクセス手段の漏洩リスクが低い|アクセスできるまでの設定が複雑|

設定ファイルで変更する項目は認証方式を含めたセキュリティに関するものです。
パスワード認証方式を採用する場合は、公開鍵認証方式と公開鍵ディレクトリの項目を変更せず、パスワード認証方式を許可してください。

- 使用ポートの変更
- パスワード認証方式の禁止
- 公開鍵認証方式の採用
- ログインユーザーの指定

```console
# sudo vim /etc/ssh/sshd_config

/使用するポート番号の変更/
- #Port 22
+ Port <自由に利用できるポート番号の範囲：49152–65535>

/rootログインの禁止/
- PermitRootLogin yes
+ PermitRootLogin no

/公開鍵認証方式の許可/
- #PubkeyAuthentication yes
+ PubkeyAuthentication yes

/公開鍵ディレクトリの指定/
- #AuthorizedKeysFile     .ssh/authorized_keys .ssh/authorized_keys2
+ AuthorizedKeysFile     /home/<ログインに使用するユーザー名>/.ssh/authorized_keys

/パスワード認証方式の禁止/
- #PasswordAuthentication yes
+ PasswordAuthentication no

/最終行に追記/
+ DenyUsers ALL
+ AllowUsers <ログインに使用するユーザー名> <ユーザー名>@<クラス範囲指定>, etc.
```

##サーバーサイド⑴
前項の設定ファイルで指定した公開鍵ディレクトリを作成します。

```console
# su <ログインに使用するユーザー名> #ログインに使用するユーザーに切り替え
# cd #移動
# mkdir .ssh #.sshディレクトリを作成
```

##Macの場合
ターミナルからOpenSSHのコマンドを使用して、キーペア（公開鍵と秘密鍵）を生成します。

```terminal
$ ssh-keygen -t rsa #キーペアを生成

/保存場所（Enterでデフォルト）とパスワードの入力（Enterでパスワードなし）/
Enter file in which to save the key (/Users/home/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter passphrase again:
```

鍵を使用できるようにディレクトリのパーミッションを変更します。

```terminal
$ chmod 700 ~/.ssh
```

アクセス情報を記述した設定ファイルを作成しておきましょう。

```terminal
$ vim ~/.ssh/config

/+は追記/
+ Host <適当な名称>
+      HostName <IPアドレス>
+      User <ログインに使用するユーザー名（最初に作成したユーザー）>
+      Port <49152–65535の範囲で指定したポート番号>
+      IdentityFile .ssh/id_rsa
```

作成したキーペアの内、公開鍵はSSHを用いてサーバーサイドへ転送します。
OpenSSHを手動インストールした場合は、ポートが開放されていないのでSSHが使用できません。id_rsaの内容をコピーして[サーバーサイド⑵](#サーバーサイド⑵)へ進んでください。

```terminal
$ scp -P 22 ~/.ssh/id_rsa.pub <ログインに使用するユーザー名>@<IPアドレス>:~/.ssh/authorized_keys

/指定したユーザーに対応する要求されたパスワードを入力/
<ログインに使用するユーザー名>@<IPアドレス>'s password:<パスワード>
id_rsa.pub    100%    419    1.3KB/s    00:00
```

[サーバーサイド⑵](#サーバーサイド⑵)へ進みます。

##Windowsの場合
Windows PowerShellを管理者モードで起動し、OpenSSHのコマンドを使用して、キーペア（公開鍵と秘密鍵）を生成します。

```terminal
$ ssh-keygen -t rsa #キーペアを生成

/保存場所（Enterでデフォルト）とパスワードの入力（Enterでパスワードなし）/
Enter file in which to save the key (C:¥Users¥<windowsのユーザー名>/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter passphrase again:
```

鍵を使用できるようにディレクトリのパーミッションを変更します。

```terminal
$ cacls C:¥Users¥<windowsのユーザー名>/.ssh/id_rsa.pub /g <windowsのユーザー名>:F #フルコントロールのアクセス権を付与
```

アクセス情報を記述した設定ファイルを作成しておきましょう。

```terminal
$ vim C:¥Users¥<windowsのユーザー名>/.ssh/config

/+は追記/
+ Host <適当な名称>
+      HostName <IPアドレス>
+      User <ログインに使用するユーザー名>
+      Port <49152–65535の範囲で指定したポート番号>
+      IdentityFile C:¥Users¥<windowsのユーザー名>/.ssh/id_rsa
```

作成したキーペアの内、公開鍵はSSHを用いてサーバサイドへ転送します。

OpenSSHを手動インストールした場合は、ポートが開放されていないのでSSHが使用できません。id_rsaの内容をコピーして[サーバーサイド⑵](#サーバーサイド⑵)へ進んでください。

```terminal
$ scp -P 22 C:¥Users¥<windowsのユーザー名>/.ssh/id_rsa <ログインに使用するユーザー名>@<IPアドレス>:~/.ssh/authorized_keys

/指定したユーザーに対応する要求されたパスワードを入力してYで答える/
<ログインに使用するユーザー名>@<IPアドレス>'s password:<パスワード>
よろしいですか(Y/N)?<Y>
```

[サーバーサイド⑵](#サーバーサイド⑵)へ進みます。

##サーバーサイド⑵
ファイルのパーミッションを変更して転送した公開鍵を使用可能な状態にします。
scpで公開鍵を転送していない場合は、コピーしたid_rsaの内容を`vim ~/.ssh/authorized_keys`で作成したファイルの中にペーストしてからパーミッション を変更してください。

```console
# su <ログインに使用するユーザー名>
# sudo chmod 600 ~/.ssh/authorized_keys #パーミッションを変更

# sudo systemctl start ssh #設定ファイルを反映
```

権限を付与したい場合は数字を足算して、所有者・所有グループのユーザー・その他のユーザーの順で記述します。

|レター|意味|数字|
|:-----------------|:------------------|:------------------|
|r|読取|4|
|w|書込|2|
|x|実行|1|

#ファイアーウォール
`ufw`の状態を確認し、前項の設定ファイルで変更した番号のポートを開きます。

```console
/SSHを手動でインストールした場合/
# sudo ufw status
Status: inactive
# sudo ufw allow proto tcp to 0.0.0.0/0 port <port番号> #IPv4のTCPポートのみ解放
# sudo ufw enable #接続が途切れます
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

/SSHが既にインストールされていた場合/
# sudo ufw status
Status: active
To          Action      From
--          ------      ----
22/tcp      ALLOW       Anywhere  
# sudo ufw delete allow 22/tcp #22番ポートが開いていたら閉じる
# sudo ufw allow proto tcp to 0.0.0.0/0 port <port番号> #IPv4のTCPポートのみ解放
# sudo ufw reload #リロードして設定を反映
```

# 確認
設定した内容が有効であるかを確認するために、サーバーから退出せず、新しいアクセスを試みましょう。

```terminal
$ ssh <Host（適当な名称）>
$ Enter passphrase for key '.ssh/id_rsa':
```

ログインできれば成功です。
できなければパーミッションやsshの設定を疑って下さい。

以上で終了です。