ConoHa VPS のSSH接続設定をしよう！

# まえがき

## この記事について
この記事は、ConoHa VPS でSSH接続の初期設定を行った際のメモです。

### きっかけ
外出先でふと時間が空いて何か開発しようと持ったとき、手持ちのMacbookAirのスペックが、家に置いてあるMac miniよりも低くて、動作が重いのが課題でした。
レンタルサーバーを借りてそこで開発すれば、PCのスペックによらず、家でも外出先でも同じ環境で開発ができて便利だと思い、設定をしてみました。

# VPSサーバーを作成する

ConoHaへのアカウント作成は済んでいるものとします。
ログインするとこのような画面になっているはずです。

左のタブから「サーバー追加」を選択します。

![00_ConoHa_ログイン後のトップ画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/1ed399db-1c63-588a-b52a-6cc4165736bf.png)

サーバー追加画面はこのようになっています。

![01_ConoHa_サーバー追加画面-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/69222603-b9fd-1b57-49db-366e6c542eb3.png)

右側にある月額の合計金額が、選択した項目に応じて変化します。
今回、以下の設定で作成しました。

サービス：VPS
イメージタイプ：OS (CentOS)
料金タイプ：1ヶ月
プラン：2GB
rootパスワード：こちらは任意の値を入力します。root権限でSSH接続する際のパスワードとして使用します。
ネームタグ：用途に応じて好みの名前をつけます。後で変更も可能です。

:::note warn
rootパスワードは忘れるとSSH接続できなくなるので、必ずどこかにメモしておきます
:::

料金を確認して、問題なければ「次へ」を押します。

![02_ConoHa_サーバー追加画面_料金確認-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/37faa20d-f560-f8ff-c5f4-1af4a33b1ad0.png)

お支払い画面に遷移します。
支払い方法を選択して、「決済」を押します。

しばらく待つと、サーバーが立ち上がります。ステータスが「起動中」になっていればOKです。

![03_ConoHa_サーバー作成後_サーバー一覧-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/239dba5f-0a5b-458a-7119-c64a974b43fe.png)

# 初期設定を行う

あとはSSH接続して開発していけばいいのですが、
やっておいた方がいい初期設定があるので実施しておきます。

## ログイン

まずはログインします。
先ほどのサーバーリストのページのネームタグをクリックすると、サーバーの詳細ページに入れます

「コンソール」ボタンがあるので、これをクリックするとコンソールが開きます。
![04_ConoHa_サーバー詳細画面-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/b6090809-9de9-7dd5-0fb3-4b42d895acfd.png)

コンソール画面の「コンソール」タブから「シリアル」を選択すると、見た目がちょっと良くなります。

![05_ConoHa_コンソール_シリアル-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/4cf39524-26d7-a952-4bee-dd0b2218c87e.png)

この画面で以下を入力することで、root権限でサーバーに接続できます。
login:root
Password:サーバー作成時に指定したrootパスワードの値

```
vm-bae22ffe-00 login: root
Password:
Last login: Tue Dec 17 23:30:00 on tty1
[root@vm-bae22ffe-00 ~]#
```

なお、ターミナルを閉じる前にはlogoutコマンドでログアウトしてから閉じるようにします。

## パッケージのアップデート

パッケージをアップデートし、最新の状態にします。
結構時間がかかるので、気長に待ちます。
```
# sudo yum update -y
```

もう一度同じコマンドを実行して、以下のように Complete! が表示されればアップデートが完了しています。

```
> Last metadata expiration check: 0:12:56 ago on Wed 17 Jul 2024 08:29:32 AM JST.
> Dependencies resolved.
> Nothing to do.
> Complete!
```

## ユーザー作成

rootユーザーを常用すると権限が強すぎて危険なので、別のユーザーを作成し、そちらを使用することにします。
ユーザー名はadminにしましたが、なんでも大丈夫です。

```
# adduser admin
```

パスワードを設定します。

```
# passwd admin
> Changing password for user admin.
> New password:
> Retype new password:
> passwd: all authentication tokens updated successfully.
```

:::note warn
設定したパスワードは忘れないようにメモしておいてください。
:::

作成したユーザーでログインできるか確認するため、rootユーザーは一旦ログアウトします。

```
# logout
> 
> CentOS Stream 9
> Kernel 5.14.0-354.el9.x86_64 on an x86_64
```

adminユーザーでログインできることを確認します。

```
# login: admin
> Password:
> $
```


## ユーザーにsudo権限をつける

作成したadminユーザーにsudo権限をつけます。
adminユーザーでログインしている場合、ログアウトして、rootユーザーで再度ログインします。


