CentOS 8 上搭建SFTP服务

安装

在CentOS 8上搭建SFTP服务,可以通过OpenSSH来实现。以下是具体步骤:

1. 安装OpenSSH服务器

在CentOS 8中,通常已经安装了OpenSSH服务器。如果没有,可以通过以下命令安装:

sudo dnf install -y openssh-server

2. 启动并启用OpenSSH服务

确保OpenSSH服务正常运行,并设置为开机启动:

sudo systemctl start sshd
sudo systemctl enable sshd

可以通过以下命令检查服务状态:

sudo systemctl status sshd

3. 配置SFTP用户

为SFTP创建一个独立的用户,并指定一个目录作为用户的SFTP根目录。

创建用户组和目录

可以为SFTP用户创建一个专门的用户组和目录。例如创建一个/sftp目录,并为所有SFTP用户设置该目录为根目录:

sudo mkdir -p /sftp
sudo groupadd sftpusers
创建SFTP用户

创建一个新用户,将其主目录指定为/sftp/[username],并将用户添加到SFTP用户组中。例如:

sudo useradd -m -d /sftp/[username] -s /sbin/nologin -G sftpusers [username]

[username]替换为实际用户名。

为用户设置密码:

sudo passwd [username]
设置权限

设置/sftp目录的权限,使其只能被root用户访问,并创建用户文件夹上传数据:

sudo chown root:root /sftp
sudo chmod 755 /sftp
sudo mkdir /sftp/[username]/uploads
sudo chown [username]:sftpusers /sftp/[username]/uploads

4. 配置OpenSSH以限制SFTP访问

编辑SSH配置文件 /etc/ssh/sshd_config

sudo vim /etc/ssh/sshd_config

在文件中添加以下内容以启用SFTP的chroot环境:

# 指定SFTP子系统
Subsystem sftp internal-sftp

# 配置SFTP用户组
Match Group sftpusers
    ChrootDirectory /sftp/%u
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no
  • ChrootDirectory /sftp/%u:将用户限制在/sftp/[username]目录中。
  • ForceCommand internal-sftp:强制用户使用SFTP而不是SSH shell。

5. 重启SSH服务

修改配置文件后,重启SSH服务以应用更改:

sudo systemctl restart sshd

6. 测试SFTP连接

可以使用SFTP客户端(如sftp命令或WinSCP、FileZilla等)进行连接:

sftp [username]@[server_ip]

连接后,你应该只能访问指定的目录,无法浏览服务器上的其他文件。

注意事项

  • 确保目录权限设置正确。/sftp目录必须由root拥有,且权限为755
  • 用户上传文件的目录,如uploads,需要将权限授予具体的SFTP用户,以确保其可以上传文件。

这样,你就成功在CentOS 8上配置了一个SFTP服务!

排查报错

重启ssh报错了:Job for sshd.service failed because the control process exited with error code. See “systemctl status sshd.service” and “journalctl -xe” for details.

sshd.service重启失败的原因可能是SSH配置文件中的语法错误、不正确的权限设置,或其他配置问题。可以按照以下步骤排查问题:

1. 检查sshd的状态

运行以下命令查看sshd服务的状态,获取具体的错误信息:

sudo systemctl status sshd.service

状态信息会显示服务失败的原因或提示进一步排查的方向。

2. 查看日志

使用以下命令查看journalctl日志中的详细信息,找到可能导致服务启动失败的具体原因:

sudo journalctl -xe

日志中通常会有更详细的错误信息,比如文件权限问题、配置参数错误等。

3. 检查SSH配置文件

SSH服务启动失败的常见原因是配置文件 /etc/ssh/sshd_config 中的错误。可以使用以下命令来检查该文件是否有语法问题:

sudo sshd -t
  • 如果输出为空,说明配置文件语法无误。
  • 如果有错误信息,SSH服务会指出出错的行数和错误类型。根据提示返回的行号修正配置文件。

4. 常见错误排查

以下是一些可能导致sshd启动失败的常见原因及解决方法:

  • 配置文件语法错误:检查/etc/ssh/sshd_config文件中的配置参数,确保格式正确。例如,参数和值之间需要空格。
  • 权限问题:确保/etc/ssh/目录和sshd_config文件的权限正确。通常建议权限设置如下:
