公開鍵・秘密鍵で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_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/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でパスフレーズなしでリモートホストでシェル実行が可能に!
こんな感じで、リモートシェル実行ができる。(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はサーバへの接続セッションごとに有効っぽい