您的位置:首页 > 运维架构 > 网站架构

CentOS 下使用SFTP实现网站自动生成FTP账号,实现Chroot功能

2014-09-26 00:00 671 查看
摘要: Linux自带的sftp功能,稍加利用,可以替代vsftpd等工具,而且由于数据传输过程中会加密,所以比一般的ftp工具更安全。正因为如此,在目录权限上有一些限制,如何设置见文章详情。

背景
手上有一个这样的系统:后台可以直接新建项目(网站),只需输入项目名称、访问域名(二级)以及其他一些额外信息,就可自动生成一个模板网站。大致原理是:提交这些信息的时候,后台会给项目新建一个目录,并把一些必须的文件拷贝过去,然后会有一个二级域名映射文件实现二级域名访问。当然,一级域名可实现访问,前提是要完成备案。
之前对于单个项目都是通过一个统一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命令查看是否需要升级,升级方法自行搜索。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sftp centos chroot