在Ubuntu 24.04环境下配置SFTP服务使用systemd mount units

在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 被替换为实际的用户名。
  • 重新启动 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 存储桶)

  1. 为共享创建挂载点目录

    sudo mkdir -p /mnt/$SHARE_MOUNT
    

    其中 $SHARE_MOUNT 可以是任何描述共享内容的名称。它只能包含在目录中有效的字符。它可以与 $SHARE_PATH 相同,也可以更简洁。
    例如,共享挂载在 /mnt/results,而共享名称更长。

    我们将使用 systemd 挂载单元 而不是 /etc/fstab

  2. 创建 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
    
  3. 重新加载 systemd 管理器配置以应用新的挂载配置。

    sudo systemctl daemon-reload
    
  4. 启用 NFS 挂载单元(以便在启动时启动)

    sudo systemctl enable mnt-results.mount
    
  5. 立即启动挂载

    sudo systemctl start mnt-results.mount
    
  6. 检查状态

    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"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值