adminユーザーの場合はログアウトします
```
$ logout
```

rootユーザーで再ログイン
```
vm-0bd3dadf-5b login: root
Password:
Last login: Wed Jul 17 07:48:05 on ttyS0
```

以下のコマンドで、adminユーザーをwheelグループに追加します。
-aオプションがない場合、wheelグループに追加ではなく上書きになってしまうので注意してください。

```
# usermod -aG wheel admin
```

再度、adminユーザーでログインして、sudoが使用できるか確認します。
パスワード入力が求められるので、adminユーザーのパスワードを入力します。

```
$ su - admin
Password
```

試しにsudoでvimのバージョンを確認してみます。

```
$ sudo vi -v
```

パスワードを入力したあと、vimのバージョンが確認できればOKです。

![スクリーンショット 2024-12-18 13.06.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/07a7748c-6a45-15ef-3ed3-ce4ffc147448.png)

## rootユーザーでSSH接続できないようにする

rootユーザーで不正アクセスされると、システムを一発で乗っ取られてしまうため、
rootユーザーでのログインを禁止しておきます。

sshd_configファイルを開き、PermitRootLoginをnoにします。

```
$ sudo vim /etc/ssh/sshd_config
```

noに変更
```
#PermitRootLogin prohibit-password
PermitRootLogin no 
```

サーバーをリスタートします。

```
$ sudo systemctl restart sshd
```

一度logoutして、rootでログインできなくなっていればOKです。

rootでログインできちゃうんだけど？？っていう方は、
`もし、rootユーザーによるSSH接続や、パスワードによるSSH接続ができてしまう場合に確認すること`
の章を確認してみてください。


## SSH接続するポート番号を変更する 

セキュリティ強化のため、SSH接続するポート番号をデフォルト値の22から別の値に変えます。

sshd_configファイルを開きます
```
$ sudo vim /etc/ssh/sshd_config
```

番号を変更します
```
#Port 22
Port 10022
```

リスタートします
```
sudo systemctl restart sshd
```

## 公開鍵認証方式でログインする

今まではパスワードによってログインしていましたが、
セキュリティ強化のため、公開鍵認証方式でのログインに変更します。

### VPSサーバー側で公開鍵認証方式を有効にする

まず、VPSサーバー側で公開鍵認証方式を有効にします

sshd_configを開きます

```
sudo vim /etc/ssh/sshd_config
```

コメントアウトされている以下の一文を有効にします

```
PubkeyAuthentication yes
```

リスタートで設定を反映します

```
sudo systemctl restart sshd
```

### セキュリティグループの設定

変更したポート番号で公開鍵認証方式でのアクセスを許可するため、セキュリティグループの設定を行います。

まず、ConoHaのコントロールパネルで、セキュリティ＞セキュリティグループ のページを開きます。

ページの右上に「+セキュリティグループ」ボタンがあるのでクリックします。
![07_1_セキュリティグループ画面-2-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/294f0465-f6ea-880a-bdf2-0d4f98854bc8.png)

セキュリティグループ名、および説明を記入し、「保存」ボタンを押します。

![08_セキュリティグループ作成-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/2729ea0e-a91f-6d6d-21ba-66fa733b4ded.png)

保存すると、下のセキュリティグループの一覧に保存したものが追加されるので、以下のように設定します。

| 通信方向 | イーサタイプ| プロトコル | ポート範囲 | IP/CIDR |
| --- | --- | --- | --- | --- |
|Out | IPv6 | ALL |  |  |
|Out | IPv4 | ALL |  |  |
|In | IPv4 | TCP | 10022 | 0.0.0.0/0 |
|In | IPv6 | TCP | 10022 | ::/0 |


![09_セキュリティグループ設定-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/c8b33c81-1d45-3157-e199-914e8529da3b.png)

サーバーの詳細画面に戻り、作成したセキュリティグループを追加します。

![10_セキュリティグループ割り当て-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/38dcc505-2f52-98bb-6c7e-15d62c3db260.png)

### SSHキーの設定

#### SSHキーを作成する

セキュリティ＞SSH Keyページの「追加」ボタンから適当な名前で作成します。

![11_SSHKEY画面-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/e33ef9ae-008d-c7fd-8cbd-9a1eaafa260a.png)

追加する際、プライベートキー（秘密鍵）がPCにダウンロードされます。

パプリックキー（公開鍵）はこのページで確認できます。
次の手順でパブリックキーをサーバーに設定するため、値をどこかにコピーしておきます。

#### パプリックキーをVPSサーバーに設定する

