管理上传权限、SFTP 和 Linux

管理上传权限、SFTP 和 Linux

我是 Linux 新手。

我正在使用 Redhat 5.5 服务器,并使用基于 Java 的 SFTP 脚本,该脚本允许多个用户将文本文件上传到服务器。我不确定每个用户是否都有单独的目录,或者我是否使用包含其客户 ID 的命名约定。

这些文件包含一些有关其 LAN 设置的个人信息,因此我更喜欢使用 SFTP 而不是 FTP。据我所知,SFTP 是加密的(此外,我有一个 Java 类配置为通过 SFTP 上传,因此除非有非常好的理由,否则我宁愿不切换协议)。

原型是针对支持大量客户的系统,而通过命令行不断添加和删除客户端的想法似乎非常不切实际。(再次说明,我是 Linux 和 Redhat 的新手/正在学习中)。

授予多个用户使用 SFTP 上传文件的权限,每个用户使用唯一的用户名和密码的正常惯例是什么。

答案1

您可以通过将外部 sshd 设置为 chrooted sftpd 来实现这一点(为此,请使用 sshd_config 中的 sftpd-internal 选项)。每个用户都可以拥有自己的 chroot-jail。在用户的 authorized_key 文件(不允许使用密码!)上,您应该在每个公钥前加上必要的前缀,以禁止 shell 访问。您的 chroot 还应该只包含 sftp-access 的基本设置(没有二进制文件,没有库,只有 /dev/null、/dev/zero、/dev/random 和 /dev/urandom - 就我记得)。

答案2

您所描述的是可能的,但可能不是最好的想法,特别是如果您是 Linux 新手。

正如您所说,管理文件权限和用户将会是一场噩梦,而 SFTP 需要 SSH,而 SSH 本身可以公开各种功能,如在远程服务器上执行代码和下载文件。

可以配置具有一定安全性的 SFTP 服务器,但配置过程中存在许多陷阱。互联网上有很多关于使用 SSHd 配置 SFTP 用户的误导性建议。长话短说,不是仅仅将他们的登录 shell 更改为无效 shell 就足够了,您还需要担心他们绕过 shell 远程执行命令的能力,以及他们读取主目录之外的潜在敏感系统文件的能力,以及他们使用 SSH 隧道绕过防火墙的能力。以及我可能记不清的任何其他功能。

而且它有可能绕过整个“需要为每个客户创建一个用户”的事情,要么通过使用 PAM 进行一些黑暗魔法让 SSH 根据其他用户数据库进行身份验证,要么简单地共享一个用户帐户(只要你只关心让用户上传文件)。

此外,您还将以某种方式解决 SFTP 在您的应用程序中存在的一个基本安全问题,即许多远程用户需要能够验证远程服务器是否是它看起来的那个。SSH 没有证书颁发机构 - SSH 用于防止中间人攻击的方法是缓存客户端连接到的服务器的 SSH 服务器密钥的指纹,如果密钥与之前看到的密钥匹配,则一切正常。但是如果不知道密钥,因为这是客户端首次连接,所以 SSH 要求用户手动检查指纹。期望您的客户端确实这样做是不合理的,几乎每个人都会单击“是”,因为他们想继续他们的生活。您可能能够使用您的应用程序分发有效的主机指纹,但这似乎有点噩梦。

如果你决定继续使用 SFTP,尽管有上述潜在问题,我建议你调查一下发送限制用户只能使用 SFTP。此外,您应将所有 SFTP 用户置于 chroot jail 中,这样他们就无法干扰服务器的操作,也无法访问任何系统文件。(即便如此,攻击者也有可能枚举您系统的用户...)并且您还需要确保 sshd 已配置为阻止 SFTP 用户使用 SSH 隧道。

...

与其处理这种混乱局面,我建议你考虑另一种协议来上传文件,这似乎更适合你的用例——为什么不考虑使用 HTTPS 上传文件呢?你需要某种服务器端 CGI 脚本或 Java servlet 或其他东西来接收文件并对它们进行一些有用的操作并执行身份验证。服务器端脚本可以负责将文件存储在有用的位置。至于客户端问题,通过 HTTPS 上传文件是一件很常见的事情,如果没有一些现成的 API 类可以轻松用于进行这种文件上传,我会感到惊讶。

当然,这意味着您必须实际编写一些服务器端 CGI 脚本来解决您的问题,但我确实怀疑您无论如何都会想以某种方式编程来处理传入的文件,这实际上使它更容易因为每次有新文件时都会为您调用代码。

相关内容