我有一个文件夹 /srv/jarvis,它有多个子文件夹,其中一个叫做 carl (/srv/jarvis/carl)
jarvis Dir 拥有这些权利
drwxrwxrwx 12 root root 4096 Jun 9 11:34 jarvis
卡尔拥有这些权利
drwxr-xr-x 4 carl carl 4096 Jun 9 13:02 carl
在 /etc/ssh/sshd_config 中我添加了以下几行
Match user carl
ChrootDirectory /srv/jarvis/carl
ForceCommand internal-sftp
AllowTCPForwarding no
X11Forwarding no
但是如果我添加这些行并执行 service ssh restart
然后用户就无法登录到该服务器写入失败:管道损坏。如果从 sshd_config 中删除这些行,他可以再次登录,但我不希望这样
我希望用户只能访问 /srv/jarvis/carl/ 并在那里做任何他想做的事情,而且他不能做任何 root 操作 :)
我该如何解决这些问题
答案1
从您的 auth.log 记录来看,这似乎是一个权限问题。具体来说,日志行显示
21:10:18 localhost sshd[16609]: fatal: bad ownership or modes for chroot directory component "/srv/"
如果您保留当前sshd_config
行内容,则此路径中的每个目录都需要具有以下特征:ChrootDirectory /srv/jarvis/carl
- 它需要由 root 用户拥有(组并不重要)
- 它不能是组或世界可写的(即需要
chmod 755
)
同样,这些适用于/srv
、/srv/jarvis
和/srv/jarvis/carl
。不幸的是,这样做的结果是该用户carl
将无法写入他的顶级目录(在 chroot 生效后)。解决这个问题的一种方法是准备一个子目录并授予他所有权,这样他就有地方创建文件和文件夹了。
我自己还没有测试过,但网络上关于这个话题的一些讨论让我相信,如果你将ChrootDirectory
指令改为:
ChrootDirectory /srv/jarvis/%u
(在您的情况下,这始终意味着/srv/jarvis/carl
因为他是唯一匹配的人),sshd
可能会以不同的方式处理通配符匹配的文件夹。这样,您可能能够让用户 carl 拥有该carl
文件夹。同样,没有保证。如果不行,描述的第一种方法应该有效。