GCE(Google Compute Engine)でインスタンスを作ってSSH接続するまで

# はじめに
Google Compute Engineのインスタンスを作成して、SSH接続をできるようにしました。
インタネットで調べると、古い情報が多く見つかり、設定に時間がかかったため、その過程をこちらに残しておくことにしました。
なお、GCPの画面は2024/02/18時点のものです。

# この記事でやっていること

- GCEのインスタンスの作成
- 公開鍵の作成・GCEへ登録

# インスタンスの作成
まずはインスタンスを作成します。

ナビゲーションメニューから、「Compute Engine」-「VM インスタンス」を選択します。
「インスタンスを作成」をクリックします。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/a4c198fb-1b1a-c440-d623-b659655a67d7.png">

インスタンスの名前を設定します。
ここの例では、デフォルトのままにしています。
<img width="90%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/4ef09325-6146-dd76-ba54-c85dc75c51b7.png">

リージョンを「us-wast1(オレゴン)」に変更します。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/5712743c-9ce6-9fd9-01e8-78ab075d8daf.png">

マシンタイプを「e2-micro」に変更します。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/79099a35-76b7-c770-1963-47e44b04ec7b.png">

ブートディスクの「変更」をクリックして設定します。
OSとバージョンは好みで変更します。
ブートディスクの種類は、「標準 永続ディスク」を選択します。
サイズは「30」GBに設定します。
「選択」をクリックします。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/4fb0b24f-b241-7dbd-e8e0-4f56e3c5f48f.png">

Webサーバ構築予定があるなら、「HTTPSトラフィックを許可する」にチェックを入れます。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/a0a4d48f-ab6e-b6a3-50a0-84ceaed25caa.png">

「詳細オプション」と「ネットワーキング」の隣の三角マークをクリックして展開します。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/efdbf497-6fde-1b26-6d49-54b326e50030.png">

「ネットワーク インターフェース」の隣の三角マークをクリックして展開します。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/29286177-016a-0718-428b-1ab265c42671.png">

外部IPv4アドレスの「静的外部IPアドレスを予約」をクリックします。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/3d527314-063b-d394-6346-65c022c02019.png">

名前を入力して、予約をクリックします。
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/6263f7d0-c6d3-6dc7-5cc2-1ecb252e8deb.png">

全体の設定は、こんな感じです。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/c0a88274-77f0-927b-ea8c-eb5443508c69.png">

ページの一番下にある「作成」をクリックします。
インスタンスの作成には少し時間がかかります。

作成が完了すると下記の画面になります。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/1044892a-de90-3dcf-2d9c-a6891b6990e5.png">

外部IPを控えておきます。
これでインスタンスができました。

# SSH証明書の作成・設定

SSH証明書の作成・設定を行います。
なおクライアント側は、Windows 11にOpenSSLをインストールしています。
PowerShellで実行します。

ssh-keygenコマンドのCオプションには、インスタンスにログインするアカウントの名前を入力します。
このアカウント名で、インスタンスにアカウントが作成されます。
ここの例では、testuserというアカウントがインスタンスに作成されます。
```text:PowerShell
> mkdir ~/.ssh
> cd ~/.ssh
> ssh-keygen -t ed25519 -f gce-ssh-key -C testuser
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase):      <-- パスフレーズを入力します
Enter same passphrase again:                     <-- 確認のためのパスフレーズを入力します
Your identification has been saved in gce-ssh-key
Your public key has been saved in gce-ssh-key.pub
The key fingerprint is:
SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX testuser
The key's randomart image is:
+--[ED25519 256]--+
|                =|
|           . . =+|
|            E =.=|
|            .+ ++|
|        S. ...oo*|
|         oo. =oB+|
|         .= +.X.=|
|         ..ooB.Bo|
|          .ooo=o=|
+----[SHA256]-----+
❯ cat gce-ssh-key.pub
ssh-ed25519 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX testuser
```
最後に表示した公開鍵は、後で使用するので控えておきます。

