在Linux Centos 6.3 上搭建SFTP文件服務器
- step1:
首先查看ssh版本,版本不應低於4.8p1,因爲配置權限需要版本添加的新配置項ChrootDirectory來完成,若低於此版本,請自行升級。
[root@localhost home]# ssh -V
OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010
- step2:
創建sftp用戶組和用戶,並給用戶設置密碼
[root@localhost home]# groupadd sftpg #創建用戶組sftp
[root@localhost home]# useradd -g sftpg -s /sbin/nologin sftpuser1 #創建用戶 sftpuser1
[root@localhost home]# passwd sftpuser1
更改用戶 sftpuser1 的密碼 。
新的 密碼:
重新輸入新的 密碼:
passwd: 所有的身份驗證令牌已經成功更新。
-g sftp 指定該用戶的組爲sftpg
-s 是指定用戶登入後所使用的shell。默認值爲/bin/bash。如果不想讓用戶登錄系統可以用 -s /sbin/nologin,此用戶就不可以登錄系統。
- step3:
創建sftp文件目錄,並按用戶名區分每個用戶登錄路徑,指定用戶登錄的根目錄
[root@localhost home]# mkdir -p /data/sftp
[root@localhost home]# cd /data/sftp
[root@localhost sftp]# ls -rtl
總用量 0
[root@localhost sftp]# mkdir sftpuser1
[root@localhost sftpuser1]# usermod -d /data/sftp/sftpuser1 sftpuser1
step4:
編輯配置文件/etc/ssh/sshd_config[root@localhost sftp_admin1]# vi /etc/ssh/sshd_config
在配置文件中一頓操作:
1.註釋掉這行# Subsystem sftp /usr/libexec/openssh/sftp-server
2.增加以下6行
Subsystem sftp internal-sftp
Match Group sftp
ChrootDirectory /data/sftp/%u #設定屬於用戶組sftp的用戶訪問的根文件夾
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no #設置不允許SSH的X轉發step5:
給用戶家目錄更改屬主並授權,家目錄屬主必須是root,權限可以是755或者750
[root@localhost sftpuser1]# chown root:sftpg /data/sftp/sftpuser1
[root@localhost sftpuser1]# chmod 750 /data/sftp/sftpuser1
[root@localhost sftp]# ls -rtl
總用量 4
drwxr-x---. 2 root sftpg 4096 7月 28 20:43 sftpuser1
- step6:
創建sftpuser1文件上傳目錄。
照上面設置,在重啓sshd服務後,用戶sftpuser1已經可以登錄。但使用chroot指定根目錄後,根應該是無法寫入的,所以要新建一個目錄供sftpuser1上傳文件。這個目錄所有者爲sftpuser1,所有組爲sftp,所有者有寫入權限,而所有組無寫入權限。命令如下:
[root@localhost sftpuser1]# mkdir /data/sftp/sftpuser1/upload
[root@localhost sftpuser1]# chown sftpuser1:sftpg /data/sftp/sftpuser1/upload
[root@localhost sftpuser1]# chmod 755 /data/sftp/sftpuser1/upload
- step7:
修改/etc/selinux/config,將文件中的SELINUX=enforcing 修改爲 SELINUX=disabled ,然後保存退出。在輸入命令:setenforce 0
[root@localhost sftpuser1]# vi /etc/selinux/config
[root@localhost sftpuser1]# setenforce 0
至於爲什麼要修改SELINUX,可參考:https://www.zhihu.com/question/20559538
- step8:
重啓sshd服務
[root@localhost sftp_admin1]# service sshd restart
停止 sshd: [確定]
正在啓動 sshd: [確定]
- step9:
測試搭建成果:
[root@localhost ~]# sftp [email protected]
Connecting to 164.22.13.5...
sftpuser1@164.22.13.5's password:
sftp> ls -rtl
drwxr-xr-x 2 sftpuser1 sftpg 4096 Jul 28 21:01 upload
sftp> cd upload
sftp> ls -rlt
sftp> lls
abc admin1 anaconda-ks.cfg bam downfile install.log install.log.syslog link link.tar.gz sftpfile tmp upfile
sftp> put upfile
Uploading upfile to /data/sftp/sftpuser1/upload/upfile
upfile 100% 0 0.0KB/s 00:00
sftp> ls -rlt
-rw-r--r-- 1 sftpuser1 sftpg 0 Jul 28 21:06 upfile
sftp> get upfile
Fetching /data/sftp/sftpuser1/upload/upfile to upfile
sftp> rm upfile
Removing /data/sftp/sftpuser1/upload/upfile
sftp登錄: sftp username@ip,根據提示輸入password
登錄成功後ls 命令看到當前目錄下有upload文件上傳目錄,cd 進入upload目錄
lls 顯示本地目錄下的文件列表
put 文件名 : 將本地文件上傳到upload目錄下
get 文件名 : 將遠程目錄下爲文件下載到本地目錄
rm 文件名 :將upload目錄下的文件刪除
- step10:
問題及解決辦法:
1.文件上傳時報錯:
sftp> put downfile
Uploading downfile to /data/sftp/sftpuser2/upload/downfile
Couldn't get handle: Permission denied
該目錄權限問題,按照下面規則設置:
- 目錄開始一直往上到系統根目錄爲止的目錄擁有者都只能是 root,用戶組可以不是 root。
- 目錄開始一直往上到系統根目錄爲止都不可以具有羣組寫入權限