sudo chmod 644 /etc/ssh/sshd_config
sudo chmod 700 /etc/ssh
  • 端口被占用:如果修改了SSH监听的端口(如Port 22),请确认该端口没有被其他进程占用。可以用以下命令查看端口占用情况:
sudo lsof -i :<port-number>

如端口被占用,可以选择修改端口号,或停止占用端口的服务。

5. 重启sshd服务

修改配置文件后,重新加载配置并尝试重启SSH服务:

sudo systemctl daemon-reload
sudo systemctl restart sshd

6. 测试

如果重启成功,可以通过以下命令检查SSH服务是否在运行:

sudo systemctl status sshd

如果服务成功启动,active (running)表示SSH服务正在正常运行。

通过以上步骤,你应该能找到并解决sshd服务启动失败的问题。如果问题依旧存在,可以提供具体的日志信息,我们可以进一步排查。

常见报错

系统中已经有了子系统的配置

例如:Subsystem sftp /usr/libexec/openssh/sftp-server

在配置SFTP时,Subsystem sftp /usr/libexec/openssh/sftp-server 是指定SFTP服务的默认配置路径。在某些Linux系统中(例如CentOS),该路径用于定义SFTP服务的执行文件,默认会加载SFTP功能。如果在配置SFTP时遇到问题,可以进行以下检查和调整:

1. 确认sshd_config配置

确保在/etc/ssh/sshd_config文件中只有一个Subsystem sftp配置项。如果存在多个配置项,可能会导致冲突。通常只需保留以下内容:

Subsystem sftp /usr/libexec/openssh/sftp-server

2. 配置SFTP用户权限(可选)

如果需要将用户限制在特定目录中,可以使用以下方式指定SFTP用户组和访问限制:

Match Group sftpusers
    ChrootDirectory /sftp/%u
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no

其中:

  • ChrootDirectory /sftp/%u:将用户限制在主目录/sftp/[username]中。
  • ForceCommand internal-sftp:强制用户使用SFTP服务,而不是SSH shell。

3. 检查并重启SSH服务

保存配置后,检查配置文件的语法并重启SSH服务:

sudo sshd -t  # 检查语法是否正确
sudo systemctl restart sshd

如果配置没有语法错误且服务成功重启,SFTP功能应该可以正常工作。

4. 测试SFTP连接

通过客户端(例如sftp命令)连接服务器,验证SFTP是否可用:

sftp [username]@[server_ip]

这套配置应该能保证SFTP服务可用且具有一定的安全性。如有更多需求,可以继续根据用户组和权限配置进行精细化管理。

免密登陆失败

如果你的 sshd_config 中有以下配置:

PasswordAuthentication yes
ChallengeResponseAuthentication yes

这两个配置会允许密码认证和挑战响应认证(通常用于二次身份验证)。但是,PasswordAuthentication yes 可能与公钥认证冲突,因为 SSH 可能优先考虑密码认证或挑战响应认证,而忽略公钥认证。

解决方案:

  1. 禁用密码认证
    为了强制使用公钥认证,你可以禁用密码认证。更改 sshd_config 中的 PasswordAuthentication 设置为 no,然后重启 SSH 服务。

编辑 sshd_config

sudo vi /etc/ssh/sshd_config

将以下行:

PasswordAuthentication yes
ChallengeResponseAuthentication yes

修改为:

PasswordAuthentication no
ChallengeResponseAuthentication no

这样就会禁用密码和挑战响应认证,强制使用公钥认证。

  1. 重启 SSH 服务
    更改配置后,重启 SSH 服务以应用更改:
sudo systemctl restart sshd

检查其他配置项:

  • **确保 **PubkeyAuthentication** 为 ****yes**:确认在 sshd_config 中启用了公钥认证。
PubkeyAuthentication yes
  • 确保 **AuthorizedKeysFile** 设置正确:通常它应该是 .ssh/authorized_keys
AuthorizedKeysFile     .ssh/authorized_keys

测试公钥认证:

在客户端(比如 FileZilla 或命令行)尝试重新连接:

