Open4

windows10のssh鍵を使って、wsl2からgithubへssh -T

keijiekkeijiek

目的

Windows10 で使っている GitHub 用の秘密鍵を、その Windows 下にある WSL2(ubuntu)からも使えるようにすること。

解決方法(結論)

  • windows 側にある秘密鍵を wsl から ssh-add 秘密鍵 すれば目的がかなう。
  • しかし、ssh-add 秘密鍵のためには chmod 600 秘密鍵 としてパーミッションを変更することが必要。
  • さらに、そのchmodを成功させるためには、 自動マウントするWindowsのファイル(/mnt/c/ 以下のファイル)に「メタデータを追加する」ことが必要。メタデータ追加は、/etc/wsl.config[automount]セクション下のoptionsキーに、値のひとつとしてmetadataを追加することで行う(書き換え直後は要再起動)。

上記のことを、試行錯誤の経過とともに詳述していく。

秘密鍵を ssh-add しようとしても、パーミッションに不備があるため出来ない。

/mnt/c/以下にある秘密鍵を、wslから直接ssh-addしようと試みる。これですべて解決すると思っていた。

wsl
eval `ssh-agent`
ssh-add /mnt/c/Users/ユーザー名/.ssh/秘密鍵名

すると次のように、秘密鍵のパーミッションが777では無防備すぎる、と怒られる。

wsl
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0777 for '秘密鍵名' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.

パーミッションも変えられない

それならばということでchmodを試みるが、どういうわけかパーミッションが変更されない。

wsl
$ chmod 600 /mnt/c/Users/ユーザー名/.ssh/秘密鍵名
$ ls -l /mnt/c/Users/ユーザー名/.ssh/秘密鍵名
-rwxrwxrwx (以下略, 600を指定したのに777のまま)

関連するドキュメントを発見

しばらく検索をし、いろいろなブログ等を見た結果、公式のWSLドキュメントに行きつく。

ざっくり要約すると、wsl から windows のファイルをchmodなどで操作することには、デフォルトの状態では様々な制限がついているが、メタデータを追加することで、その制限を弱くすることができる、ということ。

メタデータを追加, wsl.conf 編集

では、メタデータを追加するとはどういうことか?
それは、同じWSLドキュメントの別ページが参考になる。
.wslconfig と wsl.conf で設定を構成する(MicroSoft-Docs)
なお、次に挙げるのは上記の英語版だが、現在(2021-12-08)、英語版の方が内容が詳しい。読むのは大変だけど。
Advanced settings configuration in WSL

具体的には、wsl 側にある /etc/wsl.confというファイルの、automount セクション下で、 key options の value として metadata を追加すればいい。
なお、wsl.confはデフォルトでは存在しないのだが、あるにせよ無いにせよ vim で開いてみる。

wsl
sudo vim /etc/wsl.conf

そして、次のように書いて保存終了。値が複数ある場合は,で区切る。

/etc/wsl.conf
[automount]
options = "metadata"

wsl を再起動。
なお、ドキュメントによれば、停止直後から再起動開始までに、数秒(最大8秒)の時間をおかなければ、新しい設定ファイルがうまく反映されない場合があるらしい。試していないけど。

powershell
wsl --shutdown
wsl

改めて chmod と ssh-add

wsl再起動後、メタデータ付きでマウントされている windows 側の鍵を chmod 600。

ubuntu
$ chmod 600 /mnt/c/User/ユーザー名/.ssh/秘密鍵ファイル名

ssh-agentを起動して鍵をssh-addし、githubに接続テスト。今度はエラーが出ないはず。

ubuntu
$ eval `ssh-agent`
$ ssh-add /mnt/c/User/ユーザー名/.ssh/秘密鍵ファイル名

そしていよいよ目的達成。おめでとう!

ubuntu
$ ssh -T git@github.com
Hi hogehoge! You've successfully authenticated, but GitHub does not provide shell access.

次の課題は、ssh-agent がwsl開始時から起動しているようにすること。ついでにapache2もwsl開始時から起動しているようにしたい。

keijiekkeijiek

wsl(ubuntu)起動直後から、windows側の秘密鍵を使って、wslから外部にssh接続する方法、with keychain。

