Conoha VPSでUbuntuサーバーを構築する方法

# 環境
* ローカル環境：Windows 10
* 構築するサーバー：Ubuntu 18.04 LTS

# サーバーの追加
Conoha VPSのメニューから、サーバー追加を選択して、サーバーを追加する。  
注意すべきポイントは以下のとおり。

* イメージタイプはUbuntu 18.04
* rootパスワードを設定して、忘れないようにする。
* SSH Keyは使用しない（あとから設定する）
* 接続許可ポートは全て許可
* ネームタグは後から変更できる（特に影響はない）
* それ以外の項目は特に設定しない

上記の項目に注意して、サーバーを追加する。

# サーバーにアクセス
追加したサーバーの管理画面に移動する。
そこで、ネットワーク情報からサーバーのIPアドレスを参照する。(以下アドレスをx.x.x.xとする)

コマンドプロンプト(Winキーを押して`cmd`と押すと出てくる)を開いて以下のコマンドを入力すると、サーバーにssh接続できる

``` sh
# x.x.x.xにrootというユーザー名で接続する
ssh root@x.x.x.x
# ここでパスワードを問われるので、rootパスワードを入力

```
もし、sshコマンドがありませんと言われる場合はOpenSSHが入っていない可能性がある。

以下、sshで接続した状態での操作をサーバー上での操作、sshで接続していない状態での操作をローカル上での操作という。

# 新規アカウントを追加
続いて、サーバー上にアカウントを追加する。
sknjpnという名前で作成したが、もちろん好きな名前に変更すべきである。

``` sh
# sknjpnという名前のアカウントを追加
adduser sknjpn
# パスワード以外の項目は何も書かずにEnterでよい

# sknjpnをsudoグループに追加
gpasswd -a sknjpn sudo
```

参考：[ubuntu ユーザを追加して sudo 権限をつける](https://qiita.com/white_aspara25/items/c1b9d02310b4731bfbaa)

# SSH接続出来るようにする
現在のパスワード認証ではなく、公開鍵認証にする。
## 新規作成したアカウントでアクセスする
一旦サーバーからログアウトする

``` sh
exit
# ここで、コマンドプロンプトが落ちた場合は、再度コマンドプロンプトを立ち上げる。
```
## 鍵の作成とサーバーへの公開鍵の配置
以下は**ローカル上での操作**であることに注意する。  
公開鍵(`id_rsa.pub`)は名前通り公開して問題ないが、秘密鍵(`id_rsa`)は公開してはいけない。(OpenSSHがSSH接続時に参照するのみ)  
サーバー上に上げるときは`id_rsa.pub`を用いる

``` sh
# 鍵を作成する
ssh-keygen -t rsa
# 作成場所を聞かれるが、デフォルトのままにする。保存場所は次のコマンド入力に用いる。
# パスフレーズは毎回入力が面倒になるので何も入力せずEnterを押す

# 公開鍵をサーバーに送信する(sknjpnは新規作成したアカウント名に変更すること。C:\Users\sknjpn\.ssh\id_rsaは保存場所を入力)
scp C:\Users\sknjpn\.ssh\id_rsa.pub sknjpn@x.x.x.x:~/authorized_keys

# サーバーにログイン
ssh sknjpn@x.x.x.x

# authorized_keysを.sshファイル内に移動
mkdir .ssh
mv authorized_keys .ssh/

# サーバーからログアウト
exit

# サーバーにログイン
ssh sknjpn@x.x.x.x
# この時、パスワードの入力が求められないならば公開鍵認証が有効となっている。
```
参考：[公開鍵暗号を用いてのSSH接続（きほん）](https://qiita.com/mukoya/items/f20def019e25dc162ca8)

## SSH接続時のセキュリティ設定
まず、パスワード認証より安全な公開鍵認証でサーバーにログインが可能となった。  
これ以降でパスワード認証によってSSH接続してくるとしたら、それはたぶん貴方ではない誰かである。  
というわけで、パスワード認証の禁止も含めたセキュリティ上の設定を行う。

``` sh
# vimのインストール(たぶん、不要な場合が多いが念のため)
sudo apt install vim -y

# SSH接続の設定ファイルを修正
sudo vim /etc/ssh/sshd_config
```
以下のように設定してください(Vimによる編集は、iキーを押すと入力が出来るようになります)
* `#Port 22`を`Port XXXXX`に(XXXXXは1024から65535のいずれかの番号を入力。後で使うのでこの番号を覚える)
* `PermitRootLogin yes`を`PermitRootLogin no`に
* `PasswordAuthentication yes`を`PasswordAuthentication no`に  
* `#ClientAliveInterval 0`を`ClientAliveInterval 60`に

`ClientAliveInterval`を設定することで、SSH接続が勝手に切断されなくなります。(しなくてもよい)  
参考:(ssh 接続をタイムアウトしないようにする)[https://gist.github.com/koudaiii/dc6ea63fa0258c39987d]

設定が終了したら、ESCキーをおして、`:wq`と入力してEnterキーを押してください(上書き保存)

そうしたら、接続が問題なくできるか確認してください

``` sh
# 変更の適用
service sshd restart

# ログアウト
exit

# XXXXX番ポートでログイン
ssh -p XXXXX sknjpn@x.x.x.x
```
これで接続出来たら成功です。


# パッケージの更新
以下のコマンドを入力して、パッケージを更新してください。

``` sh
sudo apt update
sudo apt upgrade -y
```

# VSCodeでサーバーに接続する
これは、ほぼおまけです。
まず、`Extensions`から、`Remote Development`をインストールしてください。  
そうしたら、`Remote Explorer`アイコンをクリックして、上部の設定を`Containers`から`SSH Targets`に変更します。  
`SSH Target`を追加すると、sshのコマンド入力が求められますが、この時にこれまでと同様に`ssh -p XXXXX sknjpn@x.x.x.x`を入力すれば接続できます。

参考：[VSCodeのRemote Developmentを使ってみる](https://qiita.com/HoriThe3rd/items/b2f6c440f096106cf89e)

# もし最初からやり直す場合
サーバーを削除して、再度一番上から実行すれば良いのですが、一点注意がありまして、  
ローカル上に、サーバーへのSSH接続情報が残っていると、新規作成したサーバーをなりすましだと認識して接続出来なくなるので、`known_hosts`ファイルを修正する必要があります。  

ローカル上に`C:\Users\sknjpn\.ssh\known_hosts`というファイルがあると思いますので、(`id_rsa`があるのと同じ場所です)  
そのファイルを削除するか、開いて接続したサーバー情報が書かれている行を削除してください。

# さいごに
CentOSを使う場合などはいくつかのコマンドが異なりますし、基本的にUbuntuの場合の解説となっています。  
またOpenSSHなど、ローカルの環境に応じて、書かれている通りに動かない場合があります。  
もし、ご意見、ご感想等ありましたら、お気軽にコメントください。

以上で、解説は終わりです。