如何在 Ubuntu 24.04 上限制 SSH 使用者只能存取特定目錄(SFTP Chroot 指南)
使用 chroot、適當的權限、匹配規則和安全測試,將 Ubuntu 24.04 SSH 帳戶限製到指定的 SFTP 資料夾,而不授予 shell 存取權限。
允許承包商上傳少量檔案不應自動賦予其查看整個伺服器的終端會話權限。在 Ubuntu 24.04 LTS 上,OpenSSH 可以使用ChrootDirectory規則和內建internal-sftp伺服器將檔案傳輸帳戶限制在選定的目錄中。需要注意的是,這是一種僅適用於 SFTP 的限制,而不是提供一個功能齊全但權限受限的 Bash shell 的簡單方法。
本指南解釋了這些設定實際保護的內容,然後逐步示範了可逆的八步驟設定流程,適用於多個帳戶,每個帳戶都有自己的目錄。命令中使用了名為 `<account_name>` 的範例帳戶contractor和名為 `<host_name>` 的範例主機server.example.com;請將它們替換為您自己的值。這些是配置範例,並非來自實際伺服器測試的結果。
有三種控制機制常被混淆。 Linux 權限決定了帳戶可以讀取或修改哪些檔案;更改帳戶的主目錄設定了初始位置;chroot 則更改了進程所處的檔案系統根目錄。它們不能互換使用。
| 目標 | 合適的起點 | 重要限制 |
|---|---|---|
| 只能在指定資料夾內上傳下載 | ChrootDirectory和ForceCommand internal-sftp | 不提供互動式 Linux shell |
| 允許使用 shell,但控制讀寫操作。 | Unix 所有權、群組、存取控制清單 (ACL) 和最小權限原則 | 普通的 shell 使用者仍然可以存取其他可讀路徑。 |
| 提供一個隔離的命令列環境 | 精心建置的 chroot 環境或具有獨立安全控制的容器/虛擬機 | 需要進行更多設定和隔離審查 |
誤解:將主目錄設為/home/contractor某個特定目錄會將使用者限制在該目錄中。事實並非如此。普通的 shell 使用者可以存取檔案系統中任何其他可存取的目錄。如果實際需求是檔案交換,請選擇下文提到的僅使用 SFTP 的方案,而不是嘗試使用 shell 提示字元隱藏目錄。
OpenSSH 文檔ChrootDirectory,Match以及ForceCommand官方的Ubuntu 24.04 sshd_config 手冊。
在遠端修改 SSH 設定之前,請保持現有管理員會話處於開啟狀態,並確保您擁有控制台或恢復存取權限。使用單獨的非特權帳戶進行資料傳輸;不要將您的管理員帳戶新增至受限群組。
在伺服器上,如有必要,安裝 OpenSSH,檢查服務,並儲存主配置。 Ubuntu 官方伺服器文件支援這些服務和配置路徑。
sudo apt update
sudo apt install openssh-server
sudo systemctl status ssh
sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.pre-sftp

如果只能透過 SSH 管理機器,請勿在編輯或測試期間關閉目前工作階段。在更改守護程序之前,請先查閱Ubuntu OpenSSH 伺服器設定指南。
當您預期會有多個受限帳戶時,使用群組非常有用。此範例使用%u令牌為每個成員建立一個獨立的 chroot 環境,OpenSSH 會將該令牌展開為連線使用者名稱。/upload主路徑應位於未來的 chroot 環境內,因此請勿建立主機層級的/upload目錄。
sudo groupadd sftpclients
sudo adduser --home /upload --no-create-home --shell /usr/sbin/nologin contractor
sudo usermod -aG sftpclients contractor
id contractor
流程adduser可能會要求您設定密碼。在停用 SSH 密碼認證的系統中,請建立並授權公鑰;不要為了模仿範例而全域啟用密碼登入。 shellnologin是另一項安全措施,但強制執行的internal-sftp命令使得此配置僅供傳輸使用。請在您自己的身份驗證堆疊上測試此組合。

很多教學都在這裡出錯。 OpenSSH 要求chroot 路徑的每個組成部分都必須由 root 使用者擁有,且其他使用者或群組都不能寫入。切勿將 jail 根目錄本身設定為對 SFTP 帳戶可寫入。
sudo install -d -o root -g root -m 0755 /srv/sftp
sudo install -d -o root -g root -m 0755 /srv/sftp/contractor
namei -l /srv/sftp/contractor
同時檢查現有/元件/srv;上述指令不會自動修復不安全的父級權限。如果任何元件是群組可寫入或使用者擁有的,請僅在確認其他應用程式是否依賴該元件後,才修正其所有權和模式。

該帳號可以寫入子目錄,但不能變更 chroot 根目錄。/srv/sftp/contractor/upload為帳戶的實際檔案建立目錄;在 SFTP 內部,這將顯示為/upload.
sudo install -d -o contractor -g contractor -m 0750 /srv/sftp/contractor/upload
sudo stat -c '%U:%G %a %n' /srv/sftp/contractor /srv/sftp/contractor/upload
預期的所有權有意有所不同:root:root一個是 jail 根目錄,另一個contractor:contractor是可寫入的上傳資料夾。避免這樣做chmod 777,因為這會引入不必要的風險,並且如果應用於 jail 根目錄,則會被拒絕。

