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.mzph.cn/news/864778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA工程师有前途吗 ?FPGA崛起之路

全球 FPGA 市场规模犹如滚雪球般逐年扩大。 根据Gartner Group预测,2020-2026年全球FPGA市场规模从55.85亿美元增至96.9亿美元,年均复合增长率为9.6%。 众多国际知名科技企业,如赛灵思、Lattice等,纷纷加大在 FPGA 研发和应用方…

主干网络篇 | YOLOv5/v7 更换骨干网络之 MobileNetV3 | 基于神经网络搜索的轻量级网络

主干网络篇 | YOLOv5/v7 更换骨干网络之 MobileNetV3 | 基于神经网络搜索的轻量级网络 1. 简介 近年来,深度卷积神经网络(CNN)在图像识别、目标检测等领域取得了巨大进展。然而,随着模型复杂度的不断提升,模型训练和…

贡献WebKit:成为开源Web引擎的建设者

🌟 贡献WebKit:成为开源Web引擎的建设者 WebKit是一个开源的浏览器引擎,被用于多个流行的浏览器和应用程序中,包括Safari、Mail、App Store等。为WebKit贡献代码不仅是对开源社区的贡献,也是提升个人技术实力的绝佳机…

❤ Gitee平台的使用

Gitee平台的使用 文章目录 Gitee平台的使用一、Gitee的注册1、注册2、添加邮箱 二、仓库的创建 和 团队成员的添加1、单击右上角的 **+** 号 、创建仓库2、如下填写即可 三、仓库克隆到本地1、安装好git 和 小乌龟(TortoiseGit)2、打开仓库 复…

强化学习的数学原理:最优贝尔曼公式

大纲 贝尔曼最优公式是贝尔曼公式的一个特殊情况,但其也非常重要。 本节课很重要的两个概念和一个工具: 工具不用多说,就是贝尔曼最优公式,概念则是 optimal state value(最优状态价值) 和 optimal polic…

【博主推荐】HTML5实现简洁好看的个人简历网页模板源码

文章目录 1.设计来源1.1 主界面1.2 关于我界面1.3 工作经验界面1.4 学习教育界面1.5 个人技能界面1.6 专业特长界面1.7 朋友评价界面1.8 获奖情况界面1.9 联系我界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发&#xff0c…

2024 年江西省研究生数学建模竞赛题目 A题交通信号灯管理---完整文章分享(仅供学习)

问题: 交通信号灯是指挥车辆通行的重要标志,由红灯、绿灯、黄灯组成。红灯停、绿灯行,而黄灯则起到警示作用。交通信号灯分为机动车信号灯、非机动车信号灯、人行横道信号 灯、方向指示灯等。一般情况下,十字路口有东西向和南北向…

Virsh管理kvm虚拟机命令

virsh 提供命令管理虚拟化,virt-manager提供图形化管理虚拟机。virsh可以提供edit、list、start、stop和destroy等子命令。 virsh list 查看运行的虚拟机virsh list --all 查看所有的虚拟机,关闭和运行的virsh domstate 虚机名 #显示虚机状态virsh no…

【深度学习】图生图img3img论文原理,SD EDIT

https://arxiv.org/abs/2108.01073 摘要 引导图像合成技术使普通用户能够以最小的努力创建和编辑逼真的图像。关键挑战在于平衡对用户输入(例如,手绘的彩色笔画)的忠实度和合成图像的真实感。现有的基于GAN的方法试图通过使用条件GAN或GAN反…

请求响应什么情况要使用 responseType: ‘blob‘

在前端开发中,使用 responseType: ‘blob’ 的主要情况是当你向服务器发起请求,并且期望响应返回的是一个二进制数据(Blob 对象)时。 典型应用场景包括: 1.文件下载: 当你需要从服务器下载文件时&#xff…

webpack源码深入--- webpack的编译主流程

webpack5的编译主流程 根据watch选项调用compiler.watch或者是compiler.run()方法 try {const { compiler, watch, watchOptions } create();if (watch) {compiler.watch(watchOptions, callback);} else {compiler.run((err, stats) > {compiler.close(err2 > {callb…

Pip install 和Conda install 的区别和使用场景

Pip install 和Conda install 的区别和使用场景

Echarts公共方法

Vue引入Echarts install 1.安装Echartsnpm install echarts --save 2.项目全局引入形式--#main.js 全局引入形式import * as echarts from "echarts"Vue.prototype.$echarts echarts 公共方法JS /*** author: wangjie* description: 通用echarts图表封装* date: …

【最新】2024年全球汽车零部件供应商百强榜,15家中企上榜!

6月23日,《美国汽车新闻》(Automotive News)重磅发布了2024年全球汽车零部件供应商百强榜。来自中国的动力电池企业宁德时代挤进了前四,中国企业一共上榜15家,较去年多了两家。国轩高科和三花零件为新进榜单的中企。 …

WPF自定义控件,实现含有箭头的文本或内容控件

文章目录 背景效果预览方案设计分析基本布局添加控件自定义属性添加属性值监听获取点数据 全部代码HorizontalLineContent.xamlHorizontalLineContent.xaml.csDirectionAlignment.csContentDirectionAlignment.cs 使用方法 背景 因为项目开发需要,要在WPF上绘制TCP…

【neo4j图数据库】入门实践篇

探索数据之间的奥秘:Neo4j图数据库引领新纪元 在数字化浪潮汹涌的今天,数据已成为企业最宝贵的资产之一。然而,随着数据量的爆炸性增长和数据关系的日益复杂,传统的关系型数据库在处理诸如社交网络、推荐系统、生物信息学等高度互…

代码随想录算法训练营第四十一天| 322. 零钱兑换、279.完全平方数、139.单词拆分

322. 零钱兑换 题目链接:322. 零钱兑换 文档讲解:代码随想录 状态:能想到凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],但没想到加上一个钱币coins[i]即dp[j - coins[i]] 1就是dp[j](考虑coins[i]&#xff09…

IDEA 好用的插件,必备的插件

1. GitToolBox 菜单栏显示git分支信息 2.MyBatisx 快速定位找到sql的xml文件 3.RestfulToolkit-fix 快速定位接口的插件 默认快捷键: CtrlAltN 4.EasyCamelQSM 字符串转驼峰 默认快捷键: Ctrl Alt Q 5.Maven Helper 检查maven冲突,图形化展示maven依赖的插…

C#面:如何把一个array复制到arrayist里

要将一个数组复制到ArrayList中,可以使用ArrayList的AddRange方法。以下是一个示例代码: int[] array { 1, 2, 3, 4, 5 }; ArrayList arrayList new ArrayList(); arrayList.AddRange(array); 在上面的代码中,我们首先创建了一个整数类型…

python实现excel数据自动统计

读取数据:首先,使用pandas读取Excel文件中的数据。 分组:使用groupby根据指定的分组列对数据进行分组。 统计次数:自动统计每组的指定列中每个唯一值出现的次数,和统计满足特定条件的计数 保存:将需要的…