configファイルに追記します。
HostNameには、控えておいた外部IPを入力します。
```text:~/.ssh/config
Host instance-1
    HostName XXX.XXX.XXX.XXX
    User testuser
    IdentityFile "C:\Users\ユーザ名\.ssh\gce-ssh-key"
    PasswordAuthentication no 
    IdentitiesOnly yes
```

ブラウザのVMインスタンス画面から操作します。
インスタンスの名前をクリックします。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/93b9425f-3ea4-0a76-cda6-ec736795ad44.png">

編集をクリックします。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/dfdef89b-ba23-5bd7-4adc-7981f30bdb8c.png">

SSH認証鍵の「項目を追加」をクリックします。
控えておいた公開鍵をコピーします。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/8882af55-b9f8-33f2-1dbe-055d0480c13f.png">

ページの一番下にある「保存」をクリックします。
このとき、インスタンスではtestuserアカウントが作成されています。

SSH接続します。
```text:PowerShell
❯ ssh testuser@instance-1
The authenticity of host 'XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX)' can't be established.
ED25519 key fingerprint is SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes   <--「yes」を入力します
Warning: Permanently added 'XXX.XXX.XXX.XXX' (ED25519) to the list of known hosts.
Enter passphrase for key 'C:\Users\XXXXXXX\.ssh\gce-ssh-key':     <-- パスフレーズを入力します
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 6.5.0-1013-gcp x86_64)

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

This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status


The list of available updates is more than a week old.
To check for new updates run: sudo apt update

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

testuser@instance-1:~$
```

SSHでログインできました。


安全のために、SSHのポート番号を変更します。
ここの例では、ポート番号 9999に変更します。
SSH接続したPowerShellをそのまま使います。
```text:PowerShell
testuser@instance-1:~$ echo "port 9999" | sudo tee /etc/ssh/sshd_config.d/10-port.conf
port 9999
testuser@instance-1:~$ cat /etc/ssh/sshd_config.d/10-port.conf
port 9999
testuser@instance-1:~$ sudo systemctl restart sshd
```

ナビゲーションメニューから、「VPCネットワーク」-「VPCネットワーク」を選択します。
「default」をクリックします。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/ca73932d-a64c-09a6-e8b7-2a348d1f772e.png">

「ファイアウォール」タブをクリックします。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/4fe34f26-5348-05e4-ffe5-66c20c700a25.png">

vpc-firewall-rulesの隣の三角をクリックして、展開します。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/0d92801f-3f77-0faa-a3b6-260f5517d8f7.png">

「default-allow-ssh」をクリックします。
<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/51e5f6ff-ff8b-3b3a-ccee-acf64501cd66.png">

「編集」をクリックします。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/f9cdc65b-73ee-3b5a-32ad-a3e25a7c1b01.png">

プロトコルとポートの「ポート」を変更します。
ここの例では、ポートを「9999」にしています。
<img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236088/66b1d62b-7680-f8d9-3e9b-7c37bc81b402.png">

ページの一番下にある「保存」をクリックします。

変更したポート番号でSSH接続します。
```text:PowerShell
❯ ssh testuser@instance-1 -p 9999
Enter passphrase for key 'C:\Users\XXXXXX\.ssh\gce-ssh-key':
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 6.5.0-1013-gcp x86_64)

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


This system has been minimized by removing packages and content that are
not required on a system that users do not log into.

To restore this content, you can run the 'unminimize' command.

Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status


The list of available updates is more than a week old.
To check for new updates run: sudo apt update
Last login: Sun Feb 18 06:11:47 2024 from XXX.XXX.XXX.XXX
testuser@instance-1:~$
```

# おまけ
この後、SSHの設定に下記の内容を追加しました。
- 待ち受けをIPv4に限定
- rootのログインの禁止
- 公開鍵認証の許可
- パスワードログインの禁止

```text:/etc/ssh/sshd_config.d/10-port.conf
Port 9999
AddressFamily inet
PermitRootLogin no
PubkeyAuthentication yes
PasswordAuthentication no
```

# 最後に
この記事が皆さんにとって有益であれば嬉しいです。
私の経験が、皆さんの時間節約に役立つことを願っています。