(轉):使用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使用者及組的目錄限制