SSHについて
ssh周りのいろいろなメモ.
ポートフォワードを使うと,ルータにsshサーバが入っていれば,その向こう側のプライベートIPのマシンにつなぐことができるので嬉しい.これはVPNになるのだろうか.
slogin host -L 9999:host2:80として,ローカルホスト:9999に接続すると,hostを通ってhost2:80にフォワードされる.host2はhostから見えればローカルホストから直接見えなくてもいい.
認証転送はあるマシンのssh-agentに問い合わせをして認証してしまうもの.
背景
背景
- 秘密鍵は盗まれても安心なようにパスフレーズを設定する.
- でもいちいちパスフレーズを入力するのは面倒臭いので,ssh-agentを使用する.
- ssh-agentはやばいマシンで動かすとクラックされて秘密鍵を破られるので,やばいマシンで動かさなくてもよいようにOpenSSHの認証転送機能を使う.こいつを使うと信頼できるマシン上のssh-agentと通信して認証を転送できる.
- マシンAを信頼できるマシンと想定して公開鍵をマシンB,Cのauthorized_keysに入れる.
- マシンA上で
eval `ssh-agent` (バッククォート) ssh-add .ssh/id_dsa
あと/etc/ssh/ssh_configでForwardAgent yesにする. - するとマシンAからマシンB,そしてそのマシンBからマシンCにパスフレーズの入力なしでsloginできる.
- マシンAだけに秘密鍵を置けばよい
- マシン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 keychainkeychainの特徴.
- 内部で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
とする.

