ssh-agentを使う
非暗号化ディスクにSSH鍵をパスフレーズ保護なしに保存するのは危険。
そして、known_hostsから接続先がわかってしまうと。もう最悪。
そのために、SSHを安全に扱うには、known_hostsのハッシュ化と、ssh秘密鍵のパスフレーズ化が欠かせない。
しかし、パスフレーズ化すると毎回パスフレーズを尋ねられるのが不便である。
何度もパスフレーズを入力していると、ショルダーハッキングが懸念される。
これを解消するために、パスフレーズを解除した鍵をメモリに保存しておけばいい。
そのためのソフトウェアがssh-agent である。
ssh-agentの使いかた
$ eval "$(ssh-agent)" $ ssh-add
ssh-agent を起動した後、ssh-addで鍵を登録する。
ssh-agentを使うと
ssh-agentは実行すると起動される。
takuya@raspi-ubuntu:~$ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-WkClDeJfH6Fd/agent.1297; export SSH_AUTH_SOCK; SSH_AGENT_PID=1298; export SSH_AGENT_PID; echo Agent pid 1298;
見て分かる通り、環境変数が出てきます。この環境変数を使えば、ssh-agentのコマンド ssh-addを使えるわけです。
ログイン時に自動起動設定
.bashrc にはアレコレ処理が挟まるのでbashrc は分割しておきます。
bashrc を分割するように設定して
mkdir .bashrc.d cat <<EOF >> .bashrc if [[ -e ~/.bashrc.d/ ]]; then for i in ~/.bashrc.d/*; do source $i done fi EOF
ssh-agentをログイン時に起動するようにする。
cat <<EOF > .bashrc.d/00-ssh-agent.sh ## ssh-agent を起動する ## author: takuya ## last-modified 2022-02-18 function start_ssh_agent(){ agent="$(ssh-agent)" #echo $agent eval $agent } start_ssh_agent; unset start_ssh_agent; EOF
#ログアウト処理を追加する。
ssh-agentの終了は 、ssh-agent -k
です。これをログアウト処理として入れておきます。
ログアウト時に処理するには、.bash_logout
を使います。
cat <<EOF >> .bash_logout if [[ ! -z $SSH_AGENT_PID ]]; then agent="$(ssh-agent -k)" eval $agent fi EOF
ssh-agentを使う意味とパスワード認証について
パスワード認証の利点
パスワードには、総当りリスク。盗難リスク(キー入力読み取りなど)が存在する。公開鍵認証は、パスワードの総当り対策には有効である。
しかし、公開鍵認証だとパスワードを入力しないから安心というのは違う。秘密鍵を取られてしまうと元も子もないのである。非暗号化ディスクを使っていると盗難などで盗まれます。そして、known_hostsから接続先が判明するので。もう最悪。
パスワードだけでも安全性は確保できる。fail2banやアカウント・ロックアウトで総当りに対応していれば、パスワードでも十分安全である。パスワードが、盗難リスク対応力では勝るのです。
ハイブリッド化
パスワードの対盗難対策、公開鍵認証の総当り対策、それぞれ利点があります。これをハイブリッドすればいいわけです。
つまり、記憶による認証コードと、鍵ファイルによる所有による認証をハイブリッドすれば多要素認証に近いことが行えるのです。そこで鍵ファイルにを暗号化して保存しておくのです。
秘密鍵にパスフレーズを掛けて盗難・流出に備えるのです。これでリスクを減らせます。
頻繁なパスワード入力は単純パスワードを促す。
しかし、今度はパスフレーズを何度も入力しなくてはいけません。
SSHは頻繁に利用します。パスワードを頻繁に入力させると管理リスクが発生します。まず、ショルダーハッキングの危険性があります。つぎに頻繁に何度も入力では、長いパスワードや複雑なパスフレーズが嫌われます。長いパスワードは採用されず、単純なパスを使うユーザーが増えてしまいます。
ssh-agent 自動化による対応
では、どうしたらいいでしょうか。利用前に秘密鍵のパスフレーズで暗号化を解除し、平文の秘密鍵をつくり、利用後に削除すればいいわけです。
今度は、利用後に削除するのを忘れた場合が怖いです。そこで自動化です。
そこで自動化するためにssh-agentを使います。パスフレーズなし平文秘密鍵を管理すればいいわけですね。
これで、リスクを減らすことができます。
ssh-agent管理で未暗合化ストレージのリスク低減
秘密鍵を暗号化して保存しておけば、盗難リスクに備えられます。未暗号化ストレージにも保存してもそれなりに安心です。
平文秘密鍵を管理しておけば、単純なパスフレーズを防止でき削除し忘れによる盗難リスク再発も防止できます。
このように多層防御が実現できるのです。もちろん何でもかんでも「ssh-agentしてれば安心」というわけではありません。今まで見てきたとおり、盗難リスク・漏洩リスク・パスワード単純化に備えるのがssh-agentの目的です。ディスクを暗号化していたり、ssh踏み台をつかっていてコネクションを管理している、IPアドレスを制限しているなど別な手段を用いてる場合にはこの対策をとっても得られるメリットは殆どありません。「〇〇すれば安心」というやり方だけを丸暗記する、丸暗記セキュリティは穴を生み出していても気づかないので自重するべきです。
ディスクを暗号化してない人はssh-agent使いましょう。