「みらいサーバー」の使い方

# はじめに
この記事は、「[みらいサーバー アドベントカレンダー2024 1日目](https://qiita.com/advent-calendar/2024/mirai-server)」の記事となります！今回は、「みらいサーバー」の利用方法・セットアップ方法を解説していきたいと思います！
目標は、「秘密鍵でSSHにログインする」ことで目安となる所要時間は30分~1時間です。

# みらいサーバーとは？
みらいサーバーとは、全国の高専生を支援している[高専キャリア](https://kosen-career.tech/)と、最近は政府公認クラウドに認定された[さくらインターネット](https://www.sakura.ad.jp/)が高専生向けに提供している無料のVPSサーバーです。高専に在学中であれば、無料でVPSを借りることができるので、Webサーバーをホストすることはもちろん、ちょっとしたゲームサーバーやデータベースの構築なんかも自由にできちゃいます。

# みらいサーバーの利用方法
みらいサーバーを利用するには、次の条件を満たしたうえで申請を行う必要があります。
- 現在高専に在学中であること
- 「高専キャリア」のSlackに参加していること

まずは、高専キャリアのSlackに参加することが必要です。次のリンクから参加申請をすることができます。併せて、Slackの登録も必要になるので登録しておきましょう。下のフォームに入れるメールアドレスは、**個人かつSlackで登録しているメールアドレス**がよいです。

https://kosen-career.tech/join-slack

大体一週間以内にメールが届くのでそこからSlackにログインしてください。
次に、「みらいサーバー」の利用申請を行います。こちらは、Slack内のユーザー名が必要になるのでフォームに書かれている通りに送信しましょう。利用申請は、下のリンクを開き、「今すぐ申し込む」からできます。

https://kosen-career.tech/mirai-server

サーバーの種類は、特にこだわりがなければ「Ubuntu 20.04.2」あたりがいいでしょう。(Cent OSは、サポート終了のものが多いです。また、Ubuntu 24がリリースされていますが、パフォーマンスに難があるのであまりおすすめしません。)
これも一週間ほどして、ログイン情報が書かれたメールが送られてきます。ここまで完了したら、次はサーバーにログインしてみましょう。

# サーバーにログイン
みらいサーバーのログイン方法は特殊で、さくらインターネットの会員メニューからではログインできません。シングルサーバーコントロールパネル経由でログインする必要があります。

https://secure.sakura.ad.jp/cloud/single/

ここに、メールに記載のAPI Keyとtokenを入れてログインしてください。
ログインが完了すると、次のような画面になります。
(一部情報を隠しています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2467860/6445486c-ce62-b41f-d200-eb9de007b627.png)
次に、SSHでログインできるようにしましょう。

# SSHとは
SSH(Secure Shell)を使うと、いちいちサーバーにログインしてコンソールを操作するという手間を省くことができ、Visual Studio Codeなどのエディタやターミナルアプリからサーバーをコントロールすることができます。SSHの通し方はいろいろあり、
- スーパーユーザー(root)でログイン
- 新規アカウントを作成してログイン
- アカウントを作成したうえで、秘密鍵を使用してログイン

の3通りほどあります。が、個人的には**rootでログインすることは非推奨**です。
今回は最後の「新規アカウントを作ったうえで、秘密鍵でログインすること」を目標とします。秘密鍵を用いることで、パスワードを使用せず安全にSSHの接続を行うことができます。

:::note warn
**rootでSSHログインすることが非推奨な理由**
理由はいくつかありますが、一番はLinuxがゆえになんでもできてしまうからです。Windowsは、管理者アカウントでも重要な操作(例えば、アプリのインストールや重要なフォルダの削除)を行う際には、UAC(User Account Control)による警告が表示されます。ここで許可をしないと、重要な操作ができないようになっています。一方Linuxではrootユーザーの場合、基本的には警告は出ず、入力されたコマンドをそのまま処理してしまうため誤操作した場合に取り返しがつきません。
Linuxは一般的に、一般ユーザーとしてユーザーを登録し、都度`sudo`コマンドを用いて重要な操作を行います。
:::

# 標準ユーザーの作成
ともあれ、まずはどの方法をするにもコントロールパネルからコンソールを操作しなくてはいけません。ログイン後は、「情報」タブになっていますので「コンソール」をクリックします。
黒い画面が表示されると思いますので、黒い画面の枠内にマウスカーソルを移動します。すると、「ここをクリックしてHTML5モードで接続」となるのでクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2467860/c490e67b-c7c7-8e2f-41b7-a67ad4a8ade3.png)
「Ubuntu login」と表示されたら、メールに記載のOSユーザー名を入力します。その後、「Password」にメールに記載のrootパスワードを入力するのですが、Ctrl + Vなど貼り付け系を行うことはできません。コピーしたら画面にある「ペースト > 文字列...」を選択してペーストしてEnterを押してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2467860/75fbc6f5-eb8a-a032-cf21-6a2d2fb4ee7b.png)

