凌峰创科服务平台

linux配置sftp服务器配置

  1. 使用 OpenSSH (最推荐):这是最简单、最常见的方法,因为绝大多数 Linux 系统已经安装了 SSH 服务器,我们只需要进行一些配置即可,它不需要额外安装服务,安全性也依赖于久经考验的 OpenSSH。
  2. 使用 vsftpd + ssh-vault (较少见):这种方法需要额外安装一个 FTP 服务器和一个包装程序,配置相对复杂,不推荐新手使用。

下面我将详细介绍 使用 OpenSSH 配置 SFTP 的完整步骤,这是业界标准做法。

linux配置sftp服务器配置-图1
(图片来源网络,侵删)

核心思想:通过 SSH 配置文件限制用户

SFTP 实际上是基于 SSH 协议的文件传输协议,我们配置的不是“SFTP 服务器”本身,而是“SSH 服务器”的行为,我们可以通过修改 SSH 配置文件 (sshd_config),为特定用户或用户组设置一个“沙盒”环境,限制他们只能使用 SFTP 进行文件传输,而不能通过 SSH 登录系统执行其他命令。


详细配置步骤

步骤 1:检查并安装 OpenSSH

大多数 Linux 发行版默认已安装 OpenSSH,如果没有,请安装它。

对于 Debian / Ubuntu:

sudo apt update
sudo apt install openssh-server

对于 CentOS / RHEL / Fedora:

linux配置sftp服务器配置-图2
(图片来源网络,侵删)
sudo yum install openssh-server
# 或者使用 dnf (在较新版本中)
sudo dnf install openssh-server

安装完成后,SSH 服务通常会自动启动,你可以检查其状态:

sudo systemctl status sshd

如果未启动,使用以下命令启动并设置为开机自启:

sudo systemctl start sshd
sudo systemctl enable sshd

步骤 2:创建专用的 SFTP 用户

为了安全和隔离,最好不要让系统用户(如 root, admin)直接使用 SFTP,我们创建一个专门用于 SFTP 的用户组和一个或多个用户。

  1. 创建 SFTP 用户组

    linux配置sftp服务器配置-图3
    (图片来源网络,侵删)
    sudo groupadd sftpusers
  2. 创建 SFTP 用户并添加到组 假设我们要创建一个名为 sftpuser 的用户,并将其主目录设置为 /home/sftpuser/uploads

    # 创建用户,设置密码,并指定主目录
    sudo useradd -m -d /home/sftpuser/uploads -s /bin/false -G sftpusers sftpuser
    # 为新用户设置密码
    sudo passwd sftpuser
    • -m: 自动创建用户主目录。
    • -d /home/sftpuser/uploads: 指定用户的主目录。这个目录将作为用户的 SFTP 根目录
    • -s /bin/false: 非常重要! 这会禁止该用户使用 SSH 登录(不能 ssh sftpuser@server),我们只允许它进行 SFTP 连接。
    • -G sftpusers: 将用户添加到 sftpusers 组中,方便后续进行批量配置。
  3. 设置主目录权限 为了让 SFTP 服务能正确地限制用户在其主目录内活动,目录的权限设置非常关键,错误的权限会导致用户无法登录。

    # 设置主目录的所有者为 root
    sudo chown root:root /home/sftpuser/uploads
    # 设置主目录的权限为 755
    sudo chmod 755 /home/sftpuser/uploads

    为什么是 root:root755

    • SFTP 服务需要以 root 权限来“chroot”(限制)用户到其主目录,如果主目录属于用户自己,chroot 操作可能会失败,因为用户没有权限修改其上级目录。
    • 755 权限确保了所有者(root)有读写执行权限,组和其他用户有读和执行权限,这是 chroot 操作所必需的。
  4. 创建用户可写的子目录 用户无法在其根目录(/home/sftpuser/uploads)下创建文件,因为该目录不属于它,我们需要在根目录下创建一个子目录,并将其所有权分配给用户。

    # 在根目录下创建一个名为 "files" 的子目录
    sudo mkdir /home/sftpuser/uploads/files
    # 将这个子目录的所有权分配给 sftpuser 用户
    sudo chown sftpuser:sftpuser /home/sftpuser/uploads/files
    # 设置子目录的权限
    sudo chmod 755 /home/sftpuser/uploads/files

    sftpuser 登录后,只能看到并访问 /home/sftpuser/uploads/files 目录,并且可以在这个目录里上传、下载、创建文件和文件夹。

