在Ubuntu 24.04环境下配置SFTP服务使用systemd mount units
本指南详细介绍了如何在 Ubuntu 24.04 上配置 SFTP 服务器,包括挂载 NFS 共享(例如 S3 存储桶)、添加用户以及授予用户对共享的访问权限。
目录
1. 初始一次性配置
仅在首次设置 SFTP 服务器时需要执行此步骤。
1.1 安装系统软件包
这两个命令更新软件包列表并安装 NFS 客户端和 SFTP 服务器。
sudo apt update
sudo apt install nfs-common openssh-server -y
nfs-common
: 用于挂载由 Storage Gateway 提供的 NFS 共享。openssh-server
: 用于托管 SFTP 服务(SFTP 是 SSH 的扩展,支持通过 SSH 隧道进行 FTP 操作)。
1.2 创建 SFTP 根目录
创建 SFTP 根目录,它将包含所有 SFTP 用户的主目录:
sudo mkdir -p /sftp
sudo chown root:root /sftp
sudo chmod 755 /sftp
1.3 配置 SFTP 服务
SFTP 在 SSH 守护进程(sshd)的配置文件中进行配置。
此文件位于 /etc/ssh/sshd_config
。
使用 root 权限和你喜欢的命令行文本编辑器(例如 nano)打开 SSH 服务器配置文件进行编辑:
sudo nano /etc/ssh/sshd_config
该文件包含很多行,但默认情况下大多数行都被注释掉了。重要的配置如下:
-
配置 SFTP 服务器以允许客户端使用公钥认证。
PubkeyAuthentication yes
此方法比传统的密码认证更安全,因为它依赖于加密密钥对,而不是容易被猜测或破解的密码。
-
启用质询-响应认证、密码认证和 PAM(可插拔认证模块)。
ChallengeResponseAuthentication yes PasswordAuthentication yes UsePAM yes
-
为管理员用户(ubuntu)配置特定的 SSH 规则,使其不被视为 SFTP 用户。
警告:此规则必须位于常规 SFTP 用户的规则之前(参见 d.)。Match User ubuntu: ChrootDirectory none ForceCommand none AllowTcpForwarding yes X11Forwarding yes
这为管理员用户(ubuntu)设置了比 SFTP 用户更宽松的规则,以便管理员用户可以使用 SSH shell 等登录,而 SFTP 用户不允许这样做。
具体来说:- 不对用户
ubuntu
应用 chroot 限制。 - 不强制执行特定命令。
- 允许 TCP 转发。
- 允许 X11 转发。(实际上不需要)
- 不对用户
-
为普通 SFTP 用户配置保守的 SSH 规则
Match User * ChrootDirectory /sftp/%u ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no AuthorizedKeysFile /sftp/%u/.ssh/authorized_keys
具体来说:
- 对所有其他用户应用 chroot 限制,目录设置为
/sftp/%u
,其中%u
被替换为实际的用户名。 - 强制使用内部 SFTP 服务器。
- 禁止 TCP 转发。
- 禁止 X11 转发。
- 指定认证密钥文件的位置。对于每个用户,此文件位于
/sftp/%u/.ssh/authorized_keys
,其中%u
被替换为实际的用户名。
- 对所有其他用户应用 chroot 限制,目录设置为
-
重新启动 SSH 服务以应用新配置。
sudo systemctl restart ssh
SSH 配置示例
Include /etc/ssh/sshd_config.d/*.conf
PubkeyAuthentication yes
ChallengeResponseAuthentication yes
PasswordAuthentication yes
UsePAM yes
KbdInteractiveAuthentication no
X11Forwarding yes
PrintMotd no
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
Match User ubuntu
ChrootDirectory none
ForceCommand none
AllowTcpForwarding yes
X11Forwarding yes
Match User *
ChrootDirectory /sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
AuthorizedKeysFile /sftp/%u/.ssh/authorized_keys
2. 添加新的 NFS 文件共享(例如 S3 存储桶)
-
为共享创建挂载点目录
sudo mkdir -p /mnt/$SHARE_MOUNT
其中
$SHARE_MOUNT
可以是任何描述共享内容的名称。它只能包含在目录中有效的字符。它可以与$SHARE_PATH
相同,也可以更简洁。
例如,共享挂载在/mnt/results
,而共享名称更长。我们将使用
systemd 挂载单元
而不是/etc/fstab
-
创建 NFS 的 systemd 挂载单元:
sudo nano /etc/systemd/system/mnt-results.mount
例如
mnt-results.mount
的内容:[Unit] Description=Mount NFS Share Wants=network-online.target After=network-online.target [Mount] What=ip:/bucket_name Where=/mnt/results Type=nfs Options=defaults,_netdev,nolock,retry=5,timeo=600,retrans=3,nofail,x-systemd.automount [Install] WantedBy=multi-user.target
-
重新加载 systemd 管理器配置以应用新的挂载配置。
sudo systemctl daemon-reload
-
启用 NFS 挂载单元(以便在启动时启动)
sudo systemctl enable mnt-results.mount
-
立即启动挂载
sudo systemctl start mnt-results.mount
-
检查状态
sudo systemctl status mnt-results.mount
总结:
sudo mkdir -p /mnt/results
sudo systemctl daemon-reload
sudo systemctl enable mnt-results.mount
sudo systemctl start mnt-results.mount
3. 添加新的 SFTP 用户
$USER
: 这是需要创建的用户名。
3.1 创建新的 SFTP 用户
创建没有通常主目录和 shell 访问权限的用户帐户
sudo useradd -M -s /sbin/nologin $USER
我们使用 useradd
而不是 adduser
,因为后者默认创建 shell 用户。
-M
标志阻止创建主目录,因为我们将使用我们的挂载目录,-s /sbin/nologin
出于安全考虑阻止常规 shell 访问。
为用户创建密码
sudo passwd $USER
并输入两次用户所需的密码。
在 chroot 环境中创建用户的 SFTP “主” 目录
sudo mkdir -p /sftp/$USER
为 chroot 目录设置所需的所有权和权限
sudo chown root:root /sftp/$USER
sudo chmod 755 /sftp/$USER
755
表示所有者具有读、写和执行权限,组和其他人具有读和执行权限。
总结:
sudo useradd -M -s /sbin/nologin $USER
sudo passwd $USER
sudo mkdir -p /sftp/$USER
sudo chown root:root /sftp/$USER
sudo chmod 755 /sftp/$USER
3.2 [可选] SSH 密钥认证
这使用户能够将其公钥上传到 SFTP,以便他们可以使用密钥身份登录,而不是使用密码。
请注意,用户的 .ssh
目录不会被复制到任何文件共享/S3 存储桶。
创建 .ssh
目录
sudo mkdir -p /sftp/$USER/.ssh
为 .ssh
目录设置所需的所有权和权限
sudo chown $USER:$USER /sftp/$USER/.ssh
sudo chmod 700 /sftp/$USER/.ssh
将用户 .ssh
目录的所有权更改为由当前用户 $USER
拥有,并将目录的权限设置为 700
,这意味着只有所有者具有读、写和执行权限,组和其他人没有权限。
总结:
sudo mkdir -p /sftp/$USER/.ssh
sudo chown $USER:$USER /sftp/$USER/.ssh
sudo chmod 700 /sftp/$USER/.ssh
4. 授予用户对现有共享的访问权限
这些步骤为用户($USER
)提供了对现有共享的访问权限。该共享将作为子目录出现在用户的 SFTP “主” 目录中。这是通过为用户在共享中创建 “bind” 挂载到用户 sftp 目录中的相应目录来实现的。
在下面的示例中,我们将挂载的共享称为 /mnt/$SHARE_MOUNT
(示例是 /mnt/results
)。
我们将此共享的用户子目录称为 $SDIR
。(示例会使用 results
)
4.1 将共享添加到用户
在用户的 SFTP “主” 目录中为共享创建挂载点
sudo mkdir -p /sftp/$USER/$SDIR
例如,(挂载在 /mnt/results
)的权限,并使用默认的子目录命名 results
sudo mkdir -p /sftp/$USER/results
在共享内创建用户的目录
sudo mkdir -p /mnt/$SHARE_MOUNT/$USER
例如,(挂载在 /mnt/results
)的权限
sudo mkdir -p /mnt/results/$USER
在共享内为用户的目录设置初始权限
sudo chown nobody:nogroup /mnt/$SHARE_MOUNT/$USER
例如,(挂载在 /mnt/results
)的权限
sudo chown nobody:nogroup /mnt/results/$USER
为用户创建一个新的绑定挂载单元。
sudo nano /etc/systemd/system/sftp-$USER-results.mount
sftp-$USER-results
的内容
[Unit]
Description=Bind Mount for /sftp/$USER/results
Requires=mnt-results.mount
After=mnt-results.mount network-online.target
Wants=network-online.target
DefaultDependencies=no
[Mount]
What=/mnt/results/$USER
Where=/sftp/$USER/results
Type=none
Options=bind
[Install]
WantedBy=remote-fs.target
这指示系统仅在 NFS 成功挂载后才将目录 /mnt/results/$USER
绑定到目录 /sftp/$USER/results
。
重新加载 systemd 管理器配置以应用新的挂载配置。
sudo systemctl daemon-reload
启用并启动绑定挂载单元
sudo systemctl enable sftp-$USER-results.mount
sudo systemctl start sftp-$USER-results.mount
sudo systemctl status sftp-$USER-results.mount
[可选] 希望用户可以自己上传 SFTP 中的文件
sudo chown $USER:$USER /mnt/results/$USER
sudo chown $USER:$USER /sftp/$USER/$SDIR
检查挂载单元日志:
journalctl -xe
总结:
sudo mkdir -p /sftp/$USER/$SDIR
sudo mkdir -p /mnt/$SHARE_MOUNT/$USER
sudo chown nobody:nogroup /mnt/$SHARE_MOUNT/$USER
创建一个新的绑定挂载单元:
sudo nano /etc/systemd/system/sftp-$USER-results.mount
sudo systemctl enable sftp-$USER-results.mount
sudo systemctl start sftp-$USER-results.mount
5. 常见问题解答
5.1 其他检查命令
mount | grep /mnt/results
: 检查/mnt/results
是否已挂载。如果成功挂载,将显示相关的挂载信息。cat /var/log/auth.log | grep "sshd"
: 查看 SSH 认证日志中与sshd
相关的条目。这有助于排除 SSH 登录和认证问题。
mount | grep /mnt/results
cat /var/log/auth.log | grep "sshd"