見直してみた
これまでずっと GitHub へは ssh でアクセスしてきた。鍵は、PC が新しくなった時に変えたっきりだ。ssh の方が https よりセキュアであろうという認識のもと。
ただ、いまやっている案件の実装で https を検討する機会があり、良い機会なのでどっちが良いのか検討してみた。
先に結論を述べると、どっちでも良い。
公式はどっち推奨?
以前は、https + PAT(Personal Access Token) 推しだったような気がするが、最近はそうでもないようで、どっちでも良いというのが、公式の立場のようである。
以前は、
Cloning with HTTPS URLs (recommended)
とあったような気がするが、現在は、(recommended) は取れている。どっちの立場かは、ちょいちょい変わるようなので、”現在” は、どっちでも良いという感じらしい。
それぞれのメリット・デメリット
SSH
メリット
- 公開鍵認証で安全
パスワードやトークンを毎回送信せず、秘密鍵で署名するため漏洩リスクが低い。
パスフレーズ付き鍵+Keychain/ssh-agentで自動認証
一度パスフレーズを入力すれば、以降は自動認証が可能(macOSならKeychain連携も可)。 - パスワード・トークン管理不要
GitHubに公開鍵を登録するだけで、パスワードやPATの期限切れ・漏洩リスクがない。 - CI/CDや自動化にも向く
デプロイ鍵やマシンユーザー鍵を使えば、非対話的な自動化にも適している。 - ファイアウォールやプロキシを回避できる場合がある
HTTPSが制限されている環境でも、SSHが許可されていれば利用可能。
デメリット
- 初期設定がやや複雑
鍵ペアの生成・GitHubへの公開鍵登録・ssh-agent設定などが必要。
企業や一部環境でSSHポート(22)がブロックされている場合がある - 鍵の管理が必要
秘密鍵の紛失・漏洩リスク、パスフレーズ管理が必要。 - 複数アカウント運用がやや面倒
複数GitHubアカウントでの鍵切り替えにはssh configの工夫が必要。
HTTPS + PAT
メリット
- セットアップが簡単
追加の鍵生成不要。リモートURLをHTTPSにし、PATを発行するだけ。 - ファイアウォールやプロキシ環境でも使いやすい
ほとんどの企業ネットワークでHTTPS(443)は許可されている。 - トークンの権限・有効期限を細かく管理できる
Fine-grained tokenでリポジトリ単位・権限単位で制御可能。 - CI/CDや自動化にも向く
PATを環境変数やGitHub Actions Secretに設定して自動化できる。 - 複数アカウント運用が比較的容易
リモートURLにユーザ名を含めることで切り替え可能。
デメリット
- 毎回トークンを送信する必要がある
credential helperでキャッシュできるが、トークン自体は毎回送信される。 - PATの有効期限・権限管理が必要
期限切れや権限不足でpushできなくなることがある。 - トークン漏洩時のリスク
PATが漏洩すると、権限範囲内でリポジトリ操作が可能になる。 - パスワード認証は廃止されている
必ずPATやGitHub Appsトークンを使う必要がある。
ずらずら並べてみたが、どういう環境で使いたいか次第で、どっちもどっちという感じ。セキュリティ面だけにフォーカスしてみると、情報漏洩リスクでは、通信はどちらも同程度に安全として、ローカルに物理的に保存された秘密鍵と GitHub 上に保存された PAT のどっちが漏れやすいか?という話になり、それはローカルだろうと思いつつ、パスフレーズが keychain などに安全に保存されていれば大した問題ではなさそう。
鍵やトークンの権限設定などで言えば、Fine-grainded token の方が細かく設定できるし、Expire が設定できるので、PAT の方が漏洩したとしても、設定次第では安全かも知れない。
結論: どっちでも良い
セキュリティとは面倒なものなので、面倒だからやらないみたいなのはなしで、
- HTTPS + Expire 付き PAT
- パスフレーズ付き秘密鍵で SSH
のいずれかであれば、どちらでも良い。Expire なし、パスフレーズなしは NG。PAT やパスフレーズの毎回入力を回避する場合は、Keychain などに安全に保存。何等かの事情で OS のアップデートができないような人は、PAT の方が?
なんとなくではあるけど、今後 GitHub は再び HTTPS + PAT 推しに再度傾くのではないかなぁとは思う。また、GitHub の Organization の管理者的には、PAT の方が、SSH しないで PAT にしてね + 定期的に Token をローテートしてねなどのセキュリティ対策は、ユーザを確認して回るよりはやりやすいのかも知れない。
GitHub に限らず、Git の設定は一度やったら放置みたいな人も多いのかなと思うと、一度見直してみると良いかと。