:::note info
Linuxでは、パスワード入力時に入力された文字列や桁数を表示しません。キーを押していれば入力されている判定なので何も動いていなくても問題ありません。パスワードを間違えた場合は、BackSpace連打して消すか、Ctrl + Cを押して再ログインしましょう。
:::
ログインが完了すると、
```shell
ubuntu@ubuntu:~$
```
となるはずです。ここから先は管理者として実行する必要があり、いちいちパスワードをペーストするのも大変ですので**現在のターミナルセッションを管理者に昇格(=root化)** させます。
```shell
sudo su -
```
と入力して、Enterを押してください。
```shell
[sudo] password for ubuntu:
```
となった場合は、先ほど同様rootのパスワードをペースト経由で貼り付けてEnterを押します。
```
ubuntu@ubuntu:~#
```
となれば成功です。

:::note info
現在、rootなのか通常ユーザーなのかぱっと見ではわかりづらいですが、一番最後の記号が`$`か`#`かで見分けることができます。
`$`の場合は通常ユーザーで、`#`の場合はrootユーザーであるということを覚えておきましょう。
:::
それではいよいよユーザーを作成していきます。
```shell
sudo useradd -m User
```
Userの部分はお好みで変更してください。`useradd`コマンドは、その名前の通りユーザーの作成を行います。`-m`オプションで`/home`ディレクトリに作成したユーザーのフォルダが自動で作成されます。
次に、このユーザーに対しパスワードを設定します。
```shell
sudo passwd User
```
2回パスワードの入力が求められるので入力しましょう。パスワードの一部がユーザー名と一致していると警告が出ますが、無視できます。(ほんとはあまりよくないですが...)
これで、ユーザーの作成自体は完了です。

# sudo権限の付与
このままでは`sudo`を必要とするコマンドを実行することができず不便です。そのため、このユーザーに対してsudo権限を付与します。
```shell
sudo visudo
```
を実行すると、エディタが開きます。Ubuntuではデフォルトのエディタはnanoですが、場合によってはvimになっているかと思います。編集する場所は同じですが、保存の仕方が全く異なりますのでご注意ください。
```conf
# Allow members of group sudo to execute any command
%sudo    ALL=(ALL:ALL)  ALL
```
となっている部分を探し、%sudoの下の行に、先ほど作成したユーザーを次のように設定します。
```
User   ALL=(ALL:ALL)  ALL
```
nanoの場合は、Ctrl + Xで終了・保存をすることができます。私はVimよりnano派なのでVimの場合はあまり詳しくありません...
ここまでで、標準ユーザーに対する設定は完了です。次はSSHでログインしてみます。

# SSHでログインする
先ほど作成したユーザーにログインしてみましょう。ターミナルアプリで接続してみます。ターミナルアプリはお好きなもので問題ありませんが、ここでは私が愛用しているTabbyで設定を進めていきます。
Tabbyをまずはダウンロードしましょう。

https://tabby.sh

リンクからでもダウンロードできますし、winget、chocolatey経由でもできます。インストールが完了したらTabbyを起動し、設定を開きます。設定は、画像赤枠の位置にあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2467860/40ab2fe7-d9b5-58ba-5094-69a6aa416acd.png)
「プロファイルと接続」に移動し、「新規 > 新規プロファイル」を選択します。その後、テンプレート画面になりますので「SSH接続」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2467860/b7b730ea-eecf-e06e-189a-71bdc06d4b66.png)
この後、Vaultにパスワードを設定することになります。Vaultは、SSH接続のパスワードを暗号化する機能で、SSHにログインするためにはこのVaultのパスワードが必要になりますので忘れないようにしてください。
ここまで来たら一旦サーバーのコントロールパネルに戻り、IPアドレスを取得します。コントロールパネルのコンソールタブからNICタブに切り替え、「共有セグメント インターネット」のIPv4アドレスをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2467860/2da57893-be20-be96-fb4e-edde969e02d1.png)
その後Tabbyに戻り、ホストに先ほどコピーしたIPv4アドレスを、ユーザー名は先ほど作成したユーザー、パスワードは先ほど設定したパスワードにしてください。名前の部分はわかりやすい名前にしてください。
ここまで出来たら保存してプロファイルを保存しましょう。
さて、いよいよSSHで接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2467860/3ef6a49f-20d9-5875-0dab-09f7405efd05.png)
画像のように選択し、Vaultのパスワードを入力し、先ほどの黒い画面のような文字列になればOKです!
接続できない場合は、パスワードが間違っているか、サーバーが起動していないかなどを調べてみてください。ここまで行けたら最後の仕上げとして、公開鍵と秘密鍵の設定をします。
~~あ、ちなみにサーバーのコントロールパネルの出番はここで終了です。画面を閉じてもらっても大丈夫です。~~(Tabbyとかは残しておいてね)
→ 最後のほうでもう一回使う時が来ます。そのままのほうが良いと思います。　

# 公開鍵と秘密鍵のペアを作る
コマンドプロンプトを開き、`ssh-keygen`コマンドを使ってペアを作成します。
```shell
ssh-keygen -t ed25519 -f mirai-server
```

:::note warn
Windowsで`ssh-keygen`を使用するには、OpenSSH クライアントが必要です。
:::

ed25519は暗号化のアルゴリズムのことです。RSA暗号といえばわかるでしょうか...? 近年RSA形式のキーはあまりおすすめできないため、RSAより安全で高速であるed25519を使います。
次に、パスフレーズを設定します。パスフレーズは空欄でも大丈夫です。
完成したら、mirai-serverとmirai-server.pubの二つが生成されます。ここで注意です。
**.pubとついているほうが公開鍵(public)です!間違ってもファイル名しかないほうは公開しないでください!**
pubとついているほうが秘密鍵だと思って公開してしまったことがあります。(もちろん新しく作り直しましたが) なので、ここの取り扱いにはくれぐれも注意しましょう。
生成が完了したら、.pubとついている方をみらいサーバーのほうに転送します。転送するには、`ssh-copy-id`コマンドを使うのですが、残念ながらWindowsにはありません...ですが、SSHを応用して無理やり転送します。
- `ssh-copy-id`を使う場合
    ```shell
    ssh-copy-id -i mirai-server.pub <ユーザー名>@<IPv4アドレス>
    ```
- Windowsの場合
    ```shell
    type mirai-server.pub | ssh <ユーザー名>@<IPv4アドレス> "cat >> .ssh/authorized_keys"
    ```
ユーザー名とIPv4アドレスはSSHでログインした時のようにそれぞれ入れてください。
これを実行することにより、公開鍵が無事みらいサーバー側にも転送できました。最後に、パスワード認証を無効にします。

# パスワード認証を無効にする
`/etc/ssh/sshd_config`を変更します。今回は、nanoを使っていますが、お好みのエディタをお使いください。(nanoの部分をほかのエディタ名に変えるだけで行けると思います)
```shell
sudo nano /etc/ssh/sshd_config
```
```conf
# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes
```
という部分を探し、次のようにします。(赤い部分は消すところ、緑のところは追加するところです)
```diff
# To disable tunneled clear text passwords, change to no here!
- #PasswordAuthentication yes
+ PasswordAuthentication no
+ ChallengeResponseAuthentication no
```
設定に問題がないか、検証を行います。
```shell
sudo sshd -t
```
問題がなければ何も表示されませんが、エラーがある場合はその箇所を修正してください。
そして、SSHのサービスの再起動を行います。
```shell
systemctl restart sshd
```
ここまでくればあともう一息です！

# SSHの設定を変更する
先ほど、パスワード認証によるSSH接続を無効にしたため、セッションを切断して再度接続しようとするとエラーが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2467860/3791f309-2149-f8be-2960-94dc4f6a1b78.png)
「SSHで接続する」でやったように、設定のプロファイルと接続を選択し、編集したいプロファイル名をクリックします。「秘密鍵を追加 > File System」から今度は、**.pubとついていないファイル**を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2467860/77b5be07-0d5c-f0a2-9944-74a0cc123534.png)
画像のようになればOKです。

# 再度接続する
といきたいところですが、このままではパーミッションエラーにより蹴られます。
秘密鍵の設定をしたのになんでやと思うかもしれないですが、実はみらいサーバー側のデフォルトの「.ssh」フォルダのパーミッションが足りないのです。ここで、再度サーバーのコントロールパネルを開き、コンソールからrootでログインします。そして、次のコマンドを実行しましょう。
```
sudo chmod 700 /home/<ユーザー名>/.ssh
```
```
sudo chmod 600 /home/<ユーザー名>/.ssh/authorized_keys
```
これで、再度SSHに接続してみると無事接続できると思います!
(実はパーミッション700だと思っていて作業していたのですが、どうやらそうではなかったようです...)

# おわりに
とても長くなってしまいましたが、お疲れさまでした！これで、みらいサーバーを安全に使う準備が整いました！あとは、Webサーバーを作るなりデータベースにするなりあなたの自由です。これからのみらいサーバーの発展を願っています。