2010年1月15日

把 SFTP 關起來 (CHROOTED)

前言

為了提供少量的檔案共享但又不願意特地去設定 FTP 服務的話,通常第一個想到的會是附屬在 SSH 服務下的 SFTP 傳輸模式,事實上 SFTP 這個服務雖然因為加密的關係會導致傳輸時間略長,但卻一直是格揆我作為檔案傳輸的唯一方式。但這方式雖方便卻有個大問題:登入的使用者可以看到所有的檔案目錄甚至直接下載檔案內容。這在多人使用的環境下顯然會有資安上面的困擾,有沒有辦法把 SFTP 服務關在某個指定的目錄下呢?

格揆經由 Google 大神的協助並多方測試後終於實作出可行方案,就... 再貢獻回給大神吧... XD

設定步驟

※ 本文以 OpenSSH 5.2_p1-r3 為設定環境!

  1. 選定封鎖目錄:如果對像是單一個人時即為該用戶登入 SFTP 時的根目錄;如果對像是一個群組時則該目錄為這群使用者目錄的根目錄。
  2. 在 /etc/ssh/sshd_config 中啟用 sftp subsystem:特別注意要啟用的是 internal-sftp 這個 Subsystem。
    # override default of no subsystems
    #Subsystem      sftp    /usr/lib64/misc/sftp-server               # 系統中原來的設定
    Subsystem       sftp    internal-sftp                                       # 改用 internal-sftp 
    
  3. 一樣在 sshd_config 中指定需要被關起來的使用者資訊及要關到什麼地方去,請在前述修改處之後加上以下設定:
    Match User ada                                 # 要被關起來的使用者,如果是群組的話則將 User 改為 Group 再接群組名稱
                                                              # 例如: Match Group rootedSFTP
    ChrootDirectory /chroot                    # 要關在什麼地方,如果對像是個群組且群組內的每個人有個別目錄設定時,
                                                              # 可以加上 PATTERNS (man ssh_config) 做區隔,如 /chroot/%u ,
                                                              # /chroot 為這群使用者目錄的根目錄。
    ForceCommand internal-sftp            # 一樣要使用 internal-sftp 這個 Subsystem
    
  4. 設定 Chroot 目錄權限:錯誤的目錄權限設定會導致在 log 中出現 "fatal: bad ownership or modes for chroot directory XXXXXX" 的訊息。根據 openssh 5.1 chrootdirectory permissions issue 這篇文章的資訊顯示,目錄的權限設定有兩個要點:
    • 由 ChrootDirectory 指定的目錄開始一直往上到系統根目錄為止的目錄擁有者都只能是 root
    • 由 ChrootDirectory 指定的目錄開始一直往上到系統根目錄為止都不可以具有群組寫入權限
  5. 重新載入 sshd 後即可透過 FileZilla 等支援 SFTP 的軟體測試有無被關起來了...