ファイヤープロジェクト
SSHについて
2004-04-25T23:25+09:00   matsu
ssh周りのいろいろなメモ.
ポートフォワードを使うと,ルータにsshサーバが入っていれば,その向こう側のプライベートIPのマシンにつなぐことができるので嬉しい.これはVPNになるのだろうか.
slogin host -L 9999:host2:80
として,ローカルホスト:9999に接続すると,hostを通ってhost2:80にフォワードされる.host2はhostから見えればローカルホストから直接見えなくてもいい.
認証転送はあるマシンのssh-agentに問い合わせをして認証してしまうもの.
背景
  1. 秘密鍵は盗まれても安心なようにパスフレーズを設定する.
  2. でもいちいちパスフレーズを入力するのは面倒臭いので,ssh-agentを使用する.
  3. ssh-agentはやばいマシンで動かすとクラックされて秘密鍵を破られるので,やばいマシンで動かさなくてもよいようにOpenSSHの認証転送機能を使う.こいつを使うと信頼できるマシン上のssh-agentと通信して認証を転送できる.
やり方
  1. マシンAを信頼できるマシンと想定して公開鍵をマシンB,Cのauthorized_keysに入れる.
  2. マシンA上で
    eval `ssh-agent` (バッククォート)
    ssh-add .ssh/id_dsa
    
    あと/etc/ssh/ssh_configでForwardAgent yesにする.
  3. するとマシンAからマシンB,そしてそのマシンBからマシンCにパスフレーズの入力なしでsloginできる.
メリット
  1. マシンAだけに秘密鍵を置けばよい
  2. マシンCのauthorized_keysにマシンBの公開鍵がないにもかかわらず,マシンAをsshセッションの起点にしていればマシンBからマシンCにパスワードやパスフレーズなしでsloginできる.もちろんさらにそこからマシンCからマシンBにもパスワードやパスフレーズなしでsloginできる.
.xsessionで(ssh-askpassを組み合わせて)ssh-agentを起動している場合は問題ないのだが,ssh-agentはログアウトしてログインし直すと,別のssh-agentを起動する必要がある.つまり,一回ログインしてログアウトするまでの間はパスフレーズの入力は一回でよいのだが,再度ログインするとまたパスフレーズを入れる必要がある.ということは,例えばXでターミナルをバンバン立ち上げると毎回パスフレーズを入力する必要がある.それが嫌なので.xsessionでssh-agentを起動している人が多いのだろう.が,それとても一回ログアウトしてまたログインすると,やっぱりパスフレーズを入力する必要が生じる.また,Xでターミナルをバンバン立ち上げて毎回パスフレーズを聞かれるのは,その度にssh-agentが起動している結果で,それはムダである.これらの問題を解決するにはkeychainを使用する.
apt-get install keychain
keychainの特徴.
  • 内部でssh-agentが起動しているかどうかを見て,起動しているなら新たにssh-agentを起動したりしない.ssh-agentを実行し,環境変数をファイル.ssh-agent-マシン名に保存する.
  • ログアウトしてもssh-agentは死なない.
  • なので一回ssh-addした秘密鍵のパスフレーズを毎回いれる必要がない.
使い方
keychain .ssh/id_dsa
これで上記の特徴のような動きをする.こいつを踏まえて.bash_profileなどに以下を追加(※).
keychain .ssh/id_dsa
. .ssh-agent-${HOSTNAME}
. .ssh-agent-${HOSTNAME}は,保存したssh-agentのための環境変数が入っている.これを実行することですでに起動しているssh-agetに接続する.以下はkeychainの重要なオプション
--clear
ssh-agentから私有鍵のキャッシュを消す.長時間離席するならこれをやった方がよかろう.
-k
ssh-agentを皆殺し
※ 記録をとっていないのだが,これは昔のKeyChainのための設定である.KeyChain 2.0.3では.bash_profileなどでsourceするファイルが異なる.
keychain -q .ssh/id_dsa
. ~/.keychain/${HOSTNAME}-sh
とする.
matsu(C)
Since 2002
Mail to matsu