介绍
SFTP代表 S SH ** F** ile ** T** ransfer ** P** rotocol. 正如其名称所示,它是一种使用加密SSH连接将文件传输到服务器的安全方式。 尽管它的名称,它是一个完全不同的协议,而不是 FTP(** File ** T** ransfer ** P** rotocol),尽管它被现代的FTP客户端广泛支持。
SFTP 默认情况下在所有已启用 SSH 访问的服务器上没有额外配置,它是安全和易于使用的,但具有一个缺点:在标准配置中,SSH 服务器向系统上有帐户的所有用户提供文件传输和终端壳访问。
在某些情况下,您可能只希望允许某些用户进行文件传输,而不允许 SSH 访问. 在本教程中,我们将设置 SSH DAEMON 以限制 SFTP 访问到一个目录,每个用户均不允许 SSH 访问。
前提条件
要遵循本教程,您将需要:
一个 Ubuntu 16.04 服务器配备了 此初始服务器设置教程,包括一个非 root sudo 用户和一个防火墙。
第1步:创建新用户
首先,创建一个新用户,只会获得文件传输访问服务器. 在这里,我们使用用户名 sammyfiles ,但你可以使用任何你喜欢的用户名。
1sudo adduser sammyfiles
您将被要求为帐户创建密码,随后提供有关用户的一些信息. 用户信息是可选的,因此您可以按ENTER
,以便这些字段空白。
您现在已经创建了一个新的用户,将被授予访问限制目录. 在下一步,我们将创建文件转移目录并设置必要的权限。
步骤2 — 创建文件转移的目录
为了限制 SFTP 访问到一个目录,我们首先必须确保目录符合 SSH 服务器的权限要求,这些要求非常具体。
具体来说,文件系统树中的目录本身和所有目录必须由 root 所有,不能由其他人编写,因此,不能简单地限制访问用户的主目录,因为主目录属于用户,而不是 ** root** 。
注意:一些版本的OpenSSH对目录结构和所有权没有如此严格的要求,但大多数现代的Linux发行版(包括Ubuntu 16.04)都这样做。
在本教程中,我们将创建和使用‘/var/sftp/uploads’作为目标上传目录。‘/var/sftp’将由 root 拥有,并不会被其他用户编写;子目录 `/var/sftp/uploads’将由 ** sammyfiles** 拥有,以便用户能够上传文件。
首先,创建目录。
1sudo mkdir -p /var/sftp/uploads
将 `/var/sftp 的所有者设置为 root 。
1sudo chown root:root /var/sftp
给同一个目录写权限,并给其他用户只读和执行权限。
1sudo chmod 755 /var/sftp
在上传
目录上更改所有权到 sammyfiles 。
1sudo chown sammyfiles:sammyfiles /var/sftp/uploads
现在,目录结构已经到位,我们可以配置SSH服务器本身。
步骤 3 – 限制访问一个目录
在此步骤中,我们将更改 SSH 服务器配置,以禁止 sammyfiles 的终端访问,但允许文件传输访问。
使用nano
或您最喜欢的文本编辑器打开 SSH 服务器配置文件。
1sudo nano /etc/ssh/sshd_config
滚动到文件的底部,并附加以下配置片段:
1[label /etc/ssh/sshd_config]
2. . .
3
4Match User sammyfiles
5ForceCommand internal-sftp
6PasswordAuthentication yes
7ChrootDirectory /var/sftp
8PermitTunnel no
9AllowAgentForwarding no
10AllowTcpForwarding no
11X11Forwarding no
然后保存并关闭文件。
以下是每个指令所做的:
- `Match User'告诉SSH服务器只对指定的用户应用以下命令. 在这里,我们具体说明萨米文件 。
- `ForceCommand Internal-sftp'迫使SSH服务器在登录时运行SFTP服务器,不允许 shell访问.
- `Password Authentication yes'允许该用户密码认证。
- " Chroot Directory/var/sftp/ " 确保不允许用户访问 " /var/sftp " 目录以外的任何内容。 您可以在 [此chroot教程] (https://andsky.com/tech/tutorials/how-to-configure-chroot-environments-for-testing-on-an-ubuntu-12-04-vps) 中更多地了解chroot 。
Allow Agent Forward no',
AllowTcp Forward no'.和`AllowTcp forward no'. .
此套命令,从匹配用户
开始,可以对不同用户进行复制和重复,请确保对匹配用户
行中的用户名进行相应的修改。
美元(注)
** 注意** :您可以忽略PasswordAuthentication yes
行,而不是设置 SSH 密钥访问以增强安全性。 请遵循 SSH Essentials: Working with SSH Servers, Clients, and Keys教程中的复制您的公共 SSH 密钥
部分。
在下一步中,我们将用密码访问本地测试SSHing的配置,但如果您设置SSH密钥,则需要使用用户密钥对的计算机访问。
美元
若要应用配置更改,请重新启动服务。
1sudo systemctl restart sshd
您现在已经配置了SSH服务器,以限制只对 sammyfiles 的文件传输访问,最后一步是测试配置,以确保它按预期工作。
步骤4 – 验证配置
让我们确保我们的新的 sammyfiles 用户只能传输文件。
使用正常壳存取方式登录服务器作为 sammyfiles 不再可能。
1ssh sammyfiles@localhost
在返回原始提示之前,您将看到以下消息:
1[secondary_label Error message]
2This service allows sftp connections only.
3Connection to localhost closed.
这意味着 sammyfiles 不再可以使用 SSH 访问服务器壳。
接下来,让我们验证用户是否可以成功访问 SFTP 进行文件传输。
1sftp sammyfiles@localhost
代替错误消息,此命令将显示一个成功的登录消息与交互式提示。
1[secondary_label SFTP prompt]
2Connected to localhost.
3sftp>
您可以在提示中使用ls
列出目录内容:
1ls
这将显示在上一步创建的上传
目录,并将您返回sftp>
提示。
1[secondary_label SFTP file list output]
2uploads
要验证用户确实受到此目录的限制,并且无法访问任何上面目录,您可以尝试将目录更改为上面目录。
1cd ..
此命令不会给出错误,但列出目录内容如前不会显示任何变化,证明用户无法切换到主目录。
您现在已经验证了受限制的配置是按照预期运作的。新创建的 sammyfiles 用户只能使用 SFTP 协议访问服务器进行文件传输,并且无法访问完整的壳。
结论
虽然本教程只使用一个目录和一个用户进行简化,但您可以将此示例扩展到多个用户和多个目录。
SSH 服务器允许更复杂的配置方案,包括同时限制对群组或多个用户的访问或限制对某些 IP 地址的访问. 您可以在 OpenSSH Cookbook中找到其他配置选项的示例和可能的指令的解释。