ConoHa で VPS を借りて Node.js で HTTPS サーバを建てるまでのメモ（1/2）

# ねらい

本記事は、以下の目的で行った一連の遊びに関する、自分自身のためのメモです。Qiita 的にありふれた情報ばかりだとは思いますが、自分に必要な情報をまとめておきます。

* VPS (Virtual Private Server) の勉強
* Linux (CentOS 7) の勉強
* パーソナル認証局でのお遊びからの卒業

今回（1/2）は、ConoHa で VPS を借りて、CentOS 7 の各種設定をして、SSH、SCP、VNC によるセキュアなリモート接続環境を構築したうえで、Web サーバ（Apache）を動かすところまでです。


[次回（2/2）](https://qiita.com/mkoku/items/3537d9cc7d4c029d886b)は、オリジナルのドメインを取得し、DNS に登録し、Let's Encrypt を使って SSL (HTTPS) に対応した Web サイトに仕立てたうえで、Node.js でも HTTPS サーバを建てます（予定）。



# ローカルの環境

## ハードウェア

* 端末
    * PC: Lenovo YOGA720 12IKB
    * 仕様: Core i5-7200U, 8GB RAM, 256GB SSD
    * OS: Windows 10 Home 1809 64bit
* インターネット回線
    * au ひかり（マンションタイプ）

## ソフトウェア
* Web ブラウザ: [Chrome](https://www.google.com/intl/ja_ALL/chrome/) 72.0.3626.121
    * VPS の契約とコントロールパネル操作に用いるだけなので、なんでもよい
* ターミナルソフトウェア: [RLogin](http://nanno.dip.jp/softlib/man/rlogin/) 2.24.1
    * 好み次第で TeraTerm などでもよい
* VNC クライアント: [VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/) 6.18.907 (r38355)
    * 好み次第で Ultra VNC などでもよい
    * そもそも必須ではない
* SCP クライアント: [WinSCP](https://winscp.net/) 5.13.8 (build 9278)


# ConoHa VPS を借りる

## 申し込み

* [ConoHa VPS](https://www.conoha.jp/vps/) のページで「お申し込み」をクリックして、個人情報を入力するだけ
    * 今回はたまたま 700 円分のクーポンがもらえた
* すぐに「お申込みありがとうございます」というタイトルのメールが送られてくる（コントロールパネルやスタートアップガイドの URL が書かれている）

## コントロールパネルでインスタンスを作る

* 「サーバー追加」から所望のプランのサーバのインスタンスを作る
* 今回作ったインスタンスの仕様は以下
    * CPU: 2コア
    * メモリ: 1GB
    * SSD: 50GB
    * リージョン: 東京
    * 料金: 900円／月
* OS は CentOS 7.6 (1810) (64bit) を選択（この記事を書いている時点の最新バージョン）
* 他に何のスクリプト（テンプレート）も選択しないシンプルな構成でスタート
* 初期設定の「接続許可ポート」は、「全て許可」で構わない
    * ここで許可しても、firewall-cmd でポートを開けない限り開放にはならないので心配ない
    * 逆に、firewall-cmd でポートを開けても、ここで許可していないと、開放にはならない
* SSH Key (*.pem) を作ってローカルマシンにダウンロードしておく
* サーバの IPv4 アドレスを控えておく

## （お好みで）コントロールパネルを「このはモード」に変える

* コントロールパネル右上のアカウント名をクリック → アカウント設定
* ページ後半にある「表示設定」で「このはモード」を選択

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/157570/e14b13ba-c292-db9f-164d-be7ea8dee997.png)




# CentOS 7 をもろもろ設定する

以下、SSH コンソールのプロンプトの表記は…

* # : root または su で root に昇格した場合
* $ : 一般ユーザ


## SSH でリモートアクセスして初期設定

### RLogin の設定と接続

* RLogin の「サーバに接続」から「新規」で…
  * ホスト名: サーバの IPv4 アドレス
  * ログインユーザ名: root
  * パスワード欄は空白にしておく
  * 「SSH 鍵認証」をクリック -> ダウンロードしておいた *.pem を選択


### パッケージの更新

ログインしたらなにより初めに、パッケージを更新する。

```shell-session
# yum update
```

メモ： yum = Yellowdog Updater Modified; 「ヤム」と読む 


### パッケージ更新の自動化（yum-cron）

* 自動的にパッケージを更新してくれる yum-cron をインストールする

```shell-session
# yum install yum-cron
```

* 設定ファイル /etc/yum/yum-cron.conf 内の apply_updates を yes にする

```config:/etc/yum/yum-cron.conf
apply_updates = no
↓
apply_updates = yes
```

* yum-cron を再始動

```shell-session
# systemctl daemon-reload
# systemctl restart yum-cron.service
```


### 一般ユーザの追加

* 原則今後は root ではログインや作業をしないように、一般ユーザ（例：hoge）を作成する

```shell-session
# useradd hoge
# passwd hoge
```

### ユーザを sudoers に入れる

* ユーザを wheel グループに登録して、sudo が使えるようにする

```shell-session
# usermod -G wheel hoge
```

## 鍵交換方式による SSH 認証の設定

パスワード認証を使わないように設定する。

* RLogin で上記で追加したユーザ（hoge）用のエントリを作る
* ひとまずパスワード認証で接続する

### 秘密鍵と公開鍵を作る

* ssh-keygen で秘密鍵と公開鍵を作る

```shell-session
$ ssh-keygen

  保存場所を聞かれるので、そのまま Enter することで、以下に秘密鍵と公開鍵ができる
    秘密鍵 /home/hoge/.ssh/id_rsa
    公開鍵 /home/hoge/.ssh/id_rsa.pub

  パスワードを聞かれるので、ログインパスワードとは違う任意のパスワードを2回入力
```

* 公開鍵の内容を authorized_keys ファイルに移す
    * .ssh ディレクトリ内に authorized_keys というファイルを作成
    * authorized_keys ファイルのパーミッションを 600 に設定
    * 公開鍵（id_rsa.pub）の内容を authorized_keys に追記

```shell-session
$ cd .ssh
$ touch authorized_keys
$ chmod 600 authorized_keys
$ cat id_rsa.pub >> authorized_keys
```


### 秘密鍵と公開鍵をローカルに持ってくる

* WinSCP で hoge ユーザとして接続（ここではとりあえずパスワード認証で）
* home ディレクトリ内の隠しファイル（フォルダ）を表示させるために Ctrl + Alt + H
    * あるいは「オプション」->「環境設定」->「パネル」->「一般」->「隠しファイルを表示する」にチェック
* .ssh 内の id_rsa（秘密鍵）と id_rsa.pub（公開鍵）をローカルマシンにダウンロード
    * これらサーバ上の id_rsa（秘密鍵）と id_rsa.pub（公開鍵）は後から削除するが、鍵交換方式による接続を確認するまで念のためサーバ上に残しておく


### 鍵交換方式で SSH 接続してみる

* RLogin の接続をいったん切る
    * exit あるいは logout コマンド
* hoge ユーザのエントリを「編集」
* 「サーバ」->「ホスト設定」にある「SSH 認証鍵」ボタンをクリック
* さきほどローカルにダウンロードした id_rsa（秘密鍵）を選択
* 「OK」ボタン
* 接続する
* 秘密鍵と公開鍵を作ったときに入力したパスワードを入力
* 接続できることを確認


### サーバ上の秘密鍵と公開鍵を削除する

* WinSCP で、.ssh 内の id_rsa（秘密鍵）と id_rsa.pub（公開鍵）を削除


### パスワード認証できないようにする

* root 権限で /etc/ssh/sshd_config を編集（例えば nano エディタで）

```shell-session
$ su
# nano /etc/ssh/sshd_config
```

* 79 行目の「PasswordAuthentication」を yes から no に変更

```config:/etc/ssh/sshd_config
PasswordAuthentication yes
 ↓
PasswordAuthentication no
```

* ファイルを保存
* SSH サービスを再起動する

```shell-session
# systemctl restart sshd.service
```


## root でのログインを不可にする

* root 権限で /etc/ssh/sshd_config を編集（例えば nano エディタで）

```shell-session
$ su
# nano /etc/ssh/sshd_config
```

* 38 行目の「PermitRootLogin」のコメントアウトを外して、値を no に設定

```config:/etc/ssh/sshd_config
# PermitRootLogin yes
 ↓
PermitRootLogin no
```

* ファイルを保存
* SSH サービスを再起動する

```shell-session
# systemctl restart sshd.service
```

## SCP も鍵交換方式にする

### WinSCP 用の秘密鍵を作る

* WinSCP を起動すると出てくる「ログイン」ウィンドウにて
    * 「ツール ▼」から「PuTTYgen を実行」を選択
* 「PuTTY Key Generator」ウィンドウにて
    * 「Load」ボタンをクリック -> 上記で作った id_rsa（秘密鍵）を選択
    * 「Save private key」ボタンをクリック -> id_rsa.ppk という名前で保存
    * 終えたらウィンドウを閉じる（右上の×）

### 鍵交換方式でログイン

* 再び「ログイン」ウィンドウにて
    * 自分のセッションを選択して「編集」ボタンをクリック
    * 「設定 ▼」ボタンをクリック
    * 「SSH」の「認証」の「認証条件」にて
        * [x] エージェントの転送を許可する
        * 「秘密鍵」欄で、id_rsa.ppk を選択
        * 「OK」ボタンで抜ける
    * 「保存」ボタンで設定を保存
    * 「ログイン ▼」ボタンで接続
* 秘密鍵のパスフレーズを聞かれるので、入力して、「OK」


## VNC でも接続できるようにする

VNC 接続は必要というわけではないが、GUI があるとちょっと安心できるので、VNC でも接続できるようにしておく。

### デスクトップ環境 GNOME のインストール

* SSH (RLogin) で hoge ユーザでログインした状態で以下を実行

```shell-session
$ su
# yum groupinstall "GNOME Desktop"
```

* 終わるまでのんびり待つ
* 終わったら、デフォルトで起動するのが CUI か GUI かを確認

```shell-session
# systemctl get-default
    graphical.target と出たら、GUI で起動する設定になっている
    multu-user.target と出たら、CUI で起動する設定になっている
```

* もし graphical.target（GUI で起動）になっていたら、CUI で起動するように設定する

```shell-session
# systemctl set-default multi-user.target
```


### tigervnc-server のインストール

* VNC サーバの tigervnc-server をインストールする

```shell-session
# yum install tigervnc-server
```

### ポート開放

* VNC 用のポート 5901/tcp を開ける
    * 5901 = VNC は 5900 番台を使い、末尾がディスプレイ番号

```shell-session
# firewall-cmd --add-port=5901/tcp --zone=public --permanent
# firewall-cmd --reload
# firewall-cmd --list-all
```

### パスワードの設定

* ユーザ hoge に戻る（su で root に昇格していた場合は exit する）
* VNC 接続用のパスワードを設定する

```shell-session
$ vncpasswd

view-only password? という質問には n と答える（VNC 経由で操作もできるように）
```

### 接続確認

* 一時的に VNC サーバを起動して接続できることを確認
    * まずは vncserver のディスプレイ番号1を起動

```shell-session
$ vncserver :1
$ vncserver -list
```

* Windows の VNC Viewer で接続確認
    * サーバの IPv4 アドレス:5901 で接続
    * 例：118.99.10.1:5901
    * 接続できて GUI が見られたら、一旦接続を切る

* 一時的に起動した VNC サーバを切る

```shell-session
$ vncserver -kill :1
$ vncserver -list
```

### 自動起動の設定

* VNC サーバが自動で起動するように設定する
    * 再び su で root 権限を得て
    * 自動起動のテンプレート vncserver@.service をコピーして vncserver@:1.service ファイルを作る
    * vncserver@:1.service ファイルの内容を編集する（例えば nano エディタで）
        * 具体的には \<USER> と書かれている部分を実際のユーザ名（今回の場合「hoge」）に書き換えるだけ（2箇所）


```shell-session
$ su
# cp -p /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service
# nano /etc/systemd/system/vncserver@:1.service
```

```config:vncserver@：1.service
[Unit]
Description=Remote desktop service (VNC)
After=syslog.target network.target

[Service]
Type=forking
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/usr/sbin/runuser -l hoge -c "/usr/bin/vncserver %i"  # この行にあった <USER> を hoge に
PIDFile=/home/hoge/.vnc/%H%i.pid                                # この行にあった <USER> を hoge に
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

[Install]
WantedBy=multi-user.target
```

* VNC サービスを自動起動させる
    * 設定ファイルをリロード
    * vncserver@:1.service をスタート
    * vncserver@:1.service の自動起動を有効化

```shell-session
# systemctl daemon-reload
# systemctl start vncserver@:1.service
# systemctl enable vncserver@:1.service
```

* VNC Viewer で接続できることを確認する


### SSH トンネル経由で VNC 接続するようにする

せっかく SSH を鍵交換方式にするなど念入りに設定したのに、VNC が 暗号化されないのでは意味がないため、SSH トンネル経由で接続するように設定する。VNC Viewer をローカルの特定のポート（例えば、127.0.0.1::1234）に接続させ、RLogin がそのポートへの通信を捉えて SSH に乗せて（ポートフォワードして）サーバとやりとりする。

#### RLogin 側の設定（ローカルの特定ポートへの通信をフォワードする設定）

*  RLogin のサーバのエントリで、hoge ユーザのエントリを選択して「編集」ボタン
*  「サーバー」の「プロトコル」の「SSH」にて「ポートフォワード」ボタン
*  「SSH2 ポートフォワード」ウィンドウにて「新規」ボタン
    *  上段「Listened」で
        *  (●) Local を選択
        *  「Host Name」欄に「127.0.0.1」（つまりローカルマシン自身）
        *  「Port」欄に「1234」（任意の番号だが例えば）
    *  下段「Connect」で
        *  「Host Name」欄にサーバの IPv4 アドレス
        *  「Port」欄に「5901」
    *  「OK」で抜ける
* 「OK」で抜ける 

#### VNC Viewer 側の設定（ローカルの特定ポートに接続する設定）

* 「FIle」->「New Connection」で新しい接続を作成
* 「VNC Server」欄に「127.0.0.1::1234」（上記で RLogin の「Listened」に設定した Host Name と Port）
    * IP アドレスとポート番号を区切る**コロン(:)が2個**あることに注意

#### SSH トンネルでの VNC 接続

* RLogin で通常通りサーバに接続したうえで
* VNC Viewer で 127.0.0.1::1234 を開く
* RLogin の接続を切ると、VNC Viewer の接続も切れる（トンネルがなくなるから）


### （お好みで）GNOME Classic でないほうにする

上記で "GNOME Desktop" をインストールすると、GNOME Classic というデスクトップがデフォルトで起動する。これを、Classic でないほうに変更するには以下。

* /etc/sysconfig/desktop というファイル（最初はカラ）に DESKTOP="GNOME" と書く

```shell-session
$ su
# nano /etc/sysconfig/desktop
```

```config:/etc/sysconfig/desktop
DESKTOP="GNOME"
```

* reboot すれば、次からは Classic でないほうになる



# Apache を設定する

Web サーバを動かし、VPS を借りた意義を味わう。

## Apache のインストール

* root 権限にて、yum で関連するパッケージをインストール
    * epel-release: EPEL (Extra Packages for Enterprise Linux) レポジトリ
    * httpd: Apache Web サーバ本体
    * mod_perl: Apache の API を Perl から利用するもの
    * mod_ssl: Apache に SSL (HTTPS) 接続機能を追加するもの

```shell-session
$ su
# yum install epel-release
# yum install httpd mod_perl mod_ssl
```

* この後、各種設定を勧める情報源が多いが、とりあえず手短に確認するだけなら、特に設定しなくても大丈夫
* Web サーバを起動させる
    * systemctl start で起動
    * systemctl enable で自動起動化

```shell-session
# systemctl start httpd.service
# systemctl enable httpd.service
```


* VNC にて サーバに接続し、Firefox にて「localhost」で Apache のテストページにアクセスできることを確認


## http と https のポートを開ける

* 外部からもアクセスできるようにポートを開ける
    * http のポート（80）を開ける -> firewall-cmd --add-service=http
    * https のポート（443）を開ける -> firewall-cmd --add-service=https
    * 設定のリロード
    * 設定の確認


```shell-session
# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --add-service=https --zone=public --permanent
# firewall-cmd --reload
# firewall-cmd --list-all
```

* ローカルマシンやスマホの Web ブラウザにて、URL 欄にサーバの IPv4 アドレスを入力して、Apache のテストページにアクセスできることを確認
    * 例：118.99.10.1
* 同様に「https://」をつけてアクセスしてみる
    * 例：**https://**118.99.10.1
    * ブラウザに「安全な接続ではありません」と表示されるが、例外的にアクセスはできて、しかしながら URL 欄に×印などがつくことを確認する
        * 電子証明書が信頼できる認証局により発行されたものではないことを示している
        * **次回、Let's Encrypt を使ってこれを克服し、ちゃんとした HTTPS サイトにする**

# 小まとめ

ひとまず、ConoHa で VPS を借りて、CentOS 7 の各種設定をして、SSH、SCP、VNC によるセキュアなリモート接続環境を構築したうえで、Web サーバ（Apache）を動かすところまでのメモでした。主に下記の参考書籍に沿って進めましたが、とても勉強になり、VPS 遊びが楽しくなってきました。参考書籍からアレンジしている部分もあり、それなりにオリジナルな勉強ができたと思います。

[次回は、オリジナルのドメインを取得し、DNS に登録し、Let's Encrypt を使って SSL (HTTPS) に対応した Web サイトに仕立てたうえで、Node.js でも HTTPS サーバを建てます。](https://qiita.com/mkoku/items/3537d9cc7d4c029d886b)

なお、ConoHa の VPS に落ち着く前には、[さくらの VPS](https://vps.sakura.ad.jp/) 、[カゴヤの VPS](https://www.kagoya.jp/cloud/vps/) も試しました。下記の参考書籍では、さくらの VPS を使った事例もあるため、さくら VPS にしようかとも思ったのですが…。初期費用がかからず、ほぼ同じ料金で SSD の容量が大きい ConoHa にしました。ちなみに、カゴヤの VPS は、CentOS 7 なのに、firewalld ではなく iptables を使う仕様でした。はじめそれに気づかず、ハマったため、やめました。



# 参考

* [福田和宏 (2018). 実践！CentOS7 サーバー徹底構築 改訂第二版 CentOS7(1708)対応, ソーテック社.](http://www.sotechsha.co.jp/sp/1196/)
* ConoHa. VPSスタートアップガイド, https://support.conoha.jp/vps/guide/vpsstartup/ (最終閲覧：2019年3月10日）.

次回の記事：[ConoHa で VPS を借りて Node.js で HTTPS サーバを建てるまでのメモ（2/2）](https://qiita.com/mkoku/items/3537d9cc7d4c029d886b)