Symlink

OpenSSH 拒絕帶有符號連結的 .ssh 目錄

  • September 9, 2019

在我的環境中,實際的 .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

有幾點需要注意:

  1. 權限模式欄位末尾的句點表示 SELinux 上下文對該文件處於活動狀態。
  2. 請注意 .ssh 文件夾的類型欄位是不同的 (ssh_home_t)。
  3. 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 的兩個很好的參考資料:

SELinux 上的 CentOS wiki 條目

紅帽企業 Linux 7 SELinux 指南

引用自:https://unix.stackexchange.com/questions/374084