Skip to content

antony@notes:~/suse$ cat "Setup-SSH-File-Transfer-Protocol-on-SLES-12.md"

Setup SSH File Transfer Protocol on SLES 12

2024-05-27· suse

Setup SSH File Transfer Protocol on SLES 12

1. 確認 SFTP 是否已啟用

$ cat /etc/ssh/sshd_config | grep 'sftp-server'
Subsystem       sftp    /usr/lib/ssh/sftp-server

SFTP server function 預設會啟用, 如果沒有的話,新增

Subsystem sftp /usr/lib/ssh/sftp-server

/etc/ssh/sshd_config 中。

2. 測試上傳和下載檔案

# 1. 連線到 Clinet 主機
$ ssh rancher@192.168.11.29

# 2. 登入 SFTP Server
$ sftp root@192.168.11.32
Password:
Connected to 192.168.11.32.
sftp>

# 3. 顯示在 SFTP Server 上當前所在的目錄
sftp> pwd
Remote working directory: /root

# 4. 顯示在本地機器上當前所在的目錄
sftp> !pwd
/home/rancher

# 5. 顯示 FTP Server 上目前目錄中的文件
sftp> ls -l
drwxr-xr-x    1 root     root          226 Apr 26 11:29 Desktop
...

# 6. 顯示本地機器上目前目錄下的文件
sftp> !ls -l
total 51648
drwxr-xr-x 1 rancher users        0 Mar 15  2022 bin
...

# 7. 切換在 SFTP Server 上的工作目錄
sftp> cd Desktop/
sftp> pwd
Remote working directory: /root/Desktop

# 8. 把檔案上傳到 SFTP Server 德 /root/Desktop 目錄底下
sftp> put haha
Uploading haha to /root/Desktop/haha
haha                                                                                 100%    0     0.0KB/s   00:00

# 9. 從 SFTP Server 下載檔案
sftp> get haha
Fetching /root/Desktop/haha to haha
sftp> !ls -l haha
-rw-r--r-- 1 rancher users 0 May 27 10:21 haha

# 10. 在 SFTP Server 上建立目錄
sftp> mkdir test
sftp> ls -l
...
drwxr-xr-x    1 root     root            0 May 27 10:23 test

# 11. 在 SFTP Server 上刪除空目錄
sftp> rmdir test
sftp> ls -l

# 12. 在 SFTP Server 上刪除檔案
sftp> rm haha
Removing /root/Desktop/haha

# 13. 在本地執行命令
sftp> !touch hehe
sftp> !ls -l hehe
-rw-r--r-- 1 rancher users 0 May 27 10:30 hehe

3. Test internal-sftp

internal-sftp 是一個設定關鍵字,它告訴 OpenSSH sshd 使用內建於 sshd 二進位檔案中的程序內 SFTP Server。 這表示 sshd 無需執行外部程序(如 sftp-server)來處理 SFTP 請求。 相反,它會使用自己的程式碼來處理。

使用 internal-sftp 相較於 sftp-server 有一些優點。首先是簡單性。我們不需要安裝或維護一個獨立的 sftp-server 程式。然而,這是以靈活性為代價的。internal-sftp 不允許自訂或細緻地控制 SFTP 的行為或參數。

要在 sshd_config 設定檔中配置 internal-sftp,我們使用 Subsystem 指令並加上 internal-sftp 關鍵字:

Subsystem sftp internal-sftp

我們也可以使用關鍵字 internal-sftp 的 ForceCommand 指令,強制所有 SSH 連線使用 SFTP。

3.1. 功能上與 SFTP 有什麼不同?

internal-sftp 和 sftp-server 在功能上幾乎是相同的。它們都實現了相同的協議並支持相同的功能。它們也都是從相同的源碼構建的,因此應該具有一致性和可靠性。

然而,它們之間有一些小的差異可能會影響某些特殊情況。例如,internal-sftp 完全不涉及登入 shell,而 sftp-server 會。這意味著 internal-sftp 會繞過任何 shell 配置或對某些使用者的限制,例如:

  • aliases
  • environment variables
  • login scripts

儘管 internal-sftp 支持與 sftp-server 相同的選項,但 internal-sftp 在較舊版本的 OpenSSH 中可能不支持某些功能。因此,當與依賴於較舊 SSH 版本的系統互動時,sftp-server 可能會是更好的選擇。

3.2. Security

在選擇 internal-sftp 和 sftp-server 時,安全性是另一個重要的考量因素。這兩個子系統都通過 SSH 協議提供加密、認證和完整性功能。

然而,internal-sftp 可以與 ChrootDirectory 指令一起使用。這讓我們可以把 SFTP 使用者限制在伺服器上的特定目錄中。這樣增強了使用者的安全性和隔離性,因為他們無法訪問或修改 chroot 目錄外的任何檔案。

此外,internal-sftp 不需要任何外部檔案或可執行檔來運作。這降低了攻擊面和被入侵的風險。例如,如果攻擊者獲得了 sftp-server 的可執行檔或修改了它,他們可能會在伺服器上執行任意代碼或命令。這個可執行檔也可能存在漏洞或錯誤,進而危害系統安全。

值得注意的是,sftp-server 支持將 SFTP 活動記錄到檔案或 syslog 中,以便進行稽核和監控。這有助於偵測或防止未授權或惡意的行為。

3.3. Use Cases and Recommendations

根據需求和偏好,internal-sftp 或 sftp-server 可能更適合不同的情境:

  • internal-sftp 建議用於安全性和隔離性很重要的情況,例如將使用者 chroot 到特定目錄。例如,一家網頁代管公司可能會使用 internal-sftp 來為其客戶提供安全的文件傳輸服務。他們會將每個客戶 chroot 到自己的網站目錄,並限制他們對伺服器上其他檔案或目錄的訪問。
  • sftp-server 適合需要高級功能或自訂的複雜且靈活的 SFTP 設置。它也是在兼容性很重要的情況下的首選,包括支持更多 SFTP 功能或擴展,或處理大規模部署或高流量環境。

3.4. 實作測試 internal-sftp 只允許特定群組使用

# 1. 修改 SSHD 設定檔
$ nano /etc/ssh/sshd_config
...
#Subsystem      sftp    /usr/lib/ssh/sftp-server       ## 註解這行
## 新增以下 4 行字串
Match Group root,psftp
        ChrootDirectory %h
        ForceCommand internal-sftp -f AUTH -l INFO
Match

# 2. 重啟 SSHD 服務
$