Linux

帶有 chroot 和文件創建問題的 sftp

  • August 29, 2021

我使用自己的 sshd 配置配置了第二個 sshd systemd 服務,其中配置了不同的 tcp 埠,並配置了以下 sftp 子系統:

Match Group sftponly
 ChrootDirectory /srv/%u
 AllowTcpForwarding no
 ForceCommand internal-sftp
 PubkeyAuthentication yes
 PasswordAuthentication no
 PermitTunnel no
 AllowAgentForwarding no
 X11Forwarding no

我在 sftponly 組中創建的使用者是:

uid=1001(sftpuser) gid=1001(sftponly) groups=1001(sftponly)

chroot 的目錄樹是:

drwxr-xr-x   3  root     root           22 Aug 27 15:43 /srv
drwxr-xr-x   4  root     root           34 Aug 27 18:27 /srv/sftpuser
drwx------   2  sftpuser sftponly       29 Aug 27 15:43 /srv/sftpuser/.ssh
-rw-r--r--   1  sftpuser sftponly      398 Aug 27 15:43 /srv/sftpuser/.ssh/authorized_keys

我可以使用私鑰成功執行 sftp,但是我無法在使用者的 /srv/%u chroot 目錄中創建任何文件:

sftp> ls -al
drwxr-xr-x    3 root     root           18 Aug 27 16:38 .
drwxr-xr-x    3 root     root           18 Aug 27 16:38 ..
drwx------    2 sftpuser sftponly       29 Aug 27 13:43 .ssh
sftp> mkdir one
Couldn't create directory: Permission denied
sftp>

當我執行chown sftpuser /srv/sftpuser並返回到活動的 sftp 會話時,我可以創建文件,但是當我註銷時,我無法再登錄 sftp,直到我將/srv/%u目錄改回由 root 擁有

Connection to 192.168.1.110 closed by remote host.
Connection closed

我當然可以在/srv/%usftpuser 擁有的 (/srv/sftpuser) 內創建其他目錄,但這是 chroot 的唯一解決方案嗎?為什麼使用者不能直接更改/上傳文件/srv/%u

附加問題 - 如何防止系統上的其他使用者使用僅為 sftp 配置的自定義 sshd?當我在自定義兩個選項中設置上述Subsystem行時:並且設置為no並重新啟動 sshd 守護程序,正常系統使用者仍然可以使用該自定義 sshd 埠使用他們的密碼登錄。sshd_config_sftponly``PubkeyAuthentication``PasswordAuthentication

我當然可以在 sftpuser 擁有的 /srv/%u (/srv/sftpuser) 中創建其他目錄,但這是 chroot 的唯一解決方案嗎?

# man sshd_config | col -b | sed -n '/^ *ChrootDirectory/,/^ *$/{/^ *$/q;p}' | \
fmt -w72 | sed 's/^/    /'
    ChrootDirectory
        Specifies the pathname of a directory to chroot(2)
        to after authentication.  At session startup sshd(8)
        checks that all components of the pathname are root-owned
        directories which are not writable by any other user
        or group.  After the chroot, sshd(8) changes the working
        directory to the user's home directory.  Arguments to
        ChrootDirectory accept the tokens described in the
        TOKENS section.

讓我們明確一點 -路徑名的所有組件都是 root 擁有的!因此你可以這樣做:

# man sftp-server | col -b | sed -n '/^ *\-d/,/^ *$/{/^ *$/q;p}' | \
fmt -w72 | sed 's/^/    /'
    -d start_directory
        specifies an alternate starting directory for users.
        The pathname may contain the following tokens that
        are expanded at runtime: %% is replaced by a literal
        '%', %d is replaced by the home directory of the user
        being authenticated, and %u is replaced by the username
        of that user.  The default is to use the user's home
        directory.  This option is useful in conjunction with
        the sshd_config(5) ChrootDirectory option.

引用自:https://unix.stackexchange.com/questions/666536