Linux 搭建 sftp 服务器详解

(首发地址:学习日记 https://www.learndiary.com/2024/07/sftp/

朋友们,大家好。我是淘宝网“学习日记小店”从事 Linux 服务的 learndiary。今天给大家分享 Linux 搭建 sftp 服务器的一些经验,对其中初学者可能会犯错的一些地方作了详细的讲解。视频演示:【Linux 搭建 sftp 服务器详解】 https://www.bilibili.com/video/BV1Cy411z7fc/

Linux 搭建 sftp 服务器详解

一、背景

前段时间我接到一个订单,设置 sftp 服务器,要求使用 /ftp01 顶层目录作为 sftp 存放文件的目录。但是,当同时限制了用户活动根目录为 /ftp01 后,我发现对应用户不能登录 sftp 服务器了。由此,我对 sftp 服务器作了一下深入的学习研究。后面再说可以解决这个特殊要求订单的方法。下面是一些相关的详细过程,供大家参考。

二、通用 sftp 服务器搭建

这里设置一个最简单的通用 sftp 服务器,然后介绍一下涉及的5个知识点。

1、软硬件平台介绍
在 Deepin 20.9 Linux 宿主机上使用 VirtualBox 虚拟机,在虚拟机上安装 openEuler 24.03 LTS 作为示范,OpenSSH Server 版本为 9.3。其它版本的 Linux 和 OpenSSH 也可参考。

2、sftp 服务器设置步骤
1)、创建使用 sftp 服务的用户 ftp01

sudo su -
useradd -m -s /sbin/nologin ftp01
passwd ftp01

2)、创建 ftp01 保存文件的目录 /sftp/ftp01

mkdir /sftp/ftp01 -pv
chown ftp01:ftp01 /sftp/ftp01 -v

3)、修改 /etc/ssh/sshd_config 配置文件
先注释掉“Subsystem sftp”开头的这一行,即在行首加个#
再在配置文件的最后面加上

Subsystem sftp internal-sftp -d %u
Match User ftp01
ChrootDirectory /sftp

保存配置文件后退出,执行 service sshd reload 重载服务配置就完成了。
可以使用 sftp 客户端以用户 ftp01 登录试试,可以上传下载文件,活动范围限制在 /sftp 中,一切正常。同样用户使用 ssh 不能登录。达到预期效果。

3、知识点讲解
1)、internal-sftp 与 sftp-server 的区别
经过我的测试,使用原默认的sftp-server,当前用户的 shell 必须是像 /bin/bash 这样可以使用的普通 shell,而不能是像 /sbin/nologin 这种禁止 ssh 登录的 shell。否则,sftp 用户不能登录。另外,原默认的 sftp-server 不能chroot,所以不能限定 sftp 用户登录后的活动范围。有可能是因为 chroot 环境找不到 shell。但据说原默认的 sftp-server 对旧版 openssh 的兼容性较好,而且可以记录日志。

而 internal-sftp 简单性、性能、对 ChrootDirectory 的兼容性是它的优点。另外,我这里还给它加一个安全性优于 sftp-server。

总之,通常情况下,我们建立 sftp 服务器应该总是选择 internal-sftp。

参考网址:OpenSSH: Difference Between internal-sftp and sftp-server https://www.baeldung.com/linux/openssh-internal-sftp-vs-sftp-server

2)、Match 条件指令
根据 man 文档,Match 条件指令块必须后面接另一个 Match 行(如 Match All),或者放在配置文件最后。用 “Match All” 来结束 Match 块的用法我没有看到正式的明确的文档,故我这里采用的方法是直接把 Match 块放到配置文件的最后。
参考联机 man 文档摘录:

man ssh_config
Match Introduces a conditional block. If all of the criteria on the Match line are satisfied, the keywords on the following lines override those set in the
global section of the config file, until either another Match line or the end of the file. If a keyword appears in multiple Match blocks that are
satisfied, only the first instance of the keyword is applied.

