ラベル ssh の投稿を表示しています。 すべての投稿を表示
ラベル ssh の投稿を表示しています。 すべての投稿を表示

2015年9月6日日曜日

[ssh] OpenSSHのアップデートでssh-agentがパスワードを覚えてくれなくなった問題への対処

ssh-agent/ssh-addを利用してsshを用いたサーバーへのログイン時のパスワード入力を省略している方、OpenSSHのアップデートにより、毎回パスワード入力を求められるようになった場合は以下の設定を疑ってみてください。

問題の症状:

OpenSSHパッケージを最新版にアップデートすると発生するようになった問題です。ssh-agentを起動してssh-addで鍵を正しく登録しているにも関わらず、sshコマンドを実行する度に"password:"というプロンプトが表示されてパスワードの入力を求められてしまいます。

環境:

問題に遭遇&解決した私のcygwin環境では以下のバージョンで問題が発生することを確認しました。
  • OpenSSH_7.0p1, OpenSSL 1.0.2d 9 Jul 2015
  • OpenSSH_7.1p1, OpenSSL 1.0.2d 9 Jul 2015

以下のバージョンでは問題は発生していませんでした。
  • OpenSSH_6.9p1, OpenSSL 1.0.2d 9 Jul 2015

原因と解決方法:

OpenSSHがデフォルトでサポートするkey typeに変更があったのが原因です。私の場合は鍵がDSAであったため、"ssh-dss"というkey typeをサポートするように設定することで、以前通り正しくパスワードを覚えてくれるようになりました。
具体的には~/.ssh/config(もしくは/etc/ssh_config)に以下の記述を追加すれば、デフォルトではサポートされていないキータイプがサポートされます。
PubkeyAcceptedKeyTypes +ssh-dss

自分の鍵のタイプは以下のコマンドで確認可能です。
% ssh-add -l
1024 xx:yy:8e:4f:72:2c:a4:b9:ad:ce:e7:80:a3:5d:e6:0f /home/xxxxx/.ssh/id_dsa (DSA)

cygwinのMLに質問を投げたところGeorgeさんという親切な方がアドバイスがとどき、教わった解決方法です。感謝。

関連情報:

1024bitの鍵は安全ではないので、2048bit以上の鍵を使うのが正しい解決方法だよ、という指摘をいただきました。DSAは1024bitまでしか扱えないようですが、RSAなど他のタイプで2048bit以上の鍵を作ることのがよいようです。RSAの2048bitの鍵を作って確認したところ、PubkeyAcceptedKeyTypesの設定を変えなくても期待通り動作しました。

参考:

2012年7月23日月曜日

[ssh][linux][cygwin] ssh-agentの重複起動を防ぐには

ssh, sftp, scp でパスワードの入力を省略するにはssh-agentを使います。

このssh-agentは便利なのですが、何も考えずに利用しているとターミナル毎に個別にssh-agentを起動する羽目になり、気がつくとssh-agentが複数動いている、という状況に陥ってしまいます。

これはssh,sftp,scpなどのクライアントツールが、ssh-agentを利用するために2つの環境変数(SSH_AUTH_SOCKとSSH_AGENT_PID)を参照しているためです。逆に言うと、これらの環境変数をターミナル間で共有することができれば、ssh-agentをその都度起動しなくてもよくなり、共有することができます。


このブログで見つけたシェルスクリプトを.bashrc(もしくは.tcshrc)に追加することで、ターミナル起動時(=シェル起動時)に以下のお世話をしてくれます。

  • ssh-agentが起動済みかどうかをチェック
  • 未起動であれば起動
    • 2つの環境変数を$HOME/.ssh/environmentに記録
    • その後、ssh-addコマンドも実行してパスフレーズ入力を促す
  • 起動済であれば、2つの環境変数の設定を引き継ぐ
.bashrcへの追加スクリプト(前述ブログのまま)

SSH_ENV=”${HOME}/.ssh/environment”
SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS=”-s”

function start_agent {
    echo -n “Initialising new SSH agent…”
    ${SSHAGENT} | sed ‘s/^echo/#echo/’ > “${SSH_ENV}”
    echo succeeded
    chmod 600 “${SSH_ENV}”
    . “${SSH_ENV}” > /dev/null
    ssh-add
}

# Source SSH settings, if applicable

if [ -f “${SSH_ENV}” ]; then
    . “${SSH_ENV}” > /dev/null
    #ps ${SSH_AGENT_PID} doesn’t work under cywgin
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
    if [[ -z `ssh-add -l | grep “${HOME}/.ssh/id_”` ]]; then
        ssh-add
    fi
else
    start_agent;
fi


.tcshrcへの追加スクリプト(前述ブログのbashスクリプトをtcshスクリプトにポート)

setenv SSH_ENV "$HOME/.ssh/environment"
setenv SSHAGENT `which ssh-agent`
setenv SSHAGENTARGS "-c"

if ( -f "${SSH_ENV}" ) then
    source "${SSH_ENV}"
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent > /dev/null
    if ( $status == 1 ) then
        #echo "no agent found."
        goto call_start_agent
    endif
    ssh-add -l | grep "${HOME}/.ssh/id_" > /dev/null
    if ( $status == 1 ) then
        #echo "no key added."
        goto call_ssh_add
    endif
else
    goto call_start_agent
endif
goto exit_ssh

# Source SSH settings, if applicable
call_start_agent:
    echo -n "Initialising new SSH agent... "
    ${SSHAGENT} | sed 's/^echo/#echo/' > "${SSH_ENV}"
    echo succeeded
    chmod 700 "${SSH_ENV}"
    source "${SSH_ENV}"

call_ssh_add:
    ssh-add

exit_ssh: