Palmsonntagmorgen

NGSデータを使った解析と、その周辺。

SSHその2 ssh のパスワード入力を省略 (ssh-agent)

諸事情によりまたしばらく基礎的な内容になります。

クラウドサービス含め、サーバに接続する時にはセキュリティ面を考えて公開鍵方式のSSHを利用するのが一般的です。 公開鍵については過去に記事にしています。

rnakato.hatenablog.jp

しかしサーバに接続するたびにパスワードを入力するのは面倒ですね。だからと言って、短く簡単なパスワードにしてしまう(あるいはパスワードなしにしてしまう)のはセキュリティ面で大きな問題になります。

そんな時にはssh-agentを使うと、パスワードの入力を省略することができるようになります。

参考記事

Linuxの場合

Linux (Windows WSL含む) では、以下のコマンドで起動します。

$ eval `ssh-agent` 

次に、以下のコマンドで公開鍵のパスワードをssh-agentに登録します。

$ ssh-add  <秘密鍵のファイル名>
(秘密鍵のパスワード入力)

こうすると、以後サーバログイン時に公開鍵のパスワード入力が不要になります。

ただこの方法では、ターミナルを立ち上げるたびに自分でssh-agentを起動しなければなりません。 ターミナル起動時(またはログイン時)にssh-agentが自動起動されるようにするには、ホームディレクトリにある .bashrc (または.bash_profile)に以下の内容を追記します。

if [ -f ~/.ssh-agent ]; then
    . ~/.ssh-agent
fi
if [ -z "$SSH_AGENT_PID" ] || ! kill -0 $SSH_AGENT_PID; then
    ssh-agent > ~/.ssh-agent
    . ~/.ssh-agent
fi
ssh-add -l >& /dev/null || ssh-add

ここでの記述方法には色々あるのですが、ひとまずこのままコピー&ペーストしてしまって大丈夫です。

Macの場合

上の参考記事によれば、Mac OS X LeopardEl Capitan まではssh-agentのかわりにKeychainというプログラムが自動的に実行されており、ssh-agentのマニュアル起動は不要でしたが、macOS Sierra では自動では実行されない設定になったそうです。 自動起動のため、Sierra では以下の設定を行います。

(実機で確認していないため、訂正あればコメントをお願いします。)

  • ~/.ssh/config に以下を追記(ファイルがなければ新規作成)
Host *
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile <秘密鍵のパス>

なお最後の行 IdentityFile <秘密鍵のパス>秘密鍵の場所を毎回 -iオプションで指定しなくてもよい設定にするためのもので、ssh-agentとは直接関係はありません。

サーバ上にも設定を反映する:ForwardAgent

これはMac/Linux共通です。

使っているサーバが複数ある場合、例えばローカルPCからサーバAにssh接続し、サーバAからサーバBにsshでログインする、あるいはscpでデータを送りたいというケースが発生します。 そうなるとサーバ上にも秘密鍵を置く必要がありますが、それはセキュリティ的に問題です。 ここでForwardAgentという仕組みを使うと、ローカルPCのssh設定をそのままログインしたサーバに反映させることができます。

具体的には ~/.ssh/config に以下を追記するだけでOKです。(ファイルがなければ新規作成)

ForwardAgent yes

こうするとローカルのssh-agent設定がサーバに引き継がれますので、サーバ間のssh, scpをする際に秘密鍵、パスワードの入力が不要になります。

注意点

ssh-agentを起動している間はパスなしでサーバにログインできてしまうため、共用PCなどで設定する際は注意が必要です。 他の人が使う可能性がある環境、職場で席を長く離れる場合などは ssh-add -D で登録した秘密鍵を削除するなどするとより安心です。