🌐

【ネットワーク】VScodeからSSH接続(公開鍵認証方式)でEC2インスタンスに接続する

2024/05/11に公開

はじめに

今回は、SSH接続の中の特に公開鍵認証について学んでいく。応用編では、VScodeのエディタ画面からSSH接続でAWSのEC2インスタンスに接続する方法を解説している。

環境:

  • windows 11
  • Vscode 1.87.2
  • Ubuntu 22.04
  • wsl 2.1.5.0
  • AWS EC2インスタンス

SSHとは

SSH接続を行うための2つの認証方法

1.パスワード認証

パスワード認証の基本構文
ssh ユーザー名@IPアドレス

ユーザー名やIPアドレスの確認方法は下記記事を参照。
https://zenn.dev/code_journey_ys/articles/45b4f55027cecc

2.公開鍵認証

公開鍵認証を実装するためにキーペアを生成してみよう。

1.クライアント側で公開鍵・秘密鍵(キーペア)を生成する。

ターミナル(方法1)
ssh-keygen -t rsa -b 4096
(方法1)出力結果
出力結果(コマンド実行後、Enterを何度か押す)
$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/yusuke/.ssh/id_rsa): 
Created directory '/home/yusuke/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/yusuke/.ssh/id_rsa
Your public key has been saved in /home/yusuke/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:~~~~~ key ~~~~~ yusuke@DESKTOP-R2IF631
The key's randomart image is:
+---[RSA 4096]----+
|             oo +|
|         . . oo+o|
|          E *.+oo|
|         * X = o.|
|        S + B o..|
|   .         +  .|
|  . o.    = +    |
| + ...+.         |
|  +o..o   +      |
+----[SHA256]-----+
ターミナル(方法2)
ssh-keygen -t rsa -b 4096 -C "コメント" -f ~/.ssh/id_rsa

【ssh-keygenのオプション】

option 内容
-t 鍵の種類を指定
-b 生成する鍵のビット数(1024/2048/4096)を指定
-C コメントを追加
-f 鍵を格納するファイル名を指定

2.公開鍵・秘密鍵(キーペア)のファイルが作成されたか確認する。

ターミナル(方法1)
ls -al ~/.ssh
(方法1)出力結果
$ ls -al ~/.ssh
total 16
drwx------  2 yusuke yusuke 4096 May  6 20:47 .
drwxr-x--- 14 yusuke yusuke 4096 May  6 20:44 ..
-rw-------  1 yusuke yusuke 3389 May  6 20:47 id_rsa
-rw-r--r--  1 yusuke yusuke  748 May  6 20:47 id_rsa.pub
ターミナル(方法2)
ls ~/.ssh
(方法2)出力結果
$ ls ~/.ssh
id_rsa  id_rsa.pub
暗号の強度を確認したい場合のコマンド
ターミナル
ssh-keygen -l -f ~/.ssh/id_rsa.pub
出力結果
$ ssh-keygen -l -f ~/.ssh/id_rsa.pub
4096 SHA256:de6lGqlos8BKzm9950nZkWDs0VqW3kTEduXsE6WjJmQ yusuke@DESKTOP-R2IF631 (RSA)

上記結果だと4096にあたる部分がRSAの鍵長にあたる。数字の大きい方が、安全性が高い。

3.公開鍵と秘密鍵(キーペア)のファイルの中身を確認する。

公開鍵
cat ~/.ssh/id_rsa.pub
出力結果
出力結果
$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XfD3w== XXXXX@XXXX-R2IF631
秘密鍵
cat ~/.ssh/id_rsa
出力結果
ターミナル
$ cat ~/.ssh/id_rsa
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAAB
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
cjiXDRYq26YLAAAAFnl1c3VrZUBERVNLVE9QLVIySUY2MzEBAgME
-----END OPENSSH PRIVATE KEY-----

VScodeから公開鍵認証を行い、EC2(リモートサーバー)にアクセスしよう。

1.どちらがアクセスする側なのか、される側なのかを整理する。

