👌

VSCodeでSSHリモート開発環境を構築する【前準備: 鍵認証・agent転送・Git連携まで】

に公開

windows10以降ではsshクライアントやエージェントが標準装備されているのでvscodeでリモートsshして開発しようってな場合環境構築するにあたってエージェントの登録/転送ほぼ必須である。ここでは例として52.195.226.154(これはEC2であるが)というホストに接続する例を示してみる(ipは適当なので置き換えてくださいね)

想定する読者

  • EC2などのリモートホストをそのまま開発環境としたい
  • 開発しないまでもwindowsからリモート先でgithubのcloneやpushをssh経由で行いたい
  • プロダクジョンサーバーで緊急メンテナンス用にvscodeを使って作業する環境を整えたい

なお、リモートホスト(ここでは52.195.226.154)には少なくとも誰かの別のユーザーが既にログイン可能で新たに公開鍵を貼り付ける事ができるという環境を想定している。そもそもにおいて完全に締め出されているサーバーにログインする方法はここでは紹介しないので、あくまでユーザーの追加作業は別途行う環境がある前提だ。

おおまかな流れ

  • windows環境でsshの構成を確認し疎通確認も行う
  • windowsで鍵を生成し、公開鍵を登録してもらってログインする
  • sshエージェントサービスの稼動状態を取得し、再起動時にこれを自動起動できるよう設定する
    • sshエージェントに鍵を登録してログインする

windows環境でsshの構成を確認する

はじめに、現在のwindowsでsshコマンドがあるかとか、エージェントの構成を確認してみたりしよう

sshコマンドの確認と実行

PowerShellを使う。最終的にエージェントの自動起動を仕込むので「管理者として実行」しといた方がいいかも。いずれにせよsshの基本はコマンドなのである程度必要となる。たとえば、この辺の知識がほとんどない人に開発環境を貸し出す場合この作業はよくわかっている人がやる事(ハメ)になると思う。


PowerShellの起動、このページの処理は「管理者として実行」が好ましい

ここではubuntuサーバなのでubuntuというユーザーを指定して実行してみる

ssh ubuntu@52.195.226.154

SSH接続は正常に開始されており、ホスト鍵の確認メッセージが出ている状態。言うまでもなく初回限定で表示されるものだ。ここではyesと打って(あるいは何も打たずに)Enterキー すると ~/.ssh/known_hosts にこのホストの鍵が記録され、次回以降この確認はスキップされる。

なお、ここでの ~/.ssh はユニックス的なホームディレクトリを~で表現しいる記法であるが、windowsの場合はDocumentRootという環境変数の下に保存される。これは大抵の場合において C:\Users\<ログインユーザー>\ となり、実際の当該ディレクトリは C:\Users\<ログインユーザー>\.ssh\ などとなるだろう。

ここで現在windowsにログインしているcatatというユーザーではなくubuntuというユーザーでログインするために@を使って記述しているが、、これは-l ubuntuオプションを用いても同じこととなる。

当該ホストには現在このユーザーの公開鍵を書いていないため当然ログインできないのであるが、ここでsshコマンドと当該ホストにssh通信できる(そしてログインできない)という事が確認できたはずだ。

windowsで鍵を生成する

ed25519鍵の生成

ここではモダンで安全・速い・短いed25519鍵 = 高速・コンパクト・安全設計みたいな良い所取りの鍵を使うが、下位互換が無いので古いサーバーにはログインできない事があるが、まあここでは考えないことにしよう!

ssh-keygen -t ed25519
  • -C(comment)
  • f(filepath)

も管理上あった方がいいが割愛。入力すると

PS C:\Users\catat> ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\catat/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\catat/.ssh/id_ed25519
Your public key has been saved in C:\Users\catat/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:o7AdMrLSrZT5E2guord1t5mYWAl9Eykx5vTCkSmOjpo catat@four-on-sixs
The key's randomart image is:
+--[ED25519 256]--+
|      *o         |
|    .=o= .       |
|   o .= +        |
|  . .. o .       |
| o..= o S        |
|..+*.B = o       |
|o+* +.* .        |
|Eoo+.+ + +       |
|+oo.o.o +        |
+----[SHA256]-----+
PS C:\Users\catat>

ここで鍵のパスフレーズを設定している

生成された鍵を確認する

これは以下のようにdirコマンドで確認できる

PS C:\Users\catat> dir .ssh


    ディレクトリ: C:\Users\catat\.ssh


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2025/06/02     13:42            464 id_ed25519
-a----        2025/06/02     13:42            101 id_ed25519.pub
-a----        2025/06/02     13:41             97 known_hosts

このようにid_ed25519id_ed25519.pub ってのができている。1つは公開して1つは厳重に取られないようにしろという相反しすぎる管理ポリシーを求められるが、これは基本のリテラシーとしてそういうものだ。

id_ed25519.pubの内容を転送先のsshサーバーに登録する必要がある。これは冒頭で書いたように別にsshログインできるユーザーに渡してauthorized_keysに書いてもらう必要があるんだけど、ここでは「誰かがやってくれる」想定なので誰かにやってもらう(記事の内容と合致しないのでこの作業は一気に省略する)

いずれにせよ、この公開鍵が登録された状態で再度ログインしてみると

PS C:\Users\catat> ssh ubuntu@52.195.226.154
Enter passphrase for key 'C:\Users\catat/.ssh/id_ed25519':
Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.8.0-1024-aws aarch64)

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

 System information as of Mon Jun  2 04:51:49 UTC 2025

  System load:  0.0                Temperature:           -273.1 C
  Usage of /:   47.2% of 18.33GB   Processes:             177
  Memory usage: 40%                Users logged in:       1
  Swap usage:   0%                 IPv4 address for ens5: 172.31.36.78

 * Ubuntu Pro delivers the most comprehensive open source security and
   compliance features.

   https://ubuntu.com/aws/pro

