0、sftp介紹
sftp是Secure FileTransferProtocol的縮寫,安全文件傳送協議。可以爲傳輸文件提供一種安全的加密方法。sftp與 ftp有着幾乎一樣的語法和功能。SFTP爲 SSH的一部分,是一種傳輸檔案至Blogger伺服器的安全方式。其實在SSH軟件包中,已經包含了一個叫作SFTP(Secure File TransferProtocol)的安全文件傳輸子系統,SFTP本身沒有單獨的守護進程,它必須使用sshd守護進程(端口號默認是22)來完成相應的連接操作,所以從某種意義上來說,SFTP並不像一個服務器程序,而更像是一個客戶端程序。SFTP同樣是使用加密傳輸認證信息和傳輸的數據,所以,使用SFTP是非常安全的。但是,由於這種傳輸方式使用了加密/解密技術,所以傳輸效率比普通的FTP要低得多,如果您對網絡安全性要求更高時,可以使用SFTP代替FTP。
SFTP命令常用選項sftp即secure ftp,是一個交互式文件傳輸程式。它類似於ftp,但它進行加密傳輸,比FTP有更高的安全性。
1、sftp權限配置
1.1 創建sftp組
groupadd sftp
創建完成之後使用cat /etc/group命令組的信息;
cat /etc/group
效果如下圖:
1.2 創建一個sftp用戶mysftp
創建一個sftp用戶mysftp,並加入到創建的sftp組中:
(使用-s /bin/false來禁止mysftp 這個賬戶ssh登錄權限)
useradd -g sftp -s /bin/false mysftp
修改mysftp用戶的密碼:
passwd mysftp
效果如下圖:
1.3 創建並配置mysftp的根目錄
新建/data/sftp/mysftp目錄(-p 創建多級目錄):
mkdir -p /data/sftp/mysftp
並將它指定爲mysftp用戶的home目錄
usermod -d /data/sftp/mysftp mysftp
1.4 編輯配置文件/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
配置一個外部子系統(例如,一個文件傳輸守護進程)。僅用於SSH-2協議。值是一個子系統的名字和對應的命令行(含選項和參數)。比如"sftp /usr/libexec/openssh/sftp-server"。,這裏配置爲內部的 - Match Group sftp
限定只有sftp組的才能訪問 - ChrootDirectory /data/sftp/%u
設定屬於用戶組sftp的用戶訪問的根文件夾 - ForceCommand internal-sftp
強制執行這裏指定的命令而忽略客戶端提供的任何命令。這個命令將使用用戶的登錄shell執行(shell -c)。這可以應用於 shell 、命令、子系統的完成,通常用於 Match 塊中。這個命令最初是在客戶端通過 SSH_ORIGINAL_COMMAND 環境變量來支持的。 - AllowTcpForwarding no
是否允許TCP轉發,默認值爲"yes", 禁止TCP轉發並不能增強安全性,除非禁止了用戶對shell的訪問,因爲用戶可以安裝他們自己的轉發器。 - X11Forwarding no
是否允許進行 X11 轉發。默認值是"no",設爲"yes"表示允許。如果允許X11轉發並且sshd(8)代理的顯示區被配置爲在含有通配符的地址(X11UseLocalhost)上監聽。那麼將可能有額外的信息被泄漏。由於使用X11轉發的可能帶來的風險,此指令默認值爲"no"。需要注意的是,禁止X11轉發並不能禁止用戶轉發X11通信,因爲用戶可以安裝他們自己的轉發器。
如果啓用了 UseLogin ,那麼X11轉發將被自動禁止。
1.5 新建一個目錄供sftp用戶mysftp上傳文件
這個目錄所有者爲mysftp所有組爲sftp,所有者有寫入權限所有組無寫入權限
mkdir /data/sftp/mysftp/upload
chown mysftp:sftp /data/sftp/mysftp/upload
chmod 755 /data/sftp/mysftp/upload
注意:修改權限這裏有個大坑,/data/sftp/mysftp 這些目錄必須都是root用戶的,只有upload才能是mysftp的(這裏建議upload所有者/組爲mysftp:sftp,sftp和mysftp所有者/組爲root:sftp,data的所有者/組爲root/root)。
這是由於/etc/ssh/sshd_config配置裏面ChrootDirectory有個主目錄權限問題,ChrootDirectory所指向的文件夾,屬主必須是root,屬組是sftp用戶所屬的用戶組。而且ChrootDirectory所指向的文件夾到系統根路徑上的所有途徑文件夾,屬主都必須是root,且權限不允許有羣組用戶寫入權限,即權限 只能爲750或755,如果任意一個是777,則會出現報錯。
centos6.5會報錯:
client_loop: send disconnect: Broken pipe Connection
closed. Connection closed
centos7會報錯:
Write failed: Broken pipe
Couldn't read packet: Connection reset by peer
所以,用mysftp用戶連接的客戶端只能讀取mysftp文件夾下的內容,不能寫入,需要寫入的話得寫到有寫權限的upload文件夾下。
2、關閉selinux並重啓sshd服務
setenforce 0
systemctl restart sshd.service
上述命令截圖如下:
注意,如果是centos6.5,則重啓sshd命令爲:
setenforce 0
service sshd restart
效果如下圖:
3、遠程驗證sftp服務以及sftp常用命令
3.1 遠程連接
遠程測試sftp命令爲:sftp user@ip
sftp mysftp@192.168.77.135
3.2 上傳文件
命令格式: put [-Ppr] local [remote]
注意:由於上面設置了sftp的根目錄爲“/data/sftp/mysftp”,所以下面命令雖然寫的遠端路徑是“/upload”,但是實際傳到的地址爲“/data/sftp/mysftp/upload”
put /home/beyond/mysoftware/ftp-0.17-54.el6.x86_64.rpm /upload
3.3 下載文件
命令格式:get [-Ppr] remote [local]
get java-demo.sh /home/beyond/
3.4 pwd和lpwd
- pwd是看遠端服務器的目錄, 即sftp服務器默認的當前目錄。
- lpwd是看linux本地目錄。
3.5 ls和lls
- ls是看sftp服務器下當前目錄下的文件
- lls是看linux當前目錄下的文件
3.6 !command
這個是指在linux上執行command這個命令。
比如!ls是列舉linux當前目錄下的東文件, !rm a.txt是刪除linux當前目錄下的a.txt文件。
這個命令非常非常有用, 因爲在sftp> 後輸入命令, 默認值針對sftp服務器的, 所以執行rm a.txt刪除的是sftp服務器上的a.txt文件, 而非本地的linux上的a.txt文件。
3.7 exit和quit
退出。