echo("備忘録");

IT技術やプログラミング関連など、技術系の事を備忘録的にまとめています。

【VS Code】Remote SSHでSSH接続する

はじめに

現在、仕事でSSHを使用する機会がかなり増えてます。(今まであまりなかった)

それに伴い「SSHで便利なツールないかなー」「できればVS Code上で扱える拡張機能がないかなー」と思っていたら、やはりありました。(てかVS Code拡張機能、マジで何でもありますね)

という訳で、今回はSSH接続を行うVS Code拡張機能「Remote SSH」の紹介です。

Remote SSHの紹介とインストール

Remote SSHは、先述の通りVSCodeSSH接続を行うための拡張機能です。
鍵認証の使用や、また多段SSH接続(=踏み台ホスト経由で目的のホストに接続)にも対応しています。

そしてインストールですが、以下2つの方法があります。
自分の好きな方法でインストールしてください。(どちらを選んでもRemote SSHに差異は全くありません)

  • 「Remote SSH」をインストール
    • これはRemote SSH単体でインストールされる
  • 「Remote Development」をインストール
    • Remote Developmentは、下記3つをまとめてインストールする拡張機能パッケージ
      • Remote SSH
      • Remote Containers
      • Remote WSL

Host設定

次に接続するホストの設定を行います。

インストールを行うと左のタブに「Remote Explorer」アイコン(赤〇)が追加されるのでそれをクリック、しRemote Explorerのリスト(青〇)から「SSHターゲット」を選択します。
そしてリストの下の歯車アイコン(緑〇)をクリックすると「更新するSSH構成ファイルを選択する」メニューが表示されるので、設定を保存するSSHファイルを選択します。

  • ここは環境(OSなど)によって、表示される内容が違います。
  • 一部ファイル(Macのetc/hostsとか)を編集する場合は管理者権限が必要な場合があります。


今回は一番上のユーザー個別の設定ファイルを選択しました。(Macならhome/(ユーザー名)/.ssh/configかな)

該当の設定ファイルを編集しますが、とりあえずSSH接続するだけなら、下記の設定を抑えておけばOKです。

Host hogehoge
    HostName hogehoge.com
    User hoge
    PasswordAuthentication no
    IdentityFile ~/.ssh/id_rsa    
    IdentitiesOnly yes
    Port 22
項目 意味 初期値 備考
Host 任意の一意の名前(識別名)
HostName 接続先ホストのドメインまたはIPアドレス
User 接続する際のユーザー名
PasswordAuthentication 接続時にパスワードによる認証を行うかどうか yes 鍵認証のみで認証する場合はnoにする
IdentityFile 鍵認証で使用する秘密鍵ファイルのパス ~/.ssh/id_rsa または ~/.ssh/id_dsa 鍵認証を使用する場合に指定する
IdentitiesOnly IdentityFileの秘密鍵のみで認証を行うかどうか no yesの場合、ssh-agentに他の鍵情報が登録されていても使用しない
Port SSH接続に使用するポート番号 22 22以外を使用する場合のみ指定する(なので、正確には上記設定にPortは不要)

なお、設定項目の詳しい情報は下記URLにあります。
https://linux.die.net/man/5/ssh_config

接続する&切断する

上記Host設定を行うと、「SSHターゲット」に先程設定を行った「Host」の名前が登録されていると思います。

そのホストを右クリックすると、どのウィンドウで接続を行うか選択できる(新しくウィンドウを開く/今のウィンドウのまま)ので、好きな方を選択します。

認証が通り接続が無事完了すると、VS Codeの左下に「Host」の名前が表示されます。

また接続先ホストのファイル/フォルダをエクスプローラで表示・編集したり、接続先ホストのターミナルを操作することもできます。

切断する際は、左下の「Hostの名前」をクリックすると表示されるメニューから「リモート接続を終了する」を選択すればOKです。

踏み台ホスト経由で接続する(=多段接続)

ここまではシンプルに

  • ローカルPC → 目的のホスト

という前提で書きましたが、実際の開発環境ではセキュリティなどの観点から、

  • ローカルPC → 踏み台ホスト → 目的のホスト

のように、踏み台ホストを経由した接続を行うケースもあると思います。(もちろん、踏み台ホストが複数台あるケースも存在する)

その際は、設定ファイルに下記のように設定します

# ローカルPC → 踏み台ホスト1(bastion1) → 踏み台ホスト2(bastion2) → 目的のホスト(target) という場合
# 秘密鍵を使用するケースは後で説明します
# Userは適宜置き換えてください
Host bastion1
    HostName bastion1.com
    User hoge
    PasswordAuthentication yes

Host bastion2
    HostName bastion2.com
    User hoge
    PasswordAuthentication yes
    ProxyCommand ssh -W %h:%p bastion1

Host target
    HostName target.com
    User hoge
    PasswordAuthentication yes
    ProxyCommand ssh -W %h:%p bastion2

ポイントはProxyCommadで、これに続けて下記コマンドを設定します。

ssh -W %h:%p (踏み台Host名)

