相比傳統的 ftp 服務,SFTP 顯得更加方便、安全,一般系統安裝了 ssh 后,默認就安裝了這個服務,我們只要簡單的配置一下就可以了。
但是 SFTP 賬號是基于 SSH 賬號的(也就是系統賬戶),默認情況下訪問服務器的權限很大,下面的教程就是教你像 ftp 那樣限制 SFTP 賬號相關的訪問權限。
必要條件:
你的 openssh-server 版本至少得 4.8p1, 因為配置權限需要版本添加的新配置項 ChrootDirectory 來完成。
如何查看自己服務器上的ssh版本?嘗試以下命令
1
|
$ ssh -V |
具體實施步驟
我們需要創建一個用戶組,專門用于sftp用戶
1
|
$ groupadd sftpusers |
我們創建一個用戶test
1
|
$ useradd -s /bin/false -G sftpusers test |
注意這里我們將test用戶的shell設置為/bin/false使他沒有登陸shell的權限
編輯 /etc/ssh/sshd_config
找到Subsystem這個配置項,將其修改為
1
|
Subsystem sftp internal- sftp |
為什么實用 internal-sftp 而不用默認的 sftp-server,這是因為:
這是一個進程內的 sftp 服務,當用戶 ChrootDirectory 的時候,將不請求任何文件;
更好的性能,不用為 sftp 再開一個進程。
然后再到文件最尾處增加配置設定屬于用戶組sftpusers的用戶都只能訪問他們自己的home文件夾
1
2
3
4
5
6
7
8
9
10
11
12
|
# 匹配用戶組,如果要匹配多個組,多個組之間用逗號分割 Match Group sftpusers # 指定登陸用戶到自己的用戶目錄 ChrootDirectory %h # 指定 sftp 命令 ForceCommand internal- sftp # 這兩行,如果不希望該用戶能使用端口轉發的話就加上,否則刪掉 X11Forwarding no AllowTcpForwarding no |
保存并關閉文件
修改test用戶home文件夾的權限,讓其屬于root用戶
1
|
chown root ~ test |
重啟sshd服務
1
2
3
|
$ service sshd restart # 或 $ systemctl restart sshd |
測試用戶賬號
1
|
$ ssh test @localhost |
連接會被拒絕或者無法登陸
1
|
$ sftp tesst@localhost |
登陸后你會發現你的賬號無法切換到除自己home目錄之外的地方的
常見問題:
如果你鏈接服務器的時候出現下面的提示:
1
2
|
> Write failed: Broken pipe > Couldn't read packet: Connection reset by peer |
這個問題的原因是ChrootDirectory的權限問題,你設定的目錄必須是root用戶所有,否則就會出現問題。所以請確保sftp用戶根目錄的所有人是root, 權限是 750 或者 755。注意以下兩點原則:
- 目錄開始一直往上到系統根目錄為止的目錄擁有者都只能是 root,用戶組可以不是 root。
- 目錄開始一直往上到系統根目錄為止都不可以具有群組寫入權限
配置sublime text3 的 sftp 插件
實用 st3 的包工具搜索安裝 sftp,具體可以參加下面的文章:
sublime text3 安裝、配置sftp插件
1
2
3
4
5
6
7
8
9
|
"upload_on_save" : true , "sync_down_on_open" : true , "host" : "xxx.com" , "user" : "xxx" , "password" : "xxx" , "port" : "22" , "remote_path" : "/xxx/xxx" , |
sftp 的 remote_path 和 ftp 不同,ftp 值得是遠程能看到的目錄和子目錄,sftp 指的是遠程服務器上的目錄路徑如 /home/html。
設置 upload_on_save 為 true,將在你保存的時候自動上傳到服務器。
設置 sync_down_on_open 為 true,將在你打開本地文件編輯的時候,自動下載遠程文件來更新本地。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://segmentfault.com/a/1190000008578734