👌

完璧に記述しているSSH Configで認証できなかった話

2024/07/10に公開2

まえがき

bitbucketでいつもと違うワークスペースにリポジトリを作り、ローカル端末に用意していたリポジトリをプッシュしようとしたら拒否されて4時間ハマったので、解決法を記載します。

部分的には完璧にあっていた。

ググって出てきた答えや、ChatGPTの提案は全て実施しましたが元々なんらミスっていなかったので、全く解決しませんでした。
そもそも、私がスペースのオーナーから管理者権限を移譲してもらって作ったリポジトリなのにアクセス権限がないのは意味不明でした。

・・・そう、部分的には完璧だったのです。
下のような感じです。

~/ssh/config
265 # bitbucket.org$
266 Host bitbucket.org$
267 $
268 User git$
269 Port 22$
270 HostName bitbucket.org$
271 IdentityFile ~/.ssh/hoge.huga.key

ね、完璧でしょ?
実際、完璧です。
ですから、ここだけググってもこれ以上の解決策は絶対に出てきません。
合っているから。

確認のためにSSH接続チェックコマンドを実施すると接続OK、でもシェル接続はできませんと帰ってきていました。

unix
ssh -T git@bitbucket.org

答え

ヒントは前書きにあります。
ようするに腹数アカウント持ちで、似たような設定が既に記述されていたってことです。

~/ssh/config
 46 # bitbacket_hello$
 47 Host bitbucket.org$
 48  User git$
 49  Hostname bitbucket.org$
 50  IdentitiesOnly yes$
 51  IdentityFile ~/.ssh/id_rsa_bitbacket.key$

(中略)
265 # bitbucket.org$
266 Host bitbucket.org$
267 $
268 User git$
269 Port 22$
270 HostName bitbucket.org$
271 IdentityFile ~/.ssh/hoge.huga.key

このようになっていました。
ここでsshコマンドはHostの項目を見て、どの秘密鍵を使うかを判断します。

ところが上記のようにHostに同じ値が設定されていると、後から書いた方は無効になってしまうのです。
(前と後ろどっちを消すかは毎回同じ挙動かわかりません。とにかく競合させると大変なことになるのは確か。)

じゃあどうするかというと、片方を例えば

Host bitbucket.org_sub

みたいにします。

それでそっちからcloneしたいときは

linux
 git clone git@bitbucket.org_sub:my_workspace/my_repository.git

というふうにホスト部を変えてやれば、接続できます。

あとがき

今回は別の設定の影響で、一見接続できているように見える非常に難解なトラブルでした。
みなさんも偽の成功メッセージに騙されないよう、頭を柔らかくしてトラブル対応にあたってください。

株式会社ONE WEDGE

【Serverlessで世の中をもっと楽しく】 ONE WEDGEはServerlessシステム開発を中核技術としてWeb系システム開発、AWS/GCPを利用した業務システム・サービス開発、PWAを用いたモバイル開発、Alexaスキル開発など、元気と技術力を武器にお客様に真摯に向き合う価値創造企業です。
https://onewedge.co.jp

Discussion

いわもと こういちいわもと こういち

ssh_config(5)のman pageには

 Since the first obtained value for each parameter is used, more host-
 specific declarations should be given near the beginning of the file, and
 general defaults at the end.

と、先に得られた値が使われると書かれています。
この記述自体は、例えば

Host *
  User foo

Host bitbucket.org
  User git
  IdentifyFile ~/.ssh/id_rsa_bitbucket

というような設定の場合、UserHost *の方が適用されるのでデフォルト的な設定は後ろに書けという事を言っているのですが、先に得られた値が使われるというのは同一のHost設定の場合にも当てはまります。

特に上記設定の場合はIdentityFileの設定は意図した物が使われるのにUserが意図した物にならないという分かりづらい状況になるので、設定がどういう順番で使われるかというのは認識しておいた方がいいと思います。