我在 CentOS 上配置了一个 SFTP 服务器,如下所示本文档user1
。我的意图是禁止属于该组的新用户( 、user2
)登录控制台sftpusers
,但仍可以登录其各自的sftp
文件夹。
另外,我想使用 CentOS 用户使用的相同密钥(可以登录控制台并且sftp
没有问题)。为此,我将.ssh
文件夹从 CentOS 用户复制到user1
主文件夹,将文件夹和文件user2
的所有权更改为用户。700
.ssh
600
authorized_keys
不过,我还是不断收到消息Server refused our key
。 CentOS 用户使用的密钥就像所有服务器中的主密钥,这就是为什么我想为新用户重复使用该密钥。
我怎样才能实现这种配置?
更新
为每个用户生成密钥后,两个用户都可以使用他们的私钥远程访问服务器,但是当我激活以下配置时,/etc/ssh/sshd_config
使用该命令拒绝权限sftp
。
SSHD 配置
Match Group sftpusers #Or you could replace Group with User and specify a different configuration for each user
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
ChrootDirectory /path/to/shared_folder/%u # %h the path to upload the files
ForceCommand internal-sftp
来自 shell 的消息
packet_write_wait: Connection to IPSERVER port 22: Broken pipe
Couldn't read packet: Connection reset by peer
答案1
更新引入了一个与原始问题不同的问题。看起来原始问题不再是问题。我正在解决更新。
这手动的内容如下:
ChrootDirectory
指定认证后目录的路径名chroot(2)
。会话启动时sshd(8)
检查路径名的所有组件是否都是根目录,且其他任何用户或组都无法写入。
我的测试表明,如果不满足这个条件,那么Broken pipe
在尝试登录时就会出现这种情况sftp
。
在你的情况下路径名是/path/to/shared_folder/%u
。注意%u
(扩展后)是还组件;因此它应该是“root 拥有的,并且任何其他用户或组都无法写入”。您应该修复所有权和权限。然后,显然,用户将无法写入目录。无论您使用什么路径名ChrootDirectory
,用户都无法写入它(除非用户是 root)。换句话说,用户将无法/
在 chrooted 环境中写入。要允许写入,您需要一个子目录。有几种方法可以解决这个问题。
在公共 chroot 目录中使用主目录。
该手册还指出:
之后
chroot
,sshd(8)
将工作目录更改为用户的主目录。我假设主目录默认为
/home/user1
等/home/user2
。这表明以下情况:将服务器设置为 chroot 为
/path/to/shared_folder
(否%u
):ChrootDirectory /path/to/shared_folder
在那里复制相关的目录结构(
/path/to/shared_folder/home/user1
等等)。- 满足条件
path
,to
且shared_folder
。 - 使 的所有权和权限
home
就像是常规的一样/home
。 - 使 内部目录的所有权和权限
home
与 中的目录一样/home
。
通过此设置
sftp
将在身份验证后自动放置user1
在/path/to/shared_folder/home/user1
,但他们会将其视为/home/user1
由于chroot
。在公共 chroot 目录中使用自定义目录。
你
ForceCommand internal-sftp
可以指定起始目录(internal-sftp
支持与sftp-server
)。 像这样:ChrootDirectory /path/to/shared_folder ForceCommand internal-sftp -d /home/%u
以确保用户无论在操作系统中哪个正式主目录下都
sftp
可以使用。或者像这样:/path/to/shared_folder/home/…
ChrootDirectory /path/to/shared_folder ForceCommand internal-sftp -d /%u
简化路径并去掉
home
中间的这个。这样在使用 登录后,user1
您将看到它们位于。在这种情况下,应该直接包含用户文件夹(而不是)。/user1
sftp
shared_folder
home
使用特定于用户的 chroot 目录中的至少一个子目录。
上述解决方案允许用户浏览彼此的目录。用户将能够对其
chmod
文件 (sftp
支持chmod
) 授予或拒绝访问权限。您使用了
%u
,ChrootDirectory
因此您很可能想要创建单独的 chroot 目录。在这种情况下,请执行以下操作:ChrootDirectory /path/to/shared_folder/%u
并设置每个组件(包括
%u
扩展为的内容)的所有权和权限以满足条件。除非涉及只读访问,否则至少需要一个用户可写的子目录。几种可能性:- 按照操作系统的定义,复制用户主目录的路径;
- 强制
/home/%u
用ForceCommand internal-sftp -d /home/%u
; - 强制
/%u
用ForceCommand internal-sftp -d /%u
; - 使用固定的子目录名称,例如
ForceCommand internal-sftp -d /files
。
在每种情况下,您都需要准备 内的目录结构
/path/to/shared_folder
。例如,如果您要强制/home/user1
,则user1
相关路径将是:/path/to/shared_folder/user1/home/user1
其中
path
,,to
和shared_folder
(第一个)user1
满足条件,home
模拟/home
并且(第二个)user1
可由用户写入。
可以使用更灵活的方法。例如,您可以为user1
和指定一个公共的 chroot 目录user2
,但为 指定一个不同的 chroot 目录user3
。
无论 Chroot 目录是否常见,我个人都会以最不令人惊讶的方式创建子目录,这样任何用户都会发现自己处于他们有点期望的目录中。输入后,pwd
他们sftp
应该看到类似/home/user1
。我发现其他可能性(/user1
, /files
)有些令人惊讶。