如何设置单向 scp?

如何设置单向 scp?

我有一个远程服务器my.server.com,我想允许另一个用户 ( stranger) 将 scp 文件发送到服务器上。

目标:

  • stranger给予用户尽可能少的访问权限
  • stranger应该根本无法登录
  • 如果可能,安排单向复制 - 他们应该只能将文件复制到服务器上,而不能复制到服务器上

我怎样才能做到这一点?

编辑:我已经删除了所有交叉帖子。这个问题只存在于此。请帮忙!

编辑2:我最终决定进行正常scp转移。选择@Lambert 的答案,因为它是最完整的。感谢您的帮助!

答案1

如果您想要所有设置所有您提到的限制性内容,我建议使用 ProFTPd。

使用sftp_module您只能允许安全会话。看http://www.proftpd.org/docs/contrib/mod_sftp.html有关sftp功能的详细信息。页面底部附近列出了示例配置。

使用该DefaultRoot指令,您可以将授予的用户隔离到他/她自己的目录中

使用该<LIMIT>结构,您可以限制您想要允许的 FTP 命令,即READ用户无法检索文件。看http://www.proftpd.org/docs/howto/Limit.html了解详情。

当您sftp在 ProFTPd 中设置配置时,您可能希望让它侦听除ssh2222 之外的另一个端口。配置您的防火墙和/或路由器以允许来自stranger您为 ProFTPd 选择的端口的流量。另一种可能性是sftp在端口 22 上运行 ProFTPd 的模块并重新配置ssh为侦听另一个端口。

示例配置可能如下所示:

<IfModule mod_sftp.c>
  <VirtualHost a.b.c.d>
    # The SFTP configuration
    Port 2222

    SFTPEngine on
    SFTPLog /var/log/proftpd_sftp.log

    # Configure the RSA, DSA, and ECDSA host keys, using the same host key
    # files that OpenSSH uses. 
    SFTPHostKey /etc/ssh_host_rsa_key
    SFTPHostKey /etc/ssh_host_dsa_key
    SFTPHostKey /etc/ssh_host_ecdsa_key

    <Limit READ>
      DenyAll
    </Limit>

    DefaultRoot ~ users,!staff

  </VirtualHost>
</IfModule>

笔记:这不是 ProFTPd 的完整配置,您应该查看并修改 ProFTPd 默认配置以使其适合您的需要。


还有另一种可能,只需使用 OpenSSH 即可:

创建用户stranger并为用户设置密码:

useradd -m -d /home/stranger -s /bin/true stranger
passwd stranger

编辑文件/etc/ssh/sshd_config并检查以下行是否存在,如果不存在则添加:

Subsystem       sftp    internal-sftp

接下来在 的底部添加一个 Match 块/etc/ssh/sshd_config

Match User stranger
    ChrootDirectory  %h
    ForceCommand  internal-sftp -P read,remove
    AllowTcpForwarding no

笔记:用户将能够覆盖现有文件。

重新启动sshd守护进程。

将目录的所有者设置/home/strangerroot

chown root:stranger /home/stranger

笔记:root 必须是所有者,并且如果使用 ChrootDirectory,则可能是唯一拥有写入权限的人。另一种方法可能是添加-d %uForceCommand internal-sftp行并设置ChrootDirectory /home,但用户将能够使用以下命令cd /查看其他用户名ls

为用户创建上传目录:

mkdir /home/stranger/upload; chown stranger:stranger /home/stranger/upload

现在您可以stranger使用以下命令以用户身份登录:

sftp stranger@somehost

当你上传文件时应该没问题:

sftp> put myfile
Uploading myfile to /upload/myfile
myfile                               100%   17     0.0KB/s   00:00    
sftp> get myfile
Fetching /upload/myfile to myfile
/upload/myfile                         0%    0     0.0KB/s   --:-- ETA
Couldn't read from remote file "/upload/myfile" : Permission denied

答案2

就我个人而言,如果目标只是允许将文件复制到服务器,我会选择 sftp 而不是 scp。 scp 假定 ssh 访问,如果不需要提供 shell 访问,最好不要尝试仅为文件传输而锁定它。

所以,sftp。一些建议。禁用普通 FTP,而是运行一些允许您轻松控制访问的程序,您也可以使用 sftp 在唯一端口上运行该程序。例如,我刚刚在服务器上完成了 proftpd 的配置,它很好地完成了这项工作。您可以 chroot 访问权限,以便用户登陆其主目录,并且无法导航整个树。您还可以定义允许的命令,例如完全禁用“cd”等。您还可以控制 *nix 帐户之外的 FTP 用户,因此您只能在 FTP 上下文中创建此用户帐户,而实际上没有用户的帐户。

此外(对于皮带和吊带方法),您可以从操作系统级别更改用户主目录(他们的 SFTP 会话将连接到的位置)的权限,以便他们只能写入而不能读取(但同样,您可以使用像 proftpd 这样的 ftp 守护进程来限制命令,这样它们也不能执行 get 操作)。

我过去使用过其他 ftp 服务器(虽然现在我记不起这些名字了),而且所有服务器似乎都比默认的 ftp 守护进程提供了更多的控制,所以我确信其他服务器提供了类似的功能(我只提到 proftpd,因为我只是正在努力,并不是因为相信这是最好的选择)。

相关内容