背景 手上有一個這樣的系統:后臺可以直接新建項目(網站),只需輸入項目名稱、訪問域名(二級)以及其他一些額外信息,就可自動生成一個模板網站。大致原理是:提交這些信息的時候,后臺會給項目新建一個目錄,并把一些必須的文件拷貝過去,然后會有一個二級域名映射文件實現二級域名訪問。當然,一級域名可實現訪問,前提是要完成備案。 之前對于單個項目都是通過一個統一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命令查看是否需要升級,升級方法自行搜索。