给linux下网站目录配置SFTP

时间:2022-07-03 12:18:19

 

   网上很难找到一篇适用于网站目录的SFTP配置说明,折腾了许久,我来写一篇完整点的。 如果觉得中文难以理解的话, 请看一篇简洁的英文配置方法http://www.linuxtechi.com/configure-chroot-sftp-in-linux/

 

   首先,据说如果开了selinux配置好后可能会无法连接(我没测试)。

  假设网站目录: /var/wwwroot/xxx.com/public_html(为什么要有子目录,是有原因的,见后面) ;

  目录下文件归属为 www:www (php-fpm用户及组), 我为什么要使用www组? 就是为了保证用户和php共享组权限。因为我们在给web目录配置权限的时候, 往往给文件夹 775、 755 或 750, 其他组往往拥有的权限不足, 新建或修改重传的文件拥有过低权限,导致php不能以组权限读取。

  // 添加一个SFTP组
    # groupadd www  

  // 禁止shell,home目录/var/wwwroot/xxx.com,  组 www .
  
// 如果user不存在:   # useradd -s /bin/nologin -d /var/wwwroot/xxx.com -g www sftp_david   // 如果user存在,则修改此user:    # usermod -s /bin/nologin -d /var/wwwroot/xxx.com -g www sftp_david   // 为此user设置密码    # passwd sftp_david

   到此没有其他错误的话,SFTP已经可以登录,但是此时user能浏览的太多了,几乎整个系统的文件! 得限制它的访问目录。

    # vim /etc/ssh/sshd_config     

    // 找到 Subsystem sftp 这一行注释掉,添加以下行:

      Subsystem       sftp  internal-sftp            

    // 在文件末尾添加以下内容, 限制该组只能访问home目录:

    Match Group www        //  也可以 Match User sftp_david

    ChrootDirectory %h

    ForceCommand internal-sftp

    AllowTcpForwarding no

  // 保存然后重启。 网络不好不要急着重启,以免重启失败导致当前ssh连接不上

  # service sshd restart  

  

  权限更改:

  SFTP有一个独特的地方, 用户的home目录以上文件夹的user必为root且你有写入权限。

  本例中 home 目录是  /var/wwwroot/xxx.com,  它每一级文件夹,user必须是root,并且SFTP账号都不能用有写入权限(通过group也不允许), 否则连接被拒。

  # cd  /var/wwwroot/xxx.com
  # chown root:root  .        // xxx.com 是home目录,将它设为root 
  # chown sftp_david:www   public_html   
  # chmod 775  public_html  

  上面就是public_html 这个子文件夹存在的意义—— 账号不能拥有xxx.com的文件夹写入,也就不能在它下面上传文件。所以我要建public_html这个子文件夹,它下面可以任意上传。

 

  同时将用户 sftp_david 加入 www 组,以拥有www组的权限

  # usermod -s /sbin/nologin -d /var/wwwroot/xxx.com/public_html -G www sftp_david

  完成!

 

  另外,如果public_html下的组权限为文件夹<7, 文件<6:执行(因为我这里依赖组权限操作文件): 

  # cd xxx.com

  # find . -type d -exec chmod g=rwx {} \;
  # find . -type f -exec chmod g=rw {} \;

   切记不要给文件赋予x权限。

 

 

user操作常用参数说明(其他见 -h):

  -a   添加的方式.   将一个用户加入多个组可使用此参数

  -d   指定home目录,也就是登录时进入的目录

  -M   

  -s   通常设置: /bin/false 禁止使用任何登录(包括shell),   /sbin/nologin 禁止登陆但可以使用SFTP

  -G   并将user加入这个group(同时创建group)

  -g   将此user加入这个组(不创建组)

 

  ( vsftp配置链接 )