blogですかい

株式会社Loco Partnersに勤めるエンジニアうちの一人のブログ。仕事、プライベートで学んだことなどを発信し、その内容がたとえ少数でも誰かの役に立ったらなら、それはとっても嬉しいなって

DSA鍵でSSHパス無しログインをしようとしたらハマった

パスワードの入力無しでsshログインしたいことって、ありますよね。
例えばrsyncをcronで叩いて別マシンとファイルを同期させたい、とか。

DSA鍵ペアを使ってパスの入力無しにSSHでログインする

  • ローカルマシン(接続する側) : local
  • リモートマシン(接続される側) : remote
  • ログインするユーザ : root

の場合(local,remote等はご自分の環境に合わせて置き換えてください)

注意
rootがsshでログインできる状態には通常すべきではありません。
今回はLANからしか接続できないサーバなので、rootでのログインを許可しています。
またrootでのログインを許可していない環境でも、適切なファイアウォールの設置、
/etc/hosts.denyの設定、待受けポートの変更等でしっかりサーバを守ってください。

DSA鍵ペアの生成

root@local ~#ssh-keygen -t dsa

3度入力を求められますが、何も入力せずEnterを3回叩く。
~/.ssh ディレクトリ下に、id_dsa,id_dsa.pub という2つのファイルが生成される。
id_dsaが秘密鍵、その場所から移動・コピーなどはせず、そのまま厳重に保管する。
id_dsa.pubが公開鍵、リモートマシンにコピーして、認証に用いる。

公開鍵をリモートマシンに設置
root@local ~#scp /root/.ssh/id_dsa.pub remote:/root/.ssh/local.id_dsa.pub
または
root@remote ~#scp local:/root/.ssh/id_dsa.pub /root/.ssh/local.id_dsa.pub
パスワードの入力が求められます。パスワードを入力してください。
リモートの ~/.ssh に local.id_dsa.pub が生成されます。(ローカルのid_dsa.pubの複製)
※公開鍵の移動・コピーには必ず暗号化された通信を用いてください。
んでんでんで

root@remote ~#cp ~/.ssh/local.id_dsa.pub >> ~/.ssh/authorized_keys
root@remote ~#chmod 600 ~/.ssh/authorized_keys
root@remote ~#rm -f ~/.ssh/local.id_dsa

authorized_keys は必ず、所有者以外読み書きできないようにしてください。
以上の設定で、localからremoteへパスワード無しでログインできます。


こんな簡単な設定のどこでハマったのか
ここから本編。

種明し
私の場合は、 /root のownerが何故か一般ユーザになっていたため(なにそれこわい)、
鍵ペアを使ったログインができなくなっていました。
chown root:root /root とすることで、DSA鍵でログインできるようになりました。

解説
リモートの ~/.ssh/authorized_keys にローカルの公開鍵が設定されていても、
他のユーザがauthorized_keysを書き換えられる状態になっていると、
パスワード無しでのログインはできないようになっています。
例えば、

上記のような状態だと、他のユーザがauthorized_keysを書き換えることができます。
~/ は755、~/.ssh 及び ~/.ssh/authorized_keysは700と、
パーミッションを確実に設定しましょう。