vmに入れたUbuntuとsshできるようになるまで

# はじめに

Docker全盛期ではあるものの、依然としてWindowsやMacで開発していると、UbuntuのvmをVirtualBoxやHyper-Vで立てることがあると思う。

幸いにしてVSCodeはssh接続さえできていればVSCodeからもssh先にアクセスができる。

・・・はい嘘ですね、Windowsがホストの時は
[Windows10でvscodeからSSHできるようになるまで](https://qiita.com/yumetodo/items/123cd1d91f913bf0e748)
をどうぞ

それはさておき、sshできるようにしていく

# 前提環境

## Host

以下のいずれかで、別のところへのssh自体はすでにできる状態であること

- mac
- Windows + msys2

つまり、`ssh-keygen`, `ssh`, `rsync`くらいは使えることを前提にしている。

## Guest

- Ubuntu 18.04

別にほかのバージョンでも手順は変わらないと思うが念のため。

# 手順

## パスワード認証でVMに接続できるようになる

まずVMを起動し、ホスト名を調べる。私の場合は`yumetodo-virtual-machine2`だった。

```bash
$ hostnamectl
   Static hostname: yumetodo-virtual-machine2
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 0aa80159bab84389b19bb219d8a8dcb7
           Boot ID: 8541e864263841eb98684e5059df77f8
    Virtualization: microsoft
  Operating System: Ubuntu 18.04.5 LTS
            Kernel: Linux 5.4.0-77-generic
      Architecture: x86-64
```

この時大文字を含んでいるとsshするときに面倒くさいので`hostnamectl set-hostname <new name>`して変更しておく。

次に`echo $USER`でユーザー名を調べる。私の場合は`yumetodo`だった。

次にssh serverをセットアップする。

```bash
$ sudo apt update
$ sudo apt install openssh-server
```

うまくいけば次のように`active (running)`となるはずだ

```bash
$ sudo systemctl start ssh
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2021-06-30 09:36:18 JST; 11h ago
 Main PID: 933 (sshd)
    Tasks: 1 (limit: 4662)
   CGroup: /system.slice/ssh.service
           └─933 /usr/sbin/sshd -D

(以下略)
```

ホスト側で端末を立ちあげる。

```bash
ssh <ubuntuのユーザー名>@<ubuntuのホスト名>
```

ログイン出来たら成功だ。

## 公開鍵認証でVMに接続できるようになる

いくらLANとはいえ安全とは限らない。またVMのUbuntuのユーザーにパスワードを設定していると思うが、これを毎回入れるのも面倒だ。公開鍵認証しよう。

まず公開鍵を**ホスト側で**生成する。最近の流行はed25519らしいのでそれにする。

```bash
$ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/yumetodo/.ssh/id_ed25519):
```

`Enter file in which to save the key`で名前を付けられる。自分は`/home/yumetodo/.ssh/ubuntu_vm_ed25519`とした。

注意点

- 鍵のパスワードはいらない: ローカルでしか使わんのでパスワードはとくに必要ない
- VMの上で`ssh-keygen`しない: VMの上は真の乱数を得るための乱数源が不足するためかならず実機で生成する
- 鍵を使いまわさない: だめ、絶対。またこの意志を表明するためにsshの鍵の名前は何に使うものかわかりやすいものにする。

そうしたら生成した鍵のうち、公開鍵をVMに転送する

```
$ rsync -au ~/.ssh/ubuntu_vm_ed25519.pub yumetodo@yumetodo-virtual-machine2:~
```


VM側での作業に移る。パスワード認証でsshしてもいいし、VMのGUI上で端末を動かしてもいい。

```
$ cd ~
$ mkdir -p .ssh
$ cat ubuntu_vm_ed25519.pub >> .ssh/authorized_keys
$ sudo chmod 700 .ssh
$ sudo chmod 600 .ssh/authorized_keys
```

ホスト側に戻って、公開鍵を使うように設定する。`~/.ssh/config`を開いて以下を書き込む。

```ssh:~/.ssh/config
Host yumetodo-virtual-machine2
    IdentityFile ~/.ssh/ubuntu_vm_ed25519
    User yumetodo
```

忘れずに権限を書き換える。

Windowsでは
[Windows10でvscodeからSSHできるようになるまで - Qiita#~/.ssh/configの権限設定](https://qiita.com/yumetodo/items/123cd1d91f913bf0e748#sshconfig%E3%81%AE%E6%A8%A9%E9%99%90%E8%A8%AD%E5%AE%9A)
の手順を行う。

macでは

```zsh
$ cd ~
$ sudo chmod 700 .ssh
$ sudo chmod 600 .ssh/config
```

とする。

ここまでくれば公開鍵を使ってsshできるはずだ。

```bash
$ ssh yumetodo-virtual-machine2
Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.4.0-77-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0 updates can be applied immediately.

New release '20.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

Your Hardware Enablement Stack (HWE) is supported until April 2023.
Last login: Wed Jun 30 20:34:59 2021 from fe80::551c:b446:494a:4e7a%eth0
yumetodo@yumetodo-virtual-machine2 ~ $ 
```

## VMのパスワード認証を無効化する

LAN内からの攻撃を避けるために、パスワード認証を無効化する。portまでは変えなくていいだろう。

VM側で`sudo nano /etc/ssh/sshd_config`などとして`PasswordAuthentication`を`no`にする

```diff:/etc/ssh/sshd_config
-#PasswordAuthentication yes
+PasswordAuthentication no
```

あとはsshdを再起動する

```
$ sudo systemctl restart ssh
```