開啟文件/etc/ssh/sshd_config,並在末尾(所有現有指令和Match程式碼區塊之後)添加以下程式碼區塊。使用文字編輯器,例如 phpMyCompletesudoedit或 phpMyComplete sudo nano。Match請先檢查現有規則:如果多個符合的程式碼區塊分配了相同的關鍵字,OpenSSH 將使用第一個適用的實例。 Ubuntu 也會處理/etc/ssh/sshd_config.d/早期版本的 .ts/config/config/ config 下的檔案Include;其中的規則可能會影響優先權。
Match Group sftpclients
ChrootDirectory /srv/sftp/%u
ForceCommand internal-sftp -d /upload
PermitTTY no
DisableForwarding yes
Match Group目標物件為sftpclients.ChrootDirectory將每個使用者置於 . 下/srv/sftp/USERNAME.ForceCommand internal-sftp -d /upload運行進程內 SFTP 服務,並在可寫入目錄中啟動 .PermitTTY no阻止終端分配,同時DisableForwarding yes停用匹配連接的 SSH 轉發功能。
除非有特殊原因需要更改,否則請保留 Ubuntu 已提供的全域Subsystem sftp指令;強制執行的內部 SFTP 指令不需要取代該全域指令。不要Match All為了結束程式碼區塊而不了解其影響,就加入額外的全域指令。

解析成功並不代表監獄權限正確,也不代表目標帳號與策略相符。必須顯式地執行這兩項檢查。
sudo /usr/sbin/sshd -t
sudo /usr/sbin/sshd -T -C user=contractor,host=localhost,addr=192.0.2.10 | grep -E '^(chrootdirectory|forcecommand|permittty|disableforwarding) '
namei -l /srv/sftp/contractor
有效的配置應明確指定所需的 chroot 路徑、強制執行的 SFTP 命令、禁用的 TTY 分配以及轉送限制。範例位址192.0.2.10僅供參考;如果您有與位址相關的Match規則,請替換為實際的用戶端來源位址。此-T -C設定格式的詳細說明請參閱Ubuntu 24.04 sshd 手冊。
如果驗證失敗,請在重新載入 SSH 之前修復設定。如果有效值與預期不符,請檢查包含的程式碼片段以及現有條件區塊的順序,而不僅僅是您編輯的最後幾行。
檢查成功後,重新載入 SSH 服務,以便新連線使用修改後的政策。保持目前管理員連線處於活動狀態,同時開啟第二個終端,確認正常的管理員存取權限仍然有效。
sudo systemctl reload ssh
sudo systemctl status ssh --no-pager

完全重啟也可能會套用更改,但如果系統支援且您希望避免不必要的中斷,則最好重新載入。服務命令輸出和日誌訊息因主機而異,因此請檢查實際結果,而不是假設成功返回提示符號就一定能存取系統。
從另一台電腦以受限使用者身分連線。使用伺服器的實際主機名稱和一個適當的測試檔案。第一個 SFTP 目錄應該是 `<hostname>` /upload,而 chroot 根目錄應該顯示為/`<hostname>` 而不是主機路徑/srv/sftp/contractor。
sftp contractor@server.example.com
sftp> pwd
sftp> cd /
sftp> ls
sftp> cd /upload
sftp> put sample.txt
sftp> cd /etc
sftp> exit
應該允許上傳無害的測試文件/upload。存取主機的實際根目錄/etc應該是不可能的:chroot 定義了一個不同的根目錄,/etc只有當您故意在 jail 內建立或暴露此類目錄時才能存取。客戶端錯誤訊息的具體內容並不重要。

ssh contractor@server.example.com
此帳戶不得開啟常規互動式 SSH shell。連線可能會關閉或顯示與協定相關的訊息;請勿依賴確切的短語。如果 shell 已打開,請將設定視為不安全,並在使用該帳戶之前重新檢查群組成員關係、優先Match順序和有效sshd -T -C輸出。

