文系卒のWebエンジニアの成長と備忘録
エンジニア経験を生かして発信するメディアサイト

GCPに自分のPCからssh接続する方法[秘密鍵/公開鍵]

GCP ssh接続

こんにちはYsです。普段はサーバーサイドエンジニアとして働いています。

この記事でGoogle Cloud Platform(以下、GCP)のComputer EngineであるVMインスタンスに、自宅のPCからssh接続をする方法を書いていきます。

通常ではGCPは『cloud shell』と呼ばれるものがあり、ブラウザから簡単にサーバー内にログインが可能です。(以下のところから簡単に接続ができます

GCP ssh接続

しかし、「何か作業するたびに、いちいちブラウザを開くのは面倒」といったことが多々あると思います。
僕自身もかなり面倒だなあ。と思っていたので普通のサーバーを扱うのと同じく、PCのターミナル画面からssh接続を行う方法を書いていきます。

※前提としてGCPの登録が済んでいること。任意のインスタンスが立ち上がっていることします

環境は以下

  • Mac OS Mojave
  • iTerm


ssh接続するために公開鍵と秘密鍵を作成する

秘訣

まずはssh接続に必要なための公開鍵秘密鍵を用意する必要があります。
Macではssh-keygenコマンド一発で鍵が生成できます。

ssh-keygenコマンドについて

-t rsa(RSA方式)
-b 4096(4096ビット方式)

ssh-keygen -t rsa -b 4096 -C "hoge@example.com"

上記のコマンドを実行すると色々聞かれますが、全部Enterでも構わないです。

  • ①:鍵をここに作って良いか?
  • ②:パスフレーズを入力してください
  • ③:確認のためパスフレーズを再入力してください
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/hoge/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

上記全て終わると鍵が作成されます。
以下のように出力されていればOK。

The key's randomart image is:
+---[RSA 4096]----+
|          . oo=o=|
|         . + +=++|
|        .   +oo+=|
|         o  oo+.o|
|        Y +.  =o |
|       . =oo + + |
|        = ooo o .|
|         +.  = oo|
|          +. +++S|
+----[SHA256]-----+

実際に鍵が作成されていると以下のファイルが出来上がります。
このうちの「公開鍵」(pub)の方をVMインスタンスに設定します。

$ ls ~/.ssh/
-rw-------   1 hoge  staff  3434  1  2 17:44 id_rsa        // 秘密鍵
-rw-r--r--   1 hoge  staff   751  1  2 17:44 id_rsa.pub    // 公開鍵

公開鍵の中身をコピーします。

  • Mac:pbcopy < ~/.ssh/id_rsa.pub
  • Windows:clip < ~/.ssh/id_rsa.pub

GCPのComputer EngineのVMインスタンスに公開鍵を設定する

任意にVMインスタンスの詳細を押し、「編集」タブをクリックすると、<ssh認証鍵>という項目があるので、そこの項目を開くと鍵を設定することができるので設定します。先ほどコピーした公開鍵をそのままペーストし保存。
Compute_Engine 公開鍵

これで鍵の設定は完了したので自身のPCから接続できるか試します。

GCPのComputer EngineのVMインスタンスにssh接続する

ssh接続のコマンドは以下。
ssh -i {key_pass} {username}@{ipaddress}

  • key_passは先ほど作成した秘密鍵のパス(デフォルトであれば~/.ssh/id_rsa
  • usernameは鍵を生成した時に設置したユーザー名
  • ipアドレスはVMインスタンスの外部IPアドレス
$ ssh -i ~/.ssh/id_rsa hoge@10.200.30.400
The authenticity of host '10.200.30.400 (10.200.30.400)' can't be established.
Are you sure you want to continue connecting (yes/no)? yes  // ここはyesを入力

Warning: Permanently added '10.200.30.400' (ECDSA) to the list of known hosts.
Enter passphrase for key 'gcp-sample':  // パスフレーズを設定してなければ特に求められないです。上記で設定していれば入力
Linux gcp-sample 4.9.0-11-amd64 #1 SMP Debian 4.9.189-3+deb9u2 (2019-11-11) x86_64

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

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
hoge@gcp-sample:~$  // 接続されました

無事に接続されたことを確認できました。

格VMインスタンスごとに公開鍵/秘密鍵を使い分ける方法

上記では鍵が共通の鍵を見に行くような設定になっているのですが、各インスタンスごと(サーバー)ごとに鍵を分けることが一般的です。

ただ、鍵が増える分だけ管理や接続する際の手間が増えます。
毎度毎度、上記のssh接続コマンドを打つのは面倒です。なので、設定ファイルを作成して接続を楽にすることがおすすめです。

なので、各設定ファイルを作成することにより接続の手間や、鍵の管理がしやすくする方法を書いていきます。

本来であれば~/.ssh/configのconfigファイルに以下のようにまとめて書くことが一般的です。

Host github.com.company
    HostName github.com
    User git
    Port 22
    IdentityFile /Users/hoge/.ssh/keys/github_key
    IdentitiesOnly yes
Host sample-gcp
    HostName 10.20.30.40
    User ys
    IdentityFile /Users/hoge/.ssh/keys/sample-gcp

上記でもいいのですが、それぞれの設定が増えるたびにこのファイルを管理するのは面倒なので個別の管理ファイルを作成します。

個別のファイル構成

.ssh
├── conf.d
│   └── project_name.conf
├── config
├── keys
│   ├── id_rsa_project_name
│   └── id_rsa_project_name.pub
├── known_hosts
└── known_hosts.old
  • conf.d:設定ディレクトリです。本来であればconfigに書くものを個別のconfファイルに書いていきます
  • keys:鍵をまとめておくディレクトリ
  • config:個別のconfファイルが集約するファイル(直接は編集しません

~/.sshの個別ファイルを作成する

$ touch ~/.ssh/config  // 設定まとめファイルを作成
$ mkdir ~/.ssh/keys    // keyをまとめるディレクトリ作成
$ mkdir ~/.ssh/conf.d  // 設定ファイルをまとめるディレクトリ作成
$ chmod 700 ~/.ssh/keys ~/.ssh/conf.d

この次にconfファイルを作成し、以下のように編集。

$ touch ~/.ssh/conf.d/hoge.conf    // 個別ファイルを作成
$ vi ~/.ssh/conf.d/hoge.conf       // 個別ファイルを編集

Host project_name(任意の値 接続名を記載
    HostName ホスト名 or 外部IPアドレス
    User ユーザー名
    Port ポート番号
    IdentityFile 鍵へのPATH(~/.ssh/keys/id_rsa_hoge)

そして鍵を任意のファイル名で、~/.ssh/keysに作成します。

$ ssh-keygen -t rsa -b 4096 -C "hoge@example.com" -f ~/.ssh/keys/id_rsa_hoge

ここまで作成できると以下のようになっていると思います。
この次にconfの内容を、configファイルに反映させます。

├── conf.d
│   └── hoge.conf
├── config
├── keys
│   ├── id_rsa_hoge
│   └── id_rsa_hoge.pub
├── known_hosts
└── known_hosts.old

confファイルを反映させる

毎度毎度、設定ファイルを作成するたびにファイルを修正するのは面倒なのでエイリアスを設定して、自動で更新するようにします。以下の設定をすると configファイルに一括でまとめて設定が反映されます。

$ vi ~/.bashrc

# 以下を記述
alias sshconf-update="cat ~/.ssh/conf.d/*.conf > ~/.ssh/config"

# 上記の修正を反映
$ source ~/.bashrc

上記のやり方を行うことで、configファイルを修正することなく、ぞれぞれの個別ファイルがあることで管理しやすく、configファイルも綺麗になるのでおすすめです。

人気記事【独学者おすすめ】プログラミング学習動画サービス3選

人気記事プログラミング実務未経験者が自社開発エンジニアになるための方法

人気記事エンジニアを目指しているなら使用すべき5つの転職サイト



\記事のシェアをお願いします!/