必要なファイルも設置済み、パーミッションも問題ない。おんなじ設定で他のユーザは公開鍵認証で接続できているのになんで?を、解決するまでのメモ。
1. 原因
公開鍵認証できないユーザはホームディレクトリが他と違った(/home/[ユーザID]/でなかった)ため、authorized_keysへのアクセスをSELinuxが禁止していた。
2. 解決までの流れ
2-1. とりあえずauthorized_keysとパーミッションをチェック
過去にauthorized_keys作成時にコピー&ペーストで変なところに改行を入れてしまったことがあったので、目視だけでなく成功ユーザのauthorized_keysとdiffを取ってチェック。
パーミッションもしつこいくらいに確認、さらに再設定したが改善せず。
authorized_keysの内容もパーミッションも間違ってないと判断。
2-2. クライアントをデバッグモードで確認
成功ユーザのデバッグ表示と並べて確認。
$ ssh -v 〜 -vv
//有意な情報なし。
$ ssh -vvv
:
debug3: receive packet: type 51
問題のユーザはインストーラーで作成されたユーザで、ホームディレクトリが「/var/lib/pgsql/」と公開鍵認証できたユーザの「/home/[ユーザID]/」でないのが気になりだす。試しに「/home/postgres/」を作成してssh環境を整えてみるが改善せず。
クライアント側からの調査を諦めてサーバ側での調査に移る。
2-3. サーバをデバッグモードで確認
設定を変更してsshを再起動して。
$ cd /etc/ssh
$ sudo diff sshd_config sshd_config.bk
< LogLevel DEBUG
+++
> #LogLevel INFO
$ sudo systemctl restart sshd
ログを確認したらなんか出た。
$ sudo tail -f /var/log/secure
:
debug1: Could not open authorized keys '/var/lib/pgsql/.ssh/authorized_keys': Permission denied
:
「/var/lib/pgsql/.ssh/authorized_keys」は認識(存在)してるけどパーミッションが無い? えー、ちゃんと設定してますやん、なんで?
2-4. SELinuxにたどり着く
「Could not open authorized keys ‘/var/lib/pgsql/.ssh/authorized_keys’: Permission denied」で検索してsshの公開鍵認証が有効にならない(解決済み)にたどり着く。
SELinuxかー!!
確認してみると。
//SELinuxが有効になってる
$ getenforce
Enforcing
//公開鍵認証できたユーザ
ls -Z authorized_keys
unconfined_u:object_r:ssh_home_t:s0 authorized_keys
//公開鍵認証できなかったpostgres
ls -Z authorized_keys
unconfined_u:object_r:postgresql_db_t:s0 authorized_keys
設定変更
$ sudo chcon -t ssh_home_t /var/lib/pgsql/.ssh/authorized_keys /var/lib/pgsql/.ssh
$ ls -Z authorized_keys
unconfined_u:object_r:ssh_home_t:s0 authorized_keys
無事接続できました。
3. 追記
- 今回は、chconで設定変更したのでrestoreconで元に戻ります。永続的な変更はどうするか検討中。SELinux自体を止めるかも。
- 文書にして目立つところに残しておくって大事。
- SELinuxは鬼門だなー。一度きちんと勉強せんといかんとは思うんだけどプログラミングの方もやらなきゃいけないことがいっぱいあるからなぁ。
- sshd_configのログレベル戻すの忘れずに。