如何在 Ubuntu 24.04 上限制 SSH 使用者只能存取特定目錄(SFTP Chroot 指南)

允許承包商上傳少量檔案不應自動賦予其查看整個伺服器的終端會話權限。在 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 手冊。

分八個階段設定僅支援 SFTP 的目錄隔離區

在遠端修改 SSH 設定之前,請保持現有管理員會話處於開啟狀態,並確保您擁有控制台或恢復存取權限。使用單獨的非特權帳戶進行資料傳輸;不要將您的管理員帳戶新增至受限群組。

1. 驗證 OpenSSH 並保持恢復會話

在伺服器上,如有必要,安裝 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
Ubuntu 終端機顯示 systemctl status ssh 命令和 SSH 服務詳細信息
SSH 服務狀態的終端視圖,可用於在變更存取規則之前檢查 OpenSSH 是否可用。

如果只能透過 SSH 管理機器,請勿在編輯或測試期間關閉目前工作階段。在更改守護程序之前,請先查閱Ubuntu OpenSSH 伺服器設定指南。

2. 建立專用使用者和 SFTP 存取群組

當您預期會有多個受限帳戶時,使用群組非常有用。此範例使用%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命令使得此配置僅供傳輸使用。請在您自己的身份驗證堆疊上測試此組合。

Ubuntu 終端機顯示 adduser 操作正在建立承包商帳戶,並將主路徑設定為 upload。
帳戶建立命令指定了受限制的帳戶以及應用 chroot 後可用的主路徑。

3. 建立一個 root 使用者擁有的 chroot 目錄

很多教學都在這裡出錯。 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;上述指令不會自動修復不安全的父級權限。如果任何元件是群組可寫入或使用者擁有的,請僅在確認其他應用程式是否依賴該元件後,才修正其所有權和模式。

Ubuntu 終端機顯示 root 使用者擁有的 /srv/sftp 和 /srv/sftp/contractor 目錄及其權限
jail 目錄及其父目錄皆以 root 擁有權顯示,這是 OpenSSH 在會話啟動時檢查的條件。

4. 在 jail 內新增一個可寫子目錄

該帳號可以寫入子目錄,但不能變更 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 根目錄,則會被拒絕。

Ubuntu 終端機顯示在 root 使用者擁有的 SFTP jail 下有一個單獨的承包商擁有的上傳資料夾。
受限帳號可以寫入上傳子目錄,而包含該子目錄的 jail 仍然歸 root 所有。

5. 在 sshd_config 新增匹配規則

開啟文件/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為了結束程式碼區塊而不了解其影響,就加入額外的全域指令。

GNU nano 編輯器顯示了帶有 ChrootDirectory 和 ForceCommand 設定匹配群組的 SFTP 規則
條件 OpenSSH 設定區塊將目錄限制和僅限 SFTP 指令組合在一起。

6. 重新加載前檢查語法和有效設置

解析成功並不代表監獄權限正確,也不代表目標帳號與策略相符。必須顯式地執行這兩項檢查。

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 之前修復設定。如果有效值與預期不符,請檢查包含的程式碼片段以及現有條件區塊的順序,而不僅僅是您編輯的最後幾行。

7. 重新載入 SSH 並保留您的管理員存取權限

檢查成功後,重新載入 SSH 服務,以便新連線使用修改後的政策。保持目前管理員連線處於活動狀態,同時開啟第二個終端,確認正常的管理員存取權限仍然有效。

sudo systemctl reload ssh
sudo systemctl status ssh --no-pager
Ubuntu 終端機顯示 SSH 服務控制指令和活動的 SSH 服務狀態
SSH 服務管理視窗顯示了設定變更後檢查服務運作狀況的流程。

完全重啟也可能會套用更改,但如果系統支援且您希望避免不必要的中斷,則最好重新載入。服務命令輸出和日誌訊息因主機而異,因此請檢查實際結果,而不是假設成功返回提示符號就一定能存取系統。

8. 測試允許的傳輸和封鎖的 shell 訪問

從另一台電腦以受限使用者身分連線。使用伺服器的實際主機名稱和一個適當的測試檔案。第一個 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 內建立或暴露此類目錄時才能存取。客戶端錯誤訊息的具體內容並不重要。

SFTP 終端機會話顯示了一個虛擬根目錄、一個上傳資料夾和一個導航嘗試。
SFTP 命令提示字元示範如何瀏覽受限檔案系統,而不是主機檔案系統。
ssh contractor@server.example.com

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

Ubuntu 終端機顯示 SSH 連線嘗試失敗,連線關閉而不是顯示互動式 shell。
終端連線嘗試示範了啟用僅限 SFTP 限制後執行的 shell 存取檢查。

如果使用SSH公鑰呢?

公鑰認證可以配合 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 手冊中所述。

能否將互動式 SSH shell 的存取範圍限制在單一資料夾內?

僅僅更改使用者主目錄或使用上述僅 SFTP 的範例是行不通的。 OpenSSH 也ChrootDirectory可以用於 shell 會話,但 jail 環境必須包含可用的 shell、其共用程式庫、所需的裝置節點以及所有命令相依性。安全地建構這樣的環境並非只需在設定檔中新增一行即可sshd_config。尤其是在涉及任意 shell 命令或掛載點時,很容易創建脆弱或具有誤導性的配置。

