Linux

Chroot SFTP - 允許使用者寫入目前(chroot)目錄

  • February 14, 2022

我目前有一個 WORKING SFTP 登錄,使用私鑰登錄,並且使用者被 chroot 到他們的主目錄。

目標:保留使用者 chroot,但允許對相對 chroot 目錄進行 WRITE 訪問,而無需在任何地方指定任何路徑或 cd。

換句話說,當 sftp 使用者登錄時,我不希望他們必須 cd 到另一個路徑才能上傳文件。

由於 chroot 目錄需要完全的 root 所有權(由於 chroot 設計),我不確定這是否可能。

在 /etc/passwd 中:

sftpuser:x:1006:1006:,,,:/home/sftpuser:/bin/false

使用者登錄公鑰位於:

/home/sftpuser/.ssh/authorized_keys

sshd_confg 中的 Chroot 規則:

Match User sftpuser
   ChrootDirectory /home/sftpuser
   ForceCommand internal-sftp
   AllowTCPForwarding no
   X11Forwarding no

主目錄權限:

# ls -l /home/ |grep sftpuser
drwxr-xr-x 5 root      root     4096 May  4 11:24 sftpuser

# ls -l /home/sftpuser/
total 4
drwxrw-r-x 3 sftpuser sftpuser 4096 May  4 11:23 sftp_share

目前工作流程範例

Connected to sftp.example.com.
sftp> ls
sftp_share

sftp> put testfile.txt
Uploading testfile.txt to /testfile.txt
remote open("/testfile.txt"): Permission denied

sftp> cd sftp_share

sftp> put testfile.txt
Uploading testfile.txt to /sftp_share/testfile.txt
testfile.txt

所需的工作流程:

Connected to sftp.example.com.
sftp> put testfile.txt
Uploading testfile.txt to /testfile.txt
testfile.txt

有沒有辦法允許上傳(放置)到預設目錄,而不必先 chdir?

我確實可以靈活地移動這些目錄。例如,sftp chroot 目錄不必在使用者主目錄中,我什至可以更改使用者主目錄(但使用者仍然必須能夠使用 authorized_keys 登錄)。

**請注意:**我確實了解許多 SFTP 客戶端,命令行 SFTP 客戶端允許在登錄時定義相對路徑。這超出了這個問題的範圍,我希望這個配置在伺服器端完成,客戶端只需要登錄。

嘿@emmdee 我花了很長時間才意識到有一個簡單而不錯的技巧。您只需將 root 設置為您想要 sFTP 的父文件夾的所有者,然後使用 force 命令告訴特定使用者在 CHROOT 目錄中載入特定 DIR。

在您的情況下,如果您想/home/sftpuser成為可寫目錄,您必須讓root成為目錄的所有者,/home然後繼續並強制命令他/sftpuser作為該使用者或組的登錄目錄。

您的/etc/ssh/sshd_conf遺囑如下所示:

Match User sftpuser
   ChrootDirectory /home
   ForceCommand internal-sftp -d /sftpuser
   AllowTCPForwarding no
   X11Forwarding no

完成後,您必須如前所述授予正確的權限,root 應該擁有 parent(chroot) 目錄/home,而使用者應該擁有 final(-d) 目錄/sftpuser。如果沒有,我將假設您有一個名為sftpusers的 sFTP 使用者組;只需從下一個命令中省略該組或將其替換為使用者(第一個是root ,第二個是**sftpusers)。由於我們在命令行中使用 -R 進行繼承,因此您必須在使用者所有權之前從 root 所有權開始,如下所示:

sudo chown -R root:sftpusers /home

然後對於使用者,您可以執行:

sudo chown -R sftpuser:sftpusers /home/sftpuser

我不確定這是否需要,但您始終可以重新啟動 sshd 服務以確保再次重新載入所有設置:

sudo systemctl restart sshd.service

希望這應該像一個魅力一樣起作用,我遇到了類似的問題,並且解決方案大部分時間都在看著我。

乾杯!

引用自:https://serverfault.com/questions/910789