前幾天裝了一台 CentOS 6.4 作業系統,結果第一個發生的問題就是遠端 SSH 連線時,無法透過金鑰登入,出現的問題正是 “Server refused our key” 錯誤,經過進一步查詢與了解後,原來又是 SELinux 機制搞的鬼,當然,SELinux 是個可以讓你的 Linux 非常安全的防護機制,如果可以的話,建議不要關閉這個功能。本篇文章將說明如何正確設定 SELinux 標籤,讓你可以正確的使用金鑰登入主機。
下圖是登入失敗的樣子:
先來看看我通常建立 .ssh/authorized_keys 的過程 ( 或是使用 ssh-copy-id 來把公鑰複製到遠端電腦 )
從這個過程可以看出,建立完成之後的 .ssh/authorized_keys 檔案標籤(Label)為 user_home_t,這是使用者目錄的預設值,任何使用者建立的檔案,預設都會標上這個標籤。
不過,由於 .ssh 資料夾與 .ssh/authorized_keys 檔案會被 sshd 讀取,若要讓目錄與檔案擁有正確擁有讀取權限的話,該 .ssh 目錄必須被標示為 user_home_dir_t 標籤,而 .ssh/authorized_keys 檔案則必須被標示為 ssh_home_t 標籤才行。
要解決這個問題,你只要登入帳號後,輸入以下指令,將該目錄與其子目錄與檔案全部都還原成 SELinux 安全強化標籤的預設值,如此一來就能立即解決此問題:
如果想要將主機上所有目錄與使用者 (含 root 帳號) 都一併重設的話,也可以考慮以下指令:
另一個解決方法,就是透過 ssh-keygen 工具產生 .ssh 目錄,如此一來之後建立的檔案也會套用正確的 SELinux 標籤,如下圖示:
最後,分享關閉 SELinux 的方法,或許有人有需要:
設定暫時關閉 SELinux (執行完立即生效)
echo 0 > /selinux/enforce
若要永久關閉 SELinux 的限制,需修改 /etc/selinux/config 設定檔,將 enforcing 改成 disabled 即可
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
相關連結