3)、ChrootDirectory 限定活动范围指令
根据 man 文档,ChrootDirectory 限定活动范围(Chroot)的目录必须是全路径每个目录都只能被 root 拥有,且不能被其他用户和组写入。这就决定了 Chroot 的目录不能直接作为普通用户 sftp 存放目录,除非存放在里面新建的二级目录中。而 root 用户通常不会作为 sftp 的直接用户。
参考联机 man 文档摘录:

man ssh_config
ChrootDirectory
Specifies the pathname of a directory to chroot(2) to after authentication. At session startup sshd(8) checks that all components of the pathname are
root‐owned directories which are not writable by any other user or group. After the chroot, sshd(8) changes the working directory to the user’s home
directory. Arguments to ChrootDirectory accept the tokens described in the “TOKENS” section.

4)、sftp 用户家目录及免密码登录
sftp 用户的家目录和文件保存目录是两个概念。可以在家目录下设置密钥自动登录。方法跟 ssh 密钥登录一样。

5)、SELinux 属性对 sftp 密钥登录影响
在基于红帽或类似红帽的 Linux 系统中,一般都默认开启了 SELinux。在做 sftp 密钥登录时,如果 ~/.ssh/authorized_keys 的 SELinux 属性不是 ssh_home_t 属性(如 default_t),可能会由于 SELinux 属性不对而拒绝密钥自动登录。这种情况通常可以通过恢复相关文件默认的 SELinux 属性解决(restorecon -R -v ~/.ssh)。
参考链接:
SELinux preventing ssh via public key https://unix.stackexchange.com/questions/136877/selinux-preventing-ssh-via-public-key

三、解决顶层目录为 sftp 目录的问题

通过上述几个要点尤其是 ChrootDirectory 指令的讲解,可以看出,如果要把像 /ftp01 这样的顶层目录作为 sftp 直接保存文件的目录,一个方法就是不限制 sftp 登录用户的活动范围,允许他登录后可以在系统中自由活动,与最前面的 /etc/ssh/sshd_config 设置不同的地方就是去掉最后 Match 和 ChrootDirectory 开头的 2 行,Subsystem 开头的那行改为“Subsystem sftp internal-sftp -d /ftp01”,保存并重载服务设置即可。

四、扩展知识

sftp 公共目录、工作组目录设置。
参考链接:
林哥讲运维:一分钟学会:部署sftp服务器 https://www.bilibili.com/video/BV1yx4y147Ki

