ISUCON14お疲れ様でした。
私は昨年のISUCON13にも出場したのですが、ssh-agentの存在を知らず本番サーバーで自分以外pull、pushできないという事態に陥ったので今年はそちらを改善した(多分他の皆さんは当たり前のようにssh-agent使ってるなだろうなとは思いつつ)ので備忘録として記事に残そうと思います。
前提
私たちのチームでは、以下のフローでコードの改善を行っています。
1.本番サーバーにはいって、webapp配下のコードをgithubにあげる
2.各々がローカル環境にコードをCloneして各々のブランチで作業
3.ベンチを試したくなったら、他の人と被らないようにサーバーにSSHして、自身のブランチをpullしベンチを回す
4.スコアが上がっていそうだったら、mainブランチにmergeする
問題点
git pushをする際、githubの公開鍵をサーバーに持っていく or 認証のために本番サーバーでDeployKeyを生成してレポジトリのsettingに貼り付けたりとか何かとめんどくさいですね。
また、これが自分一人でやっている素振りの時ならいいのですが、本番サーバーには一つのgithuserしか登録されてないので、複数人で改善を行う際にはどのUserがpull、pushしたのかコミットログに残らないので不便です(多分?)
解決策
ssh-agentを使うとここらへんの面倒なところが多少楽になります。
ついでに、1passwordで秘密鍵を管理していると、もう少し幸せになれます。
ssh-agentとは?
ssh-agentはSSHキー(特に秘密鍵)を管理するためのプログラムで、SSH認証をより便利かつ安全に行うために使われます。このエージェントを利用することで、複数のSSHセッションをまたいで、一度鍵のパスフレーズを入力すれば、その後はパスフレーズを再度入力する必要なくSSH接続ができるようになります。
こんな感じでgithubの秘密鍵を登録しておくと、接続先のサーバーでもその秘密鍵が使える(フォワーディング)ようになります
//keyを登録
ssh-add ~/.ssh/id_rsa
//ssh
ssh server
// keyが登録されているかを確認
ssh-add -l
//keyの情報が出力される(登録したkeyがフォワーディングされている)
しかし、keyの登録は永続的に続かず、セッションが終了すると破棄されます。
1passwordとは?
1passwordはいわゆるパスワードマネージャーというやつで、パスワードに限らず、文書やSSHキーまで秘匿化して一元管理してくれます。
https://developer.1password.com/
また、1passwordに登録したsshKeyも当然ssh-agentに登録することができます。つまり、fowrdingも行うことができます。
ssh-add
のようにCLIのセッション上で管理していないので、先ほどの述べたような、セッション切れによるkeyの登録切れが起こらないのが、1passwordでssh-keyを管理する利点です。
手順
-
~/.ssh/configに1passwordに登録されてあるssh-keyを読み込む設定を追加
以下の設定をconfigに追加します
# 1pass
Host *
IdentityAgent "~/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock"
公式Doc
https://developer.1password.com/docs/ssh/get-started/#step-4-configure-your-ssh-or-git-client
4 ./ssh/configにISUCONサーバーのHostの設定を追加する。
ForwardAgentをyesに設定しないと、フォワーディングされないので注意です。
Host isucon14-1
HostName xxxx
User isucon
ForwardAgent yes
IdentityFile ~/.ssh/hoge.pem ←練習の場合は鍵の指定必要
configを設定しない場合は-A
でフォワーディングの指定をします。
ssh -A isucon@xxxx
これで下準備は完了で、あとはいつも通りsshするだけです
ssh先のサーバーで正常にフォワーディングされているかを確認
ssh-add -l
2048 SHA256:hogeeeeeeeeeeeeeee id_rsa (RSA)
github.comにsshできるか確認
ssh -T git@github.com
ubuntu@ip-10-0-0-161:~$ ssh -T git@github.com
Hi kojikokojiko! You've successfully authenticated, but GitHub does not provide shell access.
まとめ
1passwordとても便利なので、個人でもバンバン使っていきたいなと思いました!
また、ssh-agentのTipsは業務でもよく使うので、覚えておいて損はないと思います。