windows10のssh鍵を使って、wsl2からgithubへssh -T
目的
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
しようと試みる。これですべて解決すると思っていた。
eval `ssh-agent`
ssh-add /mnt/c/Users/ユーザー名/.ssh/秘密鍵名
すると次のように、秘密鍵のパーミッションが777では無防備すぎる、と怒られる。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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
を試みるが、どういうわけかパーミッションが変更されない。
$ 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 で開いてみる。
sudo vim /etc/wsl.conf
そして、次のように書いて保存終了。値が複数ある場合は,
で区切る。
[automount]
options = "metadata"
wsl を再起動。
なお、ドキュメントによれば、停止直後から再起動開始までに、数秒(最大8秒)の時間をおかなければ、新しい設定ファイルがうまく反映されない場合があるらしい。試していないけど。
wsl --shutdown
wsl
改めて chmod と ssh-add
wsl再起動後、メタデータ付きでマウントされている windows 側の鍵を chmod 600。
$ chmod 600 /mnt/c/User/ユーザー名/.ssh/秘密鍵ファイル名
ssh-agentを起動して鍵をssh-addし、githubに接続テスト。今度はエラーが出ないはず。
$ eval `ssh-agent`
$ ssh-add /mnt/c/User/ユーザー名/.ssh/秘密鍵ファイル名
そしていよいよ目的達成。おめでとう!
$ ssh -T git@github.com
Hi hogehoge! You've successfully authenticated, but GitHub does not provide shell access.
次の課題は、ssh-agent がwsl開始時から起動しているようにすること。ついでにapache2もwsl開始時から起動しているようにしたい。
wsl(ubuntu)起動直後から、windows側の秘密鍵を使って、wslから外部にssh接続する方法、with keychain。
1.0 前置き
1.1 もっと良い方法を発見
直前に投稿した私の方法よりも、次のページで解説されている方法がずっと良いと思った。
その方法を、私の環境用に微調整したものを以下に詳述する。違いは次の通り:
- zshではなく、デフォルトのbashを使う。(これが大きい差であるように感じた)
- 自動マウントするウィンドウズファイル中にある秘密鍵を使う。
1.1 いちおうの前提:メタデータは追加した状態
また、直前の私の投稿で行った、自動マウントするwindowsファイルにメタデータを追加する所までは終わっているものとする。
つまり、/etc/wsl.conf
のsection[automount]
下のvalueoptions
にkeymetadata
を追加する所までだ。
それが必要な作業なのかどうかは試していない。
もし、この方法を試したい方がいらっしゃって、まだメタデータを追加していないなら、ぜひ追加していない状態で可能かどうかを教えていただきたいです。
2.0 手順
2.1 wsl 再起動
wsl --shutdown
その後、好きな方法でwslを再起動してログイン。
2.2 keychain 導入
sudo apt install keychain
入れる前にkeychainの概要を見たい方は、まずapt show keychain
で見てみるといいかも。
2.3 ~/.bashrc を編集
~/.bashrc
の末尾に次の二行を追加すれば、必要な作業は終了。
.bashrc
は、bashを起動するたびに自動で読み込まれ、記述内容が処理される。
/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
オプションを付けていないなら、冒頭に次のように表示されるはず。鍵にパスフレーズを設定している人はここで問われる…のではないかと想像する。(←設定していない人)
* 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接続できるかを確認。目的達成。
ssh -T git@github.com
Hi hogehoge! You've successfully authenticated, but GitHub does not provide shell access.
参考にさせていただきました。
まだメタデータを追加していないなら、ぜひ追加していない状態で可能かどうかを教えていただきたいです。
私は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
とすることでうまくいきました。
参考にしていただけたこと、嬉しく思います。
また、metadataの必要性も試していただき、ありがとうございます。