<think>好的,我现在需要帮助用户了解如何搭建SFTP服务器。根据用户的问题,他们希望得到一个详细的教程。首先,我要回顾用户提供的引用资料,这些资料涵盖了Windows和Linux系统的搭建方法,包括使用freesshd软件、配置用户权限和目录设置等。 首先,我需要整理不同操作系统的步骤。用户可能使用的是Windows或Linux,因此分开说明会比较清晰。对于Windows部分,引用[1]、[2]、[4]提到了使用FreeSSHd软件,所以应该详细列出下载、安装、配置的步骤,包括设置用户、根目录、权限和网络配置。需要确保每个步骤都清晰,比如如何添加用户,如何设置SSH密钥认证,以及如何测试连接。 接下来是Linux系统的搭建,引用[3]和[5]提到了使用OpenSSH和配置用户目录及权限。这里需要说明安装openssh-server,修改sshd_config文件,创建用户组,设置家目录权限,以及重启服务。特别是要处理权限问题,比如ChrootDirectory的所有权必须是root,而用户目录的所有权需要正确设置,以避免权限错误。 然后,用户可能关心公网访问,引用[2]提到了这一点,所以需要简要说明端口转发和动态DNS的应用,但可能不需要深入,因为用户主要问的是搭建步骤,公网访问可以作为扩展内容。 还需要注意用户权限和目录配置的安全性,比如在Linux中限制用户只能访问自己的目录,避免越权。同时,防火墙设置也是关键,确保22端口开放,否则连接会失败。 可能遇到的问题包括安装过程中的软件兼容性,比如FreeSSHd在Windows的版本是否支持最新系统,或者Linux中SELinux的配置可能阻止SFTP访问,需要提示用户检查这些设置。 最后,生成相关问题时要覆盖不同系统、安全性、配置优化和故障排除等方面,帮助用户进一步探索。例如,如何选择Windows和Linux的方案,如何加强安全,或者处理连接失败的情况。 现在需要将这些思考整理成一个结构化的回答,分步骤指导用户,同时确保引用正确,如Windows部分引用[1][2][4],Linux部分引用[3][5]。注意使用正确的LaTeX格式,虽然用户的问题中没有数学内容,但按照系统指令,行内公式需要用$...$,独立公式用$$...$$,但当前内容可能不需要数学表达式,所以可能不需要添加。但需要检查是否有变量或技术术语需要格式处理,比如端口号22可能需要用代码块或引号,但用户示例中使用的是代码块,所以可能用代码块来显示命令。 总结来说,回答应该分为Windows和Linux两部分,每部分详细步骤,注意事项,然后相关问题。确保引用标注正确,语言简洁明了,符合用户要求的结构清晰,帮助用户逐步解决问题。</think>### 如何搭建SFTP服务器教程 SFTP(SSH文件传输协议)提供了一种安全的文件传输方式。以下是针对Windows和Linux系统的搭建教程: --- #### **一、Windows系统搭建SFTP服务器** 1. **下载并安装FreeSSHD** - 访问FreeSSHD官网[^2],下载并安装软件。安装时需勾选“SFTP server”功能[^4]。 - 安装完成后,以管理员身份运行FreeSSHD,进入主界面。 2. **配置SFTP服务器** - **用户管理**:点击左侧菜单的`Users`,添加新用户并设置密码或SSH密钥[^4]。 - **根目录设置**:在用户配置中指定SFTP根目录(如`C:\SFTP_Data`),确保用户权限为“Read/Write”[^2]。 - **网络配置**:在`SSH`选项卡中设置服务器IP和端口(默认22),并确保防火墙允许该端口[^1]。 3. **启动服务并测试** - 点击`Server`选项卡启动服务,使用SFTP客户端(如WinSCP)输入IP、端口、用户名和密码连接测试。 --- #### **二、Linux系统搭建SFTP服务器** 1. **安装OpenSSH服务** ```bash sudo apt-get install openssh-server # Ubuntu/Debian sudo yum install openssh-server # CentOS/RHEL ``` 2. **配置SFTP用户组与目录** - 创建用户组和用户: ```bash sudo groupadd sftp_users sudo useradd -G sftp_users -s /sbin/nologin uftp01 # 禁止Shell登录[^3][^5] sudo passwd uftp01 ``` - 设置用户根目录: ```bash sudo mkdir -p /sftp/uftp01 sudo chown root:sftp_users /sftp/uftp01 sudo chmod 755 /sftp/uftp01 ``` 3. **修改SSH配置文件** - 编辑`/etc/ssh/sshd_config`,添加以下内容: ``` Subsystem sftp internal-sftp Match Group sftp_users ChrootDirectory /sftp/%u ForceCommand internal-sftp AllowTcpForwarding no ``` - 重启SSH服务: ```bash sudo systemctl restart sshd ``` 4. **测试连接** - 使用SFTP客户端连接服务器地址和端口22,输入用户名和密码验证。 --- #### **注意事项** 1. **权限安全**:Linux中`ChrootDirectory`的父目录必须属于`root`,子目录可由用户管理[^5]。 2. **防火墙配置**:确保22端口在防火墙中开放(如`ufw allow 22`)。 3. **公网访问**:若需公网访问,需配置路由器端口转发并绑定动态DNS。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值