操作系统 / 系统运维

SFTP服务部署配置

温馨提示:本文最后更新于2021-12-16 11:47:19,某些文章具有时效性,若有错误或已失效,请在下方留言或提交工单提交工单
浅时光 · 3月11日 · 2020年 本文3668个字,预计阅读10分钟 92105次已读

一、SFTP简介

SFTP是Secure File Transfer Protocol的缩写,安全文件传送协议。SFTP使用加密传输认证信息和传输的数据,所以使用SFTP是非常安全的。

和ftp不同的是sftp传输协议默认是采用加密方式来传输数据的,sft原文链接:https://www.dqzboy.comp确保传输的一切数据都是加密的。而ftp一般来说允许明文传输,当然目前也有带SSL的加密的ftp,有些服务器软件也可以设置成“只允许加密连接”,但是需要我们手工调整,一般会被大多数人给忽视。

SFTP 为SSH的一部分,是一种传输档案至 Blogger 伺服器的安全方式。SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。

二、SFTP搭建

1、安装OpenSSH

  • 安装之前务必检查SELINUX状态,如果开启一定将其关闭
[root@localhost ~]# sestatus
SELinux status:                 enabled

[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

# 重启服务器
[root@localhost ~]# reboot

# 重启服务器后再次确认
[root@localhost ~]# sestatus
SELinux status:                 disabled
  • 首先我们需要先确认是否安装了OpenSSH服务,默认情况下Linux发行版都安装了,我们这里再确认一下,安装则忽略,没安装则运行下面的命令安装
# YUM方式安装的,通过以下命令查看
[root@localhost ~]# yum list installed openssh
[root@localhost ~]# yum install openssh

# RPM包安装的,通过以下命令查看
[root@localhost ~]# rpm -qa | grep openssh

# 如果没有则通过以下命令进行安装
[root@localhost ~]# yum install openssh-client openssh-server openssh-sftp-server

2、创建用户和组

2.1:创建用户组

  • 这里创建一个单独的用户组,为了方便我们管理SFTP用户
# 我这里创建了一个名为sftp-users的用户组
[root@localhost ~]# groupadd sftp-users

2.2:创建用户

# 创建一个SFTP用户,我这里取名为admin,并指定他的属组为sftp-users
[root@localhost ~]# useradd -g sftp-users -M -s /sbin/nologin admin 

# 为admin用户配置密码
[root@localhost ~]# echo "dqzboy123" | passwd --stdin admin 
更改用户 admin 的密码 。
passwd:所有的身份验证令牌已经成功更新。
  • 参数说明:
    • -s /sbin/nologin:不允许SSH登入;如果你需要允许该用户SSH连接则取消该选项
    • -M:创建用户时,不创建用户家目录;你可以使用-m

3、配置SSH和权限

3.1:修改SSH的配置

[root@localhost ~]# vim /etc/ssh/sshd_config
Subsystem       sftp    internal-sftp
# Example of overriding settings on a per-user basis
Match Group sftp-users
        ChrootDirectory /data/app
        X11Forwarding no
        AllowTcpForwarding no
        #PermitTTY no
        ForceCommand internal-sftp
SFTP服务部署配置-浅时光博客

参数说明:

  • Subsystem   sftp   internal-sftp 指定sshd使用内置sshd的SFTP服务器代码,而不是运行另一个进程
  • Match Group sftp-users     表示下面的配置匹配该用户组,多个组用逗号分隔;Match user admin:表示匹配用户  
    • ChrootDirectory /data/app  表示SFTP所访问的主目录为/data/app,表示指定上面匹配的用户组可以chroot环境路径到此目录, 如果写的是 %h,文章来源(Source):https://www.dqzboy.com 那就是指定SFTP默认的主目录为用户家目录,比如/home/admin
    • AllowTcpForwarding no  用户不能使用端口转发,去除注释,将yes改为no;没有该参数则需将该参数添加至文件末尾
    • X11Forwarding no        禁止使用X11转发;没有该参数则需将该参数添加至文件末尾
    • ForceCommand internal-sftp 原文链接:https://www.dqzboy.com  强制执行内部sftp,并忽略任何~/.ssh/rc文件中的命令

3.2:设定SFTP的权限

# 创建SFTP指定的主目录
[root@localhost ~]# mkdir -p /data/app

# 主目录的属主必须为ROOT用户,属组改为我们上面创建的sftp的用户组
[root@localhost ~]# chown root:sftp-users /data/app/

# 设置SFTP主目录权限为755,不可以超过755否则会登入报错
[root@localhost ~]# chmod 755 /data/app/

# 重启下SSHD服务
[root@localhost ~]# systemctl restart sshd.service
SFTP服务部署配置-浅时光博客
  • 注意:目前为止,sftp的主目录只有查看权限,只能实现下载、查看,并不能上传,删除,重命名;提示权限问题,如下图所示:
SFTP服务部署配置-浅时光博客
  • 如果上传需要写入权限,那么需要在主目录下创建可写属主的子目录供上传使用,如下所示

3.3:创建SFTP子目录

# 现在在SFTP主目录下创建一个子目录,并设置子目录的属主为admin,属组为sftp-users
[root@localhost ~]# mkdir /data/app/upload
[root@localhost ~]# chown admin:sftp-users /data/app/upload/
[root@localhost ~]# chmod 755 /data/app/upload/
SFTP服务部署配置-浅时光博客

3.4:重启SFTP服务

  • 配置完成后需要重新启动sshd使配置生效
[root@localhost ~]# systemctl restart sshd.service

三、SFTP登入

1、Linux环境下

[root@localhost ~]# sftp admin@127.0.0.1
sftp> ls
upload  
sftp> pwd
Remote working directory: /
sftp> cd upload/
sftp> ls
sftp> mkdir 1
sftp> ls
1  

2、Windows环境

SFTP连接测试

  • 通过ftp工具或者xshell选择sftp协议连接
SFTP服务部署配置-浅时光博客
SFTP服务部署配置-浅时光博客

上传文件测试

SFTP服务部署配置-浅时光博客

四、问题总结

问题1: Couldn’t read packet: Connection reset by peer

问题描述:

packet_write_wait: Connection to xx.xx.xx.xx port 22: Broken pipe
Couldn't read packet: Connection reset by peer

问题原因:

  • 这个问题的原因是ChrootDirectory的主目录权限问题,你设定的主目录必须是root用户所有,如果主目录的权限不是root用户就会出现问题

解决方案:

确保sftp用户根目录的所有人是root, 权限是 750 或者 755。文章来源(Source):浅时光博客注意以下两点原则:

  • 目录开始一直往上到系统根目录为止的目录拥有者都只能是 root,用户组可以不是 root。
  • 目录开始一直往上到系统根目录为止都不可以具有群组写入权限

问题2:ssh连接/bin/bash: No such file or directory

问题原因:

  • 这则提示非常的正确,对于此时登录的用户,会话中的根目录 / 已经切换为你所设置的 chroot 目录,除非你的 chroot 就是系统的 / 目录,否则此时的 chroot/bin 下是不会有 bash 命令的,这就类似添加用户时设定的 -s /bin/false 参数,自然就无法远程 ssh 登录了
  • ForceCommand 为会话开始时的初始命令 如果指定了比如 internal-sftp,则会提示 This service allows sftp conn文章来源(Source):浅时光博客ections only. 用户登录会话时无法调用 /bin/bash 命令,自然无法 ssh 登录服务器

解决方案:

  • chroot指定根目录;但是一般不建议这样操作,既然配置用户通过sftp访问服务,那么就不需要通过ssh连接了,如果需要ssh连接那就没必要配置sftp访问了



关注本站官方微信公众号『精彩程序人生』

扫描左侧二维码关注我们的微信公众帐号,在微信公众帐号中回复【资料】即可获取各类互联网技术学习资料。
关注博主不迷路~


本文作者:浅时光
原文链接:https://www.dqzboy.com/1850.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可
转载时请以超链接形式标明文章原始出处和作者信息
免责声明:本站发布的内容(图片、视频和文字)以及一切破解补丁、注册激活和软件解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。访问和下载本站内容,说明您已同意上述条款!


0 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!

    本站已稳定运行: | 耗时 0.446 秒 | 查询 15 次 | 内存 41.56 MB