ssh -i ~/.ssh/id_rsa sftp0@[server_ip]

如果连接成功,说明公钥认证已经生效。

总结:

通过禁用密码认证和挑战响应认证,可以确保服务器只使用公钥认证,这会提高 SFTP 安全性并避免认证冲突。

client_loop: send disconnect: Broken pipe

client_loop: send disconnect: Broken pipe 错误通常发生在 SSH 会话中,表示连接已经被意外关闭。这可能是由于多个原因引起的,下面是一些常见的原因以及相应的解决方法:

1. 网络连接问题

  • 这是最常见的原因之一,尤其是在网络不稳定的情况下,连接可能会断开。
  • 解决方法: 确保网络连接稳定。你可以尝试通过其他网络(例如有线连接或不同的 Wi-Fi 网络)来确认是否是网络问题。

2. SSH 客户端超时

  • 如果 SSH 客户端等待时间过长没有活动,连接可能会被自动断开。你可以通过增加客户端的保持活动设置来避免此问题。
  • 解决方法: 编辑客户端配置文件 ~/.ssh/config,添加以下行来启用保持活动功能:
Host *
  ServerAliveInterval 60
  ServerAliveCountMax 3

这个设置会每 60 秒向服务器发送一个空闲包,如果服务器在 3 次尝试内没有响应,则断开连接。

3. SSH 服务器端超时

  • 如果服务器端有设置连接超时,且客户端在该时间内没有任何活动,服务器会断开连接。
  • 解决方法: 编辑 SSH 服务器端配置文件 /etc/ssh/sshd_config,确保没有过短的超时设置:
ClientAliveInterval 60
ClientAliveCountMax 3

这会让服务器每 60 秒向客户端发送一个信号。如果服务器在 3 次尝试内没有收到响应,就断开连接。

修改后,重启 SSH 服务:

sudo systemctl restart sshd

4. 防火墙或网络设备问题

  • 一些防火墙或路由器可能会关闭长时间未活动的连接。
  • 解决方法: 检查防火墙设置(包括本地和远程的防火墙)是否有类似的连接超时设置。如果使用的是企业级防火墙或路由器,检查是否存在自动断开长时间闲置连接的规则。

5. 错误的 SSH 配置

  • 如果 SSH 配置不正确,特别是公钥认证部分出现问题,也可能导致连接被强制关闭。
  • 解决方法: 确保 SSH 配置文件没有错误。你可以通过以下命令检查 sshd 服务的状态,查看是否有任何错误信息:
sudo systemctl status sshd

如果出现错误,查看日志并修复配置。

6. 不正确的权限设置

  • 如果 .ssh/authorized_keys 文件或其父目录的权限设置不正确,可能导致认证失败并最终断开连接。
  • 解决方法: 确保 .ssh 目录和 authorized_keys 文件的权限是正确的。执行以下命令:
sudo chmod 700 /home/sftp0/.ssh
sudo chmod 600 /home/sftp0/.ssh/authorized_keys
sudo chown -R sftp0:sftp0 /home/sftp0/.ssh

7. 检查服务器端日志

  • 服务器端日志可能会提供更多关于连接断开的详细信息,特别是 SSH 服务的日志。
  • 解决方法: 查看 /var/log/auth.log/var/log/secure 文件,了解更多信息:
sudo tail -f /var/log/auth.log

或者:

sudo tail -f /var/log/secure

这样你可以查看 SSH 服务是否由于某些错误或限制关闭了连接。

8. SSH 版本不兼容

  • 如果客户端和服务器使用的 SSH 协议版本或加密算法不兼容,可能会导致连接问题。
  • 解决方法: 确保客户端和服务器使用的 SSH 版本是兼容的,并且支持相同的加密算法。

总结

client_loop: send disconnect: Broken pipe 错误通常是因为 SSH 连接超时、网络问题或服务器端配置不当引起的。通过调整 SSH 客户端和服务器的超时设置、检查防火墙规则和权限设置,通常可以解决这个问题。如果问题仍然存在,查看日志可以帮助进一步诊断。

fatal: bad ownership or modes for chroot directory “/sftp/sftp0”

