VPSにLinuxサーバーを構築する手順例

# 概要

本記事では、VPSにinuxサーバーを構築した手順の一例を記載します。

#### 本記事のカバー範囲
* VPSを契約し、サーバー上での作業が可能な環境を整える。
* サーバーの用途に依存する手順は本記事で扱わない。

#### 本記事の方向性
* 個人利用目的に適していること。
* コストを極力抑えること。
* できるだけ手順が簡便で、作業負荷が低いこと。

# 環境
以下の環境以外の場合、利用可能なコマンドなどが異なる可能性があります。
| インフラ | カーネル | ディストリビューション |
|:------------:|:------------:|:------------:|
| [ConoHa VPS](https://conoha.jp/vps/)  | Linux | Ubuntu 22.04 |

#### VPSを用いる理由（主観）
個人利用目的（検証・テスト・小規模なサービスの提供など）であれば、VPS（定額課金）が自由度・コスト・運用負荷において最も適していると考えたためです。
| 種別 | 自由度 | コスト | 運用負荷 | 備考 |
|:------------:|:------------:|:------------:|:------------:|:------------|
| VPS（定額課金） | 〇 | 〇 | 〇 |  |
| VPS（従量課金） | 〇  | ！ | 〇 | 稼働時間・転送量などによっては高額になる可能性あり。 |
| 自宅サーバー | ◎ | △ | × | 障害監視・復旧なども自分で対応する必要あり。 |
| レンタルWebサーバー | × | ◎ | 〇 | 原則Webサイトやブログなどの公開用途に限定（一部DB・phpも対応）。 |
| 専用ホスティングサーバー | ◎ | × | △ | 基本的に法人向け。運用負荷は契約にも依存。 |

# 手順
## 1. VPSを契約する

:::note info
他のVPSサービスを利用する場合も、第3章以降の手順は基本的に共通です。
:::

Webサービスを提供するサーバーを構築したい場合、VPS（仮想専用サーバー）を契約すれば、高価なハードウェアや回線を導入しなくともすぐ作業に着手できます。
料金体系・サーバーの仕様・提供サービスは運営元によって異なりますが、個人的には従量課金が無いプランを推奨します。

##### 1. とりあえず一番安価なプランにしてみます。
ディストリビューションは慣れ親しんだものか、UbuntuやCentOSなど技術情報が豊富なものを選ぶとよいでしょう。

:::note info
本記事ではディストリビューションとしてUbuntuを選択しています。
:::

※ConoHa VPSの料金・契約手順は[公式サイト](https://support.conoha.jp/c/vpswizard/?btn_id=subscription-subscription-subscription_c-vpswizard)を参照。

![プラン選択画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818983/2c792008-f646-bfc8-1595-03ed5e96b5d0.png)

##### 2. セキュリティ上のリスクを最小限にするため、使用しないポートは閉塞します。
サービス提供や維持に必要なポートを洗い出し、それ以外を閉塞します。
不必要なポートの外部公開は、攻撃者による侵入の足掛かりとなる可能性があるため推奨できません。
ターミナルソフトを使用せず、ConoHa VPSのコンソール機能のみで作業する場合はSSH(22)も閉塞して問題ありません。
![オプション設定画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818983/88ec8e5a-19f2-216b-7de6-4115ea4dc842.png)

## 2. サーバーにアクセスする

:::note info
本章は[ConoHa VPS](https://conoha.jp/vps/)のコンソール機能を利用する場合の手順です。
SSH接続する場合や他のVPSを利用する場合は、適宜対応するドキュメントを参照の上、接続設定を実施してください。
:::

ConoHa VPSにはコンソール機能が用意されており、自身でターミナルソフトを用意しなくても作業可能です。
他のVPSでも類似の機能を提供している場合があります。
※VPSアカウントの認証情報は適切に管理してください。

##### 1. ConoHa VPSの[ダッシュボード](https://manage.conoha.jp/Dashboard/)にアクセスします。
##### 2. 仮想サーバー一覧の右側にある「コンソール」アイコンをクリックします。
![ConoHa VPSダッシュボード画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818983/aa03881f-75f6-fb34-bbd0-cfcd7a07960e.png)
##### 3. ブラウザーの別ウィンドウでコンソールが起動します。
![ConoHa VPSコンソール画面](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818983/24a04f49-f636-0e96-4f26-911dabcb7a5b.png)

## 3. ユーザーアカウントを作成する

:::note info
本記事ではUbuntu22.04での作業例を記載しています。
:::

導入作業やサービスの実行などは、特権アカウント(root)ではなく一般アカウントで行うことを推奨します。
これはセキュリティ上の観点および、作業ミスやバグによるシステム影響を抑えるためです。

#### アカウント一覧
本記事では例として、サービス実行用アカウント「discord_bot」と作業用アカウント「ope_user」の2つを作成します。
本来は作業内容によってアカウントおよび使用可能なコマンドを限定するなど権限分離を行うことが望ましいですが、今回は一人での運用を想定し以下の通り作成します。
| 名称(例) | 用途 | 利用主体 | sudo |
|:------------:|:------------:|:------------:|:------------:|
| discord_bot       | サービスの実行        | システムが利用         |不要         |
| ope_user     | 構築・テスト・メンテナンスなど      | 人間が利用       |必要        |

#### 補足：sudoについて
本記事では、一般アカウントが管理者権限を用いる際に都度sudoを使用するように設定します。
sudoを使用すると、**rootが予め許可したユーザー**が**sudoersで許可されたコマンド**を実行可能になります。
※初期設定では全コマンドが実行可能。

##### 1. サーバーにrootでログインします。
##### 2. サービス実行用ユーザーを作成します。（以下はユーザー名を「discord_bot」とする場合の例）
:::note info
ConoHa VPSコンソールの場合、「テキスト送信」をクリックするとコマンドをコピー＆ペーストで送信できます。
:::

```
sudo adduser discord_bot
```

##### 3. New passwordを聞かれるため、今回作成するユーザー用のパスワード（rootと異なるもの）を入力します。
![ユーザー作成（パスワード設定）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818983/9c98a001-35a9-4778-c29e-127f94f34194.png)

##### 4. Retype New passwordを聞かれるため、パスワードを再入力します。
![ユーザー作成（パスワード設定再入力）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818983/1c3142d4-f109-fd82-00c0-8b26e0f8ca59.png)

##### 5. 「passwd: password updated successfully」と表示されればユーザー作成は成功です。
![ユーザー作成成功](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818983/8a26c648-53b6-ad71-1704-8f8f998dc2b1.png)
user indormation で任意の説明文を設定可能ですが、不要な場合は空白のままENTERを押下して構いません。
最後にY→ENTERを押下して完了です。
![user indormation設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818983/38b27b5b-8772-8a31-a186-da6f36302d60.png)

##### 6. 作業用ユーザーを作成します。（以下はユーザー名を「ope_user」とする場合の例）

```
sudo adduser ope_user
```

##### 7. 前述3～5と同様に作業します。 

##### 8. 作業用ユーザーをsudoグループに追加します。

:::note warn
この作業はrootアカウントを無効化する前に実施してください。
:::

追加作成したユーザーはデフォルトでsudo権限を持っていないため、sudoの利用を許可するグループへ追加します。

```
gpasswd -a ope_user sudo
```
コマンドが実行できていれば「Adding user {ユーザー名} to group sudo」と表示されます。
![sudo追加コマンド](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818983/9d81155a-cff5-0818-6b0d-375191ea4ca3.png)

##### 9. 作業用ユーザーのアカウントがsudoに追加されていることを確認します。
idコマンドで、作業用アカウントの属性を表示させます。
```
id ope_user
```
sudoへ追加されていれば、「groups=」以降に「(sudo)」が付与されています。
![sudo追加成功](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818983/7595ef79-f05c-ef8e-f94c-42432b0f5b82.png)

##### 10. 以降rootアカウントは使わないため、サーバーからログアウトします。
exitコマンドでログアウトします。
```
exit
```

## 4. rootアカウントを無効化する
:::note warn
この作業は作業用ユーザーをsudoへ参加させる前に実施しないでください。
:::

作業用アカウントにsudo権限を付与できたら、rootアカウントをロックします。

##### 1. 作業用アカウントでログインします。
前項で作成した作業用アカウントでログインします。
![作業用アカウントでログイン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818983/0ec5792b-94d2-0955-407f-f2bc7cbaa4ab.png)
パスワード入力後、最終行に作業用アカウントのユーザー名@～が表示されていれば成功です。
![作業用アカウントでログイン成功](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818983/9e1a2885-a010-381e-eafa-4839efa891de.png)

##### 2. rootのアカウントをロックします。
passwdコマンドをオプションl(LockのL)で実行します。

```
sudo passwd -l root
```

コマンドが実行できていれば「passwd: password expiry information changed.」と表示されます。
![root無効化](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818983/331e5f7b-14f0-5604-f2f8-3e0b3c8074eb.png)


##### 3. rootアカウントがロックされていることを確認します。

```
su root
```

rootアカウントがロックされていれば、正しいパスワードを入力しても「su: Authentication failure」と表示されログインできないことが確認できます。
![rootアカウントのロック成功](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2818983/70386a2c-cf31-b609-83bd-229fc6678d20.png)

## 5. 完了
作業お疲れさまでした。
ツールやサーバーソフトウェアの導入など、サービス提供に向けた準備が開始できる状態です。