在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"
### 配置SFTP服务Ubuntu 24.04系统中配置SFTP服务,可以按照以下步骤进行操作: #### 初始一次性配置 1. **安装系统软件包** 确保系统已安装OpenSSH服务器,这是提供SFTP服务的基础。可以通过以下命令安装: ```bash sudo apt update sudo apt install openssh-server ``` 2. **创建 SFTP 根目录** 为SFTP用户创建一个根目录,该目录将是用户登录后的主目录。例如,创建名为`sftpusers`的目录: ```bash sudo mkdir /sftpusers ``` 3. **配置 SFTP 服务** 编辑SSH配置文件,通常位于`/etc/ssh/sshd_config`,添加或修改以下内容以启用SFTP服务: ``` Subsystem sftp internal-sftp Match Group sftpusers ChrootDirectory /sftpusers/%u ForceCommand internal-sftp AllowTcpForwarding no X11Forwarding no ``` 完成配置后,重启SSH服务以应用更改: ```bash sudo systemctl restart ssh ``` #### 添加新的 NFS 文件共享(例如 S3 存储桶) 如果需要将NFS文件共享(如AWS S3存储桶)挂载到SFTP用户的目录中,可以使用`systemd mount units`来实现自动挂载。创建一个`.mount`文件,例如`/etc/systemd/system/s3.mount`,并添加如下内容: ``` [Unit] Description=Mount S3 Bucket After=network.target [Mount] What=s3fs#<bucket-name> Where=/sftpusers/<username>/s3 Type=fuse Options=_netdev,allow_other,use_path_request_style,url=https://s3.<region>.amazonaws.com ``` 启用并启动该挂载点: ```bash sudo systemctl daemon-reexec sudo systemctl enable s3.mount sudo systemctl start s3.mount ``` #### 添加新的 SFTP 用户 1. **创建新的 SFTP 用户** 创建一个新的用户,并将其加入`sftpusers`组,以便该用户能够使用SFTP服务: ```bash sudo adduser <username> sudo usermod -aG sftpusers <username> ``` 同时,确保用户的家目录位于SFTP根目录下,并且权限设置正确: ```bash sudo mkdir /sftpusers/<username> sudo chown root:root /sftpusers/<username> sudo chmod 755 /sftpusers/<username> ``` 2. **[可选] SSH 密钥认证** 对于需要更高安全性的场景,可以配置SSH密钥认证。首先,在客户端生成SSH密钥对: ```bash ssh-keygen -t rsa -b 4096 ``` 然后,将公钥复制到服务器上的用户家目录中: ```bash ssh-copy-id <username>@<server-ip> ``` #### 授予用户对现有共享的访问权限 1. **将共享添加到用户** 如果有多个用户需要访问同一个NFS共享,可以将这些用户添加到一个特定的用户组中,并确保该用户组对共享目录具有适当的读写权限。 #### 常见问题解答 1. **其他检查命令** - 检查SSH服务状态: ```bash sudo systemctl status ssh ``` - 查看SFTP连接日志: ```bash sudo tail -f /var/log/auth.log ``` 通过以上步骤,可以在Ubuntu 24.04系统中成功配置SFTP服务,同时支持NFS文件共享和SSH密钥认证等高级功能[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值