sftp 仅在 chroot 时才给予拒绝权限?

ibr*_*ter 5 permissions selinux centos sftp

我在我的centos机器上配置了sshd_conf,如下所示:

Match group pilots
ChrootDirectory /home/pilots
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
Run Code Online (Sandbox Code Playgroud)

目录 /home/pilots 如下所示:

# ls -al /home/pilots
total 12
drwxr-x---. 3 root pilots 4096 Mar 10 14:20 .
drwxr-xr-x. 7 root root     4096 Mar 10 14:10 ..
drwxrwxr-x. 2 root pilots 4096 Mar 10 15:21 data
-rwxrwxrwx. 1 root root        0 Mar 10 14:20 topLevel
# 
Run Code Online (Sandbox Code Playgroud)

如果我在没有启用 ChrootDirectory 指令的情况下以飞行员组中的用户身份进行 sftp,我可以 cd 到 /home/pilots 文件夹(或其子目录)并毫无困难地执行 ls 或 get 操作。但是,如果我启用 ChrootDirectory 指令,虽然我仍然可以 sftp 进入,并且可以 cd 到数据,但我无法执行 ls 或进入任一目录。例如,尝试 ls 会给出一个 Remote readdir("/"): Permission returned 错误,而尝试获取 topLevel 会给出 File "/topLevel" not find 。我想也许我不在我期望的目录中,但 cd 数据的能力似乎表明 chroot 确实按预期工作。

查看消息日志,当 ls 被拒绝时,我看到以下内容:

type=1400 audit(1394494944.504:50): avc:  denied  { read } for  pid=22758 comm="sshd" name="pilots" dev=dm-0 ino=400504 scontext=unconfined_u:system_r:chroot_user_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:home_root_t:s0 tclass=dir
Run Code Online (Sandbox Code Playgroud)

所以有否认的记录。但仍然没有告诉我为什么。

我可能做错了什么?

几个可能重要的注意事项:

  • 有问题的用户存在于远程 LDAP 服务器上,通过 sssd 访问
  • 访问控制必须按组进行,因为许多用户需要对同一文件夹进行读取访问。因此所有权仍然是根。

编辑:经过进一步调查,这似乎与 SELinux 有关 - 解决了echo 0 >/selinux/enforce这个问题,尽管是用大锤杀死蚂蚁这样的笨拙方式。如果可能的话,我想知道“正确的”修复方法。

ibr*_*ter 5

我在此页面上找到了解决方案。总而言之,按照上述配置配置 sftp 后,需要运行以下两个命令以允许在启用 SELinux 的情况下进行访问:

setsebool -P ssh_chroot_rw_homedirs on
restorecon -R /home/$USERNAME
Run Code Online (Sandbox Code Playgroud)

在这种情况下,第二个命令是restorecon -R /home/pilots。此后,即使 chroot 后,sftp 也能按预期工作,而无需完全禁用 SELinux。