看到某雲的CDN居然是使用ftp這種早該淘汰的協議,不禁有些吐槽。ftp曾經作為互聯網上最重要的協議,但漫長使用過程中體現出的各種缺點,已不適合再使用。其中最致命的問題就是明文傳輸用戶密碼。建議使用這種CDN時,最好長個心眼關閉ftp管理方式,直接使用回源透傳的模式。
不過某些情況下,不適合使用svn、git之類的方式來傳輸文件時(一般是不需要版本管理的二進制文件),最合適的選擇就是ftp這種類型的協議。ftp的替代品也不少,如sftp、ftps、webdav。我個人最看好的是webdav,但是鑒於幾乎所有的linux服務器都安裝了ssh,使用sftp可以更省資源,不需要開啟額外的進程和端口。接下來記錄sftp的設置過程,系統環境基於debian 8。
我的需求是這樣的:設置一個sftp目錄,可以通過sftp上傳/下載,同時nginx也需要能夠讀寫,以方便我上傳/更新web程序,以及下載web服務器的日志。
操作流程如下:
- 添加sftp賬號
首先建立好sftp的目錄:
mkdir /var/sftp
創建用於sftp的用戶和用戶組
groupadd sftp useradd -g sftp -d /var/sftp -s /bin/false sftp passwd sftp # 設置密碼
- 通過chroot限制sftp服務的訪問目錄
編輯ssh的配置文件,設置chroot目錄,把sftp限制在他的用戶目錄下(%h代表用戶目錄),並且禁止掉其他不需要的ssh權限
nano /etc/ssh/sshd_config # 找到Subsystem,注釋掉原來的那行 #Subsystem sftp /usr/lib/openssh/sftp-server # 再添加下面的新行 Subsystem sftp internal-sftp # 限制sftp的目錄,讓他看不到不應該看到的東西 Match Group sftp ChrootDirectory %h AllowTcpForwarding no X11Forwarding no ForceCommand internal-sftp創建上傳目錄並設置權限,ChrootDirectory的目錄和其所有上層目錄的所有者必須是root,並且權限不能大於755
cd /var/sftp mkdir www chmod 770 www chown sftp:sftp www cd .. chmod 755 sftp chown root:root sftp
- 設置掩碼,以便外部程序能夠使用
sftp上傳過程中創建的目錄和文件所有者固定為sftp:sftp,權限默認為755,其他用戶只能讀不能寫。這里我們需要修改為可以被組成員讀寫(當然了解原理后你也可以圖省事,直接允許所有用戶讀寫)
nano /etc/pam.d/sshd # 在文件最末尾添加 session optional pam_umask.so umask=0007 # 也可以是0002給nginx使用的用戶添加用戶組sftp,我這里是www-data
usermod -G sftp www-data還原shell中的默認umask,避免被sftp覆蓋
nano /etc/profile # 在文件最末尾添加 umask 022
到此,我們已經順利的架設了sftp服務,可以使用各種流行的ftp客戶端,比如FileZilla、FlashFXP安逸的上傳/下載文件啦。