Linux
帶有 chroot 和文件創建問題的 sftp
我使用自己的 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/%u
sftpuser 擁有的 (/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.