使用 Ubuntu 服务器,我需要创建一些具有以下限制的用户帐户:
(1)用户只能查看和操作其主目录中的文件。
(2)用户只能执行与 rsync 和 sftp 相关的命令。
我希望用户能够使用 rsync 备份文件,并且希望他们能够使用 FileZilla 等 sftp 客户端检索文件。
除此之外,我不希望用户能够查看系统上的其他文件,或者执行任何可能干扰系统的命令。
我更像是 Ubuntu 桌面用户,在管理 Linux 服务器方面经验很少。我发现的大多数教程都假设我知道一些我不知道的东西。所以我很难进行设置。
答案1
用户所做的一切都需要访问文件系统的大部分内容。为了向自己证明这一点,请运行以下命令:
strace -e trace=file /bin/ls/$HOME
您会发现,列出您自己的主目录的内容需要打开并读取系统中分散的至少 40 个其他文件。其他命令(如 sftp 等)需要更广泛的访问权限。
Unix 系统的设计理念是让用户对操作系统的大多数部分拥有只读访问权限。通过谨慎的权限和组,您可以轻松禁止他们查看彼此目录的内容。使用pam_apparmor您将能够限制他们可以运行的应用程序。
编辑: 我刚刚重新阅读了您的要求。听起来您不需要它们就可以登录到完全交互式的 shell。如果是这种情况,您可以通过两种方式继续:
aptitude install scponly
。然后将用户的 shell 设置为“scponly”。不要让它的名字占据你的全部空间;它也可以与 sftp 配合使用。如果你想进一步锁定它们,请查看有关/usr/local/share/doc/scponly
设置每个用户“chroot”的文档。如果您需要允许访问除 sftp/scp 之外的更多命令(例如 rsync),则需要推出自己的命令验证器并设置 ssh“强制命令”。将如下所示的块添加到您的
/etc/ssh/sshd_config
:Match group sftponly ForceCommand /usr/local/bin/validate_sftp
然后编写
/usr/local/bin/validate_sftp
脚本。类似于以下内容:#!/bin/bash if [[ $SSH_ORIGINAL_COMMAND = "rsync --server" ]] then exec $SSH_ORIGINAL_COMMAND elif [[ $SSH_ORIGINAL_COMMAND = "/usr/lib/openssh/sftp-server" ]] then exec $SSH_ORIGINAL_COMMAND else echo "You are only allowed rsync or sftp access to this server." fi
将用户添加到“sftponly”组(当然,您必须添加该组),他们将被限制使用您的脚本允许的命令。
答案2
我不知道这是否能满足您的要求,但既然您说这应该是一台服务器,那么可能值得考虑从不同角度解决这个问题:
- 也许用户不需要系统上的 unix 帐户。
- 通过在该系统上设置 sftp 服务器(或类似的东西,例如 WebDAV)可以实现类似的功能吗?并且系统提供自动备份解决方案?(如果您愿意,您甚至可以使用 Subversion + WebDAV 提供自动版本控制。)
... 只是一个想法,因为在向用户提供系统帐户时总是存在一定的安全风险(并且需要管理用户和文件权限) - 至少只要您不为每个人设置虚拟服务器。