【ネットワーク】VScodeからSSH接続(公開鍵認証方式)でEC2インスタンスに接続する
はじめに
今回は、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アドレスの確認方法は下記記事を参照。
2.公開鍵認証
公開鍵認証を実装するためにキーペアを生成してみよう。
1.クライアント側で公開鍵・秘密鍵(キーペア)を生成する。
ssh-keygen -t rsa -b 4096
(方法1)出力結果
$ 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]-----+
ssh-keygen -t rsa -b 4096 -C "コメント" -f ~/.ssh/id_rsa
【ssh-keygenのオプション】
option | 内容 |
---|---|
-t | 鍵の種類を指定 |
-b | 生成する鍵のビット数(1024/2048/4096)を指定 |
-C | コメントを追加 |
-f | 鍵を格納するファイル名を指定 |
2.公開鍵・秘密鍵(キーペア)のファイルが作成されたか確認する。
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
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上)でキーペアを生成する。
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.作成されたキーペアのファイルを確認する。
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.作成されたキーペアの中の公開鍵のファイルの中身を確認する。
cat ~/.ssh/key-test.pub
出力結果
$ cat ~/.ssh/key-test.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ~~~~~~~~~~
authorized_keys
ファイル内に登録する。
5.手順4で出力された公開鍵の内容をssh ec2-user@EC2インスタンスのパブリックIPアドレス "mkdir -p ~/.ssh && echo '手順4の公開鍵の内容をペースト' >> ~/.ssh/authorized_keys"
authorized_keys
ファイル内に公開鍵が登録されたかを確認する。
6.cat ~/.ssh/authorized_keys
7.作成されたキーペアの中の秘密鍵のファイルの中身を確認する。
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】------------------
.ssh
フォルダ内に移動し、Vim
コマンドを用いて、秘密鍵を登録する準備をする。
8.VScodeを開きターミナルでcd ~/.ssh
vi key-test
出力結果
以下の画面が出てきたら成功
i
出力結果
画面下が[INSERT]とになる
9.手順7でcloud9上で作成したキーペアの内、秘密鍵をVScodeのファイルにコピーペーストする。
[Esc]
キーを押したあと、ファイルを保存し、終了するコマンドを実行する。
10.キーボードの:wq
11.保存したファイルの中身を確認する。
cat ~/.ssh/key-test
12.SSH接続を試みる。
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インスタンスに接続する方法を解説した。リモートワークの仕組みや個人情報の安全な通信がどのようにして行われているかがわかるようになると考える。
参考
Discussion