これを設定すると「踏み台Host名」のホスト名に接続した際に、自動でこのコマンドを実行してHostのホストに接続を行ってくれます。(例えばbastion1に接続した際に、自動でbastion2への接続を実施してくれる)

また「%h:%p」はそれぞれホスト/ポートで、コマンド実行時には接続先ホストのホスト/ポートが指定されます。

秘密鍵情報を踏み台ホストでも使う(ForwardAgent)

上記「踏み台ホスト経由で接続する(=多段接続) 」はパスワード認証でしたが、これだと踏み台を含めた各ホストに接続する際に、いちいちパスワードを聞かれ、ちょっと面倒です。
しかしForwardAgent(※)を使用すればそういった手間は無くなります。

ssh-agentに登録した秘密鍵情報を接続先ホストでも使用できる仕組み。ざっくり言うとローカルの秘密鍵情報を接続先ホストでも使用可能になる
※ただしセキュリティ的な問題点もあるので、その点はご注意を

もちろんRemote SSHでもForwardAgent(※)を使用して多段接続を行うことができます。
Remote SSHでForwardAgentを使用する方法ですが、非常にシンプルです。

Host bastion1
    HostName bastion1.com
    User hoge
    IdentityFile ~/.ssh/id_rsa
    ForwardAgent yes # これを追加

上記の通り、秘密鍵があるホスト(=ローカルなど)からの接続設定にForwardAgent yesを追加するだけでOKです。
これだけで、接続先のホストで接続元の秘密鍵情報を使用することができます。

また、設定ファイルの全ホストへの接続にForwardAgentを使用する場合、設定ファイルの先頭にForwardAgent yesを追加すれば、どのホストへの接続もForwardAgentを使用してくれます。

# 先頭にForwardAgent yesを定義すれば、全ホストに適用される
ForwardAgent yes
  
Host host1
    HostName host1.com
    User hoge
    IdentityFile ~/.ssh/id_rsa
    
Host host2
    HostName host2.com
    User hoge
    IdentityFile ~/.ssh/id_rsa

Tips:「プロセスが、存在しないパイプに書き込もうとしました」というエラーが出る場合

上記を設定してSSH接続を行っても、「プロセスが、存在しないパイプに書き込もうとしました」というエラーが発生して接続ができない場合があります。
その際によくある原因&対象方法を記載します。

  • 下記に記載したエラーログはたいてい「プロセスが、存在しないパイプに書き込もうとしました」の直前の数行に表示されるので、まずはエラーログを確認してください。
  • 下記ではエラー解消しないケースももちろんあるので、その場合は各自調べてください。(下記はあくまで原因の一例です)
  • 下記以外のエラーももちろんあります。

「Bad owner or permissions on .../.ssh/config」というメッセージが表示される
この場合、

  • Host設定ファイルへの読み取り権限がない
  • Host設定ファイルを読みにいってない(例えばユーザーごとの設定ファイルに設定したのに、OS標準の設定ファイルを読みにいってる、等)

が考えられます。

前者はchmodコマンドなどで権限を付与する事、後者は下記の手順で正しいファイルを読みに行くように設定することで回避できるケースがあります。

  1. 歯車アイコンをクリックし「更新するSSH構成ファイルを選択する」メニューを表示する
  2. 「設定(カスタム設定ファイルを指定する)」を選択する
  3. 設定項目の「Remote SSH: Config File(カスタム SSH 構成ファイルへの絶対ファイル パス)」に、該当の設定ファイルの絶対パスを入力する

「no such identity: (IdentityFileに設定した秘密鍵ファイルのパス) No such file or directory」というメッセージが表示される
この場合、

  • IdentityFileに設定した秘密鍵ファイルへの読み取り権限がない
  • IdentityFileに設定した秘密鍵ファイルがない

が考えられます。

前者は先程と同様、chmodコマンドなどで権限を付与してみてください。
後者はIdentityFileに設定した秘密鍵ファイルが存在することを確認してください。

なおWindowsのWSL(WSL2含む)環境で動作させている場合、Linux形式のパス(/home/(ユーザー名)/...)を指定しているとダメというケースがあるので要注意です。(C:\Users\(ユーザー名)\...など、Windows形式のパスを指定しないといけない)

「this access is currently unavailable ssh」というメッセージが表示される
この場合、そもそも接続先ホストがSSHに対応していないケースが考えられます。
接続先ホストがSSHに対応しているか、確認してください。(レンタルサーバーならSSHが有効になっているか、とか)

その他、Host設定ファイルの設定内容が正しいか、なども要確認です。(実はポート番号が標準の22ではない、等)

まとめ

以上がRemote SSHSSH接続する方法になります。

SSH接続ってなんかすごいハードルが高いと思っていたんですが、めちゃくちゃ簡単に出来てしまって驚きです。
しかも接続先でもVS Codeがそのまま使えて、ファイル編集などもできてしまうので、自分みたいにどうしてもviやvimが苦手...という人にはすごくお勧めです。

とはいえ、SSHとかLinuxのようなコマンドベースOSを触るなら、やはりvimあたりは扱えるようにしておかないといけないんでしょうね...

それでは、今回はこの辺で。