Symlink
OpenSSH 拒絕帶有符號連結的 .ssh 目錄
在我的環境中,實際的 .ssh 目錄存在於外部設備上,並
~/.ssh
通過符號連結從它連結到。openssh
作為客戶端使用沒有問題,但sshd
不允許使用其中的公鑰進行身份驗證。有什麼方法可以
.ssh
在外部設備上使用目錄嗎?journalctl -u sshd
Authentication refused: bad ownership or modes for directory /pool/secure/ssh
權限
$ ls -ld ~/.ssh lrwxrwxrwx. 1 foobar foobar 28 Mar 7 19:59 .ssh -> /pool/secure/ssh $ ls -l /pool/secure/ssh -rw------- 1 foobar foobar 381 Jun 29 15:01 authorized_keys -rw------- 1 foobar foobar 292 Jun 29 15:01 config -rw-------. 1 foobar foobar 5306 Jun 23 02:16 known_hosts $ ls -ld /pool/secure/ssh drwx------. 2 foobar foobar 8 Jun 29 15:01
版本
$ ssh -V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
添加於 2017-06-29 (提示)
- OpenBSD 和 FreeBSD 可以通過 chmod 修改 symlink 的訪問權限。但是 Linux 沒有執行該操作的系統呼叫。
- stat(2) 跟隨連結。
- 基本規範第 7 版未指定 st_mode 欄位中返回的文件模式位的值。
解決於 2017-06-30
auth_secure_path有答案。該函式檢查文件和目錄的權限,範圍包括父目錄。它繼續檢查是否設置了正確的權限(只有所有者可以寫),直到通過 home 或 root 。
ex) general environment /home/foobar/.ssh (raise error if group and other can write) /home/foobar (same) break! ex) special environment (like me) /home/foobar/.ssh -> /pool/secure/ssh /pool/secure/ssh (raise error if group and other can write) /pool/secure (same) /pool (same) / (same) break!
這是一個權限問題。
您需要檢查所有目錄(包括的主目錄)以及外部設備上
foobar
目標目錄之上的所有目錄的權限。.ssh
除了foobar
目標.ssh
目錄之外,所有其他目錄都必須由 root 擁有,並且不能被其他任何人寫入。您可能還會遇到 SELinux 問題。
-Z
您可以使用以下標誌檢查文件和目錄的 SELinux 安全上下文:[sheepd0g@dogpound ~]$ ls -ZA drwxr-xr-x. root root system_u:object_r:home_root_t:s0 .. drwxrwxr-x. sheepd0g sheepd0g unconfined_u:object_r:user_home_t:s0 20170620-auditlogs -rw-rw-r--. sheepd0g sheepd0g unconfined_u:object_r:user_home_t:s0 random.dat drwx------. sheepd0g sheepd0g unconfined_u:object_r:ssh_home_t:s0 .ssh
有幾點需要注意:
- 權限模式欄位末尾的句點表示 SELinux 上下文對該文件處於活動狀態。
- 請注意 .ssh 文件夾的類型欄位是不同的 (ssh_home_t)。
- SELinux 對象、類型、策略和設置可能在各個發行版甚至主要版本中都不相同。適用於 RHEL6 的東西可能不適用於 SUSE 10 或 Debian 6(我不確定 Debian 6 甚至有 SELinux 強制執行,開箱即用……)
無論如何,如果所有其他方法都失敗了,這是一個很好的地方。您可以使用以下命令輕鬆檢查 SELinux 是否處於強制模式:
[sheed0g@dogpound ~]$ sudo getenforce Enforcing
如果您懷疑 SELinux 是我們的問題,您可以將 SELinux 切換到 Permissive 模式(啟用策略,但不採取任何措施——僅記錄/審核操作):
[sheepd0b@dogpound ~]$ sudo setenforce 0 [sheepd0b@dogpound ~]$ sudo getenforce Permissive
如果您的問題消失了,這可能就是問題所在。
請注意,SELinux 比這裡描述的複雜得多。如果您的 .ssh/ 在 NFS 共享上,您將需要使用 SELinux 的布爾設置進行更多更改。
以下是 SELinux 的兩個很好的參考資料: