我在家里搭建了一个 Ubuntu 服务器只是为了学习“东西”。我做得有点过头了,我的 SSD 上还有一些空闲空间。我准备给朋友一些空间来在我的计算机上进行备份。他也会给我同样的机会。利润!!
以下是我的系统的要求/设置:
用户只能使用密钥对通过 sshd 登录。这就是我在系统上配置 ssh 的方式。不允许密码访问。
附加用户不应具有 shell 访问权限或以任何方式在我的服务器上执行命令
- 我只想授予 sshd 对位于 /mnt/copro 中的文件夹的写入和读取权限。他将通过 sshd 使用 duplicati 来进行备份。
一般来说,该文件夹应该可以作为(哑)文件服务器访问,但可以通过 ssh 访问,并且只能使用密钥对进行访问。
我确实做了一些研究,但我没有找到总体令人满意的答案,或者我无法正确组合我在工作解决方案中找到的答案:
因此我的问题是:
- 如何创建没有 shell 访问权限的用户
- 我如何允许此类用户读/写访问我选择的文件夹
- 我在哪里存储该特定用户的私钥
谢谢你的协助。
答案1
我假设您使用 OpenSSH 作为 SSH 服务器,我相信这是 Ubuntu 上的默认设置。
复制品的文档明确表明您实际上只需要 SFTP 访问;这使得这变得更容易。
- 您设置了一个
Match User
或Match Group
部分来/etc/ssh/sshd_config
将用户与多个选项相匹配,最关键的ForceCommand
是,可能ForceCommand internal-sftp
(在某些情况下您可能会使用一个外部 sftp 服务器,这实际上可以是任何命令 - 它也可以用于某些事情)例如,仅git
访问。)您很可能还希望阻止各种转发。不幸的是,您必须密切关注 SSH 升级,添加更多内容;最后我检查了你想要的(注意其中一些默认为“否”):
AllowAgentForwarding no
AllowTCPForwarding no
AllowStreamLocalForwarding no
PermitTTY no
PermitTunnel no
PermitUserEnvironment no
PermitUserRC no
X11Forwarding no
首先,从文件系统权限开始。这应该可以保护您的个人文件;
$HOME
其他用户不应该读取您的内容!然而,有很多地方是全局可读的(但你可能并不真正关心用户是否可以阅读
/bin/sh
;当然他/她可以从你的发行版下载它)。还有一些全局可写目录,例如/tmp
.您可以使用 ChrootDirectory 来保护这两个目录,但请注意,chroot 目录需要由 root 拥有并且用户不可写入(否则将是一个巨大的安全问题,并且 sshd 不会允许这样做)。因此,如果您有ChrootDirectory /mnt/copro
,那么您需要将其设为0755 root:root
,并且内部有一个/mnt/copro/data
(或类似的),由用户拥有。出于安全原因,其名称绝对不应该是etc
或任何其他常见的顶级目录(bin
、usr
、lib
等)。最简单的可能是将授权密钥文件放在用户主目录的正常位置(
~/.ssh/authorized_keys
,就像任何其他用户一样)。该主目录可能应该位于 之外/mnt/copro
,因为如果可能的话,最好不要让受限用户写入自己的主目录$HOME
。如果需要,您可以在块AuthorizedKeysFile
内部设置替代位置Match
。
PS:Duplicati 支持其他后端。因此,如果您更熟悉 Apache 等设置,也许您想建议使用 WebDAV。或者您可能拥有大量存储空间并且可以提供 S3 兼容接口等。
答案2
要创建没有 shell 访问权限的用户帐户,
sudo adduser --shell /bin/false mysftpfriend
您应该为 mysftpfriend 创建一个目录和目录结构,并使其可供访问。
sudo mkdir -p /var/mysftpfriends/storage
要授予访问权限,
sudo chown mysftpfriend:mysftpfriend /var/mysftpfriends/storage
只需将 root 设置为对 mysftpfriends 目录具有完全访问权限(所有者和组所有者)即可。
sudo chown root:root /var/mysftpfriends
sudo chmod 0766 /var/mysftpfriends
组成员可以读/写,但不能执行。
现在,要配置仅用于 SFTP 的 SSH,请/etc/ssh/sshd_config
在文本编辑器(nano 或 vim)中打开,
sudo nano /etc/ssh/sshd_config
将以下行添加到文件末尾,
Match User mysftpfriend
ForceCommand internal-sftp
PasswordAuthentication yes
ChrootDirectory /var/mysftpfriends
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no
保存文件,退出编辑器并重新启动 ssh。
sudo service ssh restart
就这样,现在尝试 ssh 到控制台并测试文件读/写,并确保 sftpfriend 用户无法执行。
sftp mysftpfriend@myserver
全做完了!