OpenSSH 拒绝带有符号链接的 .ssh 目录

Mel*_*ado 10 openssh symlink

在我的环境中,实际的 .ssh 目录存在于外部设备上,并~/.ssh使用符号链接从它链接到。使用openssh的客户端工作没有问题,但sshd不允许认证与里面的公钥。

有什么方法可以.ssh在外部设备上使用目录吗?

journalctl -u sshd
Run Code Online (Sandbox Code Playgroud)
Authentication refused: bad ownership or modes for directory /pool/secure/ssh
Run Code Online (Sandbox Code Playgroud)

权限

$ 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)

于 2017-06-29 添加(提示)

  • OpenBSD 和 FreeBSD 可以通过 chmod 修改符号链接的访问权限。但是 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!
Run Code Online (Sandbox Code Playgroud)

roa*_*ima 8

这是一个权限问题。

您需要检查以上所有目录的权限,包括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)

需要注意的几点:

  1. 权限模式字段末尾的句点表示该文件的 SELinux 上下文处于活动状态。
  2. 请注意 .ssh 文件夹的类型字段是不同的 (ssh_home_t)。
  3. SELinux 对象、类型、策略和设置在不同发行版甚至主要版本之间可能不同。适用于 RHEL6 的可能不适用于 SUSE 10 或 Debian 6(我不确定 Debian 6 是否甚至具有 SELinux 强制执行,开箱即用......)

无论如何,如果所有其他方法都失败了,这是一个很好的地方。您可以使用以下命令轻松检查 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 参考:

SELinux 上的 CentOS wiki 条目

红帽企业 Linux 7 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)