一種設置“已入獄”的僅限 SFTP 帳戶的簡單分步方法
我覺得我已經瀏覽了 Internet 上的所有 SFTP/Chroot 教程,但沒有找到我想要的東西(或者,至少沒有一個產生正確的結果)。這是我的具體情況:
- 我將通過腳本創建很多個人使用者帳戶。因此,任何需要我逐個使用者非常精細地手動編輯文件的解決方案都不是一個好的解決方案。
- 這些使用者中的每一個都將在文件夾 /var/www/html/USER 中獲得一個目錄,其中 USER 是他們的使用者名。他們應該對該目錄具有完全的寫訪問權限,並且能夠創建和編輯子目錄,但他們應該完全被鎖定在文件樹上更高的任何目錄之外(他們應該不能列出,更不用說編輯了, /var/www/html/ 或 /var/www/ 或 /var/ 等)
就是這樣。看起來很簡單,對吧?然而,我看到的大多數範例都是關於將所有 SFTP 使用者鎖定在一個共享目錄中,或者要求您將使用者“監禁”到他們的 /home/USER 目錄(這不適用於 Web 服務)。我不想要那個。
我在 Ubuntu 16.04 上,在一個新的 AWS EC-2 實例上執行此操作。
我嘗試過的兩種方法都是徒勞的:
- 將使用者的 HOME 設置為 /var/www/html/USER,Chroot 將他們囚禁到 HOME。無論出於何種原因,這似乎都不起作用——它導致 SFTP 拒絕連接。
- 為使用者設置一個標準的 HOME 目錄(例如使用 adduser),創建使用者的 web 目錄,Chroot 將他們監禁到 web 目錄。儘管嘗試了幾天,但我還是沒能成功——SFTP 帳戶最終仍會進入 HOME 目錄,這通常意味著它們會被 Chroot 監獄拒絕。
最終發生的事情要麼是使用者有太多的自由,要麼他們被完全鎖定。我從來沒有設法讓它進入使用者只能看到正確的目錄並且能夠編輯它的情況。我已經嘗試了該目錄上的所有 chown 設置(例如,user:user、user:sftp、root:root)和權限設置,但似乎效果為零。我在這裡遺漏了一些明顯或深刻的東西。
一些附加的細節——這是我的嘗試之一。
以下是 /etc/ssh/sshd_config 的相關部分:
Subsystem sftp internal-sftp Match Group sftp ChrootDirectory %h X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp
這與大多數指南所說的你應該做的相符。
我創建了一個新使用者:
adduser --disabled-password -gecos "" --ingroup sftp --shell /usr/sbin/nologin --home /var/www/html/testuser testuser
其中說:
Adding user `testuser' ... Adding new user `testuser' (1001) with group `sftp' ... Creating home directory `/var/www/html/testuser' ... Copying files from `/etc/skel' ...
然後我用 passwd 給他們一個密碼。
然後我嘗試登錄:
sftp testuser@myserver testuser@myserver's password: packet_write_wait: Connection to myserver_ip: Broken pipe Connection closed
這似乎是由於 Chroot jail 設置,與任何其他明顯的伺服器設置無關。如果我註釋掉 ChrootDirectory,它可以正常連接:
sftp testuser@myserver testuser@myserver's password: Connected to myserver. sftp> pwd Remote working directory: /var/www/html/testuser
但是我這樣做了,sftp 使用者可以退出他們的目錄並在伺服器上四處遊蕩,隨心所欲。不好!
我也試過設置
ChrootDirectory /var/www/html/%u
它不會改變我能看到的任何東西(與以前相同的“斷管”錯誤)。(是的,我每次進行更改時都會重新啟動 ssh 伺服器。)
這些是使用者文件夾的目前設置:
drwxr-xr-x 4 testuser sftp 4096 Aug 29 15:00 testuser
一些說明說要讓 Chroot 工作,你需要
chown root:root /var/www/html/testuser
但是我仍然收到 ChrootDirectory 集的“Broken pipe”錯誤。將權限更改為 777 也不會改變這一點。(/var/www/html 由 root:root 擁有,/var/www/ 和 /var/ 也是如此)
我用 /etc/ssh/sshd_config 嘗試過的其他事情:
- 將其更改為 Subsystem sftp /usr/lib/openssh/sftp-server 並註釋掉 ForceCommand internal-sftp (沒有可察覺的變化)
- 註釋掉 UsePAM 是(有人報告這有幫助,但它只會讓 sftp 伺服器立即拒絕所有連接——“被遠端主機關閉”)
好的,我終於讓它工作了。有幾件事我做錯了,顯然我一次又一次地嘗試做錯了一些設置,所以我只是沖洗實例並從頭開始。
主要問題似乎是您不能使 Chroot 的目錄成為可寫目錄。所以它不能是您的主要網路目錄。我一直在想這一切都錯了,試圖讓使用者帳戶脫離我的主要 Apache 目錄。這是不對的——你所做的是在標準使用者目錄(/home/jimmy)中創建使用者帳戶,在該目錄中創建一個 www(或 public_html 或其他)文件夾,創建使用者目錄本身(在這種情況下,/ home/jimmy/) 由 root 擁有,並使可寫目錄 (/home/jimmy/www) 由 jimmy 和 Chrooted 組擁有(例如,上面範例中的“sftp”)。然後將 ChrootDirectory 設置為 %h(在本例中為 /home/jimmy)。Jimmy 將無法在 /home/jimmy/ 目錄中執行任何操作,但他可以將文件放入 /home/jimmy/www。為了使其可用,然後設置Apache 中的 userdir 並告訴它使用那些 www 文件夾作為使用者文件夾。
現在它起作用了!