我有一个远程服务器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 中设置配置时,您可能希望让它侦听除ssh
2222 之外的另一个端口。配置您的防火墙和/或路由器以允许来自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/stranger
为root
:
chown root:stranger /home/stranger
笔记:root
必须是所有者,并且如果使用 ChrootDirectory,则可能是唯一拥有写入权限的人。另一种方法可能是添加-d %u
到ForceCommand 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,因为我只是正在努力,并不是因为相信这是最好的选择)。