最近搞一個sftp項目,用於給第三方公司上傳文件,期間查詢了很多種方式,依然無法限制目錄,很苦惱,本次經過無數次試驗,終於成功了。
提供sftp服務的有vsftpd和internal-sftp,這里用的是系統自帶的internal-sftp,操作步驟如下:
下面是千篇一律的步驟,網上大抵相同。
1、創建用戶 sftpuser,並禁止ssh登錄,不創建家目錄
useradd -s /sbin/nologin -M sftpuser
2、設置用戶密碼
passwd sftpuser
3、創建sftp根目錄,所有sftp用戶都將在該目錄下活動。(如果以后不會在新增新用戶的話,可跳過此目錄)
mkdir /home/sftp
4、設置目錄權限,目錄的權限設定有兩個要點:
目錄開始一直往上到系統根目錄為止的目錄擁有者都只能是root
目錄開始一直往上到系統根目錄為止都不可以具有群組寫入權限
chown root:root /home/sftp
chmod 755 /home/sftp 注:該目錄權限最大為755,設置成777會報錯,這個也是我困擾我的一個地方。
5、創建用戶sftpuser根目錄,目錄名為用戶名
cd /home/sftp
mkdir sftpuser
6、設置sftpuser目錄權限
chown root:sftpuser /home/sftp/sftpuser
(注:設置用戶sftpuser,如果設置擁有者為root,表示該目錄sftpuser沒有權限讀寫,在該目錄下建立其它目錄,賦權給sftpuser用戶讀寫權限;
若需要對該目錄擁有讀寫權限,設置權限:chown sftpuser:sftpuser /home/sftp/sftpuser)
chmod 755 /home/sftp/sftpuser 注:這里的目錄sftpuser 權限也只能是755,否則無法限制目錄。
7、配置sshd_config
vi /etc/ssh/sshd_config
8、修改如下內容,並保存退出
#注釋掉這行
#Subsystem sftp /usr/libexec/openssh/sftp-server
添加這行:
Subsystem sftp internal-sftp #指定使用sftp服務使用系統自帶的internal-sftp,如果不添加,用戶無法通過sftp登錄。
#添加在配置文件末尾
Match User sftpuser#匹配用戶,如果要匹配多個組,多個組之間用逗號分割
ChrootDirectory /home/sftp/%u #用chroot將指定用戶的根目錄,chroot的含義:http://www.ibm.com/developerworks/cn/linux/l-cn-chroot/;
#這里的%u指的是賬號名,/home/sftp/%u 含義是:/home/sftp/sftpuser
ForceCommand internal-sftp #指定sftp命令
X11Forwarding no #這兩行,如果不希望該用戶能使用端口轉發的話就加上,否則刪掉
AllowTcpForwarding no
9、重啟sshd服務器
systemctl restart sshd.service
#查詢sshd啟動狀態命令:
systemctl status sshd.service
10、sftpuser用戶登錄測試:
sftp -oPort=22 sftpuser@127.0.0.1
至此已經完成了sftp創建用戶,並修改權限,限制根目錄。
在用戶登錄測試過程中,可能會遇到如下錯誤:
Couldn't read packet: Connection reset by peer
這是什么原因導致的呢,當時我一直很困惑,后來發現,是目錄權限導致了該問題,具體解決方案,回看以上4、5、6步驟!
————————————————
版權聲明:本文為CSDN博主「Tastill」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/Tastill/article/details/78864179