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
chmod 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1473646.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

3-3 超参数

3-3 超参数 什么是超参数 超参数也是一种参数,它具有参数的特性,比如未知,也就是它不是一个已知常量。是一种手工可配置的设置,需要为它根据已有或现有的经验,指定“正确”的值,也就是人为为它设定一个值&…

Linux系统的服务——以Centos7为例

一、Linux系统的服务简介 服务是向外部提供对应功能的进程,其运行在系统后台,能够7*24小时持续不断的提供外界随时发来的服务请求,且服务进程常驻在内存中,具有固定的端口号,通过端口号就能找到服务内容。 提供服务的一…

2000-2022年地级市数字经济指数(含控制变量)

2000-2022年地级市数字经济指数(含控制变量) 目录 数字经济对区域经济发展的影响实证研究 一、引言 二、文献综述 三、数据来源与变量说明 四、实证模型 五、程序代码与运行结果 数字经济对区域经济发展的影响实证研究 摘要: 本文旨在…

Ubuntu防火墙相关内容

Ubuntu防火墙相关的命令,主要用于日常使用过程中,忘记命令时查找方便,不用再去各种地方搜索了。以下命令均已root用户执行,如果是非root用户,需要添加sudo 查看防火墙的启用状态 ufw status 说明是启用状态。 启用防…

Fish Speech: 开源文本转语音技术(TTS)的新里程碑

简介 Fish Speech 是一个全新的文本转语音(TTS)解决方案,该项目由fishaudio开发。当前模型使用约十五万小时三语数据训练,对中文支持非常的完美。 能够熟练处理和生成中文、日语和英语的语音,语言处理能力接近人类水平,并且声音…

代码随想录算法训练营第4天|LeetCode24,19,02,07,142

24.交换链表结点 题目链接:24. 两两交换链表中的节点 - 力扣(LeetCode) 文章链接:代码随想录 (programmercarl.com) 视频链接:代码随想录算法公开课 | 最强算法公开课 | 代码随想录 第一想法 正常模拟,先画…

算法金 | 欧氏距离算法、余弦相似度、汉明、曼哈顿、切比雪夫、闵可夫斯基、雅卡尔指数、半正矢、Sørensen-Dice

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 抱个拳,送个礼 在算法模型构建中,我们经常需要计算样本之间的相似度,通常的做法是计算样本之间的距…

性价比蓝牙耳机排行榜前十名有哪些?十大性价比蓝牙耳机榜单盘点

作为使用真无线蓝牙耳机长达5-6年的资深爱好者,我始终对音频技术和产品的创新保持着浓厚的兴趣,最近,我投入了一笔不小的资金,超过大几千元,用于深入测试和评估市面上多款来自各大品牌的真无线蓝牙耳机(包括…

EtherCAT转Profinet网关配置说明第一讲:配置软件安装及介绍

网关XD-ECPNS20为EtherCAT转Profinet协议网关,使EtherCAT协议和Profinet协议两种工业实时以太网网络之间双向传输 IO 数据。适用于具有EtherCAT协议网络与Profinet协议网络跨越网络界限进行数据交换的解决方案。 本网关通过上位机来进行配置。 首先安装上位机软件 一…

用递归解决冒泡排序问题

冒泡排序是种很简单的排序方式. 如果用循环方式, 通常就是两层循环. 由于两层循环都是与元素个数 N 线性相关, 所以可以简单估算出它的时间复杂度是 O(N2), 通常而言, 这是较糟糕的复杂度. 当然, 这也几乎是所有简单方式的宿命, 想简单就别想效率高! 前面篇章说到递归也是一种循…

基于Java技术的人事管理系统

你好,我是专注于计算机科学领域的小野。如果你对人事管理系统感兴趣或有相关需求,欢迎私信交流。 开发语言: Java 数据库: MySQL 技术: B/S模式、Java技术、SpringBoot 工具: Eclipse、MySQL、浏览…

【C++:类的基础认识和this指针】

C的类与C语言的struct结构体有啥区别? 默认的访问限定符不同 类的简要 关键字:class{}里面是类的主体,特别注意:{}后面的;不可以省略类中的变量叫做成员变量,类中的函数叫做成员函数类中访问有三种访问权限…

HTML5使用<blockquote>标签:段落缩进

使用<blockquote>标签可以实现页面文字的段落缩进。这一标签也是每使用一次&#xff0c;段落就缩进一次&#xff0c;并且可以嵌套使用&#xff0c;以达到不同的缩进效果。语法如下&#xff1a; <blockquote>文字</blockquote> 【实例】使用<blockquote&…

谷粒商城----通过缓存和分布式锁获取数据。

高并发下缓存失效的问题 高并发下缓存失效的问题--缓存穿透 指查询一个一定不存在的数据&#xff0c;由于缓存是不命中&#xff0c;将去查询数据库&#xff0c;但是数据库也无此记录&#xff0c;我们没有将这次查询的不写入缓存&#xff0c;这将导致这个不存在的数据每次请求…

工厂模式之简单工厂模式

文章目录 工厂模式工厂模式分为工厂模式的角色简单工厂模式案例代码定义一个父类&#xff0c;三个子类定义简单工厂客户端使用输出结果 工厂模式 工厂模式属于创造型的模式&#xff0c;用于创建对象。 工厂模式分为 简单工厂模式&#xff1a;定义一个简单工厂类&#xff0c;根…

VuePress 的更多配置

现在&#xff0c;读者应该对 VuePress、主题和插件等有了基本的认识&#xff0c;除了插件&#xff0c;VuePress 自身也有很多有用的配置&#xff0c;这里简单说明下。 ‍ ‍ VuePress 的介绍 在介绍了 VuePress 的基本使用、主题和插件的概念之后&#xff0c;我们再来看看官…

【MySQL】1.初识MySQL

初识MySQL 一.MySQL 安装1.卸载已有的 MySQL2.获取官方 yum 源3.安装 MySQL4.登录 MySQL5.配置 my.cnf 二.MySQL 数据库基础1.MySQL 是什么&#xff1f;2.服务器&#xff0c;数据库和表3.mysqld 的层状结构4.SQL 语句分类 一.MySQL 安装 1.卸载已有的 MySQL //查询是否有相关…

vue事件参数

事件参数 事件参数可以获取event对象和通过事件传递数据 获取event对象 <template> <buttonclick"addCount">点击</button><p>count is: {{ count }}</p><p>{{ coutent_e }}</p> </template> <script>expor…

昇腾910B部署Qwen2-7B-Instruct进行流式输出【pytorch框架】NPU推理

目录 前情提要torch_npu框架mindsport框架mindnlp框架 下载模型国外国内 环境设置代码适配&#xff08;非流式&#xff09;MainBranch结果展示 代码适配&#xff08;流式&#xff09; 前情提要 torch_npu框架 官方未适配 mindsport框架 官方未适配 mindnlp框架 官方适配…

25.【C语言】循环结构之for 上

1.基本使用 类比while 在while循环中&#xff0c;有三个不可或缺的部分&#xff1a;初始化&#xff0c;判断部分&#xff0c;调整部分 int i 0;//初始化 while (i < 10)//判断部分 {……i;//调整部分 }三个部分太分散&#xff0c;用for循环可集为一体&#xff0c;简洁 …