從技術角度來分析,幾個要求:linux
一、從安全方面看,sftp會更安全一點vim
二、線上服務器提供在線服務,對用戶須要控制,只能讓用戶在本身的home目錄下活動安全
三、用戶只能使用sftp,不能ssh到機器進行操做服務器
提供sftp服務,能夠用系統自帶的internal-sftp,也可使用vsftpd,這裏需求很少,直接選用internal-sftp。ssh
限制用戶只能在本身的home目錄下活動,這裏須要使用到chroot,openssh 4.8p1之後都支持chroot,我如今用的是CentOS 6.3,自帶的openssh已是5.3p1,足夠了。spa
能夠輸入:rest
# ssh -V server
來查看openssh的版本,若是低於4.8p1,須要自行升級安裝,不在這裏具體介紹了。ip
假設,有一個名爲sftp的組,這個組中的用戶只能使用sftp,不能使用ssh,且sftp登陸後只能在本身的home目錄下活動登錄
一、建立sftp組
# groupadd sftp
二、建立一個sftp用戶,名爲mysftp
# useradd -g sftp -s /bin/false mysftp
# passwd mysftp
三、sftp組的用戶的home目錄統一指定到/data/sftp下,按用戶名區分,這裏先新建一個mysftp目錄,而後指定mysftp的home爲/data/sftp/mysftp
# mkdir -p /data/sftp/mysftp
# usermod -d /data/sftp/mysftp mysftp
四、配置sshd_config
編輯 /etc/ssh/sshd_config
# vim /etc/ssh/sshd_config
找到以下這行,並註釋掉
Subsystem sftp /usr/libexec/openssh/sftp-server
添加以下幾行
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory /data/sftp/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
解釋一下添加的幾行的意思
Subsystem sftp internal-sftp
這行指定使用sftp服務使用系統自帶的internal-sftp
Match Group sftp
這行用來匹配sftp組的用戶,若是要匹配多個組,多個組之間用逗號分割
固然,也能夠匹配用戶
Match User mysftp
這樣就能夠匹配用戶了,多個用戶名之間也是用逗號分割,但咱們這裏按組匹配更靈活和方便
ChrootDirectory /data/sftp/%u
用chroot將用戶的根目錄指定到/data/sftp/%u,%u表明用戶名,這樣用戶就只能在/data/sftp/%u下活動,chroot的含義,能夠參考這裏:http://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
ForceCommand internal-sftp
指定sftp命令
AllowTcpForwarding no
X11Forwarding no
這兩行,若是不但願該用戶能使用端口轉發的話就加上,不然刪掉
五、設定Chroot目錄權限
# chown root:sftp /data/sftp/mysftp
# chmod 755 /data/sftp/mysftp
錯誤的目錄權限設定會致使在log中出現」fatal: bad ownership or modes for chroot directory XXXXXX」的內容
目錄的權限設定有兩個要點:
一、由ChrootDirectory指定的目錄開始一直往上到系統根目錄爲止的目錄擁有者都只能是root
二、由ChrootDirectory指定的目錄開始一直往上到系統根目錄爲止都不能夠具備羣組寫入權限
因此遵循以上兩個原則
1)咱們將/data/sftp/mysftp的全部者設置爲了root,全部組設置爲sftp
2)咱們將/data/sftp/mysftp的權限設置爲755,全部者root有寫入權限,而全部組sftp無寫入權限
六、創建SFTP用戶登入後可寫入的目錄
照上面設置後,在重啓sshd服務後,用戶mysftp已經能夠登陸,但使用chroot指定根目錄後,根應該是沒法寫入的,因此要新建一個目錄供mysftp上傳文件。這個目錄全部者爲mysftp,全部組爲sftp,全部者有寫入權限,而全部組無寫入權限
# mkdir /data/sftp/mysftp/upload
# chown mysftp:sftp /data/sftp/mysftp/upload
# chmod 755 /data/sftp/mysftp/upload
七、重啓sshd服務
# service sshd restart
到這裏,mysftp已經能夠經過sftp客戶端登陸並能夠上傳文件到upload目錄。
若是仍是不能在此目錄下上傳文件,提示沒有權限,檢查SElinux是否關閉,可使用以下指令關閉SElinux
修改/etc/selinux/config文件中的SELINUX="" 爲 disabled ,而後重啓。或者
# setenforce 0
*PS
一開始,我覺得是權限問題致使的沒法上傳文件,即便給777權限給文件夾也不行. 而後乾脆關閉了SElinux,終於能夠上傳了。