由於vsftp採用明文傳輸,用戶名密碼可通過抓包得到,爲了安全性,需使用sftp,鎖定目錄且不允許sftp用戶登到服務器。由於sftp使用的是ssh協議,需保證用戶只能使用sftp,不能ssh到機器進行操作,且使用密鑰登陸、不是22端口。
先看下原理圖:
1. 在遠程目標創建sftp服務用戶組,創建sftp服務根目錄
1 | groupadd sftp |
#此目錄及上級目錄的所有者必須爲root,權限不高於755,此目錄的組最好設定爲sftp
1 2 3 | mkdir /data/sftp chown -R root: sftp /data/sftp chmod -R 0755 /data/sftp |
2. 修改sshd配置文件
1 2 | cp /etc/ssh/sshd_config ,_bk} #備份配置文件 sed -i 's@#Port 22@Port 22@' /etc/ssh/sshd_config #保證原來22端口可以 |
1 | vi /etc/ssh/sshd_config |
註釋掉/etc/ssh/sshd_config文件中的此行代碼:
1 | Subsystem sftp /usr/libexec/openssh/sftp-server |
添加如下代碼:
1 2 3 4 5 6 7 | Port 22222 #此處改爲非22端口 Subsystem sftp internal- sftp -l INFO -f AUTH Match Group sftp ChrootDirectory /data/sftp/ %u X11Forwarding no AllowTcpForwarding no ForceCommand internal- sftp -l INFO -f AUTH |
凡是在用戶組sftp裏的用戶,都可以使用sftp服務;使用sftp服務連接上之後,可訪問目錄爲/data/sftp/username
舉個例子:
test是一個sftp組的用戶,它通過sftp連接服務器上之後,只能看到/data/sftp/test目錄下的內容
test2也是一個sftp組的用戶,它通過sftp連接服務器之後,只能看到/data/sftp/test2目錄下的內容
3. 創建sftp用戶
#此例將創建一個名稱爲test的sftp帳號
#創建test sftp家目錄:test目錄的所有者必須是root,組最好設定爲sftp,權限不高於755
1 2 3 4 | mkdir /data/sftp/test chmod 0755 /data/sftp/test chown root: sftp /data/sftp/test useradd -g sftp -s /sbin/nologin test #添加用戶,參數-s /sbin/nologin禁止用戶通過命令行登錄 |
在本地創建test用戶密鑰對(用來連接遠程服務器的):
1 2 3 4 | # mkdir /home/test/.ssh # ssh-keygen -t rsa # ssh-copy-id test@IP ##要遠程的目標服務器IP和賬戶 # chown -R test.sftp /home/test |
在目標遠程服務器test目錄下創建一個可以寫的upload目錄
1 2 | mkdir /data/sftp/test/upload chown -R test : sftp /data/sftp/test/upload |
注:sftp服務的根目錄的所有者必須是root,權限不能超過755(上級目錄也必須遵循此規則),sftp的用戶目錄所有者也必須是root,且最高權限不能超過755。
4. 測試sftp
1 | systemctl restart sshd.service |
test用戶密鑰登陸:
1 | sftp test@IP ##在本地sftp登陸遠程服務器 |
另外,將公鑰拷貝到服務器的~/.ssh/authorized_keys文件中方法有如下幾種:
1、將公鑰通過scp拷貝到服務器上,然後追加到~/.ssh/authorized_keys文件中,這種方式比較麻煩。scp -P 22 ~/.ssh/id_rsa.pub user@host:~/。
2、通過ssh-copy-id程序,就是我演示的方法,ssh-copyid user@host即可
3、可以通過cat ~/.ssh/id_rsa.pub | ssh -p 22 user@host ‘cat >> ~/.ssh/authorized_keys’,這個也是比較常用的方法,因爲可以更改端口號。