我已經在 CentOS 上設定了 SFTP 伺服器,如下所示這個文檔。我的目的是禁止屬於該群組的新使用者( user1
、user2
)的控制台登錄sftpusers
,但仍可登入各自的sftp
資料夾。
另外,我想使用 CentOS 用戶使用的相同金鑰(可以毫無問題地登入控制台sftp
)。為此,我將.ssh
資料夾從 CentOS 使用者複製到user1
和user2
home 資料夾,更改使用者、700
資料.ssh
夾和檔案600
的所有權authorized_keys
。
儘管如此,我還是不斷收到訊息Server refused our key
。 CentOS 用戶使用的金鑰就像所有伺服器中的主金鑰一樣,這就是為什麼我想為新用戶重複使用該金鑰。
我怎麼才能實現這個配置?
更新
為每個使用者產生金鑰後,兩個使用者都可以使用其私鑰遠端存取伺服器,但是當我啟動/etc/ssh/sshd_config
權限中的以下配置時,使用該sftp
命令會被拒絕。
固態硬碟配置
Match Group sftpusers #Or you could replace Group with User and specify a different configuration for each user
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
ChrootDirectory /path/to/shared_folder/%u # %h the path to upload the files
ForceCommand internal-sftp
來自 shell 的訊息
packet_write_wait: Connection to IPSERVER port 22: Broken pipe
Couldn't read packet: Connection reset by peer
答案1
更新引入了與原始問題不同的問題。看來原來的問題已經不再是問題了。我正在解決更新問題。
這手動的內容如下:
ChrootDirectory
chroot(2)
指定身份驗證後的 目錄路徑名。在會話啟動時,sshd(8)
檢查路徑名的所有組成部分是否為 root 擁有的目錄,任何其他使用者或群組都無法寫入這些目錄。
我的測試表明,如果不滿足此條件,那麼Broken pipe
在嘗試使用sftp
.
在你的情況下,路徑名是/path/to/shared_folder/%u
.注意%u
(擴展後)是也一個組件;因此它應該是「root 擁有的並且不能被任何其他使用者或群組寫入」。您應該修復所有權和權限。那麼,顯然,用戶將無法寫入該目錄。無論您使用什麼路徑名ChrootDirectory
,使用者都將無法寫入它(除非使用者是 root)。換句話說,使用者將無法/
在 chroot 環境中進行寫入。為了允許寫入,您需要一個子目錄。解決這個問題的方法很少。
使用公用 chroot 目錄中的主目錄。
手冊也指出:
之後
chroot
,sshd(8)
將工作目錄變更為使用者的主目錄。我假設預設情況下主目錄類似於
/home/user1
等/home/user2
。這表示以下情況:將伺服器設定為 chroot 到
/path/to/shared_folder
(否%u
):ChrootDirectory /path/to/shared_folder
在那裡複製相關的目錄結構(
/path/to/shared_folder/home/user1
等等)。path
滿足、to
和的條件shared_folder
。- 使所有權和權限
home
與常規/home
. - 使內部目錄的所有權和權限
home
與/home
.
透過此設置,
sftp
將在身份驗證後自動放置user1
,/path/to/shared_folder/home/user1
但他們會將其視為/home/user1
由於chroot
.在公用 chroot 目錄中使用自訂目錄。
ForceCommand internal-sftp
您可以指定起始目錄(internal-sftp
支援與sftp-server
)。像這樣:ChrootDirectory /path/to/shared_folder ForceCommand internal-sftp -d /home/%u
以確保
sftp
使用者將使用/path/to/shared_folder/home/…
作業系統中的正式主目錄。或者像這樣:ChrootDirectory /path/to/shared_folder ForceCommand internal-sftp -d /%u
簡化路徑並擺脫
home
中間的這個。這樣在使用 登入後user1
就會看到他們在。在這種情況下應直接包含使用者資料夾(而不是)。/user1
sftp
shared_folder
home
使用特定於使用者的 chroot 目錄中的至少一個子目錄。
上述解決方案允許使用者瀏覽彼此的目錄。使用者將能夠對其
chmod
文件(sftp
支援chmod
)授予或拒絕存取權限。您使用
%u
了ChrootDirectory
,因此您很可能想要建立單獨的 chroot 目錄。在這種情況下,請執行您所做的操作:ChrootDirectory /path/to/shared_folder/%u
並設定每個組件(包括擴展的組件)的所有權和權限
%u
以滿足條件。除非涉及唯讀訪問,否則您至少需要一個使用者可寫入的子目錄。幾種可能性:- 複製作業系統中定義的使用者主目錄的路徑;
- 強迫
/home/%u
與ForceCommand internal-sftp -d /home/%u
; - 強迫
/%u
與ForceCommand internal-sftp -d /%u
; - 使用固定的子目錄名稱,例如
ForceCommand internal-sftp -d /files
.
在每種情況下,您都需要準備內部的目錄結構
/path/to/shared_folder
。例如,如果您想強制/home/user1
foruser1
,相關路徑將是:/path/to/shared_folder/user1/home/user1
其中
path
、to
、shared_folder
和(第一個)user1
滿足條件,home
進行模擬/home
,並且(第二個)user1
可由使用者寫入。
更靈活的方法是可能的。例如,您可以為user1
和擁有一個共同的 chroot 目錄user2
,但為user3
.
Chroot 目錄是否常見,我個人會以最不令人驚訝的方式建立子目錄,這樣任何使用者都會發現自己位於他們期望的目錄中。pwd
輸入後,sftp
他們應該會看到類似的內容/home/user1
。我發現其他可能性 ( /user1
, /files
) 有點令人驚訝。