如何在 Debian 10 中設定 Chroot 環境的 SFTP 服務

2020-05-05 22:36:00

SFTP 意思是“安全檔案傳輸協定Secure File Transfer Protocol” 或 “SSH 檔案傳輸協定SSH File Transfer Protocol”,它是最常用的用於通過 ssh 將檔案從本地系統安全地傳輸到遠端伺服器的方法,反之亦然。sftp 的主要優點是,除 openssh-server 之外,我們不需要安裝任何額外的軟體包,在大多數的 Linux 發行版中,openssh-server 軟體包是預設安裝的一部分。sftp 的另外一個好處是,我們可以允許使用者使用 sftp ,而不允許使用 ssh

當前發布的 Debian 10 代號為 ‘Buster’,在這篇文章中,我們將演示如何在 Debian 10 系統中在 “監獄式的” Chroot 環境中設定 sftp。在這裡,Chroot 監獄式環境意味著,使用者不能超出各自的家目錄,或者使用者不能從各自的家目錄更改目錄。下面實驗的詳細情況:

  • OS = Debian 10
  • IP 地址 = 192.168.56.151

讓我們跳轉到 SFTP 設定步驟,

步驟 1、使用 groupadd 命令給 sftp 建立一個組

開啟終端,使用下面的 groupadd 命令建立一個名為的 sftp_users 組:

root@linuxtechi:~# groupadd sftp_users

步驟 2、新增使用者到組 sftp_users 並設定許可權

假設你想建立新的使用者,並且想新增該使用者到 sftp_users 組中,那麼執行下面的命令,

語法:

#  useradd -m -G sftp_users <使用者名稱>

讓我們假設使用者名稱是 jonathan

root@linuxtechi:~# useradd -m -G sftp_users jonathan

使用下面的 chpasswd 命令設定密碼:

root@linuxtechi:~# echo "jonathan:<輸入密碼>" | chpasswd

假設你想新增現有的使用者到 sftp_users 組中,那麼執行下面的 usermod 命令,讓我們假設已經存在的使用者名稱稱是 chris

root@linuxtechi:~# usermod -G sftp_users chris

現在設定使用者所需的許可權:

root@linuxtechi:~# chown root /home/jonathan /home/chris/

在各使用者的家目錄中都建立一個上傳目錄,並設定正確地所有權:

root@linuxtechi:~# mkdir /home/jonathan/uploadroot@linuxtechi:~# mkdir /home/chris/uploadroot@linuxtechi:~# chown jonathan /home/jonathan/uploadroot@linuxtechi:~# chown chris /home/chris/upload

注意: 像 Jonathan 和 Chris 之類的使用者可以從他們的本地系統上傳檔案和目錄。

步驟 3、編輯 sftp 組態檔 /etc/ssh/sshd_config

正如我們已經陳述的,sftp 操作是通過 ssh 完成的,所以它的組態檔是 /etc/ssh/sshd_config,在做任何更改前,我建議首先備份檔案,然後再編輯該檔案,接下來新增下面的內容:

root@linuxtechi:~# cp /etc/ssh/sshd_config /etc/ssh/sshd_config-orgroot@linuxtechi:~# vim /etc/ssh/sshd_config......#Subsystem      sftp    /usr/lib/openssh/sftp-serverSubsystem       sftp    internal-sftpMatch Group sftp_users  X11Forwarding no  AllowTcpForwarding no  ChrootDirectory %h  ForceCommand internal-sftp......

儲存並退出檔案。

為使上述更改生效,使用下面的 systemctl 命令來重新啟動 ssh 服務:

root@linuxtechi:~# systemctl restart sshd

在上面的 sshd_config 檔案中,我們已經注釋掉了以 Subsystem 開頭的行,並新增了新的條目 Subsystem sftp internal-sftp 和新的行。而

Match Group sftp_users –> 它意味著如果使用者是 sftp_users 組中的一員,那麼將應用下面提到的規則到這個條目。

ChrootDierctory %h –> 它意味著使用者只能在他們自己各自的家目錄中更改目錄,而不能超出他們各自的家目錄。或者換句話說,我們可以說使用者是不允許更改目錄的。他們將在他們的目錄中獲得監獄一樣的環境,並且不能存取其他使用者的目錄和系統的目錄。

ForceCommand internal-sftp –> 它意味著使用者僅被限制到只能使用 sftp 命令。

步驟 4、測試和驗證 sftp

登入到你的 sftp 伺服器的同一個網路上的任何其它的 Linux 系統,然後通過我們放入 sftp_users 組中的使用者來嘗試 ssh 和 sftp 服務。

[root@linuxtechi ~]# ssh root@linuxtechiroot@linuxtechi's password:Write failed: Broken pipe[root@linuxtechi ~]# ssh root@linuxtechiroot@linuxtechi's password:Write failed: Broken pipe[root@linuxtechi ~]#

以上操作證實使用者不允許 ssh ,現在使用下面的命令嘗試 sftp

[root@linuxtechi ~]# sftp root@linuxtechiroot@linuxtechi's password:Connected to 192.168.56.151.sftp> ls -ldrwxr-xr-x    2 root     1001         4096 Sep 14 07:52 debian10-pkgs-rw-r--r--    1 root     1001          155 Sep 14 07:52 devops-actions.txtdrwxr-xr-x    2 1001     1002         4096 Sep 14 08:29 upload

讓我們使用 sftp 的 get 命令來嚐試下載一個檔案:

sftp> get devops-actions.txtFetching /devops-actions.txt to devops-actions.txt/devops-actions.txt                                                                               100%  155     0.2KB/s   00:00sftp>sftp> cd /etcCouldn't stat remote file: No such file or directorysftp> cd /rootCouldn't stat remote file: No such file or directorysftp>

上面的輸出證實我們能從我們的 sftp 伺服器下載檔案到本地機器,除此之外,我們也必須測試使用者不能更改目錄。

讓我們在 upload 目錄下嘗試上傳一個檔案:

sftp> cd upload/sftp> put metricbeat-7.3.1-amd64.debUploading metricbeat-7.3.1-amd64.deb to /upload/metricbeat-7.3.1-amd64.debmetricbeat-7.3.1-amd64.deb                                                                        100%   38MB  38.4MB/s   00:01sftp> ls -l-rw-r--r--    1 1001     1002     40275654 Sep 14 09:18 metricbeat-7.3.1-amd64.debsftp>

這證實我們已經成功地從我們的本地系統上傳一個檔案到 sftp 服務中。

現在使用 winscp 工具來測試 sftp 服務,輸入 sftp 伺服器 IP 地址和使用者的憑證:

在 “Login” 上單擊,然後嘗試下載和上傳檔案:

現在,在 upload 資料夾中嘗試上傳檔案:

上面的視窗證實上傳是完好地工作的,這就是這篇文章的全部。如果這些步驟能幫助你在 Debian 10 中使用 chroot 環境設定 SFTP 伺服器s,那麼請分享你的反饋和評論。