1.0 前置き

1.1 もっと良い方法を発見

直前に投稿した私の方法よりも、次のページで解説されている方法がずっと良いと思った。
https://zenn.dev/kaityo256/articles/ssh_agent_on_wsl

その方法を、私の環境用に微調整したものを以下に詳述する。違いは次の通り:

  • zshではなく、デフォルトのbashを使う。(これが大きい差であるように感じた)
  • 自動マウントするウィンドウズファイル中にある秘密鍵を使う。

1.1 いちおうの前提:メタデータは追加した状態

また、直前の私の投稿で行った、自動マウントするwindowsファイルにメタデータを追加する所までは終わっているものとする。
つまり、/etc/wsl.confのsection[automount]下のvalueoptionsにkeymetadataを追加する所までだ。
それが必要な作業なのかどうかは試していない。

もし、この方法を試したい方がいらっしゃって、まだメタデータを追加していないなら、ぜひ追加していない状態で可能かどうかを教えていただきたいです。

2.0 手順

2.1 wsl 再起動

powershell
wsl --shutdown

その後、好きな方法でwslを再起動してログイン。

2.2 keychain 導入

ubuntu
sudo apt install keychain

入れる前にkeychainの概要を見たい方は、まずapt show keychainで見てみるといいかも。

2.3 ~/.bashrc を編集

~/.bashrc の末尾に次の二行を追加すれば、必要な作業は終了。
.bashrcは、bashを起動するたびに自動で読み込まれ、記述内容が処理される。

~/.bashrc
/usr/bin/keychain --nogui /mnt/c/Users/ユーザ名/.ssh/秘密鍵名
source $HOME/.keychain/`hostname`-sh

1行目解説

1行目では、wsl起動時に自動マウントされるウィンドウズファイル中の秘密鍵をkeychainに登録している。
なお、引数-qを付加すると実行時のメッセージが表示されない。

2行名解説

2行目では、1行目の実行により~/.keychain/下に生成される3つのスクリプトのうちsh版を使用。
ファイル名には、いずれもホスト名が使用されている。ホスト名は、ターミナル上に「ユーザ名@ホスト名」の形で表示されているだろうし、hostnameコマンドでも出力される。

冒頭で引用したページでは$HOSTという変数でホストネームが取得されているけど、私の環境(bash)では出来なかったので、hostnameコマンドの標準出力を取得している。
シェルスクリプトでは、コマンド(パイプしまくったものでも可)を``で囲むと、その実行結果である標準出力をスクリプト上に得られるので、それを利用しているということ。実のところ、シェルスクリプトの文法をまったく知らなかったので、ここに至るまで、それを学ぶための時間が多く必要だった。

3.0 接続

3.1 bash (再)起動

windows terminal で別のwslタブを開くなど、お好きな方法で新しいwslのbashを起動。
上記のkeychainコマンドに-qオプションを付けていないなら、冒頭に次のように表示されるはず。鍵にパスフレーズを設定している人はここで問われる…のではないかと想像する。(←設定していない人)

ubutu
 * keychain 2.8.5 ~ http://www.funtoo.org
 * Starting ssh-agent...
 * Adding 1 ssh key(s): 秘密鍵のパス
 * ssh-add: Identities added: 秘密鍵のパス

3.2 ssh -T

githubにssh接続できるかを確認。目的達成。

ubuntu
ssh -T git@github.com
Hi hogehoge! You've successfully authenticated, but GitHub does not provide shell access.
marcmarc

参考にさせていただきました。

まだメタデータを追加していないなら、ぜひ追加していない状態で可能かどうかを教えていただきたいです。

私は2から始めたのですが

 * keychain 2.8.5 ~ http://www.funtoo.org
 * Starting ssh-agent...
 * Adding 1 ssh key(s): /mnt/c/Users/xxx/.ssh/id_rsa
 * Error: Problem adding; giving up

とエラーになってしまい、結局metadataを追加し、chmod 600とすることでうまくいきました。

keijiekkeijiek

参考にしていただけたこと、嬉しく思います。
また、metadataの必要性も試していただき、ありがとうございます。