报错信息 fatal: bad ownership or modes for chroot directory "/sftp/sftp0" 表示 SSH 守护进程在尝试使用 chroot 环境时,发现指定的目录 /sftp/sftp0 的权限或所有者设置不符合安全要求。为了防止潜在的安全问题,SSH 要求 chroot 目录必须具有特定的权限。

解决方案

1. 确保 **chroot** 目录的所有者和权限正确

SSH 在使用 chroot 时要求指定的目录必须由 root 用户拥有,并且该目录的权限设置不能太宽松。确保 /sftp/sftp0 目录的所有者是 root,且该目录的权限是 755。执行以下命令:

sudo chown root:root /sftp/sftp0
sudo chmod 755 /sftp/sftp0
2. 检查子目录权限

如果 sftp0 用户应该在该目录下有自己的子目录(比如 uploads 或其他),确保这些子目录的权限是适当的。具体来说,子目录可以由 sftp0 用户拥有,但不能直接为 sftp0 用户的父目录设置过宽松的权限。

假设你在 /sftp/sftp0 下创建了子目录:

sudo mkdir /sftp/sftp0/uploads
sudo chown sftp0:sftpusers /sftp/sftp0/uploads
sudo chmod 755 /sftp/sftp0/uploads
3. 确保没有额外的 **chroot** 子目录权限问题

如果你启用了 ChrootDirectory 配置项,必须确保父目录的权限符合 SSH 的要求:

  • ChrootDirectory 指定的目录(即 /sftp/sftp0)必须属于 root,并且不能有写权限给普通用户。
  • 用户应该在 chroot 目录内有自己的子目录(如 uploads)来进行操作,且该子目录可以赋予用户写权限。
4. 检查 SSH 配置

确保 SSH 配置文件 /etc/ssh/sshd_config 中的 ChrootDirectory 配置项没有问题。以下是正确配置的示例:

# 限制 sftp0 用户只能访问 /sftp/sftp0 目录
Match User sftp0
    ChrootDirectory /sftp/sftp0
    ForceCommand internal-sftp
    AllowTcpForwarding no
5. 重新启动 SSH 服务

在做出上述更改后,重新启动 SSH 服务使配置生效:

sudo systemctl restart sshd

总结

bad ownership or modes for chroot directory 错误通常是由于 SSH 对于 chroot 目录的权限要求不满足。你需要确保 chroot 目录的所有者是 root,并且权限设置为 755,且子目录的权限适合用户操作。通过以上操作,应该可以解决问题。

如果看到返回:This service allows sftp connections only.

说明登录已经成功了,该用sftp协议即可,例如: FileZillasftp 命令行工具

Q&A

Subsystem配置变了,ForceCommand配置是不是也要一起改变?

例如:ForceCommand /usr/libexec/openssh/sftp-server

是的,如果你改变了 SFTP 子系统的路径(例如,更改了 sftp-server 的位置),你可能需要更新 sshd_config 中的 ForceCommand 配置项。

1. **Subsystem**** 与 **ForceCommand** 的关系**

  • **Subsystem**:指定 SFTP 服务的可执行文件。在默认情况下,Subsystem sftp /usr/libexec/openssh/sftp-server 用于指定 SFTP 服务的路径。
  • **ForceCommand**:强制用户登录时只执行特定的命令,如果你设置了 ForceCommand internal-sftp,那么用户只能通过 SFTP 访问,不会有交互式 Shell。它确保了当用户连接 SSH 时,不会启动普通的 shell,而是启动 SFTP 会话。

2. 更新配置

如果你改变了 sftp-server 的路径,确实需要相应地更新 ForceCommandSubsystem 配置项。如果你将 sftp-server 移到了新的路径,例如 /usr/local/bin/sftp-server,你需要修改如下:

Subsystem sftp /usr/local/bin/sftp-server
ForceCommand /usr/local/bin/sftp-server

3. 配置建议

通常情况下,**ForceCommand internal-sftp** 会是更常见的配置,它将强制用户使用内置的 SFTP 服务,而不需要指定路径。这样,如果你没有特殊需求,不必再指定外部的 sftp-server 路径。例如:

Subsystem sftp /usr/libexec/openssh/sftp-server
ForceCommand internal-sftp

