ssh-agentの使い方 【サーバー上でGitHubを安全に管理する】
本記事では、サーバー上でGitHubにSSH接続してソースコードを取得したい場合など、ローカルPCの秘密鍵を使ってサーバー上からSSH接続する方法について解説します。
最近では、CIを使うことが多いと思いますが、規模が小さいものなどであればそのままGitHubと連携してしまうこともあるかと思います。
ssh-agentの使い方 【サーバー上でGitHubを安全に管理する】
今回は、ローカルにGitHubのSSHキーがあり、これを使ってサーバー上でGitHubからPullなどでコードを取得できるようにすることを目的とします。例えば以下のような操作を想定しています。
- SSHでVPSへ接続
- VPS上からGitHubへSSH接続する
※VPS上でGitHubへSSH接続(ssh-agentを使ってローカルの秘密鍵を使いGitHubへ接続)して、git pullなどでソースコードをVPS上に取得する。
サーバー上に秘密鍵をおくのはしない方がよいため、ssh-agentの仕組みを使ってサーバー上でGitHubにSSH接続する方法を紹介します。
GitHubの公式にもこの方法は記載されています。
1.SSHキーの設定を確認する
ローカルでSSHキーがセットアップされていて、正常に動作するかを確認します。
$ ssh -T git@github.com
「Hi username! You've successfully authenticated 〜」というような表示が出れば、正常に動作しています。
2.ssh-agentの動作確認
ssh-agentが正常に動作しているかを確認します。ほとんどのOSでは自動的にssh-agent
が起動されますが、Windowsでは手動で起動しなければなりません。
ssh-agentが動作しているかを「echo "$SSH_AUTH_SOCK"
」のコマンドで、確認します。「〜/Listeners
」のような表示が出れば起動しています。
$ echo "$SSH_AUTH_SOCK"
> /tmp/launch-kNSlgU/Listeners
もし起動していなければ、「$ ssh-agent bash
」や「$ eval "$(ssh-agent -s)"
」のコマンドで起動してみてください。
3.SSH キーを ssh-agent に追加する
「ssh-add -L」でキーが見えない場合は、「$ ssh-add yourkey」コマンドで秘密鍵の場所を追加します。「yourkey」の部分に「~/.ssh/id_rsa」のように鍵の場所を指定します。また「-K」オプションを付けてキーチェーンに設定しておきます。
$ ssh-add -K ~/.ssh/id_rsa_github
※今回はサーバー上でローカルPCの秘密鍵を使って、サーバーからGitHubにSSH接続することを目的にしているので、SSHキーの秘密鍵をssh-addで登録します。
再度「ssh-add -L
」で確認すると登録したSSHキーが表示されます。
Mac(OS X)では再起動などでssh-agentが起動し直されるとキーは忘れられてしまうので再度「ssh-add」でキーの追加をしなければなりません。「$ ssh-add -K yourkey
」と「-K
」オプションをつけてコマンドを実行すると、キーチェーンに鍵が登録されて、再起動しても再度「ssh-add
」で登録しなくて良くなります。
4.「~/.ssh/config」に設定する
「~/.ssh/config
」がなければ作成し、以下のような記述を追加します。「example.com
」の部分を接続するサーバーのドメイン名・IPアドレスに置き換えてください。
Host example.com
ForwardAgent yes
「ForwardAgent yes
」によって、指定したHostでエージェント転送(ssh-agent
)を使うことを示しています。
ちなみに「ForwardAgent yes
」を設定しなくても、サーバーにSSH接続するする際に「ssh -A ホスト名
」のように「-A
」オプションを毎回付けて対応することも可能です。
5.サーバーにSSH接続して、サーバー上でSSHの動作確認する
サーバー上でも、ローカルのSSHキーを使ってSSH接続ができているかを確認するために、サーバー上で、「ssh -T git@github.com
」コマンドを入力してテストします。
$ ssh -T git@github.com
# SSHでgithubに入る
> Hi username! You've successfully authenticated, but GitHub does not provide
> shell access.
問題ない場合は「You’ve successfully〜」などのコメントが表示されます。
エージェント転送が動作していない場合
「$ ssh -T git@github.com
」コマンドを打った後に、「Permission denied (publickey).
」など表示される場合は、エージェント転送が動作していないということになります。
「$ echo "$SSH_AUTH_SOCK"
」コマンドで「SSH_AUTH_SOCK変数の出力」がされているかを見てみて、何も設定されていなければエージェント転送が動作が動作していないということです。
$ echo "$SSH_AUTH_SOCK"
# SSH_AUTH_SOCK変数の出力
> [No output]
$ ssh -T git@github.com
# SSHでgithubに入る
> Permission denied (publickey).
エージェント転送が正しく動作していればこれで完了となり、GitHubをサーバー上でSSH接続できるかと思います。エージェント転送が正常に動作していない場合は続けて設定をしていきます。
正常に動作しない時に試すべきトラブルシューティング
サーバー上でエージェント転送できるように設定する
サーバーのシステム設定でSSHエージェント転送が許可されていない可能性があるので、それを確認していきます。
まずは「ssh -v example.com」コマンドなどでsshの設定場所を確認します。
$ ssh -v example.com
# Connect to example.com with verbose debug output
> OpenSSH_5.6p1, OpenSSL 0.9.8r 8 Feb 2011
> debug1: Reading configuration data /Users/you/.ssh/config
> debug1: Applying options for example.com
> debug1: Reading configuration data /etc/ssh/ssh_config
> debug1: Applying options for *
$ exit
# Returns to your local command prompt
上記の例だと、「/etc/ssh/ssh_config
」というファイルが読まれていますので、「/etc/ssh/ssh_config
」の設定を確認します。
「$ sudo vi /etc/ssh/ssh_config
」などでファイルを開き、「ForwardAgent no
」と転送をブロックしている箇所などがないかを探し、ある場合はこの行を削除します。
設定を変えたらsshdを再起動します。※CentOS7なら「$ sudo systemctl restart sshd
」など。
再度、サーバーから出てSSHでログインし直して確認します。
「-A」オプションでサーバーにSSH接続して確認してみる
サーバーにSSH接続する時に「-A」オプションを付けてログインしてみて、「$ echo "$SSH_AUTH_SOCK"
」で値が表示されるか、「$ ssh -T git@github.com
」でGitHubに入れるかなどを確認してみます。
もし問題なければ、ローカルPCの「~/.ssh/config
」の設定(「ForwardAgent yes
」付近の設定)が間違っている可能性があるので見直しましょう。
サーバー上の「.git/config」設定
サーバー上で過去にHttps(Http)で接続していた場合、remote origin のURLをSShスタイルのURLに書き換える必要があります。
[remote "origin"]
url = git@github.com:yourAccount/yourProject.git
fetch = +refs/heads/*:refs/remotes/origin/*
まとめ
ローカルのSSHキーを使ってサーバー上からGitHubなどへSSH接続する方法を紹介しました。
- SSH キーを ssh-agent に追加する
※「~/.ssh/id_rsa_github」の例
$ ssh-add -K ~/.ssh/id_rsa_github - 「~/.ssh/config」に設定する
Host example.com ForwardAgent yes
- サーバー上でSSH接続でローカルの鍵を使って接続する
ご参考になれば幸いです。
※当サイトでは一部のリンクについてアフィリエイトプログラムを利用して商品を紹介しています