sshのパスフレーズを省略 agentでログイン認証

公開鍵・秘密鍵でSSH接続する際、毎回パスフレーズを求められてめんどくさいときに使う。

SSH接続時のパスフレーズを省略する設定方法

SSH接続時のパスフレーズを省略する方法

SSHでつなぐときに、パスフレーズ入力するのめんどくせぇ…!

ってときに、SSHの秘密鍵は単にパスフレーズなしにすることは可能。

業務を効率化するのは正義!だから、パスフレーズ省略も正義!でも、実際に外部から侵入される事件が起こったら「なんでパスフレーズつけてないの!」と犯人探しが始まってしまうんですねぇ…。

しかし、「みんなそれぞれ長いパスフレーズをつけてください」という運用をすると、あちこちでパスフレーズを忘れちゃった事件が続出してしまい、運用にも支障がでる。

なので、「秘密鍵は絶対漏らすな。運用のためパスフレーズはつけない。漏れたとわかった時点で、すぐ秘密鍵を無効化する」という運用も少なくない。まあ、これがセキュリティ強度的に良いかどうかは別として、「パスフレーズ入力なしでSSH接続したい」というニーズは多い。だって、面倒くさいもん。

そこで、現実的な対応は「パスフレーズ自体をつけない」のではなく、「パスフレーズはつけるけど、パスフレーズ管理をエージェントというプログラムに任せて、人間は入力しなくていい」という運用になる。

パスワード自体つけてないと、問題が起こったときに「何も対策していないとは何事だ」と怒られると思う。上司とかを納得させるには、秘密鍵にパスフレーズをつけてエージェント管理というのが良い、ということになるのかな。

以下は、SSHの実行先をリモートマシン、現在操作しているのをローカルマシンとした設定例だ。以下のコマンドは、ローカルマシン上で操作。

なお、ローカルマシン上には秘密鍵と公開鍵が作成済みで、リモートマシン上では、authrized_hostsでホストが認証済みな前提。

SSHでパスフレーズ省略するコマンド入力例

パスフレーズ省略するコマンド入力例

$ eval `ssh-agent`
Agent pid 15679
$ ssh-add
Enter passphrase for /home/user1/.ssh/id_rsa: ※パスフレーズを入力
Identity added: /home/user1/.ssh/id_rsa (/home/kabuki1/.ssh/id_rsa)
$

上記のように実行すれば、とりあえずパスフレーズ入力が省略されるようになる。

ログイン時に、エージェントがパスフレーズ入力を裏でやってくれるのだ。

ssh-agent は、パスフレーズ入力を代行するエージェント

ssh-agent は、パスフレーズ入力を代行するエージェント
ssh-agentは、そのセッションに限り有効な代行エージェント。実行するとエージェントプロセスが立ち上がって、必要な環境変数が設定される。

$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-qVudcUJAIt0w/agent.16501; export SSH_AUTH_SOCK;
SSH_AGENT_PID=16502; export SSH_AGENT_PID;
echo Agent pid 16502;
$

具体的には、SSH_AUTH_SOCKやら、SSH_AGENT_PIDやらが設定される。設定されるんだけど、子プロセスの先で設定されるらしく、ssh-agent実行後に環境変数を表示させてみても、何も設定されてない。

$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-n2NfZpVS255C/agent.17210; export SSH_AUTH_SOCK;
SSH_AGENT_PID=17211; export SSH_AGENT_PID;
echo Agent pid 17211;
$ echo ${SSH_AUTH_SOCK}

$

evalを使って実行すると、現セッションに環境変数が設定される。

$ eval `ssh-agent`
Agent pid 17416
kabuki@ubuntu:~$ echo ${SSH_AUTH_SOCK}
/tmp/ssh-3HwOtYqcdGNC/agent.17415

ssh-add 対象の秘密鍵を追加するコマンド

ssh-add 対象の秘密鍵を追加するコマンド
ssh-addは、対象の秘密鍵(デフォルトだと、~/.ssh/id_rsa)を追加するコマンド。

Enter passphraseのところでパスフレーズを入力すればOK。

$ ssh-add
Enter passphrase for /home/user1/.ssh/id_rsa:
Identity added: /home/user1/.ssh/id_rsa (/home/user1/.ssh/id_rsa)
~$

ssh-add -l で登録した秘密鍵が確認できる。

ssh-add -K で鍵の場所指定も可能。

sshでパスフレーズなしでリモートホストでシェル実行が可能に!

sshでパスフレーズなしでリモートホストでシェル実行が可能に!
こんな感じで、リモートシェル実行ができる。(xx.xx.xx.xxは、IPアドレス)

$ ssh xx.xx.xx.xx 'df -k'
Filesystem 1K-blocks Used Available Use% Mounted on
udev 1864196 0 1864196 0% /dev
tmpfs 377204 904 376300 1% /run
/dev/sda1 9983232 3824224 6142624 39% /
tmpfs 1886020 0 1886020 0% /dev/shm
tmpfs 5120 0 5120 0% /run/lock
tmpfs 1886020 0 1886020 0% /sys/fs/cgroup
/dev/loop1 31744 31744 0 100% /snap/snapd/9721
/dev/loop3 56704 56704 0 100% /snap/core18/1885
/dev/loop2 31744 31744 0 100% /snap/snapd/9607
/dev/loop4 131328 131328 0 100% /snap/google-cloud-sdk/156
/dev/sda15 106858 3671 103188 4% /boot/efi
/dev/loop5 56704 56704 0 100% /snap/core18/1932
/dev/loop6 131456 131456 0 100% /snap/google-cloud-sdk/157
tmpfs 377204 0 377204 0% /run/user/1002

最初にいったん手動でパスフレーズ入力しなきゃいけないけど、GCPを使うときなんかはまあまあ便利かも。

sshでパスフレーズ省略のまとめ

まとめ

  • ssh-agentとssh-addでパスフレーズ省略可能
  • ssh-agentは、evalをつけて実行する
  • ssh-agentはサーバへの接続セッションごとに有効っぽい