一、sftp對比vsftpd的異同
ftp和sftp非常相似,都支持批量傳輸(一次傳輸多個文件),文件夾/目錄導航,文件移動,文件夾/目錄創建,文件刪除等。但還是存在著差異,下面我們來看看ftp和sftp之間的區別。
1、安全通道ftp不提供任何安全通道來在主機之間傳輸文件;而sftp協議提供了一個安全通道,用于在網絡上的主機之間傳輸文件。
2、使用的協議ftp使用TCP / IP協議。而,sftp是SSH協議的一部分,它是一種遠程登錄信息。
3、連接方式ftp使用TCP端口21上的控制連接建立連接。而,sftp是在客戶端和服務器之間通過SSH協議(TCP端口22)建立的安全連接來傳輸文件。
4、安全性ftp密碼和數據以純文本格式發送,大多數情況下是不加密的,安全性不高。而,sftp會在發送之前加密數據,二進制的形式傳遞,是無法“按原樣”閱讀的,安全性較高。
二、sftp部署
必要條件:
你的openssh-server版本至少得是4.8p1, 因為配置權限需要版本添加的新配置項ChrootDirectory來完成。
如何查看自己服務器上的ssh版本?大家可以嘗試以下命令:
ssh -V
#創建sftp的用戶組
groupadd sftp
#用戶名sftpuser,創建用戶到用戶組,并禁止登錄
useradd -g sftp -s /bin/false sftpuser -d /data/sftpuser
#為sftpuser設置密碼
echo "123456" | passwd --stdin sftpuser
#修改ssh配置
vim /etc/ssh/sshd_config
#注釋Subsystem sftp /usr/libexec/openssh/sftp-server(若不注釋,可以通過"cd / "看到系統所有文件)
#定義了 OpenSSH 服務器對 sftp(SSH 文件傳輸協議)的處理方式
Subsystem sftp internal-sftp
#匹配sftp組的用戶,如果有多個組,用逗號分隔。也可以使用"Match User mysftp"匹配用戶,多個用戶之間也是用逗號分隔。
Match Group sftp
#將用戶的根目錄指定到/data/sftpuser(%u 是一個通配符,表示當前連接用戶的用戶名。在 ChrootDirectory 指令中使用 %u,可以實現將不同的用戶限制在他們各自的家目錄下)
ChrootDirectory /data/sftpuser/%U
#指定sftp命令(限制用戶只能通過 sftp 上傳、下載或管理文件,而不允許他們執行其他任意命令)
ForceCommand internal-sftp
#禁止用戶在 SSH 連接中進行 TCP 轉發。
AllowTcpForwarding no
#是否允許用戶可以使用端口轉發。
X11Forwarding no
#修改用戶的根目錄,讓它屬于root
chown -R root:sftp /data/sftpuser
chmod -R 755 /data/sftpuser
#創建sftpuser用戶可寫入的目錄,并授權
#由于sshd_config配置中指定了根目錄,根目錄無法寫入,因此要創建一個用于上傳文件的目錄。
#目錄所有者為sftpuser,有寫入權限;所有組為sftp,無寫入權限。
mkdir /data/sftpuser/sftpdata
chown -R sftpuser:sftp /data/sftpuser/sftpdata
chmod -R 755 /data/sftpuser/sftpdata
#重啟sshd服務
systemctl restart sshd
連接:
sftp sftpuser@192.168.1.10
#備注:
如果要將某個用戶訪問的根目錄指定到某個固定的目錄下的訪問用戶名下,并且看不到別人的目錄則
例如:user1要訪問的目錄為/data/sftpuser/user1、user2要訪問的目錄為/data/sftpuser/user2
ChrootDirectory /data/sftpuser/%U
如果要將某個用戶的家目錄指定指定為根目錄
ChrootDirectory %h
踩坑:
常見問題:
如果你鏈接服務器的時候出現下面的提示:
Write fAIled: Broken pipe
Couldn't read packet: Connection reset by peer
這個問題的原因是ChrootDirectory的權限問題,你設定的目錄必須是root用戶所有,否則就會出現問題。所以請確保sftp用戶根目錄的所有人是root, 權限是 750 或者 755。
三、如果需要sftp的端口和sshd的端口不同
cp -rp /etc/ssh/sshd_config /etc/ssh/sftp_config
修改配置文件時sshd_config不動,修改/etc/ssh/sftp_config
vim /etc/ssh/sftp_config
Port 2222
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory %h
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
#軟連接sshd的啟動方式
ln -s /usr/sbin/sshd /usr/sbin/sftpd
#啟動
/usr/sbin/sftpd -f /etc/ssh/sftp_config
#停止
kill -9 `ps aux | grep /usr/sbin/sftpd | grep -v 'grep' | awk '{print $2}'`