Expanded Security Maintenance for Applications is not enabled.

5 updates can be applied immediately.
To see these additional updates run: apt list --upgradable

1 additional security update can be applied with ESM Apps.
Learn more about enabling ESM Apps service at https://ubuntu.com/esm


*** System restart required ***
Last login: Mon Jun  2 04:51:50 2025 from 165.76.190.46

このようにパスフレーズを聞かれるが、ここで先に設定した鍵のパスワードを入力すると、このようにログインが完了する。

sshエージェントの状態確認と自動起動

現在のsshエージェントの状態を確認する

powershellで

Get-Service ssh-agent

すると

PS C:\Users\catat> Get-Service ssh-agent

Status   Name               DisplayName
------   ----               -----------
Stopped  ssh-agent          OpenSSH Authentication Age

このようにStoppedと表示され、停止しているのがわかるので、自動起動する(ここで管理者権限のpowershellが必要)

Set-Service -Name ssh-agent -StartupType Automatic

この後にwindowsを再起動して再度起動状況を確認すると

PS C:\Users\catat> Get-Service ssh-agent

Status   Name               DisplayName
------   ----               -----------
Running  ssh-agent          OpenSSH Authentication Agent

このようにRunningになるはずだ。

sshエージェントに鍵を登録し、ログインする

ssh-add .\.ssh\id_ed25519

とすると

PS C:\Users\catat> ssh-add .\.ssh\id_ed25519
Enter passphrase for .\.ssh\id_ed25519:
Identity added: .\.ssh\id_ed25519 (catat@four-on-sixs)

ここで先程の鍵パスワードの入力が求められる。重要なのは鍵パスワードはサーバーにログインする時に利用するのではなく、ログインする前に自分のPCで解除するという流れになっていることであり、すなわちここではsshエージェントに当該の秘密鍵の情報が「パスワードを解除された状態で」登録される。この情報自体はPC上のメモリーに保存され、SSHエージェントが引き出し可能になるわけだ。

この状態で

ssh ubuntu@52.195.226.154

とするとノーパスワードでログインできる

PS C:\Users\catat> ssh ubuntu@52.195.226.154
Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.8.0-1024-aws aarch64)
...

(ログイン成功)

sshエージェントによりメモリーに保存されたノーパスワードの鍵情報を引き出す事によって可能にしている。

vscodeから接続する

構成ファイルを編集する

ここではremote-ssh拡張が入っている必要がある。「次に接続します」とかからホストに接続する


ここではremote-sshで接続する

ここでvscodeでまずSSH ホストを構成するを行う

この**.ssh/config**によって当該ホスト固有の接続情報を管理する仕組みになっている。

これに関してはCopilotが入っている場合

.ssh/configの雛形を書い

などと言うとある程度提示してくれる


copilotによる補完

が、これは単純に編集方法の提案ということでcopilotなど無いという場合でも以下のように書いておけばok

# SSH Config Template

Host devServer              # 接続名
    HostName 52.195.226.154 # 実際には当該のリモートホスト(ipでも名前でも)
    User ubuntu             # ログインするユーザー
    Port 22                 # 接続ボートは通常22

これで保存する

コマンドラインより.ssh/configの設定状況を確認する

.ssh/configというのは別にvscode固有の設定情報でなく、sshコマンド全般で利用できるのでまずコマンドラインにて確認してみる事としよう。

ssh devServer

これによりdevServerという名前のエントリーから構成除法がよみこまれ、自動的に HostName 52.195.226.154に変換されて接続されるわけだ


ssh devServerで接続できた

vscodeでも接続する

vscodeでもdevServerなどを指定するとログインできるようになっている。以下のように接続し、当該ホストのディレクトリ内容を読み込んでみよう


リモートサーバーのディレクトリ内容の表示に成功している

gitリポジトリーのclone(など)をssh経由で行う

この時点で本稿の役目は終わっているのだが、さらに踏み込んでssh先でgitのssh認証が必要な状況を想定し、これに対応してみよう。

たとえば git@gitlab.com:<user>/test.git みたいなリポジトリをgitで取りたい場合このままではうまくいかないので

Host devServer
    HostName 52.195.226.154
    User ubuntu
    Port 22
    ForwardAgent yes

このようにForwardAgent yesを付けておくことにより鍵のメモリー状態をも転送してしまうという事が可能になる。そうすると接続先のサーバーに鍵を登録せずとも転送元のエージェントの状態で作業可能となる。

これは通常

ローカルホスト → リモートA → リモートB

のように、リモートBにログインして作業する時に利用するのであるが、vscodeのような環境で鍵転送する場合はそのほとんどがリモート先からのgit転送で使う場合がほぼ99%くらいになるはずだ。


リモートサーバーでcloneが完了し、当該のディレクトリを開く事ができる

まとめ

本記事では、Windows 10 以降の標準SSH機能とVSCodeを活用して、リモートLinux環境への開発アクセスを安全かつ効率的に構築する方法を実例を交えて解説した

この構成は、GitのSSH認証や緊急時のVSCode接続など、実務的なシナリオに耐え得る堅牢なSSH環境の立ち上げに直結するノウハウであるので開発環境の貸出設定を行う時でも活用できるんじゃないかな...

vimでリモートホストに入ってグリグリやるみたいな特殊な性癖の人ばっかりじゃないですからねwまあそういうのは放置しましょう

Discussion