公鑰認證可以配合 SFTP jail 使用,但如果將使用者的主機級主目錄放在 `/usr/local/bin`,則/upload預設~/.ssh/authorized_keys路徑可能在 jail 外部不存在。一個實用的替代方案是讓 SSH 在啟動 chroot 之前讀取一個由 root 使用者控制的金鑰檔案。如果您選擇集中式金鑰存儲,請在同一Match Group sftpclients程式碼區塊中新增以下程式碼:
AuthorizedKeysFile /etc/ssh/authorized_keys/%u
然後建立/etc/ssh/authorized_keys/contractor一個包含承包商授權公鑰的文件,該文件具有 root 所有權,但沒有群組或全域寫入權限。例如,在將名為 `<public-key-file_name>` 的已檢查公鑰檔案安全地複製contractor.pub到管理暫存目錄之後:
sudo install -d -o root -g root -m 0755 /etc/ssh/authorized_keys
sudo install -o root -g root -m 0644 contractor.pub /etc/ssh/authorized_keys/contractor
sudo /usr/sbin/sshd -t
請勿將私鑰複製到伺服器上。金鑰路徑設定、驗證預設值和帳戶檢查取決於您現有的 SSH 策略;在停用已生效的驗證方法之前,請先驗證公鑰存取權。
| 症狀 | 最可能的原因 | 下一步檢查 |
|---|---|---|
| SFTP 驗證後立即斷開連接 | chroot 路徑的某個組成部分可寫入或不屬於 root 使用者;或者,所需的起始目錄缺失。 | 運行namei -l /srv/sftp/contractor、檢查/upload和查看服務日誌 |
| 用戶已連線但無法上傳 | 可寫子目錄的擁有者或權限錯誤 | 檢查stat上傳子目錄的輸出;不要將 jail 根目錄的所有權變更為使用者所有權。 |
| SSH shell 仍然打開 | 群組不符或先前適用的 SSH 規則 | id contractor跑sshd -T -C |
| 公鑰登入被拒絕 | 授權金鑰檔案不在設定路徑中,或者其權限驗證失敗。 | 檢查AuthorizedKeysFile金鑰放置位置、檔案擁有權和 SSH 日誌 |
| 較舊的SCP客戶端失敗 | 它需要使用傳統的 SCP 協議,而這需要遠端 shell。 | 請使用 SFTP 或支援 SFTP 的 SCP 用戶端,而不是scp -O |
使用以下命令檢查日誌sudo journalctl -u ssh -n 80 --no-pager。具體錯誤取決於 PAM 設定、SSH 配置、檔案系統存取和身份驗證方法。 OpenSSH 9.0 及更高版本scp預設使用 SFTP 進行標準傳輸,而傳統模式則需要 shell,如Ubuntu 24.04 scp 手冊中所述。
僅僅更改使用者主目錄或使用上述僅 SFTP 的範例是行不通的。 OpenSSH 也ChrootDirectory可以用於 shell 會話,但 jail 環境必須包含可用的 shell、其共用程式庫、所需的裝置節點以及所有命令相依性。安全地建構這樣的環境並非只需在設定檔中新增一行即可sshd_config。尤其是在涉及任意 shell 命令或掛載點時,很容易創建脆弱或具有誤導性的配置。
如果使用者確實需要互動式命令,首先要明確指定他們需要哪些命令和檔案。對於較小的命令集,可以使用作用域較窄的遠端命令或專用的應用程式端點。對於更廣泛的獨立環境,可以考慮使用容器或虛擬機,並明確地掛載檔案系統、設定權限控制和網路限制。單獨使用 chroot 並不能取代完整的系統隔離,而且 chroot 和 Unix 檔案權限都無法防止特權使用者修改底層系統。
ChrootDirectory,,ForceCommand internal-sftp並且在有效配置中禁用了轉發。更多技術細節,請參閱Ubuntu 24.04 OpenSSH 設定參考和Ubuntu SFTP 伺服器手冊。這些說明針對的是 Ubuntu 24.04 LTS;軟體包版本和現有的 SSH 程式碼片段可能會改變實際行為,因此最終以您主機上的配置和實際連接測試為準。
使用 chroot、適當的權限、匹配規則和安全測試,將 Ubuntu 24.04 SSH 帳戶限製到指定的 SFTP 資料夾,而不授予 shell 存取權限。
找到擁有 Ubuntu dpkg 前端鎖定的進程,讓軟體包工作完成,並在不刪除鎖定檔案的情況下修復中斷的安裝。
使用 Timeshift 在 Ubuntu Desktop 上設定定時 Btrfs 系統快照,驗證 Ubuntu 子磁碟區佈局,選擇保留策略,並了解快照無法保護的內容。
規劃更安全的 Debian 12 到 Testing 遷移:透過 Stable 版本升級,備份,清理 APT 來源,模擬依賴項更改,並驗證更改的內容。
安全地診斷 Ubuntu 伺服器緊急模式。讀取啟動日誌,檢查根目錄和 fstab 掛載點,修復故障單元,處理檔案系統錯誤,並驗證是否乾淨重新啟動。
為一個遠端客戶端設定 Debian 12 WireGuard VPN 伺服器。設定金鑰、IPv4 轉送、nftables NAT、防火牆存取和連線檢查。
使用精心設計的 CIS 基準測試工作流程來強化 Debian 12 工作站:選擇正確的設定檔、安全地修補程式、檢查服務和存取權限、設定 nftables 並記錄證據。
診斷 Debian 12 上的 MySQL OOM 崩潰問題,檢查 VPS 記憶體限制,配置交換空間,並調整資料庫記憶體和並發性,但不保證提供通用的解決方案。
學習如何在虛擬機器中建立和測試基於 Debian 的 OSTree 桌面,包括系統樹準備、啟動整合、部署檢查和回滾。
Configure an SSHFS boot mount in Debian with SSH keys, fstab, and systemd automount. Includes reboot checks, permissions, timeouts, and troubleshooting.