这意味着,无论 /usr/libexec/openssh/sftp-server 的位置在哪里,用户都会被强制使用 internal-sftp 模式连接 SSH,从而避免普通 shell 会话的启动,确保用户只能进行 SFTP 操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SMTP发送邮件的过程

&#xff08;1&#xff09;SMTP客户端首先请求与服务器端的25号端口建立TCP连接(1分)。&#xff08;2&#xff09;连接建立成功后&#xff0c;客户端和服务器通过握手阶段验证双方身份(1分)。&#xff08;3&#xff09;验证成功后&#xff0c;客户端首先向服务器端通告邮件发送…

qml Rectangle详解

1、概述 Rectangle是Qt Quick中的一个基础图形元素&#xff0c;用于在QML界面上绘制一个可带边框和可填充的矩形区域。它继承自Item类&#xff0c;因此具有Item的所有属性和功能&#xff0c;如位置、尺寸、变换等。通过Rectangle&#xff0c;可以创建各种矩形形状&#xff0c;…

软件工程实验-实验2 结构化分析与设计-总体设计和数据库设计

一、实验内容 1. 绘制工资支付系统的功能结构图和数据库 在系统设计阶段&#xff0c;要设计软件体系结构&#xff0c;即是确定软件系统中每个程序是由哪些模块组成的&#xff0c;以及这些模块相互间的关系。同时把模块组织成良好的层次系统&#xff1a;顶层模块通过调用它的下层…

Innodisk iSMART V6使用说明_SSD还能用多久?已经读写了多少次数?……

Innodisk iSMART是一款SSD健康数据读取软件。它能轻松获取大部分SSD内部寄存器中的健康数据&#xff0c;并以简洁的图形界面展示给用户。在程序界面的顶部&#xff0c;是页面标签&#xff0c;点击页面标签就能切换到相应的页面。页面标签的下面是磁盘选择栏。点击磁盘编号&…

windows11(或centos7)安装nvidia显卡驱动、CUDA、cuDNN

本文是我瞎搞时写的问题汇总及参考文献&#xff0c;记录了一些问题解决的进度及对问题的思考。 最近一次更新时间&#xff1a;2025年1月4日 一、安装或更新nvidia显卡驱动 首先&#xff0c;需要确保你的设备安装了最新的显卡驱动。 &#xff08;1&#xff09;centos7安装显…

2、蓝牙打印机点灯-GPIO输出控制

1、硬件 1.1、看原理图 初始状态位高电平. 需要驱动PA1输出高低电平控制PA1. 1.2、看手册 a、系统架构图 GPIOA在APB2总线上。 b、RCC使能 GPIOA在第2位。 c、GPIO寄存器配置 端口&#xff1a;PA1 模式&#xff1a;通用推挽输出模式 -- 输出0、1即可 速度&#xff1a;5…

WPS表格技巧01-项目管理中的基本功能-计划和每日记录的对应

前言&#xff1a; 在项目管理中&#xff0c;一般就是用些项目管理工具来管理这个任务和 task&#xff0c;但是就是要学这些工具很麻烦&#xff0c;比较好的方法&#xff0c;通用的方法就是用 Excel 表格去做&#xff08;这非常适合松散的团队组织&#xff09;&#xff0c;然后…

Vue 项目中实现打印功能:基于目标 ID 的便捷打印方案

一、引言 在 Vue 项目开发中&#xff0c;实现打印功能是一个常见的需求。本文将介绍如何封装一个打印方法&#xff0c;使得用户只需传入需要打印的目标 ID 名称&#xff0c;即可轻松实现预览并打印的功能。这种方法不仅简单易用&#xff0c;还具有一定的通用性&#xff0c;适合…

ARM 汇编基础总结

GNU 汇编语法 编写汇编的过程中&#xff0c;其指令、寄存器名等可以全部使用大写&#xff0c;也可以全部使用小写&#xff0c;但是不能大小写混用。 1. 汇编语句的格式 label: instruction comment label即标号&#xff0c;表示地址位置&#xff0c;有些指令前面可能会有标…

《塑战核心》V1.0.0.9952官方中文版

