CentOS 6配置SFTP

由于SFTP是SSH的一部分(与传统的FTP没有任何关系),因此,配置SFTP不需要传统的FTP服务器软件。仅需要OpenSSH服务器即可。

$ yum install openssh-server openssl

$ cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

$ vim +132 /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

这行指定使用sftp服务使用系统自带的internal-sftp

Match Group sftp

匹配sftp组的用户,如果有多个组用逗号分割

也可以使用“Match User mysftp”匹配用户,多个用户之间也是用逗号分割

ChrootDirectory /data/ftp/%u

用chroot将用户的根目录指定到/data/ftp/%u,%u代表用户名,%h表示用户根目录

另一种写法: ChrootDirectory %h

chroot可以参考:http://www.ibm.com/developerworks/cn/linux/l-cn-chroot/

ForceCommand    internal-sftp

指定sftp命令

AllowTcpForwarding no

X11Forwarding no

禁止用户使用端口转发

建立用户和组

$ mkdir -p /data/sftp/

$ groupadd sftp

$ useradd -m -d /data/sftp/user1 -g sftp -s /sbin/nologin user1

#通过上面这条命令建立的用户,其家目录权限是700,需要改成755才可以正常登陆

$ chmod -R 755 /data/sftp/

$ chown root:sftp /data/sftp/

$ chown root:sftp /data/sftp/user1    #重要

错误的目录权限设定会导致在log中出现”fatal: bad ownership or modesfor chroot directoryXXXXXX”的内容

目录的权限设定有两个要点:

1、由ChrootDirectory指定的目录开始一直往上到系统根目录为止的目录拥有者都只能是root

2、由ChrootDirectory指定的目录开始一直往上到系统根目录为止都不可以具有群组写入权限(最大权限755)

因为用了chroot,所以/data/sftp/user1属主一定要是root,并且所属组不能有写入权限,如果上传需要写入在/data/sftp/user1下建立可写属主的文件夹供上传使用。

$ mkdir /data/sftp/user1/upload

$ chown -R user1:sftp /data/sftp/user1/upload

===========================================

2015.01.12补充

在Ubuntu 12.04 64bit系统部按如上方法部署好了SFTP,发现无法登陆,后来在/var/log/auth.log中发现了日志:fatal: bad ownership or modes for chroot directory component “/ftpdata/ftp/”;

于是查看了一下/ftpdata/ftp/的权限,发现该目录的属主是ftp。于是立即将属主修改为root,再次登陆就没问题了

请注意,在Ubuntu系统下,“Match Group sftp”及以后的配置项要写在“UsePAM yes”之后,否则同样无法登陆

===========================================

2015.02.03补充

在Ubuntu 12.04 64bit系统部按如上方法部署好了SFTP,发现无法登陆,FileZilla提示:Received unexpected end-of-file from SFTP server;执行/etc/init.d/ssh restart也不行;

经过百度,发现执行一下initctl restart ssh就OK了

推荐阅读更多精彩内容