在Ubuntu 24.04环境下配置SFTP服务使用systemd mount units
在Ubuntu 24.04环境下配置SFTP服务使用systemd mount units
本指南详细介绍了如何在 Ubuntu 24.04 上配置 SFTP 服务器,包括挂载 NFS 共享(例如 S3 存储桶)、添加用户以及授予用户对共享的访问权限。
目录
- 在Ubuntu 24.04环境下配置SFTP服务使用systemd mount units
- 1. 初始一次性配置
- 1.1 安装系统软件包
- 1.2 创建 SFTP 根目录
- 1.3 配置 SFTP 服务
- SSH 配置示例
- 2. 添加新的 NFS 文件共享(例如 S3 存储桶)
- 3. 添加新的 SFTP 用户
- 3.1 创建新的 SFTP 用户
- 3.2 [可选] SSH 密钥认证
- 4. 授予用户对现有共享的访问权限
- 4.1 将共享添加到用户
- 5. 常见问题解答
- 5.1 其他检查命令
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"