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_ed25519 と id_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