今回は、VScodeがアクセスする側、EC2がアクセスされる側である。そのため、cloud9上から公開鍵と秘密鍵(キーペア)を生成し、VScode側に秘密鍵を登録し、EC2`側に公開鍵を登録しアクセスする流れとなる。

------------------【cloud9】------------------

2.EC2側(cloud9上)でキーペアを生成する。

ターミナル(cloud9)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/key-test
出力結果
ターミナル
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/key-test
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/ec2-user/.ssh/key-test.
Your public key has been saved in /home/ec2-user/.ssh/key-test.pub.
The key fingerprint is:
SHA256:e5EeUkXGB4xgB4hoSNTG+hqcmhZtVY8lTSckq9yQrOs ec2-user@ip-172-31-35-237.ap-northeast-1.compute.internal
The key's randomart image is:
+---[RSA 4096]----+
|o+o. .XXXXXX=.   |
|. o+o XXXXXXo .  |
| .o  +..= .  .   |
| .  oXXXXXXX     |
|. +.XXXXXXXX     |
| = +.    + o     |
|..=.    . o      |
|oo.      .       |
|.  E             |
+----[SHA256]-----+

3.作成されたキーペアのファイルを確認する。

ターミナル(cloud9)
ls -al ~/.ssh
出力結果
ターミナル
$ ls -al ~/.ssh
total 40
drwxr-xr-x  2 ec2-user ec2-user  188 May 11 02:08 .
drwx------ 19 ec2-user ec2-user 4096 May 11 01:15 ..
-rw-------  1 ec2-user ec2-user 3326 May 11 02:08 key-test
-rw-r--r--  1 ec2-user ec2-user  783 May 11 02:08 key-test.pub

4.作成されたキーペアの中の公開鍵のファイルの中身を確認する。

ターミナル(cloud9)
 cat ~/.ssh/key-test.pub
出力結果
ターミナル
$ cat ~/.ssh/key-test.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ~~~~~~~~~~

5.手順4で出力された公開鍵の内容をauthorized_keysファイル内に登録する。

ターミナル(cloud9)
ssh ec2-user@EC2インスタンスのパブリックIPアドレス "mkdir -p ~/.ssh && echo '手順4の公開鍵の内容をペースト' >> ~/.ssh/authorized_keys"

6.authorized_keysファイル内に公開鍵が登録されたかを確認する。

ターミナル
cat ~/.ssh/authorized_keys

7.作成されたキーペアの中の秘密鍵のファイルの中身を確認する。

ターミナル(cloud9)
 cat ~/.ssh/key-test
出力結果
ターミナル
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,2DD637C06C8F0781A589DA6AB9F7F130
rwkdlxhx2H76atGz7FaETMbwcY3kQEXQ7iLODxiH5IL/wmcYCjQ8dM
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
X6Twj4DsQKC+LQ6OWvH1/vJgct04UFgKTtvvcDIrahGosAB7IbI+7C
-----END RSA PRIVATE KEY-----

------------------【VScode】------------------

8.VScodeを開きターミナルで.sshフォルダ内に移動し、Vimコマンドを用いて、秘密鍵を登録する準備をする。

ターミナル(VScode)~/.sshフォルダに移動
cd ~/.ssh
ターミナル(VScode)Vimコマンドを使用し秘密鍵の登録
vi key-test
出力結果

以下の画面が出てきたら成功

ターミナル(VScode)ファイル編集のためのVimコマンド[i]を実行
i
出力結果


画面下が[INSERT]とになる

9.手順7でcloud9上で作成したキーペアの内、秘密鍵をVScodeのファイルにコピーペーストする。

10.キーボードの[Esc]キーを押したあと、ファイルを保存し、終了するコマンドを実行する。

ターミナル(VScode)Escキーを押したあとに
:wq

11.保存したファイルの中身を確認する。

ターミナル(VScode)
cat ~/.ssh/key-test

12.SSH接続を試みる。

ターミナル(VScode)
ssh -i ~/.ssh/秘密鍵を保存したファイル名(key-test) ユーザー名(ec2-user)@EC2インスタンスのパブリックIPアドレス

13.エラーを確認する。

ターミナル
$ ssh -i ~/.ssh/key-test ec2-user@18.~~~~
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/home/~/.ssh/key-test' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/home/~/.ssh/key-test": bad permissions
ec2-user@18.~~~~~: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

このエラーメッセージは、秘密鍵ファイルのパーミッションが他のユーザーにもアクセス可能な設定(0644)になっているため、SSHクライアントが警告を表示して秘密鍵を無視していることを示しています。
秘密鍵ファイルに適切なパーミッションを設定する必要があります。秘密鍵は他のユーザーにアクセスされるとセキュリティ上のリスクが高まるため、厳密なパーミッションが必要です。
適切なパーミッションを設定するためには、次のコマンドを実行します。

14.秘密鍵ファイルのパーミッションを設定する。

ターミナル
chmod 600 ~/.ssh/key-test

このコマンドを実行することで、他のユーザーがこのファイルへアクセスできなくなる。先ほどのエラーメッセージが解消される。

15.再度SSH接続を試みる。

ターミナル
ssh -i ~/.ssh/秘密鍵を保存したファイル名(key-test) ユーザー名(ec2-user)@EC2インスタンスのパブリックIPアドレス
出力画面
$ ssh -i ~/.ssh/key-test ec2-user@18.~.~.~
Last login: Sat May 11 01:45:15 2024 from 1-21-53-55.west.dxpn.ucom.ne.jp
   ,     #_
   ~\_  ####_        Amazon Linux 2
  ~~  \_#####\
  ~~     \###|       AL2 End of Life is 2025-06-30.
  ~~       \#/ ___
   ~~       V~' '->
    ~~~         /    A newer version of Amazon Linux is available!
      ~~._.   _/
         _/ _/       Amazon Linux 2023, GA and supported until 2028-03-15.
       _/m/'           https://aws.amazon.com/linux/amazon-linux-2023/

38 package(s) needed for security, out of 52 available
Run "sudo yum update" to apply all updates.

おわりに

今回は、SSH接続の中の特に公開鍵認証について解説した。応用編では、VScodeのエディタ画面からSSH接続でAWSのEC2インスタンスに接続する方法を解説した。リモートワークの仕組みや個人情報の安全な通信がどのようにして行われているかがわかるようになると考える。

参考

https://qiita.com/shobooon/items/70cc74cd20c8b5b4fe15
https://zenn.dev/aew2sbee/articles/aws-ec2-vscode

Discussion