运营有异地传输文件的需求,但如果通过QQ等即时通讯软件,不利于文件的集中管理,不方便。而我们办公室的内网机器无法提供外网访问方法,且传输的内容不合适放到公共的网盘或者是云存储上,所以只能用线上负载较低的服务器来承担此项任务。


从技术角度来分析,几个要求

1、ftp不安全,只能使用sftp

2、线上服务器提供在线服务,对用户需要控制,只能让用户在自己的home目录下活动

3、用户只能使用sftp,不能ssh到机器进行操作

3、服务器磁盘有限,需要对用户磁盘进行配额


提供sftp服务,可以用系统自带的internal-sftp,也可以使用vsftpd,这里需求不多,直接选用internal-sftp。


限制用户在自己的home目录下活动,这里需要使用到chroot,openssh 4.8p1以后都支持chroot,我这里是CentOS 6,自带的openssh已经是5.3p1,足够了。


可以



  1. ssh -V


来查看openssh的版本,如果低于4.8p1,需要自行升级安装,不在这里具体介绍了。


假设,有一个名为sftp的组,,这个组中的用户只能使用sftp,不能使用ssh,且sftp登录后只能在自己的home目录下活动


1、创建sftp组



  1. groupadd sftp




2、创建一个测试用户,名为testuser


  1. useradd -g sftp -s /bin/false testuser
  2. passwd testuser



3、sftp组的用户的home目录统一指定到/opt/sftp下,按用户名区分,这里先新建一个testuser目录,然后指定testuser的home为/opt/sftp/testuser



  1. mkdir /opt/sftp
  2. cd /opt/sftp
  3. mkdir testuser
  4. usermod -d /opt/sftp/testuser testuser


4、配置sshd_config

编辑 /etc/ssh/sshd_config



  1. vim /etc/ssh/sshd_config




找到如下这行,并注释掉



  1. Subsystem sftp /usr/libexec/openssh/sftp-server




添加如下几行



  1. Subsystem sftp internal-sftp
  2. Match Group sftp
  3. ChrootDirectory /opt/sftp/%u
  4. ForceCommand internal-sftp
  5. AllowTcpForwarding no
  6. X11Forwarding no




解释一下添加的几行的意思



  1. Subsystem sftp internal-sftp



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




  1. Match Group sftp



这行用来匹配sftp组的用户,如果要匹配多个组,多个组之间用逗号分割

也可以匹配用户



  1. Match User testuser



这样就可以匹配用户了,多个用户名之间也是用逗号分割,但我们这里按组匹配更灵活和方便




  1. ChrootDirectory /opt/sftp/%u



用chroot将用户的根目录指定到/opt/sftp/%u,%u代表用户名,这样用户就只能在/opt/sftp/%u下活动,chroot的含义​




  1. ForceCommand internal-sftp



指定sftp命令




  1. AllowTcpForwarding no
  2. X11Forwarding no



这两行,如果不希望该用户能使用端口转发的话就加上,否则删掉


5、设定Chroot目录权限



  1. chown root:sftp /opt/sftp/testuser
  2. chmod 755 /opt/sftp/testuser



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


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

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

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


所以遵循以上两个原则

1、我们将/opt/sftp/testuser的所有者设置为了root,所有组设置为sftp

2、我们讲/opt/sftp/testuser的权限设置为755,所有者root有写入权限,而所有组sftp无写入权限


6、建立SFTP用户登入后可写入的目录

照上面设置后,在重启sshd服务后,testuser已经可以登录,但使用chroot指定根目录后,根是无法写入的,所以要新建一个目录供testuser上传文件。这个目录所有者为testuser,所有组为sftp,所有者有写入权限,而所有组无写入权限



  1. mkdir /opt/sftp/testuser/upload
  2. chown uplus:sftp /opt/sftp/testuser/upload
  3. chmod 755 /opt/sftp/testuser/upload




7、重启sshd服务



  1. service sshd restart