sftp-详解


sftp 是 Secure File Transfer Protocol 的缩写,安全文件传送协议.可以为传输文件提供一种安全的网络的加密方法

1、FTP 和 SFTP 的区别

  • 链接方式:FTP 使用 TCP 端口 21 上的控制连接建立连接.而 SFTP 是在客户端和服务器之间通过 SSH 协议( TCP 端口 22 )建立的安全连接来传输文件
  • 安全性:SFTP 使用加密传输认证信息和传输的数据,所以使用 SFTP 相对于 FTP 是非常安全
  • 效率:SFTP 这种传输方式使用了加密解密技术,所以传输效率比普通的 FTP 要低得多.如果您对网络安全性要求更高时,可以使用 SFTP 代替 FTP

2、需求

  • 搭建多账号 SFTP,不同的用户只能够查看自己所属的目录
  • 禁止 SFTP 账号通过 SSH 连接
  • SFTP 用户: demo1、demo2
  • 所属目录: /dataSftp/demo1、/dataSftp/demo2

3、添加组和用户

groupadd sftp
cat /etc/group | grep sftp

useradd -g sftp -s /bin/false demo1
useradd -g sftp -s /bin/false demo2
echo "pTXAxs6XY5p3" | passwd demo1 --stdin
echo "123qwe123asd" | passwd demo2 --stdin

4、设置组根目录权限

mkdir /dataSftp/{demo1,demo2} -p
chown root:sftp /dataSftp/demo1/
chmod 755 /dataSftp/demo1
#设置用户可以上传的目录upload
mkdir /dataSftp/demo1/upload
chown -R demo1:sftp /dataSftp/demo1/upload/
chmod 755 /dataSftp/demo1/upload

5、配置 ssh 和权限

vim /etc/ssh/sshd_config

#修改(指定使用 sftp 服务使用系统自带的 internal-sftp )
Subsystem sftp internal-sftp -l INFO -f AUTH

#新增
#匹配 sftp 组的用户,如果要匹配多个组,多个组之间用逗号分割
#Match User SXYL0082
#sftp主目录指定
#ChrootDirectory /dataSftp/SXYL0082
#指定sftp命令
#ForceCommand internal-sftp
#用户不能使用端口转发 
#AllowTcpForwarding no
#用户不能使用端口转发
#X11Forwarding no
#注意,以下要放在文件的最后,否则 root 用户无法登陆
Match Group sftp
ChrootDirectory /dataSftp/%u
#只能访问默认的用户目录(自己的目录),例如 /dataSftp/demo1
#ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no

6、修改 rsyslog

vim /etc/rsyslog.conf

#文件末尾添加一行
auth,authpriv.* /var/log/sftp.log

vim /etc/logrotate.d/sftp

/var/log/sftp.log
{
    missingok
    weekly
    create 0600 root root
    minsize 1G
    rotate 10
    dateext
}

7、重启 ssh 服务

systemctl restart rsyslog
systemctl restart sshd.service

8、测试 SFTP 功能

#登录sftp
sftp demo1@192.168.47.111
#进入upload目录
cd upload
#上传文件
put /root/nginx-1.15.12.tar.gz
#查看目录下的文件   
ls
#下载文件
get nginx-1.15.12.tar.gz 

9、查看日志

tail -f /var/log/sftp.log

debug

1. 如果你链接服务器的时候出现下面的提示:

> Write failed: Broken pipe     
> Couldn't read packet: Connection reset by peer

这个问题的原因是 ChrootDirectory 的权限问题,你设定的目录必须是 root 用户所有,否则就会出现问题.所以请确保 sftp 用户根目录的所有人是 root,权限是 750 或者 755

注意以下两点原则:

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

上面 2 点一定注意,仔细检查.我就是因为这个问题,导致一直有这个问题.仔细检查配置后,解决问题,不用考虑别的,就弄权限!

2. 客户端 sftp 登录服务器显示文件列表时间不正确

服务器开启 sftp 的 chroot 安全登录功能,就访问不了系统的时区文件,客户端登录后,执行ls -l显示文件列表时间不是服务器上的时间,而是差了一个时区,需要 +8h 才能得到文件正确时间

解决:

进入sftp用户根目录
mkdir etc
cp -r /usr/share/zoneinfo/Asia/Shanghai etc/localtime

             ------------------------------- THE END -------------------------------

posted @ 2025-02-17 13:51  ordinaryRoadX  阅读(1)  评论(0编辑  收藏  举报