SFTP Server

    版本為 18:19, 20 Nov 2024

    到這個版本。

    返回到 版本存檔.

    查閱目前版本

    SFTP Server

    使帳號僅能登入 SFTP 而不能登入 SSH,而且限制用戶目錄(Chroot)

    適用 CentOS 6 以後版本

    編輯 /etc/ssh/sshd_config
    NOTE: 註解 Subsystem 行,加上其他幾行

    # override default of no subsystems
    #Subsystem      sftp    /usr/libexec/openssh/sftp-server
    Subsystem        sftp   internal-sftp
    
    Match Group sftp-only
        ChrootDirectory /sftp-server/%u-root
        X11Forwarding no
        AllowTcpForwarding no
        ForceCommand internal-sftp
    

    新增帳號/群組

    groupadd sftp-only
    useradd -c "sftp users" -G sftp-only -M -s /sbin/nologin test 
    

    新增 sftp 各帳號的根目錄,以及權限設定 *重要*

    mkdir /sftp-server
    mkdir -p  /sftp-server/test-root/test
    chown mytest:mytest /sftp-server/test-root/test 

    TIPs:

    - ChrootDirectory 所定義的目錄 Owner 必須是 root,否則 /var/log/secure 會出現錯誤:
    Accepted password for test from 10.12.25.68 port 60213 ssh2
    pam_unix(sshd:session): session opened for user test by (uid=0)
    fatal: bad ownership or modes for chroot directory "/home/test"
    pam_unix(sshd:session): session closed for user test

    - sftp 各帳號的目錄架構類似

    # tree -l /sftp-server
    /sftp-server
    ├── test2-root
    │   └── test2
    │       └── readme.txt
    └── test-root
        └── test

    4 directories, 1 file

    F.A.Q

    Q: 帳號登入後限制在 home 目錄內存取(chroot)。

    A: 修改 /etc/ssh/sshd_config,如果 OpenSSH-Server 版本低於 4.8p1

    Subsystem  sftp  internal-sftp
    ChrootDirectory /home
    AllowTCPForwarding no
    X11Forwarding no
    

    Tips:

    * ChrootDirectory 所指定的目錄owner必須是 root
    * home 目錄下的用戶名稱仍可以被其他用戶看到,尚無解決方法。
    * 帳號登入後,自動進入所屬 home 目錄,可修改帳號的設定,參考指令:
         # usermod -d /john john

    設定 Chroot 目錄權限:錯誤的目錄權限設定會導致在 log 中出現 "fatal: bad ownership or modes for chroot directory XXXXXX" 的訊息。根據 openssh 5.1 chrootdirectory permissions issue 這篇文章的資訊顯示,目錄的權限設定有兩個要點:

    • 由 ChrootDirectory 指定的目錄開始一直往上到系統根目錄為止的目錄擁有者都只能是 root
    • 由 ChrootDirectory 指定的目錄開始一直往上到系統根目錄為止都不可以具有群組寫入權限
       
    Q: 帳號只能使用 SFTP,而無法用 SSH 登入。

    A:

    修改某帳號的 shell

    # usermod -s /usr/libexec/openssh/sftp-server john
    # echo "/usr/libexec/openssh/sftp-server" >> /etc/shells 
    Powered by MindTouch Core