背景 手上有一个这样的系统:后台可以直接新建项目(网站),只需输入项目名称、访问域名(二级)以及其他一些额外信息,就可自动生成一个模板网站。大致原理是:提交这些信息的时候,后台会给项目新建一个目录,并把一些必须的文件拷贝过去,然后会有一个二级域名映射文件实现二级域名访问。当然,一级域名可实现访问,前提是要完成备案。 之前对于单个项目都是通过一个统一sftp账号管理的,随着项目的增多,发现要找到相应目录会比较困难,所以现在希望在新建项目的时候能够自动生成对应的sftp账号,实现一对一管理。
过程 vsftpd是首选,我也尝试过这种实现。由于内部服务器架构的问题,IP地址是个限制,无法实现vsftpd的访问,询问过相关人员给出的答案也是如此,所以作罢。 经过一番了解,发现sftp是剩下的唯一一条路,接着熟悉、实践,最终解决上级需求。
由于不需要安装其他第三方软件,只需要CentOS系统账户以及一些目录权限的设置,整个实现过程不是太复杂,但权限的问题绝不是那么容易就可以搞定的,有一些 规则不能违背,否则失败。
假设目录结构是这样的: /var/www/site1 /var/www/site2
相应的系统账号分别是 site1 和 site2 ,使用passwd设置相应密码,site1 和 site2 的家目录分别是/var/www/site1和 /var/www/site2
此处有两个限制:
- 从site1和site2开始设置的目录权限及其所有的上级文件夹权限,属主和属组必须是root;
- 从site1和site2开始设置的目录权限及其所有的上级文件夹权限,只有属主能拥有写权限,也就是说权限最大设置只能是755。
如果我们把网站文件就放在site1和site2下面的话,是没有权限求改的,这由sftp的内在实现决定,我们只能遵守。所以,解决方案是,我们在site1和site2下面再分别新建一个 web 目录,权限是 775,属主分别是 site1 和 site2,属组 仍然还是 root 。为实现apache的解析正常,apache服务的运行组需要设置成 root 。
权限设置完成后,修改 sshd_config 设置:
vim /etc/ssh/sshd_config
#注释原来的Subsystem设置
Subsystem sftp /usr/libexec/openssh/sftp-server
#启用internal-sftp
Subsystem sftp internal-sftp
#限制www用户的根目录
Match User apache
ChrootDirectory /var/www
ForceCommand internal-sftp
#限制blog和pay用户的根目录
Match Group root
ChrootDirectory %h
ForceCommand internal-sftp
除此之外,web 目录下生成的其他目录的权限也必须是 775 。可通过修改 umask 为 0002 来实现。
最后,一个完整的sftp 方案诞生。
ps: 升级OpenSSH的版本。只有4.8p1及以上版本才支持Chroot。 CentOS 5.4的源中的最新版本是4.3,因此需要升级OpenSSH。 可通过ssh -V命令查看是否需要升级,升级方法自行搜索。
来源:oschina
链接:https://my.oschina.net/u/940492/blog/318995