正しいssh/scpの自動運転は:
が正解(現時点では)。
必要最小限の作業に制限する方法としては、
毎回完全に同じコマンド(引数含めて)しか実行しないなら、 authorized_keysでcommand='...'を使って実行できるコマンドをそれだけ に制限。
ファイル転送用途だけなら、scponlyとかの転送用途に限定されたシェルを リモートのアカウントのシェルに設定する。
上記2つのケースには該当しないけれど、特定のコマンドに実行を制限した い時はrestricted shellとか。
可能ならchroot patchをあてたsshdを使ってchroot環境作るのも良い。
あるいはauthorized_keysのcommand='...' 機能を使って強制的に特定のコ マンドを実行された場合に、本来リモートから(ssh host 'cmd...'等で)与 えられたコマンドラインが環境変数SSH_ORIGINAL_COMMANDに保存されるの を利用して、SSH_ORIGINAL_COMMANDを自前で安全に処理するコマンドを作 るとか。
とかって方法が考えられる。さらに、どうしても必要最小限のコマンドに制限 できない場合は、接続元のホストを制限した上で接続元ホストの方を守るのと、 実行されたコマンドのログをacct等で確実に取る(必要ならアラートも飛ぶよ うにする)。
あと、意外に多い誤解が、「パスフレーズなしの秘密鍵は(パスワード認証に おける)パスワードなしと同じくらい危険」とか、「秘密鍵のパスフレーズを 変更すると、公開鍵も変化する(公開鍵の設定しなおしが必要)」とかって誤解 な。
秘密鍵のパスフレーズは秘密鍵ファイルを暗号化してるだけのもんです。暗号 化された秘密鍵をパスフレーズつかってデコードする処理は、完全にローカル で行なわれて、リモートのサーバには丸っきり関係がない。逆に言うと秘密鍵 ファイルを悪者に盗まれてしまったら、たとえパスフレーズが設定されていて も、↑のCrackみたいなオフライン攻撃が可能、つまり悪者は手に入れた秘密 鍵をどっか別の安心して作業ができるマシンでじっくり辞書攻撃なり総当り攻 撃なり使ってパスフレーズを探すことができる。
なので、「秘密鍵を他人に渡さない」ということの方が、パスフレーズを設定 することよりも遥かに重要。パスフレーズはいざという時の時間稼ぎでしかな い。
それが分かれば、ssh-agentやkeychain使うより、いさぎよくパスフレーズな しにしちゃった方がいいってのも分かると思う(自動運転の場合ね)。だって、 適切なパーミッションが設定されている秘密鍵ファイルを盗める人間(rootと か)なら、常駐しているssh-agent/keychainも乗っ取れるでしょ。パスフレー ズ設定してる意味がない。「なんかの拍子にssh-agentのプロセスが死んじゃっ てて(めったにないけど)、自動運転に失敗した」とか、「サーバをリブートす るたびに、パスフレーズ入力してssh-agent起動しないといけない(運用担当者 全員にパスフレーズ教えないといけない)」とかって、余計な手間が増えるだ け。
そんなことにいらん手間かけるぐらいなら、秘密鍵が盗まれちゃった場合でも 被害が最小限で済むように(↑で書いたような実行可能なコマンドの制限等の 対策を)がんばった方がいい。