VPSサーバーに入り、.sshディレクトリを作成します。

```
// ディレクトリを移動
$ cd /home/admin

// .sshディレクトリを作成
$ mkdir .ssh
```

.sshディレクトリにauthorized_keysファイルを作成します。
```
$ cd .ssh
$ vi authorized_keys
```

authorized_keysファイルに、先ほどコピーしておいたパブリックキーを貼り付け、保存して閉じます。

また、権限を変更しておきます。
※以下のコマンドは.sshディレクト内で実施する前提になっています。
```
$ sudo chmod 700 ./authorized_keys
```

#### シークレットキーを自分のPCの.sshディレクトリに移動する

SSH Keyを作成した際にダウンロードされたシークレットキーは自分のPCの.sshディレクトリに移動しておきます。
(もし、.sshディレクトリが存在しない場合は作成してから移動します)

Downloadsディレクトリにダウンロードされたシークレットキーを、.sshディレクトリに移動するコマンドの例
※自身のPCのディレクトリ構成に合わせて変更してください

```
$ mv /Users/<ユーザー名>/Downloads/<作成したキーの名前>.pem /Users/<ユーザー名>/.ssh/<作成したキーの名前>.pem
```

また、シークレットキーの権限を変更しておきます。
```
$ cd /Users/<ユーザー名>/.ssh
$ sudo chmod 600 ./<作成したキーの名前>.pem 
```

### ファイアウォールの設定

VPSサーバーにログインしてファイアウォールの設定を変更し、22番ポートを未許可にするとともに、10022番ポートを許可します。

ファイアウォールが起動していることの確認
```
$ sudo firewall-cmd --state
running
```

設定の確認
```
$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```

servicesの欄にsshとあるため、ポート22が解放されています。
なのでまずこれを閉じます。

sshを許可対象から除外します

```
$ sudo firewall-cmd --permanent --remove-service=ssh
success
```

ファイアウォールの設定を反映します

```
$ sudo firewall-cmd --reload
success
```

設定を再度表示し、servicesの欄にsshが消えたことを確認します

```
$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client
  ports:
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```

次に、ポート10022を開放します

```
$ sudo firewall-cmd --zone=public --add-port=10022/tcp --permanent
success
```

ファイアウォールの設定を反映します

```
$ sudo firewall-cmd --reload
success
```

設定を再度表示し、portsの欄に10022/tcpが追記されたことを確認します。

```
$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: cockpit dhcpv6-client
  ports: 10022/tcp
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```
### sshd_config ファイルを編集


以下コマンドでsshd_configファイルを開きます。
```
sudo vim /etc/ssh/sshd_config
```

Portの設定がコメントアウトされているはずなので、10022に設定をしておきます。
```
#Port 22
Port 10022
```

設定に誤りがないか確認
```
sudo sshd -t
```

SSHサービスの再起動を行い、設定を反映させます。
```
sudo systemctl restart sshd
```

### 公開鍵認証方式によるSSH接続を試す

以上の設定で、公開鍵認証方式によるSSH接続ができるようになっているはずです。
PCのターミナルからSSH接続できることを確認します。

```
$ ssh -i ./<ダウンロードした秘密鍵> <ユーザー名>@<VPSサーバーのアドレス> -p <ポート番号>
```

例
```
 $ ssh -i ./key-for-ssh.pem admin@111.111.111.11 -p 10022
```

以下のように、接続しますか？と聞かれるので、yesと打つと接続できます
```
Are you sure you want to continue connecting (yes/no/[fingerprint])?
```

## パスワードによるログインを禁止する

公開鍵認証方式によるログインができるようになったら、セキュリティ強化のためにパスワードによるログインは禁止しておきます。

VPNサーバーにアクセスして、sshd_configファイルを開きます。

```
$ sudo vim /etc/ssh/sshd_config
```

PasswordAuthenticationの設定をnoに変更して保存します。

```
# PasswordAuthentication yes
PasswordAuthentication no
```

SSHサービスの再起動を行い、設定を反映させます。

```
$ sudo systemctl restart sshd
```

ここまで設定したら、以下について確認するのがおすすめです。

- rootユーザーでSSH接続できないこと
- adminユーザー（自分の作成したユーザー）でSSH接続できること
- パスワードによるSSH接続はできないこと
- 許可していないユーザーでSSH接続できないこと
- ポート番号22でSSH接続できないこと
- ポート番号10022（自分の設定した値）でSSH接続できること

# もし、rootユーザーによるSSH接続や、パスワードによるSSH接続ができてしまう場合に確認すること

VPSサーバーに入り、sshdの設定を確認します。