如果使用者確實需要互動式命令,首先要明確指定他們需要哪些命令和檔案。對於較小的命令集,可以使用作用域較窄的遠端命令或專用的應用程式端點。對於更廣泛的獨立環境,可以考慮使用容器或虛擬機,並明確地掛載檔案系統、設定權限控制和網路限制。單獨使用 chroot 並不能取代完整的系統隔離,而且 chroot 和 Unix 檔案權限都無法防止特權使用者修改底層系統。

授予存取權限前的安全性檢查清單

  • 轉帳帳戶並非管理員帳戶,僅屬於必要的群組。
  • 通往監獄的每個組件都由 root 使用者擁有,並且不可由群組或所有人寫入。
  • 可寫入上傳位置位於 jail 內部,而非 jail 根目錄本身。
  • 目標用戶匹配ChrootDirectory,,ForceCommand internal-sftp並且在有效配置中禁用了轉發。
  • 真正的 SFTP 上傳成功,但嘗試存取僅主機檔案失敗,並且正常的 SSH shell 存取被封鎖。
  • 備份、保留、配額、監控和帳戶撤銷是單獨管理的;目錄監獄不會自動實施這些策略。

更多技術細節,請參閱Ubuntu 24.04 OpenSSH 設定參考和Ubuntu SFTP 伺服器手冊。這些說明針對的是 Ubuntu 24.04 LTS;軟體包版本和現有的 SSH 程式碼片段可能會改變實際行為,因此最終以您主機上的配置和實際連接測試為準。

留下評論

如何在 Ubuntu 24.04 上限制 SSH 使用者只能存取特定目錄(SFTP Chroot 指南)

如何在 Ubuntu 24.04 上限制 SSH 使用者只能存取特定目錄(SFTP Chroot 指南)

使用 chroot、適當的權限、匹配規則和安全測試,將 Ubuntu 24.04 SSH 帳戶限製到指定的 SFTP 資料夾,而不授予 shell 存取權限。

安全釋放 Ubuntu 的 APT 鎖定並完成更新

安全釋放 Ubuntu 的 APT 鎖定並完成更新

找到擁有 Ubuntu dpkg 前端鎖定的進程,讓軟體包工作完成,並在不刪除鎖定檔案的情況下修復中斷的安裝。

如何在 Ubuntu 桌面系統上設定 Btrfs 自動快照

如何在 Ubuntu 桌面系統上設定 Btrfs 自動快照

使用 Timeshift 在 Ubuntu Desktop 上設定定時 Btrfs 系統快照,驗證 Ubuntu 子磁碟區佈局,選擇保留策略,並了解快照無法保護的內容。

如何在不破壞依賴關係的情況下將 Debian 12 遷移到 Testing 版本

如何在不破壞依賴關係的情況下將 Debian 12 遷移到 Testing 版本

規劃更安全的 Debian 12 到 Testing 遷移:透過 Stable 版本升級,備份,清理 APT 來源,模擬依賴項更改,並驗證更改的內容。

Ubuntu 伺服器啟動進入緊急模式:逐步救援指南

Ubuntu 伺服器啟動進入緊急模式:逐步救援指南

安全地診斷 Ubuntu 伺服器緊急模式。讀取啟動日誌,檢查根目錄和 fstab 掛載點,修復故障單元,處理檔案系統錯誤,並驗證是否乾淨重新啟動。

如何在 Debian 12 設定 WireGuard 點對點 VPN

如何在 Debian 12 設定 WireGuard 點對點 VPN

為一個遠端客戶端設定 Debian 12 WireGuard VPN 伺服器。設定金鑰、IPv4 轉送、nftables NAT、防火牆存取和連線檢查。

Debian 12 逐步加固指南,以符合 CIS 標準

Debian 12 逐步加固指南,以符合 CIS 標準

使用精心設計的 CIS 基準測試工作流程來強化 Debian 12 工作站:選擇正確的設定檔、安全地修補程式、檢查服務和存取權限、設定 nftables 並記錄證據。

在低記憶體VPS上運行Debian 12:如何減少MySQL記憶體不足崩潰

在低記憶體VPS上運行Debian 12:如何減少MySQL記憶體不足崩潰

診斷 Debian 12 上的 MySQL OOM 崩潰問題,檢查 VPS 記憶體限制,配置交換空間,並調整資料庫記憶體和並發性,但不保證提供通用的解決方案。

如何建構基於 OSTree 的不可變系統的 Debian 桌面

如何建構基於 OSTree 的不可變系統的 Debian 桌面

學習如何在虛擬機器中建立和測試基於 Debian 的 OSTree 桌面,包括系統樹準備、啟動整合、部署檢查和回滾。

How to Mount a Remote SSHFS Directory Automatically at Boot in Debian

How to Mount a Remote SSHFS Directory Automatically at Boot in Debian

Configure an SSHFS boot mount in Debian with SSH keys, fstab, and systemd automount. Includes reboot checks, permissions, timeouts, and troubleshooting.