sshの公開鍵認証が有効にならない問題に遭遇しました。
公開鍵をコピーして、双方のパーミッションを正しく変更したのに、パスワードを要求されてしまいます
[root@server ~]# ll -a .ssh/
合計 12
drwx------. 2 root root 4096 10月 4 15:00 2015 .
dr-xr-x---. 3 root root 4096 10月 4 15:00 2015 ..
-rw-------. 1 root root 402 10月 4 15:00 2015 authorized_keys
[user123@client ~]$ ll -la .ssh/
合計 20
drwx------. 2 user123 user123 4096 10月 4 14:59 2015 .
drwx------. 4 user123 user123 4096 10月 4 14:58 2015 ..
-rw-------. 1 user123 user123 1675 10月 4 14:59 2015 id_rsa
-rw-r--r--. 1 user123 user123 402 10月 4 14:59 2015 id_rsa.pub
-rw-r--r--. 1 user123 user123 400 10月 4 14:58 2015 known_hosts
[user123@client ~]$ ssh root@server
root@server's password:
サーバ側の問題だろうと推測し、sshdのログを確認することにしました。/etc/ssh/sshd_config
を編集してログレベルを変更し、sshdを再起動します。
#LogLevel INFO
LogLevel DEBUG
[root@server ~]# /etc/init.d/sshd restart
sshd を停止中: [ OK ]
sshd を起動中:
もう一度ログインを試みると、/var/log/secure
に以下のようなログが出力されました。
Oct 4 15:09:27 server sshd[1366]: debug1: trying public key file /root/.ssh/authorized_keys
Oct 4 15:09:27 server sshd[1366]: debug1: Could not open authorized keys '/root/.ssh/authorized_keys': Permission denied
ここでピンと来て、SELinuxを無効化しました。
setenforce 0
公開鍵認証が有効になりました。やっぱりか。
[user123@client ~]$ ssh root@server
Last login: Sun Oct 4 15:09:20 2015 from 192.168.179.10
[root@server ~]#
SELinuxコンテキスト(ラベル)が不足していることで起きる現象とのこと。
http://stackoverflow.com/a/20818775
ラベルの再設定を行い、SELinuxが有効な場合でも公開鍵でログインできるようになりました。
[root@server ~]# restorecon -FRvv ~/.ssh
restorecon reset /root/.ssh context unconfined_u:object_r:admin_home_t:s0->system_u:object_r:ssh_home_t:s0
restorecon reset /root/.ssh/authorized_keys context unconfined_u:object_r:admin_home_t:s0->system_u:object_r:ssh_home_t:s0
そもそも、authorized_keysを直接編集するのが駄目でした。今回初めて知ったのですが、ssh-copy-id
コマンドを使うべきでした。
[user123@client ~]$ ssh-copy-id -i .ssh/id_dsa.pub root@server
root@server's password:
Now try logging into the machine, with "ssh 'root@server'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
パスワード認証後に、公開鍵の転送、パーミッションの設定、SELinuxコンテキストの設定など、もろもろをやってくれました。