在Linux Centos 6.3 上搭建SFTP文件服务器

在Linux Centos 6.3 上搭建SFTP文件服务器

  • step1:
    首先查看ssh版本,版本不应低于4.8p1,因为配置权限需要版本添加的新配置项ChrootDirectory来完成,若低于此版本,请自行升级。
[root@localhost home]# ssh -V
OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010
  • step2:
    创建sftp用户组和用户,并给用户设置密码
[root@localhost home]# groupadd sftpg #创建用户组sftp
[root@localhost home]# useradd -g sftpg -s /sbin/nologin sftpuser1 #创建用户 sftpuser1
[root@localhost home]# passwd sftpuser1
更改用户 sftpuser1 的密码 。
新的 密码:
重新输入新的 密码:
passwd: 所有的身份验证令牌已经成功更新。

-g sftp 指定该用户的组为sftpg
-s 是指定用户登入后所使用的shell。默认值为/bin/bash。如果不想让用户登录系统可以用 -s /sbin/nologin,此用户就不可以登录系统。

  • step3:
    创建sftp文件目录,并按用户名区分每个用户登录路径,指定用户登录的根目录
[root@localhost home]# mkdir -p /data/sftp
[root@localhost home]# cd /data/sftp
[root@localhost sftp]# ls -rtl
总用量 0
[root@localhost sftp]# mkdir sftpuser1
[root@localhost sftpuser1]# usermod -d /data/sftp/sftpuser1 sftpuser1
  • step4:
    编辑配置文件/etc/ssh/sshd_config

    [root@localhost sftp_admin1]# vi /etc/ssh/sshd_config 

    在配置文件中一顿操作:
    1.注释掉这行

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

    2.增加以下6行

    Subsystem sftp internal-sftp
    Match Group sftp
    ChrootDirectory /data/sftp/%u #设定属于用户组sftp的用户访问的根文件夹
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no #设置不允许SSH的X转发

  • step5:
    给用户家目录更改属主并授权,家目录属主必须是root,权限可以是755或者750

[root@localhost sftpuser1]# chown root:sftpg /data/sftp/sftpuser1
[root@localhost sftpuser1]# chmod 750 /data/sftp/sftpuser1
[root@localhost sftp]# ls -rtl
总用量 4
drwxr-x---. 2 root sftpg 4096 728 20:43 sftpuser1
  • step6:
    创建sftpuser1文件上传目录。
    照上面设置,在重启sshd服务后,用户sftpuser1已经可以登录。但使用chroot指定根目录后,根应该是无法写入的,所以要新建一个目录供sftpuser1上传文件。这个目录所有者为sftpuser1,所有组为sftp,所有者有写入权限,而所有组无写入权限。命令如下:
[root@localhost sftpuser1]# mkdir /data/sftp/sftpuser1/upload
[root@localhost sftpuser1]# chown sftpuser1:sftpg /data/sftp/sftpuser1/upload
[root@localhost sftpuser1]# chmod 755 /data/sftp/sftpuser1/upload
  • step7:
    修改/etc/selinux/config,将文件中的SELINUX=enforcing 修改为 SELINUX=disabled ,然后保存退出。在输入命令:setenforce 0
[root@localhost sftpuser1]# vi /etc/selinux/config
[root@localhost sftpuser1]# setenforce 0

至于为什么要修改SELINUX,可参考:https://www.zhihu.com/question/20559538

  • step8:
    重启sshd服务
[root@localhost sftp_admin1]# service sshd restart
停止 sshd[确定]
正在启动 sshd[确定]
  • step9:
    测试搭建成果:
[root@localhost ~]# sftp [email protected]
Connecting to 164.22.13.5...
sftpuser1@164.22.13.5's password: 
sftp> ls -rtl
drwxr-xr-x    2 sftpuser1 sftpg        4096 Jul 28 21:01 upload
sftp> cd upload
sftp> ls -rlt
sftp> lls
abc  admin1  anaconda-ks.cfg  bam  downfile  install.log  install.log.syslog  link  link.tar.gz  sftpfile  tmp  upfile
sftp> put upfile
Uploading upfile to /data/sftp/sftpuser1/upload/upfile
upfile                                                                                                                                                                         100%    0     0.0KB/s   00:00    
sftp> ls -rlt
-rw-r--r--    1 sftpuser1 sftpg           0 Jul 28 21:06 upfile
sftp> get upfile
Fetching /data/sftp/sftpuser1/upload/upfile to upfile
sftp> rm upfile
Removing /data/sftp/sftpuser1/upload/upfile

sftp登录: sftp username@ip,根据提示输入password
登录成功后ls 命令看到当前目录下有upload文件上传目录,cd 进入upload目录
lls 显示本地目录下的文件列表
put 文件名 : 将本地文件上传到upload目录下
get 文件名 : 将远程目录下为文件下载到本地目录
rm 文件名 :将upload目录下的文件删除

  • step10:
    问题及解决办法:
    1.文件上传时报错:
sftp> put downfile
Uploading downfile to /data/sftp/sftpuser2/upload/downfile
Couldn't get handle: Permission denied

该目录权限问题,按照下面规则设置:

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

你可能感兴趣的:(sftp)