1. 程式人生 > >(轉):使用SFTP替代FTP來傳輸檔案

(轉):使用SFTP替代FTP來傳輸檔案

需要檔案傳輸需求,使用者只能通過sftp訪問,不能通過OpenSSH登入到系統中。只開放一個sftp伺服器給使用者,用openssh 5.0以上的版本很容易做到,openssh新版自帶一個自己實現的sftp server:internal-sftp。在使用時有命令列或gui工具,能對像ftp服務進行操作一樣。配置 升級新版以後只需要配置為如下: Subsystem  sftp internal-sftp Match User sftpuser  ChrootDirectory /home/sftpuser  X11Forwarding no  AllowTcpForwarding no  ForceCommand internal-sftp chown root.root /home/sftpuser key驗證可以正常放在/home/sftpuser/.ssh 裡面即可,這樣就可以實現chroot和只允許sftp。 如果只是要chroot的話,要使使用者可以登入,必須在/home/sftpuser/下面準備一些檔案: The ChrootDirectory must contain the necessary files and directories to support the users’ session.  For an interactive session this requires at least a shell, typically sh(1), and basic /dev nodes such as null(4), zero(4), stdin(4), stdout(4), stderr(4), arandom(4) and tty(4) devices.  For file transfer sessions using “sftp”, no additional configuration of the environment is necessary if the in-process sftp server is used (see Subsystem for details). 過程大致如下,首先修改sshd的配置檔案: #vim /etc/ssh/sshd_config SSHD_CONFIG sshd通常是打開了sftp的,不過我們應該使用internal-sftp在sshd_conf中作如下配置: 將該檔案的末尾修改如下: #Subsystem sftp /usr/lib/openssh/sftp-server #該行(上面這行)註釋掉 Subsystem sftp internal-sftp Match group sftp  ChrootDirectory /home/data/sftpshare  X11Forwarding no  AllowTcpForwarding no  ForceCommand internal-sftp 或 Subsystem sftp internal-sftp Match Group sftp  ChrootDirectory /data/sftp/%u  ForceCommand    internal-sftp  AllowTcpForwarding no  X11Forwarding no 註釋:當sshd匹配到sftp組中的使用者,就會強制使用sftp(ForceCommand的作用),並將使用者限定在'/home/data/sftpshare'下相應使用者的目錄下(ChrootDirectory的作用)。 Subsystem sftp internal-sftp 這行指定使用sftp服務使用系統自帶的internal-sftp Match group sftp #匹配sftp組,如為單個使用者可用:Match user 使用者名稱;設定此使用者登陸時的shell設為/bin/false,這樣它就不能用ssh只能用sftp。如果要匹配多個組,多個組之間用逗號分割 當然,也可以匹配使用者 Match User freeoa 這樣就可以匹配使用者了,多個使用者名稱之間也是用逗號分割,但我們這裡按組匹配更靈活和方便 ChrootDirectory /home/data/sftpshare ChrootDirectory /data/sftp/%u   #指定使用者被鎖定到的那個目錄,為了能夠chroot成功,該目錄必須屬主是root,並且其他使用者或組不能寫。%u代表使用者名稱,這樣使用者就只能在/data/sftp/%u下活動,chroot的含義,可以參考這裡:http://www.ibm.com/developerworks/cn/linux/l-cn-chroot/ X11Forwarding no AllowTcpForwarding no #這兩行,如果不希望該使用者能使用埠轉發的話就加上,否則刪掉 ForceCommand internal-sftp #UsePAM yes #該行(上面這行)同樣註釋掉,或者移到Subsystem sftp internal-sftp的上面 下面建立sftp組和一個測試使用者user,該使用者屬於sftp組: # groupadd sftp # useradd -d /home/data/sftpshare -m -s /bin/false -g sftp user # sudo passwd user useradd -G sftp -d /sftphome/sftpuser  -s /usr/sbin/nologin sftpuser 你可以在其他機器上用sftp方式進行登入試試了。你的連線將會被reset,可以看下sshd的日誌,你會發現pam.d的認證是通過了的,但是chroot失敗了。按網路上的說法 # chown root /sftphome/sftpuser # chmod 755 /sftphome/sftpuser 重試是可以登入,新的問題是不能在此目錄下寫入。755對於組使用者是不能寫;再試試775,剛才的問題就來又了,chroot失敗。 重啟SSHD服務 # /etc/init.d/ssh reload使用者及組的目錄限制

#限制freeoa使用者的根目錄 Match User freeoa  ChrootDirectory /home/data/sftpshare  ForceCommand  internal-sftp  #限制使用者組的根目錄 Match Group sftp  ChrootDirectory %h  ForceCommand  internal-sftp -d %u 此時,使用帶有sftp功能的客戶端軟體,比如Filezilla就可以使用sftp方式登入伺服器了。許可權設定 要實現Chroot功能,目錄許可權的設定非常重要,否則無法登入。 目錄許可權設定時需要注意: ChrootDirectory設定的目錄許可權及其所有的上級資料夾許可權,屬主和屬組必須是root,ChrootDirectory設定的目錄許可權及其所有的上級資料夾許可權,只有屬主能擁有寫許可權,也就是說許可權最大設定只能是755。 如果不能遵循以上兩點,即使是該目錄僅屬於某個使用者,也可能會影響到所有的SFTP使用者,讓預設建立的檔案和目錄許可權為775即可。 設定Chroot目錄許可權 # chown root:sftp /data/sftp/mysftp # chmod 755 /data/sftp/mysftp 錯誤的目錄許可權設定會導致在log中出現”fatal: bad ownership or modes for chroot directory xyz”的內容(Oct 10 15:11:25 pde sshd[3410]: fatal: bad ownership or modes for chroot directory "/home/data/sftpshare/zhfreeoa")。 目錄的許可權設定有兩個要點,遵循這兩個原則: 1、由ChrootDirectory指定的目錄開始一直往上到系統根目錄的目錄擁有者都只能是root。 2、由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  可能涉及的問題
1、selinux 如果還是不能在此目錄下上傳檔案,提示沒有許可權,檢查SElinux是否關閉,可以使用如下指令關閉SElinux 修改/etc/selinux/config檔案中的SELINUX="" 為 disabled ,然後重啟。或者 # setenforce 0 2、認證成功但不能使用的問題 ChrootDirectory /home/data/sftpshare/%u 發生登入問題, 錯誤:    Server unexpectedly closed network connection 如果改為: ChrootDirectory %h 發生問題同上。開啟sftp日誌功能 修改SSH配置: #vim /etc/ssh/sshd_config 修改 Subsystem sftp /usr/libexec/openssh/sftp-server 如下: Subsystem sftp internal-sftp -l INFO -f local5 或 Subsystem  sftp /usr/libexec/openssh/sftp-server -l INFO -f AUTH 去掉下面一行的註釋 #LogLevel INFO 修改syslog vim /etc/syslog.conf # 增加一行 auth,authpriv.*,local5.* /var/log/sftp.log 新增sftp賬號 useradd -d "sftp許可權目錄" -s /bin/false "username" usermod -g "使用者所在組" "username" 重啟後檢視/var/log/sftp.log /etc/init.d/syslog restart /etc/init.d/sshd restart tail -f /var/log/sftp.log 修改openssh配置,以支援更多使用者在同時使用sftp檔案服務,即併發支援(該值預設為10)。 MaxStartups 32 Specifies the maximum number of open sessions permitted per network connection. The default is 10.This will only help if the user is opening multiple connections from the same IP.參考文件
http://en.wikibooks.org/wiki/OpenSSH/Cookbook/SFTP