```
sudo sshd -T | grep -E 'permitrootlogin|passwordauthentication'
```

期待値
rootログインおよびパスワードによるログインが禁止されている
```
permitrootlogin no
passwordauthentication no
```

もしこの結果の両方もしくは片方がyesになっている場合、
sshdの設定ファイル内で別のファイルがIncludeされており、
そのIncludeされているファイルの設定が反映されている可能性があります。

以下のコマンドで、別のファイルが存在しないか確認します。

```
$ sudo ls -l /etc/ssh/sshd_config.d/
```

出力例
```
$ sudo ls -l /etc/ssh/sshd_config.d/
total 12
-rw-r--r--. 1 root root 141 Nov 12  2021 01-permitrootlogin.conf
-rw-------  1 root root  27 Dec 18 11:45 50-cloud-init.conf
-rw-------  1 root root 719 Oct 21 21:30 50-redhat.conf
```

このようにファイルがヒットしたら、各ファイルの中身を確認していきます。

```
sudo cat /etc/ssh/sshd_config.d/01-permitrootlogin.conf
```


```
sudo cat /etc/ssh/sshd_config.d/50-cloud-init.conf
```


```
sudo cat /etc/ssh/sshd_config.d/50-redhat.conf
```

ファイルの中にもし以下の設定があれば、noに書き換えます
（rootログインを許可する設定と、パスワードによるログインを許可する設定です）
```
permitrootlogin yes
passwordauthentication yes
```

最後に、sshdを再起動して設定を反映させます。

```
$ sudo systemctl restart sshd
```

再度、sshdの設定を確認し、値がnoになっていることを確認します。

```
$ sudo sshd -T | grep -E 'permitrootlogin|passwordauthentication'
```

期待値
```
permitrootlogin no
passwordauthentication no
```

# SSH設定ファイルに接続情報を追加する

SSH設定ファイルに接続情報を記載すると、SSH接続する際にコマンドの入力を省略することができます。
この設定は、後段のVSCodeでSSH接続をする際にも使用します。

手元のPCでターミナルを開いて、SSH設定ファイルを編集します。
（ファイルがなければ作成してください）

```
$ vi ~/.ssh/config
```

以下を追加します。
サーバー名は、自分のわかりやすいものをつければ大丈夫です。

```
Host <サーバー名>
    HostName <VPSのアドレス>
    User <ユーザー名>
    IdentityFile <秘密鍵のパス>
    Port <ポート番号>
```

例
```
Host ConoHaDev
    HostName 111.111.111.11
    User admin
    IdentityFile ~/.ssh/key-for-ssh.pem
    Port 10022
```

これで、PCのターミナルから、追加したホスト名を打つだけでssh接続ができるようになります。

```
$ ssh ConoHaDev
```

# おまけ：VSCodeでConoha VPSへSSH接続する

私はVSCodeを使って開発を行っているため、
VSCodeからSSH接続できると便利なのでやり方をメモしておきます。

拡張機能の`Remote - SSH` をインストールします。

![スクリーンショット 2024-12-18 22.55.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/b4f620b1-97c1-bbc7-3d24-23cc866f5f92.png)

ダウンロードすると、左下の角に、＞＜みたいな形の青いボタンが追加されます

![スクリーンショット 2024-12-18 22.55.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/3d1aec43-ee2d-0728-233d-b6b0dd60cb2a.png)

それをクリックすると、「ホストに接続する...」という選択肢が出てくるのでクリックします

![スクリーンショット 2024-12-18 22.55.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/1f43a7bd-85e9-8e0b-1c12-6c57508526ea.png)

先ほど作成した接続設定（ConoHaDev）を選択します
![スクリーンショット_2024-12-18_22_55_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/4fc44845-43f8-529d-597d-c17d29ce9667.png)

すると、VSCodeから ConoHaのサーバーにSSH接続することができます

![スクリーンショット 2024-12-18 22.56.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/e54cb449-056d-514f-883c-3d6461ad3caf.png)

「フォルダーを開く」ボタンをクリックすると、開くフォルダーを選択でき、フォルダーの中身も確認することができます

![スクリーンショット 2024-12-18 22.56.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406156/2b2ae452-2fad-1c74-75c0-1a6731f2d77e.png)

あとは、自分の好きなように開発環境を構築すればOKです

# あとがき

元々は外出先で開発環境に困っていたのがきっかけでしたが、サーバーの設定をするだけでも色々勉強になりました。
本記事ではVSCodeでSSH接続するところまででしたが、その後の環境構築についてもチャレンジしてみたいと思います。