体验打击感满分的近距离战斗。击败蜂拥而至的敌人&#xff0c;每次击杀都会让你变得更强。 《塑战核心》官方中文版https://pan.xunlei.com/s/VODW7effpagQN1JU0UpBQQ5uA1?pwdmr8g#

综合练习dfs_1

1863. 找出所有子集的异或总和再求和 之前我们就做了到关于找集合子集的问题&#xff0c;但我们不需要记录路径上的数&#xff0c;求路径上数的异或和就可以。 class Solution {int path;int sum0; public:int subsetXORSum(vector<int>& nums) {dfs(nums,0);return …

【Python学习(五)——条件判断】

Python学习&#xff08;五&#xff09;——条件判断 本文介绍了条件判断&#xff0c;仅作为本人学习时记录&#xff0c;感兴趣的初学者可以一起看看&#xff0c;欢迎评论区讨论&#xff0c;一起加油鸭~~~ 心中默念&#xff1a;Python 简单好学&#xff01;&#xff01;&#x…

PPT加页码并改格式

如何快捷插入自定义 1、插入文本框&#xff0c;并处于输入状态 2、点击插入幻灯片编号的图标&#xff0c;就自动生成页码了 3、然后调整这个页码为想要的格式&#xff0c;到需要加页码的页面&#xff0c;将文本框复制过去就行了

Git 入门(一)

git 工作流如下&#xff1a; 命令如下&#xff1a; clone&#xff08;克隆&#xff09;: 从远程仓库中克隆代码到本地仓库checkout &#xff08;检出&#xff09;:从本地仓库中检出一个仓库分支然后进行修订add&#xff08;添加&#xff09;: 在提交前先将代码提交到暂存区com…

windows远程桌面无法连接,报错:“由于没有远程桌面授权服务器可以提供许可证,远程会话被中断。请跟服务器管理员联系”

windows远程桌面无法连接&#xff0c;报错&#xff1a;“由于没有远程桌面授权服务器可以提供许可证&#xff0c;远程会话被中断。请跟服务器管理员联系” 问题描述&#xff1a;解决方法&#xff1a;无法删除条目解决如下&#xff1a;正常激活详见&#xff1a;[RDS远程服务激活…

【JVM】总结篇-类的加载篇之 类的加载器 和ClassLoader分析

文章目录 类的加载器ClassLoader自定义类加载器双亲委派机制概念源码分析优势劣势如何打破Tomcat 沙箱安全机制JDK9 双亲委派机制变化 类的加载器 获得当前类的ClassLoader clazz.getClassLoader() 获得当前线程上下文的ClassLoader Thread.currentThread().getContextClassLoa…

蓝色简洁引导页网站源码

一款蓝色的简洁引导页&#xff0c;适合资源分发和网站备用引导。 1.源码上传至虚拟机或者服务器 2.绑定域名和目录 3.访问域名安装 4.安装完成后就行了 https://pan.quark.cn/s/b2d8b9c5dc7f https://pan.baidu.com/s/17h1bssUNhhR9DMyNTc-i9Q?pwd84sf https://caiyun.139.com…

Linux驱动开发(18):linux驱动并发与竞态

并发是指多个执行单元同时、并行执行&#xff0c;而并发的执行单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问 则很容易导致竞态。对于多核系统&#xff0c;很容易理解&#xff0c;由于多个CPU同时执行&#xff0c;多个CPU同时读、写共享资源时很容易造成竞态。…

docker中使用Volume完成数据共享

情景概述 在一个docker中&#xff0c;部署两个MySQL容器&#xff0c;假如它们的数据都存储在自己容器内部的data目录中。这样的存储方式会有以下问题&#xff1a; 1.无法保证两个MySQL容器中的数据同步。 2.容器删除后&#xff0c;数据就会丢失。 基于以上问题&#xff0c;容…

django StreamingHttpResponse fetchEventSource实现前后端流试返回数据并接收数据的完整详细过程

django后端环境介绍&#xff1a; Python 3.10.14 pip install django-cors-headers4.4.0 Django5.0.6 django-cors-headers4.4.0 djangorestframework3.15.2 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple 总环境如下&#xff1a; Package Version -…