1,653 瀏覽數

Linux – SSH & SFTP

我的需求如下(測試環境 CentOS 6.8):

  1. 不允許使用者透過 SSH 登入到系統的 Shell 進行操作 ( 使用者只能使用 SFTP 進行檔案傳輸 ).
  2. 使用者登入後皆到統一的目錄 (/var/ftp) 下.

參考了 sshd_config 的說明
The subsystem sftp-server(8) implements SFTP file transfer. See the manual page for sftp-server(8). The subsystem internal-sftp implements an in-process SFTP server which may simplify configurations using ChrootDirectory to force a different filesystem root on clients.

重點有

  1. SSH 預設有 FTP 的功能 (SFTP – Security FTP)
  2. 採用 internal-sftp (預設為 sftp-server) 可以限制登入權限,還可以限制使用者登入後的目錄 (需要額外設定).

所以 SSH 的 SFTP 都已經幫我們想好了,只要設定成 internal-sftp 就可以限制登入權限,還可以限制使用者的登入目錄,設定後面會一一做說明.

針對剛剛的需求 OpenSSH 的設定檔 “/etc/ssh/sshd_config” 主要有三個地方需要修改.

[root@localhost ~]# vi /etc/ssh/sshd_config
Subsystem sftp internal-sftp
Match group staff
        ChrootDirectory /var/ftp
        X11Forwarding no
        AllowTcpForwarding no
        ForceCommand internal-sftp

[root@localhost ~]# service sshd restart
Stopping sshd:                                             [  OK  ]
Starting sshd:                                             [  OK  ]
  • Subsystem sftp internal-sftp
    採用 internal-sftp 可以限制登入權限,還可以限制使用者的登入目錄 ( 讓使用者只能使用 SFTP 傳輸檔案 ).

    # override default of no subsystems
    Subsystem       sftp    internal-sftp
    #Subsystem      sftp    /usr/libexec/openssh/sftp-server
    

    預設為 sftp-server 需修改成 internal-sftp

  • Match group staff , Match user ben
    不允許 staff 群組登入 Shell 進行操作.

    Match group staff
    

    staff 則是群組,要參考 /etc/group 檔案

    [root@localhost ~]# cat /etc/group
    ...
    staff:x:504:ben,John,Mary,roger
    

    這幾位使用者 ben, John, Mary, roger 都在 staff 群組裡面,所以他們的 SSH 登入會受到限制(無法透過 SSH 登入).

    除了群組外也可以針對 個人來設定.

    Match User ben
    

    只有使用者 ben 會被限制住.

  • ChrootDirectory /var/ftp
    staff 群組預設使用 SFTP 的目錄.為了讓使用者登入後皆到統一的目錄下,我們可以透過 chroot 限制存取目錄,在該設定檔最後加上以下設定 ChrootDirectory 即可.

    ChrootDirectory /var/ftp
    

    接下來是設定目錄權限,因為使用到 chroot() 所以該目錄的擁有者必須為 root 權限 755

    [root@localhost ~]# chown root.root /var/ftp
    [root@localhost ~]# chmod 755 /var/ftp
    

    要不然使用者無法登入,最後即是將新增一個 upload 目錄給群組 staff 的使用者來使用,windows 使用者就可以透過 winscp 之類的工具了來進行檔案傳輸.

    [root@localhost ~]# cd /var/ftp
    [root@localhost ~]# mkdir upload
    [root@localhost ~]# chown staff.staff upload
    [root@localhost ~]# chmod 775 upload
    
  • 另外還有一個參數是
    ForceCommand internal-sftp 
    

    This forces the execution of the internal-sftp and ignores any command that are mentioned in the ~/.ssh/rc file.

    ForceCommand internal-sftp -d %u
    

    If it is not practical to have users’ home directories owned by root, a compromise can be made. ChrootDirectory can point to /home, which must be owned by root anyway, and then ForceCommand can then designate the user’s home directory as the starting directory using the -d option.

    大概比較少人這樣設定,意思是說要使用 chroot 的目錄擁有者必須為 root (它是以 /home 為範例) ,但如果你還須要讓不同的使用者可以登入到屬於自己的家目錄的時候沒有辦法一一設定,可以透過 ForceCommand internal-sftp -d %u 來達成.

常見問題:

  • SELINUX
    有次怎麼試都不能成功,檢查 /var/log/secure ,內容顯示 safely_chroot: stat(“/var/ftp/”): permission denied ,後來上網查了一下應該是 selinux 所影響的,所以暫時將 selinux 關閉即可以

    [root@localhost ~]# cat /var/log/secure
    .....
    Accepted password for ben from 172.16.0.135 port 38287 ssh2
    pam_unix(sshd:session): session opened for user ben by (uid=0)
    fatal: safely_chroot: stat("/var/ftp/"): permission denied
    pam_unix(sshd:session): session closed for user ben
    

    SELINUX 預設為 enforcing 需要修改成為 disabled .selinux 只能調整開機後不要啟動.所以必須重新開關機.

    [root@localhost ~]# vi /etc/sysconfig/selinux 
    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=disabled
    #SELINUX=enforcing
    # SELINUXTYPE= can take one of three two values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected.
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted
    
    [root@localhost ~]# reboot
    
    [root@localhost ~]# sestatus 
    SELinux status:                 disabled
    
  • 目錄權限
    因為使用到 chroot() 所以該目錄的擁有者必須為 root 權限 755

    [root@localhost ~]# chown root.root /var/ftp
    [root@localhost ~]# chmod 755 /var/ftp
    

    要不然使用者無法登入,且會出現下面的訊息

    [root@localhost ~]# cat /var/log/secure
    May 17 11:40:19 172 sshd[26173]: Accepted password for roger from 10.32.78.136 port 52779 ssh2
    May 17 11:40:19 172 sshd[26173]: pam_unix(sshd:session): session opened for user roger by (uid=0)
    May 17 11:40:19 172 sshd[26175]: subsystem request for sftp
    May 17 11:40:19 172 sshd[26173]: pam_unix(sshd:session): session closed for user roger
    

    或是在 Windows 的 Winscp 看到下面的錯誤訊息.

    錯誤: Network error: Software caused connection abort
    錯誤: 無法連線到伺服器
    

發表迴響