网上很难找到一篇适用于网站目录的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配置链接 )