步骤 3:配置 SSH 服务器 (sshd_config)

这是最关键的一步,我们需要编辑 OpenSSH 的主配置文件。

  1. 编辑配置文件

    sudo nano /etc/ssh/sshd_config
  2. 添加或修改配置 在文件末尾添加以下内容:

    # Subsystem for SFTP
    Subsystem sftp internal-sftp
    # Match for users in the 'sftpusers' group
    Match Group sftpusers
        # Force the command to be internal-sftp, ignoring any user's ~/.ssh/rc or ~/.ssh/authorized_keys command
        ForceCommand internal-sftp
        # Chroot the user to their home directory
        ChrootDirectory %h
        # Allow the user to write files, but not to modify their own home directory (already handled by permissions)
        # This is often not needed if permissions are set correctly on the root directory
        # AllowTcpForwarding no
        # X11Forwarding no

    配置解释:

    • Subsystem sftp internal-sftp: 指定 SFTP 子系统使用 OpenSSH 内置的 internal-sftp 实现,这是最标准的方式。
    • Match Group sftpusers: 这是一个指令块,它后面所有的配置只对 sftpusers 组中的用户生效。
    • ForceCommand internal-sftp: 强制执行 internal-sftp 命令,即使用户在 ~/.ssh/authorized_keys 文件中设置了其他的命令(command="..."),也会被忽略,这确保了用户只能进行 SFTP 操作。
    • ChrootDirectory %h: 核心配置,将用户限制(chroot)到其主目录 (%h 是一个变量,代表用户的主目录),用户将无法看到或访问其主目录之外的任何文件系统。
  3. (可选)禁用密码登录,只允许密钥登录(更安全)sshd_config 文件中找到并修改以下行:

    # PasswordAuthentication yes
    # 改为
    PasswordAuthentication no
    # 确保 PubkeyAuthentication 是开启的
    PubkeyAuthentication yes

    你需要为你的用户生成 SSH 密钥对,并将公钥添加到 ~/.ssh/authorized_keys 文件中,这样即使密码泄露,攻击者也无法登录。

步骤 4:重启 SSH 服务

保存并关闭 sshd_config 文件后,重启 SSH 服务以使配置生效。

sudo systemctl restart sshd

步骤 5:测试 SFTP 连接

你可以使用任何 SFTP 客户端(如 FileZilla, WinSCP, 或命令行 sftp)来测试连接。

使用命令行 sftp 测试:

# 格式: sftp <username>@<server_ip>
sftp sftpuser@your_server_ip

如果配置成功,你会看到类似 Connected to your_server_ip. 的提示,并且会直接进入用户的 SFTP 根目录(在用户看来是 ,实际上是 /home/sftpuser/uploads)。

sftp> pwd
/
sftp> ls
files
sftp> cd files
sftp> pwd
/files
sftp> put /path/to/local_file.txt
Uploading /path/to/local_file.txt to /files/local_file.txt
local_file.txt      100%    50     0.0KB/s   00:00
sftp> exit

如果你尝试用 SSH 登录,应该会被拒绝:

ssh sftpuser@your_server_ip
# 输出应该类似:
# This service allows sftp connections only.

故障排除

如果连接失败,请按以下步骤检查:

  1. 检查 SSH 服务状态
    sudo systemctl status sshd
  2. 查看 SSH 日志
    sudo tail -f /var/log/auth.log  # Debian/Ubuntu
    # 或者
    sudo tail -f /var/log/secure   # CentOS/RHEL

    查找与 sshdsftpuser 相关的错误信息,常见的错误是 chroot 失败,这通常是由于主目录或其父目录的权限不正确导致的。

  3. 检查文件权限:再次确认 ChrootDirectory(即用户主目录)的权限是 755,并且所有者是 root
  4. SELinux (如果启用):如果系统启用了 SELinux,它可能会阻止 chroot 操作,你可以尝试临时禁用 SELinux 来测试:
    sudo setenforce 0

    如果可以连接了,说明是 SELinux 策略问题,你需要为 SFTP 配置正确的 SELinux 上下文,这超出了本教程的范围,但可以搜索 "selinux sftp chroot" 相关资料。

通过以上步骤,你就成功地在 Linux 上配置了一个安全、隔离的 SFTP 服务器,这种方法利用了 OpenSSH 的强大功能,无需额外软件,配置清晰,是生产环境中的首选方案。

分享:
扫描分享到社交APP
上一篇
下一篇