在 sftp 配置上共享 ssh 公钥

在 sftp 配置上共享 ssh 公钥

我在 CentOS 上配置了一个 SFTP 服务器,如下所示本文档user1。我的意图是禁止属于该组的新用户( 、user2)登录控制台sftpusers,但仍可以登录其各自的sftp文件夹。

另外,我想使用 CentOS 用户使用的相同密钥(可以登录控制台并且sftp没有问题)。为此,我将.ssh文件夹从 CentOS 用户复制到user1主文件夹,将文件夹和文件user2的所有权更改为用户。700.ssh600authorized_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 目录中使用主目录。

    该手册还指出:

    之后chrootsshd(8)将工作目录更改为用户的主目录。

    我假设主目录默认为/home/user1/home/user2。这表明以下情况:

    1. 将服务器设置为 chroot 为/path/to/shared_folder(否%u):

      ChrootDirectory /path/to/shared_folder
      
    2. 在那里复制相关的目录结构(/path/to/shared_folder/home/user1等等)。

    3. 满足条件pathtoshared_folder
    4. 使 的所有权和权限home就像是常规的一样/home
    5. 使 内部目录的所有权和权限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您将看到它们位于。在这种情况下,应该直接包含用户文件夹(而不是)。/user1sftpshared_folderhome

  • 使用特定于用户的 chroot 目录中的至少一个子目录。

    上述解决方案允许用户浏览彼此的目录。用户将能够对其chmod文件 (sftp支持chmod) 授予或拒绝访问权限。

    您使用了%uChrootDirectory因此您很可能想要创建单独的 chroot 目录。在这种情况下,请执行以下操作:

    ChrootDirectory /path/to/shared_folder/%u
    

    并设置每个组件(包括%u扩展为的内容)的所有权和权限以满足条件。除非涉及只读访问,否则至少需要一个用户可写的子目录。几种可能性:

    • 按照操作系统的定义,复制用户主目录的路径;
    • 强制/home/%uForceCommand internal-sftp -d /home/%u
    • 强制/%uForceCommand internal-sftp -d /%u
    • 使用固定的子目录名称,例如ForceCommand internal-sftp -d /files

    在每种情况下,您都需要准备 内的目录结构/path/to/shared_folder。例如,如果您要强制/home/user1,则user1相关路径将是:

    /path/to/shared_folder/user1/home/user1
    

    其中path,,toshared_folder(第一个)user1满足条件,home模拟/home并且(第二个)user1可由用户写入。

可以使用更灵活的方法。例如,您可以为user1和指定一个公共的 chroot 目录user2,但为 指定一个不同的 chroot 目录user3

无论 Chroot 目录是否常见,我个人都会以最不令人惊讶的方式创建子目录,这样任何用户都会发现自己处于他们有点期望的目录中。输入后,pwd他们sftp应该看到类似/home/user1。我发现其他可能性(/user1, /files)有些令人惊讶。

相关内容