在我的环境中,实际的 .ssh 目录存在于外部设备上,并~/.ssh
使用符号链接从它链接到。使用openssh
的客户端工作没有问题,但sshd
不允许认证与里面的公钥。
有什么方法可以.ssh
在外部设备上使用目录吗?
journalctl -u sshd
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)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
Run Code Online (Sandbox Code Playgroud)
$ ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017
Run Code Online (Sandbox Code Playgroud)
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!
Run Code Online (Sandbox Code Playgroud)
这是一个权限问题。
您需要检查以上所有目录的权限,包括foobar
's home 目录,以及.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
Run Code Online (Sandbox Code Playgroud)
需要注意的几点:
无论如何,如果所有其他方法都失败了,这是一个很好的地方。您可以使用以下命令轻松检查 SELinux 是否处于强制模式:
[sheed0g@dogpound ~]$ sudo getenforce
Enforcing
Run Code Online (Sandbox Code Playgroud)
如果您怀疑 SELinux 是我们的问题,您可以将 SELinux 切换到 Permissive 模式(启用了策略,但不采取任何操作——只是记录/审核操作):
[sheepd0b@dogpound ~]$ sudo setenforce 0
[sheepd0b@dogpound ~]$ sudo getenforce
Permissive
Run Code Online (Sandbox Code Playgroud)
如果您的问题消失了,这很可能是问题所在。
请注意,SELinux 的复杂性比这里描述的要复杂得多。如果您的 .ssh/ 在 NFS 共享上,您将需要对 SELinux 的布尔设置进行更多更改。
这里有两个很好的 SELinux 参考:
Udi*_*di 5
就我而言(在 Lenovo NAS 上),更改权限没有帮助,但绑定安装解决了问题。
代替
ln -s /pool/secure/ssh .ssh
Run Code Online (Sandbox Code Playgroud)
我做到了
mkdir -m 700 .ssh
mount --bind /pool/secure/ssh .ssh
Run Code Online (Sandbox Code Playgroud)