linux(centos6、centos7) 配置sftp服务器

0、sftp介绍

sftp是Secure FileTransferProtocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的加密方法。sftp与 ftp有着几乎一样的语法和功能。SFTP为 SSH的一部分,是一种传输档案至Blogger伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File TransferProtocol)的安全文件传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。

SFTP命令常用选项sftp即secure ftp,是一个交互式文件传输程式。它类似于ftp,但它进行加密传输,比FTP有更高的安全性。

1、sftp权限配置

1.1 创建sftp组

groupadd sftp  

创建完成之后使用cat /etc/group命令组的信息;

cat /etc/group

效果如下图:
在这里插入图片描述

1.2 创建一个sftp用户mysftp

创建一个sftp用户mysftp,并加入到创建的sftp组中:
(使用-s /bin/false来禁止mysftp 这个账户ssh登录权限)

useradd -g sftp -s /bin/false mysftp  

修改mysftp用户的密码:

passwd mysftp 

效果如下图:
在这里插入图片描述

1.3 创建并配置mysftp的根目录

新建/data/sftp/mysftp目录(-p 创建多级目录):

mkdir -p /data/sftp/mysftp  

并将它指定为mysftp用户的home目录

usermod -d /data/sftp/mysftp mysftp

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

vim /etc/ssh/sshd_config

将如下这行用#符号注释掉

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

并在文件最后面添加如下几行内容然后保存:

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

效果如下图:
在这里插入图片描述
这几个配置的描述信息

  • Subsystem sftp internal-sftp
    配置一个外部子系统(例如,一个文件传输守护进程)。仅用于SSH-2协议。值是一个子系统的名字和对应的命令行(含选项和参数)。比如"sftp /usr/libexec/openssh/sftp-server"。,这里配置为内部的
  • Match Group sftp
    限定只有sftp组的才能访问
  • ChrootDirectory /data/sftp/%u
    设定属于用户组sftp的用户访问的根文件夹
  • ForceCommand internal-sftp
    强制执行这里指定的命令而忽略客户端提供的任何命令。这个命令将使用用户的登录shell执行(shell -c)。这可以应用于 shell 、命令、子系统的完成,通常用于 Match 块中。这个命令最初是在客户端通过 SSH_ORIGINAL_COMMAND 环境变量来支持的。
  • AllowTcpForwarding no
    是否允许TCP转发,默认值为"yes", 禁止TCP转发并不能增强安全性,除非禁止了用户对shell的访问,因为用户可以安装他们自己的转发器。
  • X11Forwarding no
    是否允许进行 X11 转发。默认值是"no",设为"yes"表示允许。如果允许X11转发并且sshd(8)代理的显示区被配置为在含有通配符的地址(X11UseLocalhost)上监听。那么将可能有额外的信息被泄漏。由于使用X11转发的可能带来的风险,此指令默认值为"no"。需要注意的是,禁止X11转发并不能禁止用户转发X11通信,因为用户可以安装他们自己的转发器。
    如果启用了 UseLogin ,那么X11转发将被自动禁止。

1.5 新建一个目录供sftp用户mysftp上传文件

这个目录所有者为mysftp所有组为sftp,所有者有写入权限所有组无写入权限

mkdir /data/sftp/mysftp/upload 
chown mysftp:sftp /data/sftp/mysftp/upload 
chmod 755 /data/sftp/mysftp/upload   

注意:修改权限这里有个大坑,/data/sftp/mysftp 这些目录必须都是root用户的,只有upload才能是mysftp的(这里建议upload所有者/组为mysftp:sftp,sftp和mysftp所有者/组为root:sftp,data的所有者/组为root/root)。
这是由于/etc/ssh/sshd_config配置里面ChrootDirectory有个主目录权限问题,ChrootDirectory所指向的文件夹,属主必须是root,属组是sftp用户所属的用户组。而且ChrootDirectory所指向的文件夹到系统根路径上的所有途径文件夹,属主都必须是root,且权限不允许有群组用户写入权限,即权限 只能为750或755,如果任意一个是777,则会出现报错。

centos6.5会报错:

 client_loop: send disconnect: Broken pipe Connection
 closed.   Connection closed 

centos7会报错:

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

所以,用mysftp用户连接的客户端只能读取mysftp文件夹下的内容,不能写入,需要写入的话得写到有写权限的upload文件夹下。

2、关闭selinux并重启sshd服务

setenforce 0
systemctl restart sshd.service

上述命令截图如下:
在这里插入图片描述
注意,如果是centos6.5,则重启sshd命令为:

setenforce 0
service sshd restart

效果如下图:
在这里插入图片描述

3、远程验证sftp服务以及sftp常用命令

3.1 远程连接

远程测试sftp命令为:sftp user@ip

sftp mysftp@192.168.77.135

3.2 上传文件

命令格式: put [-Ppr] local [remote]

注意:由于上面设置了sftp的根目录为“/data/sftp/mysftp”,所以下面命令虽然写的远端路径是“/upload”,但是实际传到的地址为“/data/sftp/mysftp/upload”

put /home/beyond/mysoftware/ftp-0.17-54.el6.x86_64.rpm /upload

3.3 下载文件

命令格式:get [-Ppr] remote [local]

 get java-demo.sh /home/beyond/

3.4 pwd和lpwd

  • pwd是看远端服务器的目录, 即sftp服务器默认的当前目录。
  • lpwd是看linux本地目录。

3.5 ls和lls

  • ls是看sftp服务器下当前目录下的文件
  • lls是看linux当前目录下的文件

3.6 !command

这个是指在linux上执行command这个命令。

比如!ls是列举linux当前目录下的东文件, !rm a.txt是删除linux当前目录下的a.txt文件。

这个命令非常非常有用, 因为在sftp> 后输入命令, 默认值针对sftp服务器的, 所以执行rm a.txt删除的是sftp服务器上的a.txt文件, 而非本地的linux上的a.txt文件。

3.7 exit和quit

退出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章