2021年3月19日金曜日

ssh-agent で ssh-add を自動で入力する方法

概要

ssh-agent を使ってパスワードやパスフレーズの管理を行っている場合、マシンがリブートした場合や再ログインした場合は ssh-agent のセッションがなくなるため再度 ssh-add しなければなりません
本当はセキュリティのことも踏まえて毎回パスフレーズを入力するのが良いのですが面倒なので自動化する方法を紹介します
あまりよろしくはない方法なので自己責任でお願いします

環境

  • Ubuntu 18.04

SSH_ASKPASS を使う

ssh-add をするときに環境変数 SSH_ASKPASS を設定すれば勝手にそこからパスワードを拾って登録してくれるという機能です
SSH_ASKPASS に実行可能なシェルスクリプトを設定すればその結果をパスワードとして使ってくれます

  • vim echo_pass.sh
#!/bin/sh
echo "xxxxxx"
  • chmod +x echo_pass.sh

xxxxxx の部分はパスワードを設定してください
あまりよろしくないという点はここでパスワードを平分で保存しているのでアンセキュアになるという点です
何かしらの方法で暗号化/復号化するような仕組みのシェルスクリプトになっていればある程度はセキュアになるかなと思います
今回はテストなので平文で進めます

SSH_ASKPASS + ssh-add で自動登録するコマンド

以下のような感じで使います
実際叩いてみるとわかりますがプロンプトで止まることはなく鍵が登録されることがわかると思います

  • DISPLAY=:0.0 SSH_ASKPASS=/path/to/echo_pass.sh setsid ssh-add /path/to/private_key.pem </dev/null

あとは動作確認として対象のサーバに ssh ログインしてみましょう
ちゃんとパスワードの入力を求められることなくログインできるようになっていると思います

おまけ: ssh-agent を自動起動する

上記のコマンドは ssh-agent が起動していることが前提です
ログイン時にてっとり早く起動させたい場合は以下の情報を ~/.bash_profile などに記載します

if [ -z "$SSH_AUTH_SOCK" ]; then
   # Check for a currently running instance of the agent
   RUNNING_AGENT="`ps -ax | grep 'ssh-agent -s' | grep -v grep | wc -l | tr -d '[:space:]'`"
   if [ "$RUNNING_AGENT" = "0" ]; then
        # Launch a new instance of the agent
        ssh-agent -s &> .ssh/ssh-agent
   fi
   eval `cat .ssh/ssh-agent`
fi

これでログイン時に勝手に ssh-agent が起動します
ただしこの場合だとログインすることが前提なのでサーバが再起動した際には上がってきません
サーバが起動した際に ssh-agent を起動させたい場合は systemd 配下 で起動させましょう

最後に

ssh を使うツール (ansible など) にも応用できるのでプロンプトが出て処理が止まっちゃうようなジョブなどに使うと良いかなと思います
何度も言いますがパスワード平文は危険なので何かしら工夫して使うようにしてください

参考サイト

0 件のコメント:

コメントを投稿